From 5b34b975b6945e5507bfacd6027d3d024a8f9184 Mon Sep 17 00:00:00 2001
From: b-carver <89669317+b-carver@users.noreply.github.com>
Date: Wed, 29 Sep 2021 14:45:04 -0700
Subject: [PATCH 01/12] Adding formatting example (#416)
* Adding formatting examples for javascript inside Html and typescript with React
* Update extensions-api-types and extensions.latest
---
Samples-Typescript/Formatting/formatting.html | 66 +
Samples-Typescript/Formatting/formatting.trex | 19 +
Samples-Typescript/Formatting/formatting.tsx | 33 +
Samples/Formatting/formatting.html | 104 +
Samples/Formatting/formatting.trex | 19 +
lib/tableau.extensions.1.latest.js | 2782 +++++++++++------
lib/tableau.extensions.1.latest.min.js | 4 +-
package-lock.json | 46 +-
package.json | 6 +-
tsconfig.json | 3 +-
webpack.config.js | 5 +-
11 files changed, 2203 insertions(+), 884 deletions(-)
create mode 100644 Samples-Typescript/Formatting/formatting.html
create mode 100644 Samples-Typescript/Formatting/formatting.trex
create mode 100644 Samples-Typescript/Formatting/formatting.tsx
create mode 100644 Samples/Formatting/formatting.html
create mode 100644 Samples/Formatting/formatting.trex
diff --git a/Samples-Typescript/Formatting/formatting.html b/Samples-Typescript/Formatting/formatting.html
new file mode 100644
index 00000000..947771b4
--- /dev/null
+++ b/Samples-Typescript/Formatting/formatting.html
@@ -0,0 +1,66 @@
+
+
+
+
+ Tableau Formatting Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tableau Formatting Sample
+
+
+
+
+
diff --git a/Samples-Typescript/Formatting/formatting.trex b/Samples-Typescript/Formatting/formatting.trex
new file mode 100644
index 00000000..9eb24dd9
--- /dev/null
+++ b/Samples-Typescript/Formatting/formatting.trex
@@ -0,0 +1,19 @@
+
+
+
+ en_US
+
+ Tableau Formatting Sample
+
+ 1.1
+
+ http://localhost:8765/Samples-Typescript/Formatting/formatting.html
+
+ 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
+
+
+
+ Tableau Formatting Sample
+
+
+
diff --git a/Samples-Typescript/Formatting/formatting.tsx b/Samples-Typescript/Formatting/formatting.tsx
new file mode 100644
index 00000000..ea3dec7b
--- /dev/null
+++ b/Samples-Typescript/Formatting/formatting.tsx
@@ -0,0 +1,33 @@
+import * as React from 'react';
+import * as ReactDOM from 'react-dom';
+
+// Wrap everything in an anonymous function to avoid polluting the global namespace
+(async () => {
+
+ class Formatting {
+ // This is the entry point into the extension. It initializes the Tableau Extensions Api, and then
+ // will create elements with appropriate class names to get Tableau formatting
+ public async initialize() {
+ console.log('Initializing extension API');
+ await tableau.extensions.initializeAsync();
+ await this.Render();
+ }
+
+ private async Render() {
+ const tooltipClassNames = 'tooltiptext ' + tableau.ClassNameKey.Tooltip;
+
+ ReactDOM.render(<>
+ Subheader, using tableau-worksheet-title class
+ Text, using worksheet class
+ Hover to see tooltip text, which is using tableau-tooltip class
+ Tooltip text, using tableau-tooltip class
+
+ Bullet Point, using tableau-story-title class
+ Text, using tableau-dashboard-title class
+ >, document.getElementById('formattingExample'));
+ }
+ }
+
+ console.log('Initializing Formatting extension.');
+ await new Formatting().initialize();
+})();
diff --git a/Samples/Formatting/formatting.html b/Samples/Formatting/formatting.html
new file mode 100644
index 00000000..27c60699
--- /dev/null
+++ b/Samples/Formatting/formatting.html
@@ -0,0 +1,104 @@
+
+
+
+
+ Tableau Formatting Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tableau Formatting Sample
+
+ Subheader, using tableau-worksheet-title class
+ Text, using worksheet class
+
+ Bullet Point, using tableau-story-title class
+ Text, using tableau-dashboard-title class
+
+
+
+ Text, using tableau-worksheet-title class
+
+
+
+
+
+
+
+
diff --git a/Samples/Formatting/formatting.trex b/Samples/Formatting/formatting.trex
new file mode 100644
index 00000000..af3eabd2
--- /dev/null
+++ b/Samples/Formatting/formatting.trex
@@ -0,0 +1,19 @@
+
+
+
+ en_US
+
+ Tableau Formatting Sample
+
+ 1.1
+
+ http://localhost:8765/Samples/Formatting/formatting.html
+
+ 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
+
+
+
+ Tableau Formatting Sample
+
+
+
diff --git a/lib/tableau.extensions.1.latest.js b/lib/tableau.extensions.1.latest.js
index 3e722f0f..685292f0 100644
--- a/lib/tableau.extensions.1.latest.js
+++ b/lib/tableau.extensions.1.latest.js
@@ -88,9 +88,9 @@ window["tableau"] =
/******/ ({
/***/ "../../../node_modules/core-js/es/array/find.js":
-/*!************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/array/find.js ***!
- \************************************************************************************************/
+/*!*********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/array/find.js ***!
+ \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -103,9 +103,9 @@ module.exports = entryUnbind('Array', 'find');
/***/ }),
/***/ "../../../node_modules/core-js/es/array/from.js":
-/*!************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/array/from.js ***!
- \************************************************************************************************/
+/*!*********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/array/from.js ***!
+ \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -119,9 +119,9 @@ module.exports = path.Array.from;
/***/ }),
/***/ "../../../node_modules/core-js/es/map/index.js":
-/*!***********************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/map/index.js ***!
- \***********************************************************************************************/
+/*!********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/map/index.js ***!
+ \********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -137,9 +137,9 @@ module.exports = path.Map;
/***/ }),
/***/ "../../../node_modules/core-js/es/number/is-integer.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/is-integer.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/number/is-integer.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -152,9 +152,9 @@ module.exports = path.Number.isInteger;
/***/ }),
/***/ "../../../node_modules/core-js/es/number/is-nan.js":
-/*!***************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/is-nan.js ***!
- \***************************************************************************************************/
+/*!************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/number/is-nan.js ***!
+ \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -167,9 +167,9 @@ module.exports = path.Number.isNaN;
/***/ }),
/***/ "../../../node_modules/core-js/es/number/parse-float.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/parse-float.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/number/parse-float.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -182,9 +182,9 @@ module.exports = path.Number.parseFloat;
/***/ }),
/***/ "../../../node_modules/core-js/es/number/parse-int.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/parse-int.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/number/parse-int.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -197,9 +197,9 @@ module.exports = path.Number.parseInt;
/***/ }),
/***/ "../../../node_modules/core-js/es/object/assign.js":
-/*!***************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/object/assign.js ***!
- \***************************************************************************************************/
+/*!************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/object/assign.js ***!
+ \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -212,9 +212,9 @@ module.exports = path.Object.assign;
/***/ }),
/***/ "../../../node_modules/core-js/es/object/entries.js":
-/*!****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/object/entries.js ***!
- \****************************************************************************************************/
+/*!*************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/object/entries.js ***!
+ \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -227,9 +227,9 @@ module.exports = path.Object.entries;
/***/ }),
/***/ "../../../node_modules/core-js/es/object/set-prototype-of.js":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/object/set-prototype-of.js ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/object/set-prototype-of.js ***!
+ \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -242,9 +242,9 @@ module.exports = path.Object.setPrototypeOf;
/***/ }),
/***/ "../../../node_modules/core-js/es/promise/index.js":
-/*!***************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/promise/index.js ***!
- \***************************************************************************************************/
+/*!************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/es/promise/index.js ***!
+ \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -264,9 +264,9 @@ module.exports = path.Promise;
/***/ }),
/***/ "../../../node_modules/core-js/internals/a-function.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/a-function.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/a-function.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -280,9 +280,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/a-possible-prototype.js":
-/*!*****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/a-possible-prototype.js ***!
- \*****************************************************************************************************************/
+/*!**************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/a-possible-prototype.js ***!
+ \**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -298,9 +298,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/add-to-unscopables.js":
-/*!***************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/add-to-unscopables.js ***!
- \***************************************************************************************************************/
+/*!************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/add-to-unscopables.js ***!
+ \************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -329,9 +329,9 @@ module.exports = function (key) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/an-instance.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/an-instance.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/an-instance.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -345,9 +345,9 @@ module.exports = function (it, Constructor, name) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/an-object.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/an-object.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/an-object.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -363,9 +363,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/array-from.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-from.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/array-from.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -416,9 +416,9 @@ module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undef
/***/ }),
/***/ "../../../node_modules/core-js/internals/array-includes.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-includes.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/array-includes.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -459,9 +459,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/array-iteration.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-iteration.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/array-iteration.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -542,9 +542,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/array-species-create.js":
-/*!*****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-species-create.js ***!
- \*****************************************************************************************************************/
+/*!**************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/array-species-create.js ***!
+ \**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -573,9 +573,9 @@ module.exports = function (originalArray, length) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/call-with-safe-iteration-closing.js":
-/*!*****************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/call-with-safe-iteration-closing.js ***!
- \*****************************************************************************************************************************/
+/*!**************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/call-with-safe-iteration-closing.js ***!
+ \**************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -586,7 +586,6 @@ var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../.
module.exports = function (iterator, fn, value, ENTRIES) {
try {
return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
- // 7.4.6 IteratorClose(iterator, completion)
} catch (error) {
iteratorClose(iterator);
throw error;
@@ -597,9 +596,9 @@ module.exports = function (iterator, fn, value, ENTRIES) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/check-correctness-of-iteration.js":
-/*!***************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/check-correctness-of-iteration.js ***!
- \***************************************************************************************************************************/
+/*!************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/check-correctness-of-iteration.js ***!
+ \************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -646,9 +645,9 @@ module.exports = function (exec, SKIP_CLOSING) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/classof-raw.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/classof-raw.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/classof-raw.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -662,9 +661,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/classof.js":
-/*!****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/classof.js ***!
- \****************************************************************************************************/
+/*!*************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/classof.js ***!
+ \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -699,9 +698,9 @@ module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/collection-strong.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/collection-strong.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/collection-strong.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -778,8 +777,9 @@ module.exports = {
};
redefineAll(C.prototype, {
- // 23.1.3.1 Map.prototype.clear()
- // 23.2.3.2 Set.prototype.clear()
+ // `{ Map, Set }.prototype.clear()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.clear
+ // https://tc39.es/ecma262/#sec-set.prototype.clear
clear: function clear() {
var that = this;
var state = getInternalState(that);
@@ -795,8 +795,9 @@ module.exports = {
if (DESCRIPTORS) state.size = 0;
else that.size = 0;
},
- // 23.1.3.3 Map.prototype.delete(key)
- // 23.2.3.4 Set.prototype.delete(value)
+ // `{ Map, Set }.prototype.delete(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.delete
+ // https://tc39.es/ecma262/#sec-set.prototype.delete
'delete': function (key) {
var that = this;
var state = getInternalState(that);
@@ -814,8 +815,9 @@ module.exports = {
else that.size--;
} return !!entry;
},
- // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
- // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
+ // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.foreach
+ // https://tc39.es/ecma262/#sec-set.prototype.foreach
forEach: function forEach(callbackfn /* , that = undefined */) {
var state = getInternalState(this);
var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
@@ -826,25 +828,29 @@ module.exports = {
while (entry && entry.removed) entry = entry.previous;
}
},
- // 23.1.3.7 Map.prototype.has(key)
- // 23.2.3.7 Set.prototype.has(value)
+ // `{ Map, Set}.prototype.has(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.has
+ // https://tc39.es/ecma262/#sec-set.prototype.has
has: function has(key) {
return !!getEntry(this, key);
}
});
redefineAll(C.prototype, IS_MAP ? {
- // 23.1.3.6 Map.prototype.get(key)
+ // `Map.prototype.get(key)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.get
get: function get(key) {
var entry = getEntry(this, key);
return entry && entry.value;
},
- // 23.1.3.9 Map.prototype.set(key, value)
+ // `Map.prototype.set(key, value)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.set
set: function set(key, value) {
return define(this, key === 0 ? 0 : key, value);
}
} : {
- // 23.2.3.1 Set.prototype.add(value)
+ // `Set.prototype.add(value)` method
+ // https://tc39.es/ecma262/#sec-set.prototype.add
add: function add(value) {
return define(this, value = value === 0 ? 0 : value, value);
}
@@ -860,8 +866,15 @@ module.exports = {
var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
- // add .keys, .values, .entries, [@@iterator]
- // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
+ // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.entries
+ // https://tc39.es/ecma262/#sec-map.prototype.keys
+ // https://tc39.es/ecma262/#sec-map.prototype.values
+ // https://tc39.es/ecma262/#sec-map.prototype-@@iterator
+ // https://tc39.es/ecma262/#sec-set.prototype.entries
+ // https://tc39.es/ecma262/#sec-set.prototype.keys
+ // https://tc39.es/ecma262/#sec-set.prototype.values
+ // https://tc39.es/ecma262/#sec-set.prototype-@@iterator
defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {
setInternalState(this, {
type: ITERATOR_NAME,
@@ -888,7 +901,9 @@ module.exports = {
return { value: [entry.key, entry.value], done: false };
}, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
- // add [@@species], 23.1.2.2, 23.2.2.2
+ // `{ Map, Set }.prototype[@@species]` accessors
+ // https://tc39.es/ecma262/#sec-get-map-@@species
+ // https://tc39.es/ecma262/#sec-get-set-@@species
setSpecies(CONSTRUCTOR_NAME);
}
};
@@ -897,9 +912,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/collection.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/collection.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/collection.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1012,9 +1027,9 @@ module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/copy-constructor-properties.js":
-/*!************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/copy-constructor-properties.js ***!
- \************************************************************************************************************************/
+/*!*********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/copy-constructor-properties.js ***!
+ \*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1037,9 +1052,9 @@ module.exports = function (target, source) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/correct-prototype-getter.js":
-/*!*********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/correct-prototype-getter.js ***!
- \*********************************************************************************************************************/
+/*!******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/correct-prototype-getter.js ***!
+ \******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1056,9 +1071,9 @@ module.exports = !fails(function () {
/***/ }),
/***/ "../../../node_modules/core-js/internals/create-iterator-constructor.js":
-/*!************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-iterator-constructor.js ***!
- \************************************************************************************************************************/
+/*!*********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/create-iterator-constructor.js ***!
+ \*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1084,9 +1099,9 @@ module.exports = function (IteratorConstructor, NAME, next) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/create-non-enumerable-property.js":
-/*!***************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-non-enumerable-property.js ***!
- \***************************************************************************************************************************/
+/*!************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/create-non-enumerable-property.js ***!
+ \************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1105,9 +1120,9 @@ module.exports = DESCRIPTORS ? function (object, key, value) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/create-property-descriptor.js":
-/*!***********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-property-descriptor.js ***!
- \***********************************************************************************************************************/
+/*!********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/create-property-descriptor.js ***!
+ \********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -1124,9 +1139,9 @@ module.exports = function (bitmap, value) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/create-property.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-property.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/create-property.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1146,9 +1161,9 @@ module.exports = function (object, key, value) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/define-iterator.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/define-iterator.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/define-iterator.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1215,7 +1230,7 @@ module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, I
}
}
- // fix Array#{values, @@iterator}.name in V8 / FF
+ // fix Array.prototype.{ values, @@iterator }.name in V8 / FF
if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
INCORRECT_VALUES_NAME = true;
defaultIterator = function values() { return nativeIterator.call(this); };
@@ -1248,9 +1263,9 @@ module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, I
/***/ }),
/***/ "../../../node_modules/core-js/internals/descriptors.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/descriptors.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/descriptors.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1266,9 +1281,9 @@ module.exports = !fails(function () {
/***/ }),
/***/ "../../../node_modules/core-js/internals/document-create-element.js":
-/*!********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/document-create-element.js ***!
- \********************************************************************************************************************/
+/*!*****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/document-create-element.js ***!
+ \*****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1287,9 +1302,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/dom-iterables.js":
-/*!**********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/dom-iterables.js ***!
- \**********************************************************************************************************/
+/*!*******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/dom-iterables.js ***!
+ \*******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -1330,12 +1345,24 @@ module.exports = {
};
+/***/ }),
+
+/***/ "../../../node_modules/core-js/internals/engine-is-browser.js":
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-browser.js ***!
+ \***********************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = typeof window == 'object';
+
+
/***/ }),
/***/ "../../../node_modules/core-js/internals/engine-is-ios.js":
-/*!**********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-ios.js ***!
- \**********************************************************************************************************/
+/*!*******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-ios.js ***!
+ \*******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1347,9 +1374,9 @@ module.exports = /(?:iphone|ipod|ipad).*applewebkit/i.test(userAgent);
/***/ }),
/***/ "../../../node_modules/core-js/internals/engine-is-node.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-node.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-node.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1362,9 +1389,9 @@ module.exports = classof(global.process) == 'process';
/***/ }),
/***/ "../../../node_modules/core-js/internals/engine-is-webos-webkit.js":
-/*!*******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-webos-webkit.js ***!
- \*******************************************************************************************************************/
+/*!****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-webos-webkit.js ***!
+ \****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1376,9 +1403,9 @@ module.exports = /web0s(?!.*chrome)/i.test(userAgent);
/***/ }),
/***/ "../../../node_modules/core-js/internals/engine-user-agent.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-user-agent.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/engine-user-agent.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1390,9 +1417,9 @@ module.exports = getBuiltIn('navigator', 'userAgent') || '';
/***/ }),
/***/ "../../../node_modules/core-js/internals/engine-v8-version.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-v8-version.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/engine-v8-version.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1406,7 +1433,7 @@ var match, version;
if (v8) {
match = v8.split('.');
- version = match[0] + match[1];
+ version = match[0] < 4 ? 1 : match[0] + match[1];
} else if (userAgent) {
match = userAgent.match(/Edge\/(\d+)/);
if (!match || match[1] >= 74) {
@@ -1421,9 +1448,9 @@ module.exports = version && +version;
/***/ }),
/***/ "../../../node_modules/core-js/internals/entry-unbind.js":
-/*!*********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/entry-unbind.js ***!
- \*********************************************************************************************************/
+/*!******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/entry-unbind.js ***!
+ \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1440,9 +1467,9 @@ module.exports = function (CONSTRUCTOR, METHOD, length) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/enum-bug-keys.js":
-/*!**********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/enum-bug-keys.js ***!
- \**********************************************************************************************************/
+/*!*******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/enum-bug-keys.js ***!
+ \*******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -1461,9 +1488,9 @@ module.exports = [
/***/ }),
/***/ "../../../node_modules/core-js/internals/export.js":
-/*!***************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/export.js ***!
- \***************************************************************************************************/
+/*!************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/export.js ***!
+ \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1526,9 +1553,9 @@ module.exports = function (options, source) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/fails.js":
-/*!**************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/fails.js ***!
- \**************************************************************************************************/
+/*!***********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/fails.js ***!
+ \***********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -1544,9 +1571,9 @@ module.exports = function (exec) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/freezing.js":
-/*!*****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/freezing.js ***!
- \*****************************************************************************************************/
+/*!**************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/freezing.js ***!
+ \**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1561,9 +1588,9 @@ module.exports = !fails(function () {
/***/ }),
/***/ "../../../node_modules/core-js/internals/function-bind-context.js":
-/*!******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/function-bind-context.js ***!
- \******************************************************************************************************************/
+/*!***************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/function-bind-context.js ***!
+ \***************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1596,9 +1623,9 @@ module.exports = function (fn, that, length) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/get-built-in.js":
-/*!*********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/get-built-in.js ***!
- \*********************************************************************************************************/
+/*!******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/get-built-in.js ***!
+ \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1618,9 +1645,9 @@ module.exports = function (namespace, method) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/get-iterator-method.js":
-/*!****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/get-iterator-method.js ***!
- \****************************************************************************************************************/
+/*!*************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/get-iterator-method.js ***!
+ \*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1640,9 +1667,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/global.js":
-/*!***************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/global.js ***!
- \***************************************************************************************************/
+/*!************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/global.js ***!
+ \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1661,30 +1688,32 @@ module.exports =
// eslint-disable-next-line no-new-func -- fallback
(function () { return this; })() || Function('return this')();
-/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack-cli/node_modules/webpack/buildin/global.js */ "../../../node_modules/webpack-cli/node_modules/webpack/buildin/global.js")))
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "../../../node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "../../../node_modules/core-js/internals/has.js":
-/*!************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/has.js ***!
- \************************************************************************************************/
+/*!*********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/has.js ***!
+ \*********************************************************************************/
/*! no static exports found */
-/***/ (function(module, exports) {
+/***/ (function(module, exports, __webpack_require__) {
+
+var toObject = __webpack_require__(/*! ../internals/to-object */ "../../../node_modules/core-js/internals/to-object.js");
var hasOwnProperty = {}.hasOwnProperty;
-module.exports = function (it, key) {
- return hasOwnProperty.call(it, key);
+module.exports = Object.hasOwn || function hasOwn(it, key) {
+ return hasOwnProperty.call(toObject(it), key);
};
/***/ }),
/***/ "../../../node_modules/core-js/internals/hidden-keys.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/hidden-keys.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/hidden-keys.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -1694,9 +1723,9 @@ module.exports = {};
/***/ }),
/***/ "../../../node_modules/core-js/internals/host-report-errors.js":
-/*!***************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/host-report-errors.js ***!
- \***************************************************************************************************************/
+/*!************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/host-report-errors.js ***!
+ \************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1713,9 +1742,9 @@ module.exports = function (a, b) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/html.js":
-/*!*************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/html.js ***!
- \*************************************************************************************************/
+/*!**********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/html.js ***!
+ \**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1727,9 +1756,9 @@ module.exports = getBuiltIn('document', 'documentElement');
/***/ }),
/***/ "../../../node_modules/core-js/internals/ie8-dom-define.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/ie8-dom-define.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/ie8-dom-define.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1749,9 +1778,9 @@ module.exports = !DESCRIPTORS && !fails(function () {
/***/ }),
/***/ "../../../node_modules/core-js/internals/indexed-object.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/indexed-object.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/indexed-object.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1773,9 +1802,9 @@ module.exports = fails(function () {
/***/ }),
/***/ "../../../node_modules/core-js/internals/inherit-if-required.js":
-/*!****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/inherit-if-required.js ***!
- \****************************************************************************************************************/
+/*!*************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/inherit-if-required.js ***!
+ \*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1801,9 +1830,9 @@ module.exports = function ($this, dummy, Wrapper) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/inspect-source.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/inspect-source.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/inspect-source.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1811,7 +1840,7 @@ var store = __webpack_require__(/*! ../internals/shared-store */ "../../../node_
var functionToString = Function.toString;
-// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper
+// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
if (typeof store.inspectSource != 'function') {
store.inspectSource = function (it) {
return functionToString.call(it);
@@ -1824,9 +1853,9 @@ module.exports = store.inspectSource;
/***/ }),
/***/ "../../../node_modules/core-js/internals/internal-metadata.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/internal-metadata.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/internal-metadata.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1847,7 +1876,7 @@ var isExtensible = Object.isExtensible || function () {
var setMetadata = function (it) {
defineProperty(it, METADATA, { value: {
- objectID: 'O' + ++id, // object ID
+ objectID: 'O' + id++, // object ID
weakData: {} // weak collections IDs
} });
};
@@ -1897,9 +1926,9 @@ hiddenKeys[METADATA] = true;
/***/ }),
/***/ "../../../node_modules/core-js/internals/internal-state.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/internal-state.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/internal-state.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1912,6 +1941,7 @@ var shared = __webpack_require__(/*! ../internals/shared-store */ "../../../node
var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../../node_modules/core-js/internals/shared-key.js");
var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../../node_modules/core-js/internals/hidden-keys.js");
+var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
var WeakMap = global.WeakMap;
var set, get, has;
@@ -1928,12 +1958,13 @@ var getterFor = function (TYPE) {
};
};
-if (NATIVE_WEAK_MAP) {
+if (NATIVE_WEAK_MAP || shared.state) {
var store = shared.state || (shared.state = new WeakMap());
var wmget = store.get;
var wmhas = store.has;
var wmset = store.set;
set = function (it, metadata) {
+ if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
wmset.call(store, it, metadata);
return metadata;
@@ -1948,6 +1979,7 @@ if (NATIVE_WEAK_MAP) {
var STATE = sharedKey('state');
hiddenKeys[STATE] = true;
set = function (it, metadata) {
+ if (objectHas(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
createNonEnumerableProperty(it, STATE, metadata);
return metadata;
@@ -1972,9 +2004,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/is-array-iterator-method.js":
-/*!*********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-array-iterator-method.js ***!
- \*********************************************************************************************************************/
+/*!******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/is-array-iterator-method.js ***!
+ \******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -1993,9 +2025,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/is-array.js":
-/*!*****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-array.js ***!
- \*****************************************************************************************************/
+/*!**************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/is-array.js ***!
+ \**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2012,9 +2044,9 @@ module.exports = Array.isArray || function isArray(arg) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/is-forced.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-forced.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/is-forced.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2044,9 +2076,9 @@ module.exports = isForced;
/***/ }),
/***/ "../../../node_modules/core-js/internals/is-integer.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-integer.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/is-integer.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2064,9 +2096,9 @@ module.exports = function isInteger(it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/is-object.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-object.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/is-object.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -2078,9 +2110,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/is-pure.js":
-/*!****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-pure.js ***!
- \****************************************************************************************************/
+/*!*************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/is-pure.js ***!
+ \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -2090,9 +2122,9 @@ module.exports = false;
/***/ }),
/***/ "../../../node_modules/core-js/internals/iterate.js":
-/*!****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterate.js ***!
- \****************************************************************************************************/
+/*!*************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/iterate.js ***!
+ \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2159,9 +2191,9 @@ module.exports = function (iterable, unboundFunction, options) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/iterator-close.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterator-close.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/iterator-close.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2178,9 +2210,9 @@ module.exports = function (iterator) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/iterators-core.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterators-core.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/iterators-core.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2221,7 +2253,8 @@ var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function ()
if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
-// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+// `%IteratorPrototype%[@@iterator]()` method
+// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
if ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) {
createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);
}
@@ -2235,9 +2268,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/iterators.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterators.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/iterators.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -2247,9 +2280,9 @@ module.exports = {};
/***/ }),
/***/ "../../../node_modules/core-js/internals/microtask.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/microtask.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/microtask.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2302,6 +2335,8 @@ if (!queueMicrotask) {
} else if (Promise && Promise.resolve) {
// Promise.resolve without an argument throws an error in LG WebOS 2
promise = Promise.resolve(undefined);
+ // workaround of WebKit ~ iOS Safari 10.1 bug
+ promise.constructor = Promise;
then = promise.then;
notify = function () {
then.call(promise, flush);
@@ -2338,9 +2373,9 @@ module.exports = queueMicrotask || function (fn) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/native-promise-constructor.js":
-/*!***********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/native-promise-constructor.js ***!
- \***********************************************************************************************************************/
+/*!********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/native-promise-constructor.js ***!
+ \********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2352,32 +2387,33 @@ module.exports = global.Promise;
/***/ }),
/***/ "../../../node_modules/core-js/internals/native-symbol.js":
-/*!**********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/native-symbol.js ***!
- \**********************************************************************************************************/
+/*!*******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/native-symbol.js ***!
+ \*******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../../node_modules/core-js/internals/engine-is-node.js");
+/* eslint-disable es/no-symbol -- required for testing */
var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../../node_modules/core-js/internals/engine-v8-version.js");
var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js");
// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing
module.exports = !!Object.getOwnPropertySymbols && !fails(function () {
- // eslint-disable-next-line es/no-symbol -- required for testing
- return !Symbol.sham &&
- // Chrome 38 Symbol has incorrect toString conversion
+ var symbol = Symbol();
+ // Chrome 38 Symbol has incorrect toString conversion
+ // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
+ return !String(symbol) || !(Object(symbol) instanceof Symbol) ||
// Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
- (IS_NODE ? V8_VERSION === 38 : V8_VERSION > 37 && V8_VERSION < 41);
+ !Symbol.sham && V8_VERSION && V8_VERSION < 41;
});
/***/ }),
/***/ "../../../node_modules/core-js/internals/native-weak-map.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/native-weak-map.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/native-weak-map.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2392,9 +2428,9 @@ module.exports = typeof WeakMap === 'function' && /native code/.test(inspectSour
/***/ }),
/***/ "../../../node_modules/core-js/internals/new-promise-capability.js":
-/*!*******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/new-promise-capability.js ***!
- \*******************************************************************************************************************/
+/*!****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/new-promise-capability.js ***!
+ \****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2413,7 +2449,8 @@ var PromiseCapability = function (C) {
this.reject = aFunction(reject);
};
-// 25.4.1.5 NewPromiseCapability(C)
+// `NewPromiseCapability` abstract operation
+// https://tc39.es/ecma262/#sec-newpromisecapability
module.exports.f = function (C) {
return new PromiseCapability(C);
};
@@ -2422,9 +2459,9 @@ module.exports.f = function (C) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/number-parse-float.js":
-/*!***************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/number-parse-float.js ***!
- \***************************************************************************************************************/
+/*!************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/number-parse-float.js ***!
+ \************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2447,9 +2484,9 @@ module.exports = FORCED ? function parseFloat(string) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/number-parse-int.js":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/number-parse-int.js ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/number-parse-int.js ***!
+ \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2472,9 +2509,9 @@ module.exports = FORCED ? function parseInt(string, radix) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-assign.js":
-/*!**********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-assign.js ***!
- \**********************************************************************************************************/
+/*!*******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-assign.js ***!
+ \*******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2538,9 +2575,9 @@ module.exports = !$assign || fails(function () {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-create.js":
-/*!**********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-create.js ***!
- \**********************************************************************************************************/
+/*!*******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-create.js ***!
+ \*******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2627,9 +2664,9 @@ module.exports = Object.create || function create(O, Properties) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-define-properties.js":
-/*!*********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-define-properties.js ***!
- \*********************************************************************************************************************/
+/*!******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-define-properties.js ***!
+ \******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2655,9 +2692,9 @@ module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperti
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-define-property.js":
-/*!*******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-define-property.js ***!
- \*******************************************************************************************************************/
+/*!****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-define-property.js ***!
+ \****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2687,9 +2724,9 @@ exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attrib
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-get-own-property-descriptor.js":
-/*!*******************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-descriptor.js ***!
- \*******************************************************************************************************************************/
+/*!****************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-descriptor.js ***!
+ \****************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2719,9 +2756,9 @@ exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDes
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-get-own-property-names.js":
-/*!**************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-names.js ***!
- \**************************************************************************************************************************/
+/*!***********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-names.js ***!
+ \***********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2741,9 +2778,9 @@ exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-get-own-property-symbols.js":
-/*!****************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-symbols.js ***!
- \****************************************************************************************************************************/
+/*!*************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-symbols.js ***!
+ \*************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -2754,9 +2791,9 @@ exports.f = Object.getOwnPropertySymbols;
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-get-prototype-of.js":
-/*!********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-prototype-of.js ***!
- \********************************************************************************************************************/
+/*!*****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-get-prototype-of.js ***!
+ \*****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2783,9 +2820,9 @@ module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O)
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-keys-internal.js":
-/*!*****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-keys-internal.js ***!
- \*****************************************************************************************************************/
+/*!**************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-keys-internal.js ***!
+ \**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2811,9 +2848,9 @@ module.exports = function (object, names) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-keys.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-keys.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-keys.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2831,9 +2868,9 @@ module.exports = Object.keys || function keys(O) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-property-is-enumerable.js":
-/*!**************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-property-is-enumerable.js ***!
- \**************************************************************************************************************************/
+/*!***********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-property-is-enumerable.js ***!
+ \***********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2857,9 +2894,9 @@ exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-set-prototype-of.js":
-/*!********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-set-prototype-of.js ***!
- \********************************************************************************************************************/
+/*!*****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-set-prototype-of.js ***!
+ \*****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2894,9 +2931,9 @@ module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-to-array.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-to-array.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-to-array.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2937,9 +2974,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/object-to-string.js":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-to-string.js ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/object-to-string.js ***!
+ \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2958,9 +2995,9 @@ module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {
/***/ }),
/***/ "../../../node_modules/core-js/internals/own-keys.js":
-/*!*****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/own-keys.js ***!
- \*****************************************************************************************************/
+/*!**************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/own-keys.js ***!
+ \**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2980,9 +3017,9 @@ module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/path.js":
-/*!*************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/path.js ***!
- \*************************************************************************************************/
+/*!**********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/path.js ***!
+ \**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -2994,9 +3031,9 @@ module.exports = global;
/***/ }),
/***/ "../../../node_modules/core-js/internals/perform.js":
-/*!****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/perform.js ***!
- \****************************************************************************************************/
+/*!*************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/perform.js ***!
+ \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -3012,9 +3049,9 @@ module.exports = function (exec) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/promise-resolve.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/promise-resolve.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/promise-resolve.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3035,9 +3072,9 @@ module.exports = function (C, x) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/redefine-all.js":
-/*!*********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/redefine-all.js ***!
- \*********************************************************************************************************/
+/*!******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/redefine-all.js ***!
+ \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3052,9 +3089,9 @@ module.exports = function (target, src, options) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/redefine.js":
-/*!*****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/redefine.js ***!
- \*****************************************************************************************************/
+/*!**************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/redefine.js ***!
+ \**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3103,9 +3140,9 @@ var TEMPLATE = String(String).split('String');
/***/ }),
/***/ "../../../node_modules/core-js/internals/require-object-coercible.js":
-/*!*********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/require-object-coercible.js ***!
- \*********************************************************************************************************************/
+/*!******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/require-object-coercible.js ***!
+ \******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -3120,9 +3157,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/set-global.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/set-global.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/set-global.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3141,9 +3178,9 @@ module.exports = function (key, value) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/set-species.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/set-species.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/set-species.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3172,9 +3209,9 @@ module.exports = function (CONSTRUCTOR_NAME) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/set-to-string-tag.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/set-to-string-tag.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/set-to-string-tag.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3194,9 +3231,9 @@ module.exports = function (it, TAG, STATIC) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/shared-key.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/shared-key.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/shared-key.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3213,9 +3250,9 @@ module.exports = function (key) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/shared-store.js":
-/*!*********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/shared-store.js ***!
- \*********************************************************************************************************/
+/*!******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/shared-store.js ***!
+ \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3231,9 +3268,9 @@ module.exports = store;
/***/ }),
/***/ "../../../node_modules/core-js/internals/shared.js":
-/*!***************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/shared.js ***!
- \***************************************************************************************************/
+/*!************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/shared.js ***!
+ \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3243,7 +3280,7 @@ var store = __webpack_require__(/*! ../internals/shared-store */ "../../../node_
(module.exports = function (key, value) {
return store[key] || (store[key] = value !== undefined ? value : {});
})('versions', []).push({
- version: '3.10.1',
+ version: '3.15.2',
mode: IS_PURE ? 'pure' : 'global',
copyright: '© 2021 Denis Pushkarev (zloirock.ru)'
});
@@ -3252,9 +3289,9 @@ var store = __webpack_require__(/*! ../internals/shared-store */ "../../../node_
/***/ }),
/***/ "../../../node_modules/core-js/internals/species-constructor.js":
-/*!****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/species-constructor.js ***!
- \****************************************************************************************************************/
+/*!*************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/species-constructor.js ***!
+ \*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3276,9 +3313,9 @@ module.exports = function (O, defaultConstructor) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/string-multibyte.js":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/string-multibyte.js ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/string-multibyte.js ***!
+ \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3314,9 +3351,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/string-trim.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/string-trim.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/string-trim.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3353,9 +3390,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/task.js":
-/*!*************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/task.js ***!
- \*************************************************************************************************/
+/*!**********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/task.js ***!
+ \**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3471,9 +3508,9 @@ module.exports = {
/***/ }),
/***/ "../../../node_modules/core-js/internals/to-absolute-index.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-absolute-index.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/to-absolute-index.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3494,9 +3531,9 @@ module.exports = function (index, length) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/to-indexed-object.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-indexed-object.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/to-indexed-object.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3512,9 +3549,9 @@ module.exports = function (it) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/to-integer.js":
-/*!*******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-integer.js ***!
- \*******************************************************************************************************/
+/*!****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/to-integer.js ***!
+ \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -3531,9 +3568,9 @@ module.exports = function (argument) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/to-length.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-length.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/to-length.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3551,9 +3588,9 @@ module.exports = function (argument) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/to-object.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-object.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/to-object.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3569,9 +3606,9 @@ module.exports = function (argument) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/to-primitive.js":
-/*!*********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-primitive.js ***!
- \*********************************************************************************************************/
+/*!******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/to-primitive.js ***!
+ \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3594,9 +3631,9 @@ module.exports = function (input, PREFERRED_STRING) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/to-string-tag-support.js":
-/*!******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-string-tag-support.js ***!
- \******************************************************************************************************************/
+/*!***************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/to-string-tag-support.js ***!
+ \***************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3613,9 +3650,9 @@ module.exports = String(test) === '[object z]';
/***/ }),
/***/ "../../../node_modules/core-js/internals/uid.js":
-/*!************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/uid.js ***!
- \************************************************************************************************/
+/*!*********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/uid.js ***!
+ \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -3630,9 +3667,9 @@ module.exports = function (key) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/use-symbol-as-uid.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/use-symbol-as-uid.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/use-symbol-as-uid.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3647,9 +3684,9 @@ module.exports = NATIVE_SYMBOL
/***/ }),
/***/ "../../../node_modules/core-js/internals/well-known-symbol.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/well-known-symbol.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/well-known-symbol.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3678,9 +3715,9 @@ module.exports = function (name) {
/***/ }),
/***/ "../../../node_modules/core-js/internals/whitespaces.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/whitespaces.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/internals/whitespaces.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
@@ -3692,9 +3729,9 @@ module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.aggregate-error.js":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.aggregate-error.js ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.aggregate-error.js ***!
+ \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3738,9 +3775,9 @@ $({ global: true }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.array.find.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.array.find.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.array.find.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3771,9 +3808,9 @@ addToUnscopables(FIND);
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.array.from.js":
-/*!********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.array.from.js ***!
- \********************************************************************************************************/
+/*!*****************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.array.from.js ***!
+ \*****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3796,9 +3833,9 @@ $({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.array.iterator.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.array.iterator.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.array.iterator.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3861,9 +3898,9 @@ addToUnscopables('entries');
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.map.js":
-/*!*************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.map.js ***!
- \*************************************************************************************************/
+/*!**********************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.map.js ***!
+ \**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3882,9 +3919,9 @@ module.exports = collection('Map', function (init) {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.number.is-integer.js":
-/*!***************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.is-integer.js ***!
- \***************************************************************************************************************/
+/*!************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.number.is-integer.js ***!
+ \************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3901,9 +3938,9 @@ $({ target: 'Number', stat: true }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.number.is-nan.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.is-nan.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.number.is-nan.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3922,9 +3959,9 @@ $({ target: 'Number', stat: true }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.number.parse-float.js":
-/*!****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.parse-float.js ***!
- \****************************************************************************************************************/
+/*!*************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.number.parse-float.js ***!
+ \*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3942,9 +3979,9 @@ $({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.number.parse-int.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.parse-int.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.number.parse-int.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3962,9 +3999,9 @@ $({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.object.assign.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.assign.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.object.assign.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -3982,9 +4019,9 @@ $({ target: 'Object', stat: true, forced: Object.assign !== assign }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.object.entries.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.entries.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.object.entries.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4003,9 +4040,9 @@ $({ target: 'Object', stat: true }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.object.set-prototype-of.js":
-/*!*********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.set-prototype-of.js ***!
- \*********************************************************************************************************************/
+/*!******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.object.set-prototype-of.js ***!
+ \******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4022,9 +4059,9 @@ $({ target: 'Object', stat: true }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.object.to-string.js":
-/*!**************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.to-string.js ***!
- \**************************************************************************************************************/
+/*!***********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.object.to-string.js ***!
+ \***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4042,9 +4079,9 @@ if (!TO_STRING_TAG_SUPPORT) {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.promise.all-settled.js":
-/*!*****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.all-settled.js ***!
- \*****************************************************************************************************************/
+/*!**************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.all-settled.js ***!
+ \**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4097,9 +4134,9 @@ $({ target: 'Promise', stat: true }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.promise.any.js":
-/*!*********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.any.js ***!
- \*********************************************************************************************************/
+/*!******************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.any.js ***!
+ \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4155,9 +4192,9 @@ $({ target: 'Promise', stat: true }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.promise.finally.js":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.finally.js ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.finally.js ***!
+ \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4194,18 +4231,21 @@ $({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {
}
});
-// patch native Promise.prototype for native async functions
-if (!IS_PURE && typeof NativePromise == 'function' && !NativePromise.prototype['finally']) {
- redefine(NativePromise.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);
+// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`
+if (!IS_PURE && typeof NativePromise == 'function') {
+ var method = getBuiltIn('Promise').prototype['finally'];
+ if (NativePromise.prototype['finally'] !== method) {
+ redefine(NativePromise.prototype, 'finally', method, { unsafe: true });
+ }
}
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.promise.js":
-/*!*****************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.js ***!
- \*****************************************************************************************************/
+/*!**************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.js ***!
+ \**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4218,6 +4258,7 @@ var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../
var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../../node_modules/core-js/internals/native-promise-constructor.js");
var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js");
var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../../node_modules/core-js/internals/redefine-all.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../../node_modules/core-js/internals/object-set-prototype-of.js");
var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../../node_modules/core-js/internals/set-to-string-tag.js");
var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../../node_modules/core-js/internals/set-species.js");
var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js");
@@ -4236,6 +4277,7 @@ var perform = __webpack_require__(/*! ../internals/perform */ "../../../node_mod
var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../../node_modules/core-js/internals/internal-state.js");
var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../../node_modules/core-js/internals/is-forced.js");
var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js");
+var IS_BROWSER = __webpack_require__(/*! ../internals/engine-is-browser */ "../../../node_modules/core-js/internals/engine-is-browser.js");
var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../../node_modules/core-js/internals/engine-is-node.js");
var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../../node_modules/core-js/internals/engine-v8-version.js");
@@ -4244,11 +4286,12 @@ var PROMISE = 'Promise';
var getInternalState = InternalStateModule.get;
var setInternalState = InternalStateModule.set;
var getInternalPromiseState = InternalStateModule.getterFor(PROMISE);
+var NativePromisePrototype = NativePromise && NativePromise.prototype;
var PromiseConstructor = NativePromise;
+var PromiseConstructorPrototype = NativePromisePrototype;
var TypeError = global.TypeError;
var document = global.document;
var process = global.process;
-var $fetch = getBuiltIn('fetch');
var newPromiseCapability = newPromiseCapabilityModule.f;
var newGenericPromiseCapability = newPromiseCapability;
var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);
@@ -4260,32 +4303,33 @@ var FULFILLED = 1;
var REJECTED = 2;
var HANDLED = 1;
var UNHANDLED = 2;
+var SUBCLASSING = false;
var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;
var FORCED = isForced(PROMISE, function () {
- var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);
- if (!GLOBAL_CORE_JS_PROMISE) {
- // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
- // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
- // We can't detect it synchronously, so just check versions
- if (V8_VERSION === 66) return true;
- // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
- if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true;
- }
+ var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);
+ var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);
+ // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+ // We can't detect it synchronously, so just check versions
+ if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;
// We need Promise#finally in the pure version for preventing prototype pollution
- if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;
+ if (IS_PURE && !PromiseConstructorPrototype['finally']) return true;
// We can't use @@species feature detection in V8 since it causes
// deoptimization and performance degradation
// https://github.com/zloirock/core-js/issues/679
- if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;
+ if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;
// Detect correctness of subclassing with @@species support
- var promise = PromiseConstructor.resolve(1);
+ var promise = new PromiseConstructor(function (resolve) { resolve(1); });
var FakePromise = function (exec) {
exec(function () { /* empty */ }, function () { /* empty */ });
};
var constructor = promise.constructor = {};
constructor[SPECIES] = FakePromise;
- return !(promise.then(function () { /* empty */ }) instanceof FakePromise);
+ SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;
+ if (!SUBCLASSING) return true;
+ // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+ return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;
});
var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {
@@ -4449,6 +4493,7 @@ if (FORCED) {
internalReject(state, error);
}
};
+ PromiseConstructorPrototype = PromiseConstructor.prototype;
// eslint-disable-next-line no-unused-vars -- required for `.length`
Internal = function Promise(executor) {
setInternalState(this, {
@@ -4462,7 +4507,7 @@ if (FORCED) {
value: undefined
});
};
- Internal.prototype = redefineAll(PromiseConstructor.prototype, {
+ Internal.prototype = redefineAll(PromiseConstructorPrototype, {
// `Promise.prototype.then` method
// https://tc39.es/ecma262/#sec-promise.prototype.then
then: function then(onFulfilled, onRejected) {
@@ -4495,25 +4540,32 @@ if (FORCED) {
: newGenericPromiseCapability(C);
};
- if (!IS_PURE && typeof NativePromise == 'function') {
- nativeThen = NativePromise.prototype.then;
-
- // wrap native Promise#then for native async functions
- redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {
- var that = this;
- return new PromiseConstructor(function (resolve, reject) {
- nativeThen.call(that, resolve, reject);
- }).then(onFulfilled, onRejected);
- // https://github.com/zloirock/core-js/issues/640
- }, { unsafe: true });
-
- // wrap fetch result
- if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {
- // eslint-disable-next-line no-unused-vars -- required for `.length`
- fetch: function fetch(input /* , init */) {
- return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));
- }
- });
+ if (!IS_PURE && typeof NativePromise == 'function' && NativePromisePrototype !== Object.prototype) {
+ nativeThen = NativePromisePrototype.then;
+
+ if (!SUBCLASSING) {
+ // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs
+ redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {
+ var that = this;
+ return new PromiseConstructor(function (resolve, reject) {
+ nativeThen.call(that, resolve, reject);
+ }).then(onFulfilled, onRejected);
+ // https://github.com/zloirock/core-js/issues/640
+ }, { unsafe: true });
+
+ // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`
+ redefine(NativePromisePrototype, 'catch', PromiseConstructorPrototype['catch'], { unsafe: true });
+ }
+
+ // make `.constructor === Promise` work for native promise-based APIs
+ try {
+ delete NativePromisePrototype.constructor;
+ } catch (error) { /* empty */ }
+
+ // make `instanceof Promise` work for native promise-based APIs
+ if (setPrototypeOf) {
+ setPrototypeOf(NativePromisePrototype, PromiseConstructorPrototype);
+ }
}
}
@@ -4596,9 +4648,9 @@ $({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {
/***/ }),
/***/ "../../../node_modules/core-js/modules/es.string.iterator.js":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.string.iterator.js ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/es.string.iterator.js ***!
+ \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4637,9 +4689,9 @@ defineIterator(String, 'String', function (iterated) {
/***/ }),
/***/ "../../../node_modules/core-js/modules/web.dom-collections.iterator.js":
-/*!***********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/web.dom-collections.iterator.js ***!
- \***********************************************************************************************************************/
+/*!********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/core-js/modules/web.dom-collections.iterator.js ***!
+ \********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4681,9 +4733,9 @@ for (var COLLECTION_NAME in DOMIterables) {
/***/ }),
/***/ "../../../node_modules/guid/guid.js":
-/*!************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/node_modules/guid/guid.js ***!
- \************************************************************************************/
+/*!*********************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/node_modules/guid/guid.js ***!
+ \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4754,7 +4806,7 @@ for (var COLLECTION_NAME in DOMIterables) {
/***/ }),
-/***/ "../../../node_modules/webpack-cli/node_modules/webpack/buildin/global.js":
+/***/ "../../../node_modules/webpack/buildin/global.js":
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
@@ -4786,9 +4838,9 @@ module.exports = g;
/***/ }),
/***/ "../../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js":
-/*!************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/EmbeddingApiExternalContract.js ***!
- \************************************************************************************************************************************/
+/*!*********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/EmbeddingApiExternalContract.js ***!
+ \*********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4802,17 +4854,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
// Export everything from the shared file
__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../../api-external-contract-js/lib/src/SharedApiExternalContract.js"));
__export(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js"));
-__export(__webpack_require__(/*! ./ExternalContract/Embedding/Enums */ "../../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js"));
var Enums_1 = __webpack_require__(/*! ./ExternalContract/Embedding/Enums */ "../../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js");
+exports.DeviceType = Enums_1.DeviceType;
exports.EmbeddingErrorCodes = Enums_1.EmbeddingErrorCodes;
+exports.EmbeddingTableauEventType = Enums_1.TableauEventType;
+exports.Toolbar = Enums_1.Toolbar;
+exports.SheetSizeBehavior = Enums_1.SheetSizeBehavior;
/***/ }),
/***/ "../../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js":
-/*!*************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***!
- \*************************************************************************************************************************************/
+/*!**********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***!
+ \**********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4829,14 +4884,15 @@ var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces
exports.ErrorCodes = Tableau_1.ErrorCodes;
exports.ExtensionContext = Tableau_1.ExtensionContext;
exports.ExtensionMode = Tableau_1.ExtensionMode;
+exports.TableauEventType = Tableau_1.TableauEventType;
/***/ }),
/***/ "../../api-external-contract-js/lib/src/ExternalContract.js":
-/*!************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract.js ***!
- \************************************************************************************************************************/
+/*!*********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract.js ***!
+ \*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4858,9 +4914,9 @@ __export(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../../api-ex
/***/ }),
/***/ "../../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js":
-/*!****************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js ***!
- \****************************************************************************************************************************************/
+/*!*************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js ***!
+ \*************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -4868,9 +4924,11 @@ __export(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../../api-ex
// All enum values made available to Embedding developers.
// Enums should be kept in alphabetical order.
+// Most of them should match an enum on the server defined at
+// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17
Object.defineProperty(exports, "__esModule", { value: true });
/**
- * TODO
+ * device types available to use with @VizInterfaces:VizCreateOptions:device
*/
var DeviceType;
(function (DeviceType) {
@@ -5013,48 +5071,124 @@ var EmbeddingErrorCodes;
*/
EmbeddingErrorCodes["ImplementationError"] = "wrong-implementation";
/**
- * Not implemented yet.
+ * @NotImplemented
*/
EmbeddingErrorCodes["NotImplemented"] = "not-implemented";
+ /**
+ * Unknown error during event initialization
+ */
+ EmbeddingErrorCodes["EventInitializationError"] = "event-initialization-error";
})(EmbeddingErrorCodes = exports.EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = {}));
/**
- * TODO
+ * formats available to use with displayStaticImage in @VizInterfaces
+ */
+var FileFormats;
+(function (FileFormats) {
+ FileFormats["PDF"] = "pdf";
+ FileFormats["PNG"] = "png";
+})(FileFormats = exports.FileFormats || (exports.FileFormats = {}));
+var RevertVizSelection;
+(function (RevertVizSelection) {
+ RevertVizSelection["All"] = "all";
+ RevertVizSelection["Axes"] = "axes";
+ RevertVizSelection["Filters"] = "filters";
+ RevertVizSelection["Sorts"] = "sorts";
+ RevertVizSelection["Shelves"] = "shelves";
+})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {}));
+var ToolbarButtons;
+(function (ToolbarButtons) {
+ ToolbarButtons["Alerts"] = "alerts";
+ ToolbarButtons["AskData"] = "askData";
+ ToolbarButtons["CustomViews"] = "customViews";
+ ToolbarButtons["DataDetails"] = "dataDetails";
+ ToolbarButtons["Share"] = "share";
+ ToolbarButtons["Subscribe"] = "subscribe";
+})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {}));
+var Toolbar;
+(function (Toolbar) {
+ Toolbar["Top"] = "top";
+ Toolbar["Bottom"] = "bottom";
+ Toolbar["Hidden"] = "hidden";
+})(Toolbar = exports.Toolbar || (exports.Toolbar = {}));
+var SheetSizeBehavior;
+(function (SheetSizeBehavior) {
+ SheetSizeBehavior["Automatic"] = "automatic";
+ SheetSizeBehavior["Exactly"] = "exactly";
+ SheetSizeBehavior["Range"] = "range";
+ SheetSizeBehavior["AtLeast"] = "atleast";
+ SheetSizeBehavior["AtMost"] = "atmost";
+})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {}));
+/**
+ * Be careful when adding new event types. Extensions and embedding follow two different patterns on how events are named.
+ * Events should be all lower case and without hypens or underscores.
+ */
+/**
+ * Represents the type of tableau embedding event that can be listened for.
*/
-var ToolbarPosition;
-(function (ToolbarPosition) {
- ToolbarPosition["Top"] = "top";
- ToolbarPosition["Bottom"] = "bottom";
-})(ToolbarPosition = exports.ToolbarPosition || (exports.ToolbarPosition = {}));
+var TableauEventType;
+(function (TableauEventType) {
+ /** Raised when any filter has changed state. You can use this event type with TableauViz objects.*/
+ TableauEventType["FilterChanged"] = "filterchanged";
+ /** The selected marks on a visualization has changed. You can use this event type with TableauViz objects.*/
+ TableauEventType["MarkSelectionChanged"] = "markselectionchanged";
+ /** Fired when viz size is known */
+ TableauEventType["FirstVizSizeKnown"] = "firstvizsizeknown";
+ /** Fired when a viz first becomes interactive */
+ TableauEventType["FirstInteractive"] = "firstinteractive";
+})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {}));
/***/ }),
/***/ "../../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js":
-/*!************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js ***!
- \************************************************************************************************************************************************/
+/*!*********************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js ***!
+ \*********************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-var SheetSizeBehavior;
-(function (SheetSizeBehavior) {
- SheetSizeBehavior["Automatic"] = "automatic";
- SheetSizeBehavior["Exactly"] = "exactly";
- SheetSizeBehavior["Range"] = "range";
- SheetSizeBehavior["AtLeast"] = "atleast";
- SheetSizeBehavior["AtMost"] = "atmost";
-})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {}));
+/**
+ * All the string constants used as attribute names in html
+ */
+var VizAttributes;
+(function (VizAttributes) {
+ VizAttributes["Src"] = "src";
+ VizAttributes["Width"] = "width";
+ VizAttributes["Height"] = "height";
+ VizAttributes["DisableUrlActionsPopups"] = "disable-url-actions";
+ VizAttributes["HideTabs"] = "hide-tabs";
+ VizAttributes["Toolbar"] = "toolbar";
+ VizAttributes["InstanceIdToClone"] = "instance-id-to-clone";
+ VizAttributes["Device"] = "device";
+ VizAttributes["Token"] = "token";
+ VizAttributes["TouchOptimize"] = "touch-optimize";
+ VizAttributes["Debug"] = "debug";
+})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {}));
+/**
+ * String constants used as child tags in html
+ */
+var VizChildElements;
+(function (VizChildElements) {
+ VizChildElements["VizFilter"] = "viz-filter";
+ VizChildElements["CustomParameter"] = "custom-parameter";
+})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {}));
+var VizChildElementAttributes;
+(function (VizChildElementAttributes) {
+ VizChildElementAttributes["Field"] = "field";
+ VizChildElementAttributes["Value"] = "value";
+ VizChildElementAttributes["Name"] = "name";
+})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {}));
/***/ }),
/***/ "../../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js":
-/*!******************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js ***!
- \******************************************************************************************************************************************************/
+/*!***************************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js ***!
+ \***************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -5138,6 +5272,25 @@ var Tableau;
ExtensionMode["Authoring"] = "authoring";
ExtensionMode["Viewing"] = "viewing";
})(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {}));
+ /**
+ * Represents the type of event that can be listened for.
+ */
+ var TableauEventType;
+ (function (TableauEventType) {
+ /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/
+ TableauEventType["FilterChanged"] = "filter-changed";
+ /** The selected marks on a visualization has changed.
+ * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */
+ TableauEventType["MarkSelectionChanged"] = "mark-selection-changed";
+ /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */
+ TableauEventType["ParameterChanged"] = "parameter-changed";
+ /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */
+ TableauEventType["SettingsChanged"] = "settings-changed";
+ /** The dashboard layout has changed */
+ TableauEventType["DashboardLayoutChanged"] = "dashboard-layout-changed";
+ /** The dashboard layout has changed */
+ TableauEventType["WorkbookFormattingChanged"] = "workbook-formatting-changed";
+ })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {}));
})(Tableau || (Tableau = {}));
module.exports = Tableau;
@@ -5145,14 +5298,25 @@ module.exports = Tableau;
/***/ }),
/***/ "../../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js":
-/*!**************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***!
- \**************************************************************************************************************************************************/
+/*!***********************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***!
+ \***********************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
+var __assign = (this && this.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
/**
* The tableau namespace exists for organization and to avoid polluting
* the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations.
@@ -5170,6 +5334,14 @@ var Tableau;
ColumnType["Discrete"] = "discrete";
ColumnType["Continuous"] = "continuous";
})(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {}));
+ var ClassNameKey;
+ (function (ClassNameKey) {
+ ClassNameKey["WorksheetTitle"] = "tableau-worksheet-title";
+ ClassNameKey["Worksheet"] = "tableau-worksheet";
+ ClassNameKey["Tooltip"] = "tableau-tooltip";
+ ClassNameKey["StoryTitle"] = "tableau-story-title";
+ ClassNameKey["DashboardTitle"] = "tableau-dashboard-title";
+ })(ClassNameKey = Tableau.ClassNameKey || (Tableau.ClassNameKey = {}));
/**
* What the object represents in a dashboard.
*/
@@ -5187,6 +5359,17 @@ var Tableau;
DashboardObjectType["WebPage"] = "web-page";
DashboardObjectType["Extension"] = "extension";
})(DashboardObjectType = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {}));
+ /**
+ * Enum that represents the visibility state of a dashboard object.
+ * @since 1.7.0
+ */
+ var DashboardObjectVisibilityType;
+ (function (DashboardObjectVisibilityType) {
+ /** Used for turning on the visibility of a dashboard object.*/
+ DashboardObjectVisibilityType["Show"] = "show";
+ /** Used for turning off the visibility of a dashboard object.*/
+ DashboardObjectVisibilityType["Hide"] = "hide";
+ })(DashboardObjectVisibilityType = Tableau.DashboardObjectVisibilityType || (Tableau.DashboardObjectVisibilityType = {}));
/**
* The different types of data a value can have
*/
@@ -5200,6 +5383,26 @@ var Tableau;
DataType["DateTime"] = "date-time";
DataType["Spatial"] = "spatial";
})(DataType = Tableau.DataType || (Tableau.DataType = {}));
+ /**
+ * Enum that represents the changes that occur to a dashboard object.
+ */
+ var DashboardLayoutChange;
+ (function (DashboardLayoutChange) {
+ /** A dashboard object was added */
+ DashboardLayoutChange["Added"] = "added";
+ /** A dashboard object was removed */
+ DashboardLayoutChange["Removed"] = "removed";
+ /** A dashboard object's floating state changed */
+ DashboardLayoutChange["IsFloatingChanged"] = "is-floating-changed";
+ /** A dashboard object's visibility changed */
+ DashboardLayoutChange["IsVisibleChanged"] = "is-visible-changed";
+ /** A dashboard object's position changed */
+ DashboardLayoutChange["PositionChanged"] = "position-changed";
+ /** A dashboard object's size changed */
+ DashboardLayoutChange["SizeChanged"] = "size-changed";
+ /** A dashboard object was renamed */
+ DashboardLayoutChange["NameChanged"] = "name-changed";
+ })(DashboardLayoutChange = Tableau.DashboardLayoutChange || (Tableau.DashboardLayoutChange = {}));
/**
* Valid date ranges for a relative date filter.
*/
@@ -5424,25 +5627,6 @@ var Tableau;
SortDirection["Increasing"] = "increasing";
SortDirection["Decreasing"] = "decreasing";
})(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {}));
- /**
- * Represents the type of event that can be listened for.
- */
- var TableauEventType;
- (function (TableauEventType) {
- /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/
- TableauEventType["FilterChanged"] = "filter-changed";
- /** The selected marks on a visualization has changed.
- * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */
- TableauEventType["MarkSelectionChanged"] = "mark-selection-changed";
- /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */
- TableauEventType["ParameterChanged"] = "parameter-changed";
- /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */
- TableauEventType["SettingsChanged"] = "settings-changed";
- /** Fired when viz size is known when embedded */
- TableauEventType["FirstVizSizeKnown"] = "first-viz-size-known";
- /** Fired when a viz first becomes interactive when embedded */
- TableauEventType["FirstInteractive"] = "first-interactive";
- })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {}));
var TrendLineModelType;
(function (TrendLineModelType) {
TrendLineModelType["Linear"] = "linear";
@@ -5451,16 +5635,18 @@ var Tableau;
TrendLineModelType["Polynomial"] = "polynomial";
})(TrendLineModelType = Tableau.TrendLineModelType || (Tableau.TrendLineModelType = {}));
/**
- * Enum that represents the visibility state of a zone.
- * @since 1.1.0
- */
- var ZoneVisibilityType;
- (function (ZoneVisibilityType) {
- /** Used for turning on the visibility of a zone in the dashboard.*/
- ZoneVisibilityType["Show"] = "show";
- /** Used for turning off the visibility of a zone in the dashboard.*/
- ZoneVisibilityType["Hide"] = "hide";
- })(ZoneVisibilityType = Tableau.ZoneVisibilityType || (Tableau.ZoneVisibilityType = {}));
+ * Enum that represents the replay speed of an animation.
+ * @since 1.7.0
+ */
+ var ReplaySpeedType;
+ (function (ReplaySpeedType) {
+ /** Used for setting the replay speed of an animation to 0.5x.*/
+ ReplaySpeedType["Slow"] = "slow";
+ /** Used for setting the replay speed of an animation to 1.0x.*/
+ ReplaySpeedType["Normal"] = "normal";
+ /** Used for setting the replay speed of an animation to 2.0x.*/
+ ReplaySpeedType["Fast"] = "fast";
+ })(ReplaySpeedType = Tableau.ReplaySpeedType || (Tableau.ReplaySpeedType = {}));
/**
* Enum that represents the data type of encodings for createVizImageAsync.
* @since 1.6.0
@@ -5470,6 +5656,7 @@ var Tableau;
VizImageEncodingType["Discrete"] = "discrete";
VizImageEncodingType["Continuous"] = "continuous";
})(VizImageEncodingType = Tableau.VizImageEncodingType || (Tableau.VizImageEncodingType = {}));
+ Tableau.ZoneVisibilityType = __assign({}, DashboardObjectVisibilityType);
})(Tableau || (Tableau = {}));
module.exports = Tableau;
@@ -5477,20 +5664,23 @@ module.exports = Tableau;
/***/ }),
/***/ "../../api-external-contract-js/lib/src/SharedApiExternalContract.js":
-/*!*********************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/SharedApiExternalContract.js ***!
- \*********************************************************************************************************************************/
+/*!******************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-external-contract-js/lib/src/SharedApiExternalContract.js ***!
+ \******************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-// This file re-exports everything which is part of the shared embedding api public interface
+// This file re-exports everything which is part of the shared api public interface
Object.defineProperty(exports, "__esModule", { value: true });
var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Shared/Namespaces/Tableau */ "../../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js");
exports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType;
+exports.ClassNameKey = Tableau_1.ClassNameKey;
exports.ColumnType = Tableau_1.ColumnType;
+exports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange;
exports.DashboardObjectType = Tableau_1.DashboardObjectType;
+exports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType;
exports.DataType = Tableau_1.DataType;
exports.DateRangeType = Tableau_1.DateRangeType;
exports.EncodingType = Tableau_1.EncodingType;
@@ -5505,10 +5695,10 @@ exports.MarkType = Tableau_1.MarkType;
exports.ParameterValueType = Tableau_1.ParameterValueType;
exports.PeriodType = Tableau_1.PeriodType;
exports.QuickTableCalcType = Tableau_1.QuickTableCalcType;
+exports.ReplaySpeedType = Tableau_1.ReplaySpeedType;
exports.SelectionUpdateType = Tableau_1.SelectionUpdateType;
exports.SheetType = Tableau_1.SheetType;
exports.SortDirection = Tableau_1.SortDirection;
-exports.TableauEventType = Tableau_1.TableauEventType;
exports.TrendLineModelType = Tableau_1.TrendLineModelType;
exports.VizImageEncodingType = Tableau_1.VizImageEncodingType;
exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType;
@@ -5517,20 +5707,20 @@ exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType;
/***/ }),
/***/ "../../api-internal-contract-js/lib/package.json":
-/*!*************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/package.json ***!
- \*************************************************************************************************************/
+/*!**********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/package.json ***!
+ \**********************************************************************************************/
/*! exports provided: name, version, description, repository, license, main, typings, scripts, resolutions, dependencies, devDependencies, peerDependencies, publishConfig, default */
/***/ (function(module) {
-module.exports = JSON.parse("{\"name\":\"@tableau/api-internal-contract-js\",\"version\":\"1.47.0\",\"description\":\"The API contract between Tableau and our external client.\",\"repository\":\"https://gitlab.tableausoftware.com/browser-clients/api-internal-contract-js.git\",\"license\":\"UNLICENSED\",\"main\":\"./lib/src/JsApiInternalContract.js\",\"typings\":\"./lib/src/JsApiInternalContract.d.ts\",\"scripts\":{\":check-audit-precommit\":\"yarn auditor checkPrecommit\",\":check-audit-scheduled\":\"yarn auditor checkScheduled\",\"build\":\"cd ../.. && yarn build\",\"dev\":\"cd ../.. && yarn dev\",\":build\":\"yarn compile && yarn coverage\",\"build-and-maybe-publish\":\"yarn build && yarn publish-if-new\",\"check-if-published\":\"yarn gitlab-tools checkIfVersionPublished -d .\",\":publish:bump\":\"echo \\\"bumping internal-contract\\\" && yarn config set version-tag-prefix \\\"internal_contract_v\\\" && yarn version --minor\",\"compile\":\"module-dev-scripts compile\",\"compile-watch\":\"module-dev-scripts compile -w\",\"coverage\":\"module-dev-scripts test --coverage\",\"publish-if-new\":\"yarn gitlab-tools publish -d .\",\"test\":\"module-dev-scripts test --browsers browserstack_chrome,browserstack_firefox,browserstack_ie,browserstack_safari,browserstack_edge\",\"test-dev\":\"module-dev-scripts test --dev\",\"yarn-install\":\"yarn install --frozen-lockfile --mutex network\"},\"resolutions\":{\"@tableau/module-dev-scripts/**/chokidar\":\"^3.0.1\",\"**/yargs/y18n\":\"^5\"},\"dependencies\":{\"guid\":\"0.0.12\"},\"devDependencies\":{\"@tableau-api-internal-contract-js_v0\":\"npm:@tableau/api-internal-contract-js@^0\",\"@tableau/auditor\":\"^1.7.0\",\"@tableau/gitlab-tools\":\"^3.4.0\",\"@tableau/module-dev-scripts\":\"^26.1.0\",\"@tableau/tslint-defaults\":\"^3.0.0\",\"@types/guid\":\"1.0.0\",\"colors\":\"1.4.0\",\"core-js\":\"^3.6.5\",\"tslint\":\"^6.1.2\",\"typescript\":\"3.7.2\"},\"peerDependencies\":{\"core-js\":\"^2.5.7\"},\"publishConfig\":{\"registry\":\"https://artifactory.prod.tableautools.com/artifactory/api/npm/tab-npm-local\"}}");
+module.exports = JSON.parse("{\"name\":\"@tableau/api-internal-contract-js\",\"version\":\"1.69.0\",\"description\":\"The API contract between Tableau and our external client.\",\"repository\":\"https://gitlab.tableausoftware.com/browser-clients/api-internal-contract-js.git\",\"license\":\"UNLICENSED\",\"main\":\"./lib/src/JsApiInternalContract.js\",\"typings\":\"./lib/src/JsApiInternalContract.d.ts\",\"scripts\":{\":check-audit-precommit\":\"yarn auditor checkPrecommit\",\":check-audit-scheduled\":\"yarn auditor checkScheduled\",\"build\":\"cd ../.. && yarn build\",\"dev\":\"cd ../.. && yarn dev\",\":build\":\"yarn compile\",\":test\":\"yarn coverage\",\":check-if-published\":\"yarn gitlab-tools checkIfVersionPublished -d .\",\":publish-if-new\":\"yarn gitlab-tools publish -d .\",\":publish:bump\":\"echo \\\"bumping internal-contract\\\" && yarn version --minor --no-git-tag-version\",\"compile\":\"module-dev-scripts compile\",\"compile-watch\":\"module-dev-scripts compile -w\",\"coverage\":\"module-dev-scripts test --coverage\",\"test\":\"module-dev-scripts test --browsers browserstack_chrome,browserstack_firefox,browserstack_ie,browserstack_safari,browserstack_edge\",\"test-dev\":\"module-dev-scripts test --dev\",\"yarn-install\":\"yarn install --frozen-lockfile --mutex network\"},\"resolutions\":{\"@tableau/module-dev-scripts/**/chokidar\":\"^3.0.1\",\"**/yargs/y18n\":\"^5\"},\"dependencies\":{\"guid\":\"0.0.12\"},\"devDependencies\":{\"@tableau-api-internal-contract-js_v0\":\"npm:@tableau/api-internal-contract-js@^0\",\"@tableau/auditor\":\"^1.7.0\",\"@tableau/gitlab-tools\":\"^4.1.0\",\"@tableau/module-dev-scripts\":\"^26.1.0\",\"@tableau/tslint-defaults\":\"^3.0.0\",\"@types/guid\":\"1.0.0\",\"colors\":\"1.4.0\",\"core-js\":\"^3.6.5\",\"tslint\":\"^6.1.2\",\"typescript\":\"3.7.2\"},\"peerDependencies\":{\"core-js\":\"^2.5.7\"},\"publishConfig\":{\"registry\":\"https://artifactory.prod.tableautools.com/artifactory/api/npm/tab-npm-local\"}}");
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js":
-/*!*****************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/JsApiInternalContract.js ***!
- \*****************************************************************************************************************************/
+/*!**************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/JsApiInternalContract.js ***!
+ \**************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -5554,6 +5744,7 @@ __export(__webpack_require__(/*! ./contract/DataTypeConverter */ "../../api-inte
__export(__webpack_require__(/*! ./contract/Notifications */ "../../api-internal-contract-js/lib/src/contract/Notifications.js"));
__export(__webpack_require__(/*! ./contract/Parameters */ "../../api-internal-contract-js/lib/src/contract/Parameters.js"));
__export(__webpack_require__(/*! ./contract/Verbs */ "../../api-internal-contract-js/lib/src/contract/Verbs.js"));
+__export(__webpack_require__(/*! ./interface/VqlInterface */ "../../api-internal-contract-js/lib/src/interface/VqlInterface.js"));
__export(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"));
__export(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js"));
__export(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"));
@@ -5591,9 +5782,9 @@ exports.MESSAGING_VERSION = {
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/contract/DataTypeConverter.js":
-/*!**********************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/DataTypeConverter.js ***!
- \**********************************************************************************************************************************/
+/*!*******************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/DataTypeConverter.js ***!
+ \*******************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -5726,9 +5917,9 @@ exports.DataTypeConverter = DataTypeConverter;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/contract/Enums.js":
-/*!**********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Enums.js ***!
- \**********************************************************************************************************************/
+/*!*******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Enums.js ***!
+ \*******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -5999,9 +6190,9 @@ var ApiShowDataTableFormat;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/contract/Notifications.js":
-/*!******************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Notifications.js ***!
- \******************************************************************************************************************************/
+/*!***************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Notifications.js ***!
+ \***************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6019,15 +6210,17 @@ var NotificationId;
NotificationId["TestConversionNotification"] = "test-conversion-notification";
NotificationId["FirstVizSizeKnown"] = "first-viz-size-known";
NotificationId["VizInteractive"] = "viz-interactive";
+ NotificationId["WorkbookFormattingChanged"] = "workbook-formatting-changed";
+ NotificationId["DashboardLayoutChanged"] = "dashboard-layout-changed";
})(NotificationId = exports.NotificationId || (exports.NotificationId = {}));
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/contract/Parameters.js":
-/*!***************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Parameters.js ***!
- \***************************************************************************************************************************/
+/*!************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Parameters.js ***!
+ \************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6039,6 +6232,7 @@ var ParameterId;
ParameterId["ExtensionLocator"] = "extension-locator";
ParameterId["ExtensionBootstrapInfo"] = "extension-bootstrap-info";
ParameterId["ExtensionSettingsInfo"] = "extension-settings-info";
+ ParameterId["ExtensionZoneId"] = "extension-zone-id";
ParameterId["VisualId"] = "visual-id";
ParameterId["SheetPath"] = "sheet-path";
ParameterId["ColumnsToIncludeById"] = "columns-to-include-by-id";
@@ -6099,20 +6293,25 @@ var ParameterId;
ParameterId["TestConversionParameter"] = "test-conversion-parameter";
ParameterId["Dashboard"] = "dashboard";
ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map";
+ ParameterId["DashboardObjectPositionAndSizeUpdate"] = "dashboard-object-position-and-size-update";
+ ParameterId["DashboardObjectPositionAndSizeUpdateList"] = "dashboard-object-position-and-size-update-list";
+ ParameterId["ReplaySpeed"] = "replay-speed";
+ ParameterId["ClickThroughEnabled"] = "click-through-enabled";
ParameterId["LogicalTableInfoList"] = "logical-table-info-list";
ParameterId["LogicalTableId"] = "logical-table-id";
ParameterId["VizAPIInputJson"] = "vizapi-input-json";
ParameterId["VizAPISVG"] = "vizapi-svg";
ParameterId["FunctionName"] = "function-name";
+ ParameterId["FontNameListItems"] = "font-name-list-items";
})(ParameterId = exports.ParameterId || (exports.ParameterId = {}));
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/contract/Verbs.js":
-/*!**********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Verbs.js ***!
- \**********************************************************************************************************************/
+/*!*******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Verbs.js ***!
+ \*******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6148,26 +6347,319 @@ var VerbId;
VerbId["GetConnectionDescriptionSummaries"] = "get-connection-description-summaries";
VerbId["DisplayDialog"] = "display-dialog";
VerbId["CloseDialog"] = "close-dialog";
+ VerbId["SetClickThrough"] = "set-click-through";
VerbId["TestConversionVerb"] = "test-conversion-verb";
VerbId["GetField"] = "get-field";
VerbId["GetDataSource"] = "get-datasource";
VerbId["GetActiveTables"] = "get-active-tables";
VerbId["SetZoneVisibility"] = "set-zone-visibility";
+ VerbId["MoveAndResizeZones"] = "move-and-resize-zones";
+ VerbId["ReplayAnimation"] = "replay-animation";
VerbId["BlockExtension"] = "block-extension";
VerbId["GetLogicalTables"] = "get-logical-tables";
VerbId["GetLogicalTableData"] = "get-logical-table-data";
VerbId["GetUnderlyingTableData"] = "get-underlying-table-data";
VerbId["GetUnderlyingTables"] = "get-underlying-tables";
VerbId["VizAPI"] = "viz-api";
+ VerbId["GetFonts"] = "get-fonts";
})(VerbId = exports.VerbId || (exports.VerbId = {}));
+/***/ }),
+
+/***/ "../../api-internal-contract-js/lib/src/interface/VqlInterface.js":
+/*!***************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/interface/VqlInterface.js ***!
+ \***************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+/**
+ * These strings were *manually copied* from the server,
+ * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/
+ * controller/vizql/constants/ParameterKeys.java#L9
+ * should be exported instead
+ * parameters that vizql will accept in an embedding URL
+ **/
+var VqlParameterNames;
+(function (VqlParameterNames) {
+ VqlParameterNames["ONE"] = "1";
+ VqlParameterNames["ALERTS"] = ":alerts";
+ VqlParameterNames["ALIAS"] = "alias";
+ VqlParameterNames["ALLOW_DEFERRED_BOOTSTRAP"] = ":allowDeferredBootstrap";
+ VqlParameterNames["ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS"] = "allowAutogenWorksheetPhoneLayouts";
+ VqlParameterNames["API_ID"] = ":apiID";
+ VqlParameterNames["APP"] = ":app";
+ VqlParameterNames["ATTACHMENT"] = "attachment";
+ VqlParameterNames["IS_IPAD_APP"] = "app";
+ VqlParameterNames["ANIMATE_TRANSITION"] = ":animate_transition";
+ VqlParameterNames["ASCENDING"] = "ascending";
+ VqlParameterNames["AUTHENTICATION"] = "authentication";
+ VqlParameterNames["ATTRIBUTES"] = "attributes";
+ VqlParameterNames["AUTHORING_SHEET"] = ":authSheet";
+ VqlParameterNames["AXIS"] = "axis";
+ VqlParameterNames["BOOTSTRAP_WHEN_NOTIFIED"] = ":bootstrapWhenNotified";
+ VqlParameterNames["BROWSER_BACK_BUTTON_UNDO"] = ":browserBackButtonUndo";
+ VqlParameterNames["BROWSER_RENDERING_ON"] = "isBrowserRendering";
+ VqlParameterNames["BROWSER_RENDERING_THRESHOLD"] = "browserRenderingThreshold";
+ VqlParameterNames["CHARSET"] = "charset";
+ VqlParameterNames["CLIENT_DIMENSION"] = "clientDimension";
+ VqlParameterNames["CLIENT_IP"] = "client_ip";
+ VqlParameterNames["CLIENT_NUM"] = "clientNum";
+ VqlParameterNames["COLON_EMBEDDED"] = ":embedded";
+ VqlParameterNames["COLON_MOBILE"] = ":mobile";
+ VqlParameterNames["COLON_DEEP_LINKING_DISABLED"] = ":deepLinkingDisabled";
+ VqlParameterNames["COLON_WATERMARK"] = ":watermark";
+ VqlParameterNames["COMMENTS"] = ":comments";
+ VqlParameterNames["COMMENTING_ENABLED"] = ":commentingEnabled";
+ VqlParameterNames["COMMENTING_MENTIONS_ENABLED"] = ":commentingMentions";
+ VqlParameterNames["CONNECTION"] = "connection";
+ VqlParameterNames["CREATED_BY_FEATURE"] = "createdByFeature";
+ VqlParameterNames["CRYPTED_PASSWORD"] = "crypted";
+ VqlParameterNames["CSSDEBUG"] = ":cssdebug";
+ VqlParameterNames["CSV"] = "csv";
+ VqlParameterNames["CUSTOM_VIEWS"] = ":customViews";
+ VqlParameterNames["CV"] = ":cv";
+ VqlParameterNames["CV_ID"] = "cvId";
+ VqlParameterNames["DASHBOARD_PORT_SIZE"] = "dashboardPortSize";
+ VqlParameterNames["DATA_DETAILS"] = ":dataDetails";
+ VqlParameterNames["DATASOURCE"] = "datasource";
+ VqlParameterNames["DEBUG"] = ":debug";
+ VqlParameterNames["DELAY"] = ":delay";
+ VqlParameterNames["DEPTH"] = "depth";
+ VqlParameterNames["DEVICE_TYPE"] = ":device";
+ VqlParameterNames["DEVICE_PIXEL_RATIO"] = "devicePixelRatio";
+ VqlParameterNames["DEVICE_PREVIEW_MODE"] = ":devicepreviewmode";
+ VqlParameterNames["DIMENSIONS"] = ":dimensions";
+ VqlParameterNames["DISABLE_SHARED_SESSIONS"] = ":disable_shared_sessions";
+ VqlParameterNames["DISABLE_URL_ACTIONS_POPUPS"] = ":disableUrlActionsPopups";
+ VqlParameterNames["DIRECTION"] = "direction";
+ VqlParameterNames["DISPLAY_OVERLAY"] = ":display_overlay";
+ VqlParameterNames["DISPLAY_SHARE"] = ":display_share";
+ VqlParameterNames["DISPLAY_SPINNER"] = ":display_spinner";
+ VqlParameterNames["DISPLAY_STATIC_IMAGE"] = ":display_static_image";
+ VqlParameterNames["DISPLAY_TABS"] = "display_tabs";
+ VqlParameterNames["DISPLAY_VIEW_COUNT"] = ":display_count";
+ VqlParameterNames["IGNORE_STICKY_SESSION"] = ":ignore_sticky_session";
+ VqlParameterNames["INCREMENT_VIEW_COUNT"] = ":increment_view_count";
+ VqlParameterNames["DOCMODE"] = "docmode";
+ VqlParameterNames["DOMAIN"] = "domain";
+ VqlParameterNames["DO_WORK"] = "do_work";
+ VqlParameterNames["DX"] = "dx";
+ VqlParameterNames["DY"] = "dy";
+ VqlParameterNames["EDIT_DATA_ALERT"] = ":editDataAlert";
+ VqlParameterNames["EMBED"] = ":embed";
+ VqlParameterNames["EMBEDDED"] = "embedded";
+ VqlParameterNames["ENCRYPTED"] = "encrypted";
+ VqlParameterNames["EMBEDDING_V3"] = ":embeddingV3";
+ VqlParameterNames["API_EXTERNAL_VERSION"] = ":apiExternalVersion";
+ VqlParameterNames["API_INTERNAL_VERSION"] = ":apiInternalVersion";
+ VqlParameterNames["EXCLUDE"] = "exclude";
+ VqlParameterNames["EXPORT_FORMAT"] = ":export_format";
+ VqlParameterNames["FIELDNAME"] = "fieldname";
+ VqlParameterNames["FIELD_NAME"] = "field_name";
+ VqlParameterNames["FIELD_SEP"] = "field_sep";
+ VqlParameterNames["FILE"] = "file";
+ VqlParameterNames["FILTER_TILE_SIZE"] = "filterTileSize";
+ VqlParameterNames["FN"] = "fn";
+ VqlParameterNames["FOCUS"] = "focus";
+ VqlParameterNames["FORCE_CACHE"] = "force_cache";
+ VqlParameterNames["FORMAT"] = "format";
+ VqlParameterNames["FORMAT_DATA_VALUE_LOCALLY"] = "formatDataValueLocally";
+ VqlParameterNames["FROM_WG"] = ":from_wg";
+ VqlParameterNames["GRAPHQL_DATABASE_ID"] = ":graphQLDatabaseId";
+ VqlParameterNames["GRAPHQL_TABLE_ID"] = ":graphQLTableId";
+ VqlParameterNames["GUID"] = ":guid";
+ VqlParameterNames["H"] = "h";
+ VqlParameterNames["HIGH_DPI"] = ":highdpi";
+ VqlParameterNames["HIDDEN"] = "hidden";
+ VqlParameterNames["IMAGE_SIZE_LIMIT"] = "imageSizeLimit";
+ VqlParameterNames["TRANSPARENT_LINE_MARKS_LIMIT"] = "transparentLineMarkLimit";
+ VqlParameterNames["CLIENT_RENDER_PIXEL_LIMIT"] = "clientRenderPixelLimit";
+ VqlParameterNames["IN"] = "in";
+ VqlParameterNames["INSTANCE_ID"] = ":iid";
+ VqlParameterNames["IS_GUEST_REDIRECT_FROM_VIZPORTAL"] = ":isGuestRedirectFromVizportal";
+ VqlParameterNames["IS_MARK_ANIMATION_ENABLED"] = "isMarkAnimationEnabled";
+ VqlParameterNames["IS_VIZPORTAL"] = ":isVizPortal";
+ VqlParameterNames["INPUT_"] = "input_string";
+ VqlParameterNames["JSDEBUG"] = ":jsdebug";
+ VqlParameterNames["JSON"] = "json";
+ VqlParameterNames["JSON_ONLY"] = ":jsonOnly";
+ VqlParameterNames["KEEPFILE"] = "keepfile";
+ VqlParameterNames["KEY"] = "key";
+ VqlParameterNames["LANGUAGE"] = "language";
+ VqlParameterNames["LANGUAGE_REQUESTED"] = ":language";
+ VqlParameterNames["LINKTARGET"] = ":linktarget";
+ VqlParameterNames["LOAD_ORDER_ID"] = ":loadOrderID";
+ VqlParameterNames["LOAD_NEWEST_REVISION"] = ":loadNewestRevision";
+ VqlParameterNames["LOCAL_PATHS"] = ":localPaths";
+ VqlParameterNames["LOCALE"] = "locale";
+ VqlParameterNames["LOCATION_ID"] = "locationid";
+ VqlParameterNames["LOCATION_TYPE"] = "locationtype";
+ VqlParameterNames["WORKBOOK_LOCALE"] = "workbookLocale";
+ VqlParameterNames["MAXROWS"] = "maxrows";
+ VqlParameterNames["MAX_AGE"] = "maxAge";
+ VqlParameterNames["MAX_ROWS"] = "maxRows";
+ VqlParameterNames["METHOD"] = "method";
+ VqlParameterNames["MOBILE"] = "mobile";
+ VqlParameterNames["MODIFIER"] = "modifier";
+ VqlParameterNames["NAME"] = "name";
+ VqlParameterNames["NAV_TYPE"] = "navType";
+ VqlParameterNames["NAV_SRC"] = "navSrc";
+ VqlParameterNames["NOATTACHMENT"] = "no-attachment";
+ VqlParameterNames["NO_OVERWRITE"] = "no_overwrite";
+ VqlParameterNames["OPEN_AUTHORING_IN_TOP_WINDOW"] = ":openAuthoringInTopWindow";
+ VqlParameterNames["OPENID_HD"] = ":openid_hd";
+ VqlParameterNames["OPENID_LOGIN_HINT"] = ":openid_login_hint";
+ VqlParameterNames["OAUTHREQUEST"] = "oauthrequest";
+ VqlParameterNames["OAUTH_CREDENTIAL_IDS"] = "oauth_credential_ids";
+ VqlParameterNames["OFFLINE_MODE"] = ":offlinemode";
+ VqlParameterNames["ORIGIN"] = ":origin";
+ VqlParameterNames["OVERLAY"] = ":overlay";
+ VqlParameterNames["P"] = "p";
+ VqlParameterNames["PATH"] = "path";
+ VqlParameterNames["PANE_RESOLVER_X"] = "paneResolverX";
+ VqlParameterNames["PANE_RESOLVER_Y"] = "paneResolverY";
+ VqlParameterNames["PARAM"] = "param";
+ VqlParameterNames["PARENT_ID"] = "parent_id";
+ VqlParameterNames["PASSWORD"] = "password";
+ VqlParameterNames["PATTERN"] = "pattern";
+ VqlParameterNames["PIXEL_RATIO"] = ":pixelratio";
+ VqlParameterNames["PREFIX"] = ":prefix";
+ VqlParameterNames["PREVIEW"] = ":preview";
+ VqlParameterNames["PRIMARY_CONTENT_URL"] = "primary_content_url";
+ VqlParameterNames["PROJECT"] = "project";
+ VqlParameterNames["PROTOCOL"] = "protocol";
+ VqlParameterNames["PSEUDO"] = ":pseudo";
+ VqlParameterNames["QUERY"] = "query";
+ VqlParameterNames["R"] = "r";
+ VqlParameterNames["RANGE_TYPE"] = "range_type";
+ VqlParameterNames["RECORD_SEP"] = "record_sep";
+ VqlParameterNames["RECORD_CLIENT_PERFORMANCE"] = ":record_client_performance";
+ VqlParameterNames["RECORD_PERFORMANCE"] = ":record_performance";
+ VqlParameterNames["RECOVER_OLD_SESSION_ID"] = ":recover_old_session_id";
+ VqlParameterNames["RECOVER_SESSION_STATE_TICKETS"] = ":recover_session_state_tickets";
+ VqlParameterNames["REFRESH"] = ":refresh";
+ VqlParameterNames["REFRESHUNMODIFIED"] = ":refreshunmodified";
+ VqlParameterNames["REGION"] = "region";
+ VqlParameterNames["RELOAD_ON_CUSTOM_VIEW_SAVE"] = ":reloadOnCustomViewSave";
+ VqlParameterNames["RENDER"] = ":render";
+ VqlParameterNames["RENDER_MAPS_CLIENT_SIDE"] = "renderMapsClientSide";
+ VqlParameterNames["RETRY"] = ":retry";
+ VqlParameterNames["REUSE"] = "reuse";
+ VqlParameterNames["REUSE_FOREVER"] = "reuse_forever";
+ VqlParameterNames["REVERT"] = ":revert";
+ VqlParameterNames["SAVE_DB_PASSWORDS"] = "save_db_passwords";
+ VqlParameterNames["SELECT_X"] = "select_x";
+ VqlParameterNames["SELECT_Y"] = "select_y";
+ VqlParameterNames["SESSION_FEATURE_PREFIX"] = ":ff_";
+ VqlParameterNames["SESSION_FLAGS"] = ":session_feature_flags";
+ VqlParameterNames["SHARE_BUTTON"] = "share_button";
+ VqlParameterNames["SHEET_ID"] = "sheet_id";
+ VqlParameterNames["SHARED"] = "shared";
+ VqlParameterNames["SHOWALL"] = "showall";
+ VqlParameterNames["SHOW_APP_BANNER"] = ":showAppBanner";
+ VqlParameterNames["SHOW_ASK_DATA"] = ":showAskData";
+ VqlParameterNames["SHOW_PARAMS"] = "showParams";
+ VqlParameterNames["SHOW_SHARE_OPTIONS"] = ":showShareOptions";
+ VqlParameterNames["SIZE"] = ":size";
+ VqlParameterNames["SOURCE"] = "source";
+ VqlParameterNames["STATE"] = "state";
+ VqlParameterNames["STICKY_SESSION_KEY"] = "stickySessionKey";
+ VqlParameterNames["SUBSCRIPTIONS"] = ":subscriptions";
+ VqlParameterNames["SUMMARY"] = "summary";
+ VqlParameterNames["SYNC_SESSION"] = ":sync_session";
+ VqlParameterNames["SYNC_SESSION_STATE"] = "sync_session_state";
+ VqlParameterNames["TABS"] = ":tabs";
+ VqlParameterNames["TARGET"] = "target";
+ VqlParameterNames["TARGET_SITE"] = "target_site";
+ VqlParameterNames["TOOLBAR"] = ":toolbar";
+ VqlParameterNames["TOOLTIP"] = ":tooltip";
+ VqlParameterNames["TS"] = "ts";
+ VqlParameterNames["UNDERLYING_TABLE_ID"] = "underlying_table_id";
+ VqlParameterNames["UNDERLYING_TABLE_CAPTION"] = "underlying_table_caption";
+ VqlParameterNames["UPDATE_TYPE"] = "update_type";
+ VqlParameterNames["USE_GUEST"] = ":useGuest";
+ VqlParameterNames["USE_INLINE_IMAGES"] = "use_inline_images";
+ VqlParameterNames["USERAGENT"] = "useragent";
+ VqlParameterNames["USERNAME"] = "username";
+ VqlParameterNames["VALUE"] = "value";
+ VqlParameterNames["VERBOSE_MODE"] = "verboseMode";
+ VqlParameterNames["VIEW_ID"] = "views_id";
+ VqlParameterNames["VIZ_SNAPSHOT_ID"] = "viz_snapshot_id";
+ VqlParameterNames["VW"] = ":vw";
+ VqlParameterNames["W"] = "w";
+ VqlParameterNames["WORKSHEET_PORT_SIZE"] = "worksheetPortSize";
+ VqlParameterNames["WATERMARK"] = "watermark";
+ VqlParameterNames["WATERMARK_MARGIN"] = ":watermark_margin";
+ VqlParameterNames["WB"] = ":wb";
+ VqlParameterNames["WHICH"] = "which";
+ VqlParameterNames["X"] = "x";
+ VqlParameterNames["Y"] = "y";
+ VqlParameterNames["ZID"] = "zid";
+ VqlParameterNames["ZONE_ID"] = "zone_id";
+ VqlParameterNames["KEYCHAIN_VERSION"] = "keychain_version";
+ VqlParameterNames["DATASOURCE_ID"] = "datasource_id";
+ VqlParameterNames["DATASOURCE_NAME"] = "datasource_name";
+ VqlParameterNames["LENS_ID"] = "lens_id";
+ VqlParameterNames["WIDTH"] = "width";
+ VqlParameterNames["HEIGHT"] = "height";
+ // Default Layout params
+ VqlParameterNames["LAYOUT_VIEWS"] = "views";
+ VqlParameterNames["LAYOUT_MENUS"] = "menus";
+ VqlParameterNames["LAYOUT_GEOMETRY"] = "geometry";
+ VqlParameterNames["LAYOUT_PAGES"] = "pages";
+ VqlParameterNames["LAYOUT_CACHEURL"] = "cacheurl";
+ VqlParameterNames["LAYOUT_SHEET"] = "sheet";
+ VqlParameterNames["LAYOUT_DEPTH"] = "depth";
+})(VqlParameterNames || (VqlParameterNames = {}));
+/**
+ * parameters that are only relevant when working with Tableau Public
+ * maybe not really necessry to split them out
+ */
+var PublicParameterNames;
+(function (PublicParameterNames) {
+ PublicParameterNames["SHOW_VIZ_HOME"] = ":showVizHome";
+ // display view count
+})(PublicParameterNames || (PublicParameterNames = {}));
+/**
+ * Map the parameter names as used in the url to what we call them publicly in the embedding library.
+ * The only parameters listed here should be the ones that get sent to vizql
+ * - this should match the interface at external-contract:VizInterfaces:VizSettings
+ */
+var VizOptionNames;
+(function (VizOptionNames) {
+ // publicName = internalStringValue
+ VizOptionNames["Size"] = ":size";
+ VizOptionNames["Embed"] = ":embed";
+ VizOptionNames["EmbedV3"] = ":embeddingV3";
+ VizOptionNames["ApiInternalVersion"] = ":apiInternalVersion";
+ VizOptionNames["ApiExternalVersion"] = ":apiExternalVersion";
+ VizOptionNames["ShowVizHome"] = ":showVizHome";
+ VizOptionNames["Jsdebug"] = ":jsdebug";
+ VizOptionNames["BootstrapWhenNotified"] = ":bootstrapWhenNotified";
+ VizOptionNames["NavType"] = "navType";
+ VizOptionNames["NavSrc"] = "navSrc";
+ VizOptionNames["debug"] = ":jsdebug";
+ VizOptionNames["ApiID"] = ":apiID";
+ VizOptionNames["disableUrlActionsPopups"] = ":disableUrlActionsPopups";
+ VizOptionNames["hideTabs"] = ":tabs";
+ VizOptionNames["toolbar"] = ":toolbar";
+ VizOptionNames["device"] = ":device";
+ VizOptionNames["instanceIdToClone"] = ":iid";
+ VizOptionNames["touchOptimize"] = "mobile";
+})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {}));
+
+
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js":
-/*!*************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***!
- \*************************************************************************************************************************************/
+/*!**********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***!
+ \**********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6378,9 +6870,9 @@ exports.CrossFrameMessenger = CrossFrameMessenger;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js":
-/*!*******************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***!
- \*******************************************************************************************************************************************/
+/*!****************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***!
+ \****************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6420,9 +6912,9 @@ exports.CrossFramePreparedMessage = CrossFramePreparedMessage;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js":
-/*!***********************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js ***!
- \***********************************************************************************************************************************/
+/*!********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js ***!
+ \********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6551,9 +7043,9 @@ exports.isHandshakeMessage = isHandshakeMessage;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js":
-/*!****************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***!
- \****************************************************************************************************************************************/
+/*!*************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***!
+ \*************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6577,9 +7069,9 @@ var MessageType;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js":
-/*!*******************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***!
- \*******************************************************************************************************************************************/
+/*!****************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***!
+ \****************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6614,9 +7106,9 @@ exports.IdentityVersionConverter = IdentityVersionConverter;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js":
-/*!*******************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***!
- \*******************************************************************************************************************************************/
+/*!****************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***!
+ \****************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6699,9 +7191,9 @@ exports.StackingVersionConverter = StackingVersionConverter;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js":
-/*!******************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js ***!
- \******************************************************************************************************************************************/
+/*!***************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js ***!
+ \***************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6826,9 +7318,9 @@ exports.GetMaximumMinorIndex = GetMaximumMinorIndex;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/VersionTranslations.js":
-/*!**************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***!
- \**************************************************************************************************************************************/
+/*!***********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***!
+ \***********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6877,9 +7369,9 @@ exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js":
-/*!************************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***!
- \************************************************************************************************************************************************************/
+/*!*********************************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***!
+ \*********************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6914,9 +7406,9 @@ exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js":
-/*!************************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***!
- \************************************************************************************************************************************************************/
+/*!*********************************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***!
+ \*********************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -6986,9 +7478,9 @@ exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter;
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js":
-/*!***********************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js ***!
- \***********************************************************************************************************************************************************/
+/*!********************************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js ***!
+ \********************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7083,9 +7575,9 @@ function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersio
/***/ }),
/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js":
-/*!*******************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js ***!
- \*******************************************************************************************************************************************************/
+/*!****************************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js ***!
+ \****************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7233,9 +7725,9 @@ function adjustDataColumns(executeResponse, columnsToInclude) {
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared.js":
-/*!******************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared.js ***!
- \******************************************************************************************************/
+/*!***************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared.js ***!
+ \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7258,6 +7750,8 @@ var Size_1 = __webpack_require__(/*! ./ApiShared/Size */ "../../api-shared-js/li
exports.Size = Size_1.Size;
var Point_1 = __webpack_require__(/*! ./ApiShared/Point */ "../../api-shared-js/lib/src/ApiShared/Point.js");
exports.Point = Point_1.Point;
+var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../../api-shared-js/lib/src/ApiShared/Field.js");
+exports.Field = Field_1.Field;
var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js");
exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings;
var ParameterImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/ParameterImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js");
@@ -7291,14 +7785,17 @@ var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../../api-
exports.DataSource = DataSource_1.DataSource;
var DataSourceImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DataSourceImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js");
exports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl;
+// For testing
+var NotificationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js");
+exports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/ApiVersion.js":
-/*!*****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/ApiVersion.js ***!
- \*****************************************************************************************************************/
+/*!**************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/ApiVersion.js ***!
+ \**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7333,9 +7830,9 @@ exports.ApiVersion = ApiVersion;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/ConnectionSummary.js":
-/*!************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***!
- \************************************************************************************************************************/
+/*!*********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***!
+ \*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7386,9 +7883,9 @@ exports.ConnectionSummary = ConnectionSummary;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js":
-/*!*************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js ***!
- \*************************************************************************************************************************************/
+/*!**********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js ***!
+ \**********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7456,9 +7953,9 @@ exports.doCrossFrameBootstrap = doCrossFrameBootstrap;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js":
-/*!**************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***!
- \**************************************************************************************************************************************/
+/*!***********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***!
+ \***********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7547,9 +8044,9 @@ exports.CrossFrameDispatcher = CrossFrameDispatcher;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/DataSource.js":
-/*!*****************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/DataSource.js ***!
- \*****************************************************************************************************************/
+/*!**************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/DataSource.js ***!
+ \**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7595,6 +8092,16 @@ var DataSource = /** @class */ (function () {
enumerable: true,
configurable: true
});
+ Object.defineProperty(DataSource.prototype, "isPublished", {
+ get: function () {
+ return this._dataSourceImpl.isPublished;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ DataSource.prototype.publishedUrl = function () {
+ return this._dataSourceImpl.publishedUrl();
+ };
DataSource.prototype.refreshAsync = function () {
return this._dataSourceImpl.refreshAsync();
};
@@ -7624,15 +8131,15 @@ exports.DataSource = DataSource;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js":
-/*!**************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js ***!
- \**************************************************************************************************************************************************/
+/*!***********************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js ***!
+ \***********************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-var _a, _b, _c, _d, _e;
+var _a, _b, _c, _d, _e, _f;
Object.defineProperty(exports, "__esModule", { value: true });
var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js");
var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
@@ -7664,11 +8171,18 @@ var ExternalToInternalEnumMappings = /** @class */ (function () {
_d[api_external_contract_js_1.ZoneVisibilityType.Show] = true,
_d[api_external_contract_js_1.ZoneVisibilityType.Hide] = false,
_d));
- ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_e = {},
- _e[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues,
- _e[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,
- _e[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly,
+ ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter((_e = {},
+ // these numbers are duration multipliers
+ // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed
+ _e[api_external_contract_js_1.ReplaySpeedType.Slow] = 2.0,
+ _e[api_external_contract_js_1.ReplaySpeedType.Normal] = 1.0,
+ _e[api_external_contract_js_1.ReplaySpeedType.Fast] = 0.5,
_e));
+ ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_f = {},
+ _f[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues,
+ _f[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,
+ _f[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly,
+ _f));
return ExternalToInternalEnumMappings;
}());
exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings;
@@ -7678,15 +8192,15 @@ exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js":
-/*!**************************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js ***!
- \**************************************************************************************************************************************************/
+/*!***********************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js ***!
+ \***********************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
+var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
Object.defineProperty(exports, "__esModule", { value: true });
var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js");
@@ -7828,6 +8342,19 @@ var InternalToExternalEnumMappings = /** @class */ (function () {
_p[api_internal_contract_js_1.FilterType.RelativeDate] = api_external_contract_js_1.FilterType.RelativeDate,
_p[api_internal_contract_js_1.FilterType.Hierarchical] = api_external_contract_js_1.FilterType.Hierarchical,
_p));
+ InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter((_q = {},
+ _q["tableau-dashboard-title" /* DashboardTitle */] = api_external_contract_js_1.ClassNameKey.DashboardTitle,
+ _q["tableau-story-title" /* StoryTitle */] = api_external_contract_js_1.ClassNameKey.StoryTitle,
+ _q["tableau-tooltip" /* Tooltip */] = api_external_contract_js_1.ClassNameKey.Tooltip,
+ _q["tableau-worksheet" /* Worksheet */] = api_external_contract_js_1.ClassNameKey.Worksheet,
+ _q["tableau-worksheet-title" /* WorksheetTitle */] = api_external_contract_js_1.ClassNameKey.WorksheetTitle,
+ // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed
+ _q['dashboard-title'] = api_external_contract_js_1.ClassNameKey.DashboardTitle,
+ _q['story-title'] = api_external_contract_js_1.ClassNameKey.StoryTitle,
+ _q['tooltip'] = api_external_contract_js_1.ClassNameKey.Tooltip,
+ _q['worksheet'] = api_external_contract_js_1.ClassNameKey.Worksheet,
+ _q['worksheet-title'] = api_external_contract_js_1.ClassNameKey.WorksheetTitle,
+ _q));
return InternalToExternalEnumMappings;
}());
exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings;
@@ -7837,9 +8364,9 @@ exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/EventListenerManager.js":
-/*!***************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EventListenerManager.js ***!
- \***************************************************************************************************************************/
+/*!************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EventListenerManager.js ***!
+ \************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7879,9 +8406,9 @@ exports.EventListenerManager = EventListenerManager;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Field.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Field.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Field.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -7978,9 +8505,9 @@ exports.Field = Field;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js":
-/*!*************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***!
- \*************************************************************************************************************************/
+/*!**********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***!
+ \**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8012,9 +8539,8 @@ var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../../api-shar
var DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js");
var DashboardImpl = /** @class */ (function (_super) {
__extends(DashboardImpl, _super);
- function DashboardImpl(_name, height, width, _zones, _sheetPath, index, isActive, isHidden) {
- var _this = _super.call(this, new SheetInfoImpl_1.SheetInfoImpl(_name, api_external_contract_js_1.SheetType.Dashboard, new Size_1.Size(height, width), index, isActive, isHidden)) || this;
- _this._name = _name;
+ function DashboardImpl(_sheetInfo, _zones, _sheetPath, _registryId) {
+ var _this = _super.call(this, _sheetInfo, _registryId) || this;
_this._zones = _zones;
_this._sheetPath = _sheetPath;
return _this;
@@ -8036,21 +8562,26 @@ var DashboardImpl = /** @class */ (function (_super) {
DashboardImpl.prototype.initializeWithPublicInterfaces = function () {
this._worksheetsImpl = new Array();
this._objects = new Array();
+ this.zoneMap = new Map();
// Process all the zones which are contained in this dashboard
for (var _i = 0, _a = this._zones; _i < _a.length; _i++) {
var zone = _a[_i];
var worksheetImpl = undefined;
var zoneSize = new Size_1.Size(zone.height, zone.width);
+ // As the dashboard is active, all over zones in the dashboard are inactive.
+ var isActive = false;
+ // Todo: TFS1284911 : isHidden is not always false. Verify is sheet is part of published sheets first
+ var isHidden = false;
if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) {
// zone.sheetInfo was not initialized prior to internal-contract 1.6.0
var worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name;
var sheetInfoImpl = void 0;
// Indexes, isActive and some more properties in sheetInfoImpl are embedding specific.
// But we init them for both extensions and embedding as the Models will only use what is relevant.
- sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, false, false, zone.zoneId);
+ sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden);
var vizId = {
worksheet: worksheetName,
- dashboard: this._name,
+ dashboard: this._sheetInfoImpl.name,
storyboard: this._sheetPath.storyboard,
flipboardZoneID: this._sheetPath.flipboardZoneID,
storyPointID: this._sheetPath.storyPointID
@@ -8063,11 +8594,77 @@ var DashboardImpl = /** @class */ (function (_super) {
(zone.isVisible !== undefined) ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true
zone.zoneId);
this._objects.push(dashboardObjectImpl);
+ this.zoneMap.set(zone.zoneId, dashboardObjectImpl);
+ }
+ };
+ DashboardImpl.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) {
+ var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */);
+ return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap);
+ };
+ DashboardImpl.prototype.getDashboardObjectById = function (dashboardObjectId) {
+ return this.zoneMap.get(dashboardObjectId);
+ };
+ DashboardImpl.prototype.updateZones = function (newZones) {
+ var _this = this;
+ // getting previous dashboard objects
+ var oldDashboardObjects = this._objects;
+ var oldZoneMap = this.zoneMap;
+ // updating zones, and reinitializing instance variables
+ this._zones = newZones;
+ this.initializeWithPublicInterfaces();
+ // getting new dashboard objects
+ var newDashboardObjects = this._objects;
+ var newZoneMap = this.zoneMap;
+ // initializing map for changes
+ var zoneChanges = new Map();
+ // comparing old dashboard objects with new ones
+ oldDashboardObjects.forEach(function (oldObject) {
+ var oldId = oldObject.id;
+ // checking if zone was removed
+ if (!newZoneMap.has(oldId)) {
+ _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed);
+ return;
+ }
+ var newObject = newZoneMap.get(oldId);
+ if (oldObject.isFloating !== newObject.isFloating) {
+ _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged);
+ }
+ if (oldObject.isVisible !== newObject.isVisible) {
+ _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged);
+ }
+ if (oldObject.name !== newObject.name) {
+ _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged);
+ }
+ if (oldObject.position.x !== newObject.position.x ||
+ oldObject.position.y !== newObject.position.y) {
+ _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged);
+ }
+ if (oldObject.size.height !== newObject.size.height ||
+ oldObject.size.width !== newObject.size.width) {
+ _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged);
+ }
+ });
+ // Checking for any added zones
+ newDashboardObjects.forEach(function (newObject) {
+ if (!oldZoneMap.has(newObject.id)) {
+ _this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added);
+ }
+ });
+ return zoneChanges;
+ };
+ DashboardImpl.prototype.addChange = function (zoneId, zoneChanges, change) {
+ if (!zoneChanges.has(zoneId)) {
+ zoneChanges.set(zoneId, []);
}
+ zoneChanges.get(zoneId).push(change);
};
- DashboardImpl.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) {
- var zoneService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("zone-service" /* Zone */);
- return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.objects, zoneVisibilityMap);
+ DashboardImpl.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) {
+ var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */);
+ return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray);
+ };
+ DashboardImpl.prototype.replayAnimationAsync = function (replaySpeed) {
+ var animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */);
+ return animationService.replayAsync(replaySpeed);
};
return DashboardImpl;
}(SheetImpl_1.SheetImpl));
@@ -8077,9 +8674,9 @@ exports.DashboardImpl = DashboardImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js":
-/*!*******************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js ***!
- \*******************************************************************************************************************************/
+/*!****************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js ***!
+ \****************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8173,9 +8770,9 @@ exports.DashboardObjectImpl = DashboardObjectImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js":
-/*!**************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js ***!
- \**************************************************************************************************************************/
+/*!***********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js ***!
+ \***********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8191,9 +8788,10 @@ var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api
var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../../api-shared-js/lib/src/ApiShared/LogicalTable.js");
var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
var DataSourceImpl = /** @class */ (function () {
- function DataSourceImpl(_dataSourceInfo) {
+ function DataSourceImpl(_dataSourceInfo, _registryId) {
var _this = this;
this._dataSourceInfo = _dataSourceInfo;
+ this._registryId = _registryId;
this._fields = _dataSourceInfo.fields.map(function (fieldModel) {
var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, _this);
return new Field_1.Field(fieldImpl);
@@ -8234,30 +8832,40 @@ var DataSourceImpl = /** @class */ (function () {
enumerable: true,
configurable: true
});
+ Object.defineProperty(DataSourceImpl.prototype, "isPublished", {
+ get: function () {
+ return this._dataSourceInfo.isPublished;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ DataSourceImpl.prototype.publishedUrl = function () {
+ return this._dataSourceInfo.publishedUrl;
+ };
DataSourceImpl.prototype.refreshAsync = function () {
- var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */);
return dataSourceService.refreshAsync(this._dataSourceInfo.id);
};
DataSourceImpl.prototype.getConnectionSummariesAsync = function () {
- var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */);
return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then(function (summaries) {
return summaries.map(function (summary) { return new ConnectionSummary_1.ConnectionSummary(summary); });
});
};
DataSourceImpl.prototype.getActiveTablesAsync = function () {
- var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */);
return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then(function (tableInfos) {
return tableInfos.map(function (tableInfo) { return new TableSummary_1.TableSummary(tableInfo); });
});
};
DataSourceImpl.prototype.getUnderlyingDataAsync = function (options) {
- var getDataService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
options = options || {};
return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults
options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);
};
DataSourceImpl.prototype.getLogicalTableDataAsync = function (logicalTableId, options) {
- var getDataService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
options = options || {};
return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults
options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);
@@ -8270,7 +8878,7 @@ var DataSourceImpl = /** @class */ (function () {
});
};
DataSourceImpl.prototype.getLogicalTablesAsync = function () {
- var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */);
return dataSourceService.getLogicalTablesAsync(this.id).then(function (logicalTableInfos) {
return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); });
});
@@ -8283,9 +8891,9 @@ exports.DataSourceImpl = DataSourceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js":
-/*!*********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js ***!
- \*********************************************************************************************************************/
+/*!******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js ***!
+ \******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8376,9 +8984,9 @@ exports.FieldImpl = FieldImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js":
-/*!*************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js ***!
- \*************************************************************************************************************************/
+/*!**********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js ***!
+ \**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8392,7 +9000,8 @@ var DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ ".
var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js");
var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js");
var ParameterImpl = /** @class */ (function () {
- function ParameterImpl(parameterInfo) {
+ function ParameterImpl(parameterInfo, _registryId) {
+ this._registryId = _registryId;
this.setParameterInfo(parameterInfo);
}
Object.defineProperty(ParameterImpl.prototype, "name", {
@@ -8434,7 +9043,7 @@ var ParameterImpl = /** @class */ (function () {
var _this = this;
ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue');
var coercedValue = Param_1.Param.serializeParameterValue(newValue);
- var parametersService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */);
+ var parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */);
return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then(function (parameterInfo) {
_this.setParameterInfo(parameterInfo);
return _this.currentValue;
@@ -8477,9 +9086,9 @@ exports.ParameterImpl = ParameterImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js":
-/*!*********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js ***!
- \*********************************************************************************************************************/
+/*!******************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js ***!
+ \******************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8491,8 +9100,9 @@ var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "
var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js");
var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js");
var SheetImpl = /** @class */ (function () {
- function SheetImpl(_sheetInfoImpl) {
+ function SheetImpl(_sheetInfoImpl, _registryId) {
this._sheetInfoImpl = _sheetInfoImpl;
+ this._registryId = _registryId;
}
Object.defineProperty(SheetImpl.prototype, "name", {
get: function () {
@@ -8554,11 +9164,11 @@ var SheetImpl = /** @class */ (function () {
});
SheetImpl.prototype.findParameterAsync = function (parameterName) {
ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName');
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */);
return service.findParameterByNameAsync(parameterName);
};
SheetImpl.prototype.getParametersAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */);
return service.getParametersForSheetAsync(this.sheetPath);
};
return SheetImpl;
@@ -8569,9 +9179,9 @@ exports.SheetImpl = SheetImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js":
-/*!*************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js ***!
- \*************************************************************************************************************************/
+/*!**********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js ***!
+ \**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8580,14 +9190,13 @@ exports.SheetImpl = SheetImpl;
Object.defineProperty(exports, "__esModule", { value: true });
var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
var SheetInfoImpl = /** @class */ (function () {
- function SheetInfoImpl(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _zoneIndex) {
+ function SheetInfoImpl(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden) {
this._name = _name;
this._sheetType = _sheetType;
this._sheetSize = _sheetSize;
this._index = _index;
this._isActive = _isActive;
this._isHidden = _isHidden;
- this._zoneIndex = _zoneIndex;
}
Object.defineProperty(SheetInfoImpl.prototype, "name", {
get: function () {
@@ -8642,13 +9251,6 @@ var SheetInfoImpl = /** @class */ (function () {
enumerable: true,
configurable: true
});
- Object.defineProperty(SheetInfoImpl.prototype, "zoneIndex", {
- get: function () {
- return this._zoneIndex;
- },
- enumerable: true,
- configurable: true
- });
return SheetInfoImpl;
}());
exports.SheetInfoImpl = SheetInfoImpl;
@@ -8657,9 +9259,9 @@ exports.SheetInfoImpl = SheetInfoImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js":
-/*!**********************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***!
- \**********************************************************************************************************************************/
+/*!*******************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***!
+ \*******************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8714,9 +9316,9 @@ exports.SingleEventManagerImpl = SingleEventManagerImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js":
-/*!************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js ***!
- \************************************************************************************************************************/
+/*!*********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js ***!
+ \*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8734,9 +9336,9 @@ exports.WorkbookImpl = WorkbookImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js":
-/*!*************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***!
- \*************************************************************************************************************************/
+/*!**********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***!
+ \**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8768,8 +9370,8 @@ var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../../api-share
var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js");
var WorksheetImpl = /** @class */ (function (_super) {
__extends(WorksheetImpl, _super);
- function WorksheetImpl(sheetInfoImpl, _visualId, _parentDashboardImpl) {
- var _this = _super.call(this, sheetInfoImpl) || this;
+ function WorksheetImpl(sheetInfoImpl, _visualId, _parentDashboardImpl, _registryId) {
+ var _this = _super.call(this, sheetInfoImpl, _registryId) || this;
_this._visualId = _visualId;
_this._parentDashboardImpl = _parentDashboardImpl;
return _this;
@@ -8784,6 +9386,9 @@ var WorksheetImpl = /** @class */ (function (_super) {
enumerable: true,
configurable: true
});
+ WorksheetImpl.prototype.hasParentDashboard = function () {
+ return !!this._parentDashboardImpl;
+ };
Object.defineProperty(WorksheetImpl.prototype, "visualId", {
get: function () {
return this._visualId;
@@ -8793,7 +9398,7 @@ var WorksheetImpl = /** @class */ (function (_super) {
});
WorksheetImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) {
ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, api_external_contract_js_1.FilterUpdateType, 'FilterUpdateType');
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */);
return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options);
};
WorksheetImpl.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) {
@@ -8805,17 +9410,17 @@ var WorksheetImpl = /** @class */ (function (_super) {
else {
ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max);
}
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */);
return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions);
};
WorksheetImpl.prototype.clearFilterAsync = function (fieldName) {
ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */);
return service.clearFilterAsync(this.visualId, fieldName);
};
WorksheetImpl.prototype.getDataSourcesAsync = function () {
var _this = this;
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */);
return service.getDataSourcesAsync(this.visualId).then(function (result) {
var dataSchema = result;
var worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[_this.name];
@@ -8834,56 +9439,56 @@ var WorksheetImpl = /** @class */ (function (_super) {
});
};
WorksheetImpl.prototype.getFiltersAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */);
return service.getFiltersAsync(this.visualId);
};
WorksheetImpl.prototype.getSelectedMarksAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
return service.getSelectedMarksAsync(this.visualId);
};
WorksheetImpl.prototype.getHighlightedMarksAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
return service.getHighlightedMarksAsync(this.visualId);
};
WorksheetImpl.prototype.getSummaryDataAsync = function (options) {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
options = options || {};
return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);
};
WorksheetImpl.prototype.getSummaryColumnsInfoAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
return service.getSummaryColumnsInfoAsync(this.visualId);
};
WorksheetImpl.prototype.getUnderlyingDataAsync = function (options) {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
options = options || {};
return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);
};
WorksheetImpl.prototype.getUnderlyingTablesAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */);
return service.getUnderlyingTablesAsync(this.visualId).then(function (logicalTableInfos) {
return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); });
});
};
WorksheetImpl.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */);
options = options || {};
return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);
};
WorksheetImpl.prototype.clearSelectedMarksAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("selection-service" /* Selection */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */);
return service.clearSelectedMarksAsync(this.visualId);
};
WorksheetImpl.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) {
ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName');
ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType');
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("selection-service" /* Selection */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */);
return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType);
};
WorksheetImpl.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) {
ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName');
ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType');
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("selection-service" /* Selection */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */);
return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType);
};
WorksheetImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) {
@@ -8900,9 +9505,9 @@ exports.WorksheetImpl = WorksheetImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/LogicalTable.js":
-/*!*******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/LogicalTable.js ***!
- \*******************************************************************************************************************/
+/*!****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/LogicalTable.js ***!
+ \****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8939,9 +9544,9 @@ exports.LogicalTable = LogicalTable;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Models/FilterModels.js":
-/*!**************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***!
- \**************************************************************************************************************************/
+/*!***********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***!
+ \***********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -8965,11 +9570,12 @@ var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-c
var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js");
var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js");
var Filter = /** @class */ (function () {
- function Filter(_worksheetName, _fieldName, _filterType, _fieldId) {
+ function Filter(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) {
this._worksheetName = _worksheetName;
this._fieldName = _fieldName;
this._filterType = _filterType;
this._fieldId = _fieldId;
+ this._registryId = _registryId;
}
Object.defineProperty(Filter.prototype, "worksheetName", {
get: function () {
@@ -9000,7 +9606,7 @@ var Filter = /** @class */ (function () {
configurable: true
});
Filter.prototype.getFieldAsync = function () {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */);
return service.getFieldAsync(this._fieldId);
};
return Filter;
@@ -9041,7 +9647,7 @@ var CategoricalFilter = /** @class */ (function (_super) {
domainType = api_external_contract_js_1.FilterDomainType.Relevant;
}
ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType');
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */);
return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType);
};
return CategoricalFilter;
@@ -9078,7 +9684,7 @@ var RangeFilter = /** @class */ (function (_super) {
configurable: true
});
RangeFilter.prototype.getDomainAsync = function (domainType) {
- var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */);
+ var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */);
if (!domainType) {
domainType = api_external_contract_js_1.FilterDomainType.Relevant;
}
@@ -9186,9 +9792,9 @@ exports.RangeDomain = RangeDomain;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js":
-/*!***************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/GetDataModels.js ***!
- \***************************************************************************************************************************/
+/*!************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/GetDataModels.js ***!
+ \************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -9369,9 +9975,9 @@ exports.DataValue = DataValue;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js":
-/*!*****************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***!
- \*****************************************************************************************************************************/
+/*!**************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***!
+ \**************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -9473,9 +10079,9 @@ exports.SelectionModelsContainer = SelectionModelsContainer;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Point.js":
-/*!************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Point.js ***!
- \************************************************************************************************************/
+/*!*********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Point.js ***!
+ \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -9509,9 +10115,9 @@ exports.Point = Point;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/GetDataService.js":
-/*!******************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***!
- \******************************************************************************************************************************/
+/*!***************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***!
+ \***************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -9531,15 +10137,16 @@ var GetDataType;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js":
-/*!*****************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***!
- \*****************************************************************************************************************************************/
+/*!**************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***!
+ \**************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
+var AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js");
var ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js");
var DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js");
var FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js");
@@ -9549,15 +10156,16 @@ var ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceIm
var SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js");
var VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js");
var ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js");
-function registerAllSharedServices(dispatcher, platformVersion) {
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, platformVersion));
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher));
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher));
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher));
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher));
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher));
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher));
- ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher));
+function registerAllSharedServices(dispatcher, registryId, platformVersion) {
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, platformVersion));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher));
+ ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher));
}
exports.registerAllSharedServices = registerAllSharedServices;
@@ -9565,9 +10173,9 @@ exports.registerAllSharedServices = registerAllSharedServices;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js":
-/*!*******************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***!
- \*******************************************************************************************************************************/
+/*!****************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***!
+ \****************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -9576,6 +10184,7 @@ exports.registerAllSharedServices = registerAllSharedServices;
Object.defineProperty(exports, "__esModule", { value: true });
var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js");
+window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {};
var ServiceRegistryImpl = /** @class */ (function () {
function ServiceRegistryImpl() {
this._services = {};
@@ -9592,48 +10201,119 @@ var ServiceRegistryImpl = /** @class */ (function () {
return ServiceRegistryImpl;
}());
/**
- * static class used for getting access to the single instance
- * of the ApiServiceRegistry
+ * Static class used for getting access to the single instance
+ * of the ApiServiceRegistry associated with the registryId.
+ *
+ * Extensions by design don't need to store/access multiple service registries. Their single instance of ServiceRegistry is
+ * stored/access with registryId = 0.
+ *
+ * Whereas Embedding needs to be aware of which ServiceRegistry to use when there are multiple vizzes embedded.
+ * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry}
+ * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager).
*/
var ApiServiceRegistry = /** @class */ (function () {
// Private to avoid anyone constructing this
function ApiServiceRegistry() {
}
- Object.defineProperty(ApiServiceRegistry, "instance", {
- /**
- * Gets the singleton instance of the ServiceRegistry
- */
+ /**
+ * Gets the singleton instance of the ServiceRegistry
+ */
+ ApiServiceRegistry.get = function (registryId) {
+ if (registryId === void 0) { registryId = 0; }
+ if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) {
+ ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl());
+ }
+ if (!window.__tableauApiServiceRegistry[registryId]) {
+ throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed');
+ }
+ return window.__tableauApiServiceRegistry[registryId];
+ };
+ /**
+ * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests
+ *
+ * @param {ServiceRegistry} serviceRegistry The new registry
+ */
+ ApiServiceRegistry.setInstance = function (registryId, serviceRegistry) {
+ if (!window.__tableauApiServiceRegistry) {
+ window.__tableauApiServiceRegistry = {};
+ }
+ window.__tableauApiServiceRegistry[registryId] = serviceRegistry;
+ };
+ /**
+ * Only used by unit tests
+ */
+ ApiServiceRegistry.clearRegistry = function () {
+ window.__tableauApiServiceRegistry = {};
+ };
+ return ApiServiceRegistry;
+}());
+exports.ApiServiceRegistry = ApiServiceRegistry;
+
+
+/***/ }),
+
+/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js":
+/*!**************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js ***!
+ \**************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
+var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js");
+var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js");
+var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js");
+var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js");
+var AnimationServiceImpl = /** @class */ (function (_super) {
+ __extends(AnimationServiceImpl, _super);
+ function AnimationServiceImpl() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ Object.defineProperty(AnimationServiceImpl.prototype, "serviceName", {
get: function () {
- if (!window.__tableauApiServiceRegistry) {
- ApiServiceRegistry.setInstance(new ServiceRegistryImpl());
- }
- if (!window.__tableauApiServiceRegistry) {
- throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed');
- }
- return window.__tableauApiServiceRegistry;
+ return "animation-service" /* Animation */;
},
enumerable: true,
configurable: true
});
- /**
- * Helper method to override the registry instance. Can be used by unit tests
- *
- * @param {ServiceRegistry} serviceRegistry The new registry
- */
- ApiServiceRegistry.setInstance = function (serviceRegistry) {
- window.__tableauApiServiceRegistry = serviceRegistry;
+ AnimationServiceImpl.prototype.replayAsync = function (replaySpeed) {
+ var _a;
+ var parameters = (_a = {},
+ _a[api_internal_contract_js_1.ParameterId.ReplaySpeed] = 1.0,
+ _a);
+ ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType');
+ parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed);
+ return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then(function (response) {
+ return;
+ });
};
- return ApiServiceRegistry;
-}());
-exports.ApiServiceRegistry = ApiServiceRegistry;
+ return AnimationServiceImpl;
+}(ServiceImplBase_1.ServiceImplBase));
+exports.AnimationServiceImpl = AnimationServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js":
-/*!******************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***!
- \******************************************************************************************************************************************/
+/*!***************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***!
+ \***************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -9666,9 +10346,15 @@ exports.SENTINEL_LOGICAL_TABLE_INFO = {
id: InternalContract.ApiShowDataTableSentinel.SingleTableId,
caption: InternalContract.ApiShowDataTableSentinel.SingleTableCaption
};
+// The minimum platform version when Object Model was supported
+var platformVersionObjectModelSupport = { major: 1, minor: 20, fix: 1 };
var DataSourceServiceImpl = /** @class */ (function (_super) {
__extends(DataSourceServiceImpl, _super);
+ // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the
+ // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional
+ // code in here for Object Model can be removed.
function DataSourceServiceImpl(dispatcher, _platformVersion) {
+ if (_platformVersion === void 0) { _platformVersion = platformVersionObjectModelSupport; }
var _this = _super.call(this, dispatcher) || this;
_this._platformVersion = _platformVersion;
return _this;
@@ -9815,9 +10501,9 @@ exports.DataSourceServiceImpl = DataSourceServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js":
-/*!**************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js ***!
- \**************************************************************************************************************************************/
+/*!***********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js ***!
+ \***********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10049,9 +10735,9 @@ exports.FilterServiceImpl = FilterServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js":
-/*!***************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***!
- \***************************************************************************************************************************************/
+/*!************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***!
+ \************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10264,9 +10950,9 @@ exports.GetDataServiceImpl = GetDataServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js":
-/*!********************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***!
- \********************************************************************************************************************************************/
+/*!*****************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***!
+ \*****************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10331,9 +11017,9 @@ exports.NotificationServiceImpl = NotificationServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js":
-/*!******************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***!
- \******************************************************************************************************************************************/
+/*!***************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***!
+ \***************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10438,9 +11124,9 @@ exports.ParametersServiceImpl = ParametersServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js":
-/*!*****************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***!
- \*****************************************************************************************************************************************/
+/*!**************************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***!
+ \**************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10700,9 +11386,9 @@ exports.SelectionServiceImpl = SelectionServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js":
-/*!************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js ***!
- \************************************************************************************************************************************/
+/*!*********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js ***!
+ \*********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10738,9 +11424,9 @@ exports.ServiceImplBase = ServiceImplBase;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js":
-/*!***********************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***!
- \***********************************************************************************************************************************/
+/*!********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***!
+ \********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10793,9 +11479,9 @@ exports.VizServiceImpl = VizServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js":
-/*!************************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***!
- \************************************************************************************************************************************/
+/*!*********************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***!
+ \*********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10833,7 +11519,7 @@ var ZoneServiceImpl = /** @class */ (function (_super) {
enumerable: true,
configurable: true
});
- ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardObjectsImpl, zoneVisibilityMap) {
+ ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardZoneMap, zoneVisibilityMap) {
var _a;
var parameters = (_a = {},
_a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setVisibilityAsync',
@@ -10843,14 +11529,28 @@ var ZoneServiceImpl = /** @class */ (function (_super) {
// zoneVisibilityMap can be either an object or a Map - convert it to a Map
var parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap');
parameterAsMap.forEach(function (value, key) {
- ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardObjectsImpl, Number.parseInt(key, 10));
- ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.ZoneVisibilityType, 'ZoneVisibilityType');
+ ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10));
+ ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType');
parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value);
});
return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then(function (response) {
return;
});
};
+ ZoneServiceImpl.prototype.moveAndResizeAsync = function (dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) {
+ var _a;
+ var parameters = (_a = {},
+ _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard,
+ _a[api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList] = dashboardObjectPositionAndSizeUpdateArray,
+ _a);
+ dashboardObjectPositionAndSizeUpdateArray.forEach(function (dashboardObject) {
+ ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID);
+ ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject);
+ });
+ return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then(function (response) {
+ return;
+ });
+ };
return ZoneServiceImpl;
}(ServiceImplBase_1.ServiceImplBase));
exports.ZoneServiceImpl = ZoneServiceImpl;
@@ -10859,9 +11559,9 @@ exports.ZoneServiceImpl = ZoneServiceImpl;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Size.js":
-/*!***********************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Size.js ***!
- \***********************************************************************************************************/
+/*!********************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Size.js ***!
+ \********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10895,9 +11595,9 @@ exports.Size = Size;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/TableSummary.js":
-/*!*******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/TableSummary.js ***!
- \*******************************************************************************************************************/
+/*!****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/TableSummary.js ***!
+ \****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -10948,9 +11648,9 @@ exports.TableSummary = TableSummary;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/TableauError.js":
-/*!*******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/TableauError.js ***!
- \*******************************************************************************************************************/
+/*!****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/TableauError.js ***!
+ \****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -11003,9 +11703,9 @@ exports.TableauError = TableauError;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js":
-/*!*****************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js ***!
- \*****************************************************************************************************************************/
+/*!**************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js ***!
+ \**************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -11046,9 +11746,9 @@ exports.DataValueFactory = DataValueFactory;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js":
-/*!**************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js ***!
- \**************************************************************************************************************************/
+/*!***********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js ***!
+ \***********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -11095,9 +11795,9 @@ var ShouldThrow;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js":
-/*!*************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***!
- \*************************************************************************************************************************/
+/*!**********************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***!
+ \**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -11223,15 +11923,38 @@ var ErrorHelpers = /** @class */ (function () {
* Verifies that the zoneId is present in the current dashboard.
* Throws with error code InvalidParameter if either condition is false.
*
- * @param dashboardObjects An array of all DashboardObjects in the current dashboard
+ * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object.
* @param zoneID ZoneId to be validated
*/
- ErrorHelpers.verifyZoneIsValid = function (dashboardObjectsImpl, zoneID) {
- var isValid = dashboardObjectsImpl.some(function (dashboardObjectImpl) {
- return dashboardObjectImpl.id === zoneID;
- });
- if (!isValid) {
- throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, "Unexpected invalid param value, Zone Id: " + zoneID + " is not present in dashboard.");
+ ErrorHelpers.verifyZoneIsValid = function (dashboardZoneMap, zoneID) {
+ if (dashboardZoneMap.has(zoneID)) {
+ return;
+ }
+ throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, "Unexpected invalid param value, Dashboard Object Id: " + zoneID + " is not present in dashboard.");
+ };
+ /**
+ * Verifies that the zone is present and floating in the current dashboard.
+ * Throws with error code InvalidParameter if either condition is false.
+ *
+ * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object.
+ * @param zoneID ZoneId to be validated
+ */
+ ErrorHelpers.verifyZoneIsValidAndFloating = function (dashboardZoneMap, zoneID) {
+ if (dashboardZoneMap.has(zoneID) && dashboardZoneMap.get(zoneID).isFloating) {
+ return;
+ }
+ throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, "Unexpected invalid param value, Dashboard Object Id: " + zoneID + " is not present or is a fixed zone in the dashboard.");
+ };
+ /**
+ * Verifies that width and height are > 0 for each DashboardObjectPositionAndSizeUpdate object.
+ * Throws with error code InvalidParameter if either condition is false.
+ *
+ * @param dashboardObjectPositionAndSizeUpdate DashboardObjectPositionAndSizeUpdate object for which width and height will be validated
+ */
+ ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate = function (dashboardObjectPositionAndSizeUpdate) {
+ if (dashboardObjectPositionAndSizeUpdate.width < 0 || dashboardObjectPositionAndSizeUpdate.height < 0) {
+ throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, "Unexpected invalid param value for dashboard object ID " + dashboardObjectPositionAndSizeUpdate.dashboardObjectID + ":" +
+ " negative widths and heights are not allowed.");
}
};
return ErrorHelpers;
@@ -11242,9 +11965,9 @@ exports.ErrorHelpers = ErrorHelpers;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js":
-/*!******************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/Param.js ***!
- \******************************************************************************************************************/
+/*!***************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/Param.js ***!
+ \***************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -11339,9 +12062,9 @@ exports.Param = Param;
/***/ }),
/***/ "../../api-shared-js/lib/src/ApiShared/VersionNumber.js":
-/*!********************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/VersionNumber.js ***!
- \********************************************************************************************************************/
+/*!*****************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/VersionNumber.js ***!
+ \*****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -11351,7 +12074,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js");
/**
- * Represents the current version of the extensions library
+ * Represents the current version of the extensions, embedding
* and extensions-api-types library
*/
var VersionNumber = /** @class */ (function () {
@@ -11401,9 +12124,9 @@ exports.VersionNumber = VersionNumber;
/***/ }),
/***/ "../../api-shared-js/lib/src/VersionedExternalApiDispatcher.js":
-/*!***************************************************************************************************************************!*\
- !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/VersionedExternalApiDispatcher.js ***!
- \***************************************************************************************************************************/
+/*!************************************************************************************************************!*\
+ !*** D:/dev/extensions-and-embedding-api/packages/api-shared-js/lib/src/VersionedExternalApiDispatcher.js ***!
+ \************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
@@ -11511,7 +12234,7 @@ var ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsIm
var Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "../lib/src/ExtensionsApi/Namespaces/Extensions.js");
var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js");
var isAlpha = typeof EXTENSION_VERSION_IS_ALPHA !== 'undefined' ? EXTENSION_VERSION_IS_ALPHA : false;
-api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.6.0-pre.18" : undefined, isAlpha);
+api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.7.0-pre.50" : undefined, isAlpha);
var extensionImpl = new ExtensionsImpl_1.ExtensionsImpl();
exports.extensions = new Extensions_1.Extensions(extensionImpl);
// Export Enums
@@ -11520,7 +12243,10 @@ var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-c
exports.ExtensionContext = api_external_contract_js_1.ExtensionContext;
exports.ExtensionMode = api_external_contract_js_1.ExtensionMode;
exports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType;
+exports.ClassNameKey = api_external_contract_js_1.ClassNameKey;
exports.ColumnType = api_external_contract_js_1.ColumnType;
+exports.DashboardLayoutChange = api_external_contract_js_1.DashboardLayoutChange;
+exports.DashboardObjectVisibilityType = api_external_contract_js_1.DashboardObjectVisibilityType;
exports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType;
exports.DataType = api_external_contract_js_1.DataType;
exports.DateRangeType = api_external_contract_js_1.DateRangeType;
@@ -11537,6 +12263,7 @@ exports.MarkType = api_external_contract_js_1.MarkType;
exports.ParameterValueType = api_external_contract_js_1.ParameterValueType;
exports.PeriodType = api_external_contract_js_1.PeriodType;
exports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType;
+exports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType;
exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType;
exports.SheetType = api_external_contract_js_1.SheetType;
exports.SortDirection = api_external_contract_js_1.SortDirection;
@@ -11546,6 +12273,52 @@ exports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType;
exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType;
+/***/ }),
+
+/***/ "../lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js":
+/*!**********************************************************************!*\
+ !*** ../lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
+var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "../lib/src/ExtensionsApi/Events/TableauEvent.js");
+var DashboardLayoutChangedEvent = /** @class */ (function (_super) {
+ __extends(DashboardLayoutChangedEvent, _super);
+ function DashboardLayoutChangedEvent(_dashboardLayoutChangeDetails) {
+ var _this = _super.call(this, Contract.TableauEventType.DashboardLayoutChanged) || this;
+ _this._dashboardLayoutChangeDetails = _dashboardLayoutChangeDetails;
+ return _this;
+ }
+ Object.defineProperty(DashboardLayoutChangedEvent.prototype, "dashboardLayoutChangeDetails", {
+ get: function () {
+ return this._dashboardLayoutChangeDetails;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ return DashboardLayoutChangedEvent;
+}(TableauEvent_1.TableauEvent));
+exports.DashboardLayoutChangedEvent = DashboardLayoutChangedEvent;
+
+
/***/ }),
/***/ "../lib/src/ExtensionsApi/Events/FilterChangedEvent.js":
@@ -11685,7 +12458,7 @@ var ParameterChangedEvent = /** @class */ (function (_super) {
ParameterChangedEvent.prototype.getParameterAsync = function () {
var _this = this;
// Call down to our service to get the parameter back via its field name
- var service = api_shared_js_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */);
+ var service = api_shared_js_1.ApiServiceRegistry.get().getService("parameters-service" /* Parameters */);
return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then(function (parameterImpl) {
if (parameterImpl === undefined) {
throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, "Cannot find parameter: " + _this._globalFieldName);
@@ -11816,6 +12589,50 @@ var TableauWorksheetEvent = /** @class */ (function (_super) {
exports.TableauWorksheetEvent = TableauWorksheetEvent;
+/***/ }),
+
+/***/ "../lib/src/ExtensionsApi/Impl/ConnectedServer.js":
+/*!********************************************************!*\
+ !*** ../lib/src/ExtensionsApi/Impl/ConnectedServer.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var ConnectedServer = /** @class */ (function () {
+ function ConnectedServer(_userId, _siteId, _workbookId) {
+ this._userId = _userId;
+ this._siteId = _siteId;
+ this._workbookId = _workbookId;
+ }
+ Object.defineProperty(ConnectedServer.prototype, "userId", {
+ get: function () {
+ return this._userId;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(ConnectedServer.prototype, "siteId", {
+ get: function () {
+ return this._siteId;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(ConnectedServer.prototype, "workbookId", {
+ get: function () {
+ return this._workbookId;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ return ConnectedServer;
+}());
+exports.ConnectedServer = ConnectedServer;
+
+
/***/ }),
/***/ "../lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js":
@@ -11849,7 +12666,7 @@ var ExtensionWorkbookImpl = /** @class */ (function (_super) {
}
ExtensionWorkbookImpl.prototype.getAllDataSourcesAsync = function () {
var _this = this;
- var service = api_shared_js_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */);
+ var service = api_shared_js_1.ApiServiceRegistry.get().getService("data-source-service" /* DataSourceService */);
return service.getAllDataSourcesAsync().then(function (result) {
var dataSchema = result;
var dataSources = [];
@@ -11937,16 +12754,20 @@ var ExtensionsImpl = /** @class */ (function () {
return this._initializationPromise;
};
ExtensionsImpl.prototype.createVizImageAsync = function (inputSpec) {
- var vizService = api_shared_js_1.ApiServiceRegistry.instance.getService("viz-service" /* Viz */);
+ var vizService = api_shared_js_1.ApiServiceRegistry.get().getService("viz-service" /* Viz */);
return vizService.createVizImageAsync(inputSpec);
};
+ ExtensionsImpl.prototype.setClickThroughAsync = function (clickThroughEnabled) {
+ var uiService = api_shared_js_1.ApiServiceRegistry.get().getService("UIService" /* UIService */);
+ return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId);
+ };
ExtensionsImpl.prototype.onDispatcherReceived = function (dispatcherFactory, isExtensionDialog, contextMenuFunctions) {
var _this = this;
var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);
// Call to register all the services which will use the newly initialized dispatcher
RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher);
// Get the initialization service and initialize this extension
- var initializationService = api_shared_js_1.ApiServiceRegistry.instance.getService("InitializationService" /* InitializationService */);
+ var initializationService = api_shared_js_1.ApiServiceRegistry.get().getService("InitializationService" /* InitializationService */);
var callbackMapKeys = (contextMenuFunctions) ? Object.keys(contextMenuFunctions) : [];
return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then(function (result) {
if (!result.extensionInstance.locator.dashboardPath) {
@@ -11962,24 +12783,111 @@ var ExtensionsImpl = /** @class */ (function () {
dispatcher = new api_shared_js_4.VersionedExternalApiDispatcher(dispatcher, platformVersion);
}
// Registration of services must happen before initializing content and environment
- api_shared_js_1.registerAllSharedServices(dispatcher, platformVersion);
+ // Extensions doesn't need to pass in a registryId. By default, the service registry instance is associated with registryId=0.
+ api_shared_js_1.registerAllSharedServices(dispatcher, undefined, platformVersion);
RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher);
_this.dashboardContent = _this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath);
_this.environment = new Environment_1.Environment(result.extensionEnvironment);
_this.settings = _this.initializeSettings(result.extensionSettingsInfo);
_this.ui = new UI_1.UI(new UIImpl_1.UIImpl());
_this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl());
+ _this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId;
+ if (result.extensionEnvironment.workbookFormatting) {
+ _this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting);
+ }
+ // Apply formatting on new dispatcher recieved
+ _this.applyAllFormatting(result.extensionEnvironment.workbookFormatting);
// After initialization has completed, setup listeners for the callback functions that
// are meant to be triggered whenever a context menu item is clicked.
_this.initializeContextMenuCallbacks(contextMenuFunctions);
+ // Also set up listeners for ExtensionStylesChangedEvent
+ _this.initializeWorkbookFormattingChangedEventCallback(dispatcher);
// In the normal initialization case, this will be an empty string. When returning from initializeAsync to the
// developer, we just ingore that string. In the case of initializing from an extension dialog, this string
// is an optional payload sent from the parent extension.
return result.extensionDialogPayload;
});
};
+ ExtensionsImpl.prototype.applyAllFormatting = function (formattingModel) {
+ var _this = this;
+ if (!this._styleElement) {
+ this._styleElement = document.createElement('style');
+ this._styleElement.id = 'Tableau-Extension-Formatting';
+ document.head.appendChild(this._styleElement);
+ }
+ if (!this._styleElement.sheet || !formattingModel) {
+ return;
+ }
+ var stylesheet = this._styleElement.sheet;
+ while (stylesheet.cssRules.length > 0) {
+ stylesheet.deleteRule(stylesheet.cssRules.length - 1);
+ }
+ formattingModel.formattingSheets.map(function (currentFormattingSheet) {
+ _this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet);
+ });
+ };
+ ExtensionsImpl.prototype.applyFormattingSheetToStyleSheet = function (currentFormattingSheet, stylesheet) {
+ var styleInfo = '';
+ var cssProperties = currentFormattingSheet.cssProperties;
+ if (cssProperties.fontFamily) {
+ styleInfo += 'font-family: ' + cssProperties.fontFamily.toString() + '; ';
+ }
+ if (cssProperties.fontSize) {
+ styleInfo += 'font-size: ' + cssProperties.fontSize.toString() + '; ';
+ }
+ if (cssProperties.fontWeight) {
+ styleInfo += 'font-weight: ' + cssProperties.fontWeight.toString() + '; ';
+ }
+ if (cssProperties.fontStyle) {
+ styleInfo += 'font-style: ' + cssProperties.fontStyle.toString() + '; ';
+ }
+ if (cssProperties.textDecoration) {
+ styleInfo += 'text-decoration: ' + cssProperties.textDecoration.toString() + '; ';
+ }
+ if (cssProperties.color) {
+ styleInfo += 'color: ' + cssProperties.color + '; ';
+ }
+ var selector = '.' + currentFormattingSheet.classNameKey;
+ var rule = selector + ' { ' + styleInfo + ' }';
+ stylesheet.insertRule(rule, stylesheet.cssRules.length);
+ };
+ ExtensionsImpl.prototype.initializeWorkbookFormattingChangedEventCallback = function (dispatcher) {
+ var _this = this;
+ var notificationService = api_shared_js_1.ApiServiceRegistry.get().getService("notification-service" /* Notification */);
+ // Unregister function not used since these notifications should be
+ // observed for the full lifetime of the extension.
+ notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function (model) {
+ return true;
+ }, function (eventFormatting) {
+ _this.initializeTableauFonts(dispatcher, eventFormatting);
+ _this.applyAllFormatting(eventFormatting);
+ });
+ };
+ ExtensionsImpl.prototype.initializeTableauFonts = function (dispatcher, workbookFormatting) {
+ var _a;
+ var _this = this;
+ var fontNames = new Array();
+ workbookFormatting.formattingSheets.forEach(function (formattingSheet) {
+ if (formattingSheet.cssProperties.fontFamily) {
+ fontNames.push(formattingSheet.cssProperties.fontFamily);
+ }
+ });
+ if (fontNames.length > 0) {
+ var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.FontNameListItems] = fontNames, _a);
+ dispatcher.execute(api_internal_contract_js_1.VerbId.GetFonts, parameters).then(function (response) {
+ _this.loadFonts(response.result);
+ }).catch();
+ }
+ };
+ ExtensionsImpl.prototype.loadFonts = function (fonts) {
+ fonts.forEach(function (fontNameAndInfo) {
+ var fontFace = new FontFace(fontNameAndInfo.fontName, fontNameAndInfo.fontBinaryInfo);
+ document.fonts.add(fontFace);
+ });
+ };
ExtensionsImpl.prototype.initializeDashboardContent = function (info, sheetPath) {
- var dashboardImpl = new api_shared_js_1.DashboardImpl(info.name, info.size.h, info.size.w, info.zones, sheetPath);
+ var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, new api_shared_js_1.Size(info.size.h, info.size.w));
+ var dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath);
var dashboard = new Dashboard_1.Dashboard(dashboardImpl);
return new DashboardContent_1.DashboardContent(dashboard);
};
@@ -11988,7 +12896,7 @@ var ExtensionsImpl = /** @class */ (function () {
return new Settings_1.Settings(settingsImpl);
};
ExtensionsImpl.prototype.initializeContextMenuCallbacks = function (contextMenuFunctions) {
- var notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */);
+ var notificationService = api_shared_js_1.ApiServiceRegistry.get().getService("notification-service" /* Notification */);
// Unregister function not used since these notifications should be
// observed for the full lifetime of the extension.
notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, function (model) {
@@ -12149,7 +13057,7 @@ var SettingsImpl = /** @class */ (function () {
}
this._saveInProgress = true;
// Use the settings service to save settings to twb
- var settingsService = api_shared_js_1.ApiServiceRegistry.instance.getService("SettingsService" /* SettingsService */);
+ var settingsService = api_shared_js_1.ApiServiceRegistry.get().getService("SettingsService" /* SettingsService */);
return settingsService.saveSettingsAsync(this._currentSettings).then(function (newSettings) {
_this._saveInProgress = false;
_this._isModified = false;
@@ -12182,7 +13090,7 @@ var SettingsImpl = /** @class */ (function () {
var results = new Array();
var notificationService;
try {
- notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */);
+ notificationService = api_shared_js_1.ApiServiceRegistry.get().getService("notification-service" /* Notification */);
}
catch (e) {
// If we don't have this service registered, just return
@@ -12239,8 +13147,8 @@ var UIImpl = /** @class */ (function () {
function UIImpl() {
}
UIImpl.prototype.displayDialogAsync = function (url, payload, options) {
- var uiService = api_shared_js_1.ApiServiceRegistry.instance.getService("UIService" /* UIService */);
- var notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */);
+ var uiService = api_shared_js_1.ApiServiceRegistry.get().getService("UIService" /* UIService */);
+ var notificationService = api_shared_js_1.ApiServiceRegistry.get().getService("notification-service" /* Notification */);
return new Promise(function (resolve, reject) {
uiService.displayDialogAsync(url, payload || '', options).then(function () {
var unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, function (model) {
@@ -12260,7 +13168,7 @@ var UIImpl = /** @class */ (function () {
});
};
UIImpl.prototype.closeDialog = function (payload) {
- var uiService = api_shared_js_1.ApiServiceRegistry.instance.getService("UIService" /* UIService */);
+ var uiService = api_shared_js_1.ApiServiceRegistry.get().getService("UIService" /* UIService */);
uiService.closeDialog(payload);
};
return UIImpl;
@@ -12293,6 +13201,10 @@ var __extends = (this && this.__extends) || (function () {
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
+var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js");
+var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js");
+var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js");
+var DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "../lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js");
var DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "../lib/src/ExtensionsApi/Models/DashboardObject.js");
var Sheet_1 = __webpack_require__(/*! ./Sheet */ "../lib/src/ExtensionsApi/Models/Sheet.js");
var Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "../lib/src/ExtensionsApi/Models/Worksheet.js");
@@ -12302,6 +13214,7 @@ var Dashboard = /** @class */ (function (_super) {
var _this = _super.call(this, _dashboardImpl) || this;
_this._dashboardImpl = _dashboardImpl;
_dashboardImpl.initializeWithPublicInterfaces();
+ _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); });
return _this;
}
Object.defineProperty(Dashboard.prototype, "worksheets", {
@@ -12323,7 +13236,42 @@ var Dashboard = /** @class */ (function (_super) {
configurable: true
});
Dashboard.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) {
- return this._dashboardImpl.setZoneVisibilityAsync(zoneVisibilityMap);
+ return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap);
+ };
+ Dashboard.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) {
+ return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap);
+ };
+ Dashboard.prototype.getDashboardObjectById = function (dashboardObjectId) {
+ var zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId);
+ return zone && new DashboardObject_1.DashboardObject(zone);
+ };
+ Dashboard.prototype.initializeEvents = function () {
+ var _this = this;
+ var results = new Array();
+ // Initializing events and registering notification service
+ var notificationService;
+ try {
+ notificationService = api_shared_js_1.ApiServiceRegistry.get().getService("notification-service" /* Notification */);
+ }
+ catch (e) {
+ // If we don't have this service registered, just return (allows unit testing without NotificationService mock)
+ return results;
+ }
+ var dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged);
+ notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, function (model) {
+ return true;
+ }, function (event) {
+ var dashboardObjectChanges = _this._dashboardImpl.updateZones(event.zones);
+ dashboardLayoutChangedEvent.triggerEvent(function () { return new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges); });
+ });
+ results.push(dashboardLayoutChangedEvent);
+ return results;
+ };
+ Dashboard.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) {
+ return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray);
+ };
+ Dashboard.prototype.replayAnimationAsync = function (replaySpeed) {
+ return this._dashboardImpl.replayAnimationAsync(replaySpeed);
};
return Dashboard;
}(Sheet_1.Sheet));
@@ -12516,7 +13464,7 @@ var Parameter = /** @class */ (function (_super) {
var results = new Array();
var notificationService;
try {
- notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */);
+ notificationService = api_shared_js_1.ApiServiceRegistry.get().getService("notification-service" /* Notification */);
}
catch (e) {
// If we don't have this service registered, just return
@@ -12706,7 +13654,7 @@ var Worksheet = /** @class */ (function (_super) {
var results = new Array();
var notificationService;
try {
- notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */);
+ notificationService = api_shared_js_1.ApiServiceRegistry.get().getService("notification-service" /* Notification */);
}
catch (e) {
// If we don't have this service registered, just return
@@ -12839,21 +13787,30 @@ exports.DashboardContent = DashboardContent;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
+var ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "../lib/src/ExtensionsApi/Impl/ConnectedServer.js");
var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js");
+var WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "../lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js");
/**
* Implementation of the external environment namespace.
* Environment does not follow the Impl pattern as it is
* just a property bag.
+ * First class extensions can get to ConnectedServer with: environment['connectedServer']
*/
var Environment = /** @class */ (function () {
function Environment(extensionEnvironment) {
this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build)
this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext);
+ this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting);
this._language = extensionEnvironment.extensionLanguage;
this._locale = extensionEnvironment.extensionLocale;
this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode);
this._operatingSystem = extensionEnvironment.operatingSystem;
this._tableauVersion = extensionEnvironment.tableauVersion;
+ // If we have a userId, then we are a first class extension
+ // Add our hidden member 'connectedServer'
+ if (extensionEnvironment.userId) {
+ this.connectedServer = new ConnectedServer_1.ConnectedServer(extensionEnvironment.userId, extensionEnvironment.siteId, extensionEnvironment.workbookId);
+ }
}
Object.defineProperty(Environment.prototype, "apiVersion", {
get: function () {
@@ -12869,6 +13826,13 @@ var Environment = /** @class */ (function () {
enumerable: true,
configurable: true
});
+ Object.defineProperty(Environment.prototype, "workbookFormatting", {
+ get: function () {
+ return this._formatting;
+ },
+ enumerable: true,
+ configurable: true
+ });
Object.defineProperty(Environment.prototype, "language", {
get: function () {
return this._language;
@@ -12964,6 +13928,13 @@ var Extensions = /** @class */ (function () {
enumerable: true,
configurable: true
});
+ Object.defineProperty(Extensions.prototype, "dashboardObjectId", {
+ get: function () {
+ return this.extensionImpl.extensionZoneId;
+ },
+ enumerable: true,
+ configurable: true
+ });
Extensions.prototype.initializeAsync = function (contextMenuCallbacks) {
return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then();
};
@@ -12973,6 +13944,9 @@ var Extensions = /** @class */ (function () {
Extensions.prototype.createVizImageAsync = function (inputSpec) {
return this.extensionImpl.createVizImageAsync(inputSpec);
};
+ Extensions.prototype.setClickThroughAsync = function (clickThroughEnabled) {
+ return this.extensionImpl.setClickThroughAsync(clickThroughEnabled);
+ };
return Extensions;
}());
exports.Extensions = Extensions;
@@ -13073,6 +14047,52 @@ var UI = /** @class */ (function () {
exports.UI = UI;
+/***/ }),
+
+/***/ "../lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js":
+/*!************************************************************************!*\
+ !*** ../lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js ***!
+ \************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js");
+var WorkbookFormattingEnvUtil = /** @class */ (function () {
+ function WorkbookFormattingEnvUtil() {
+ }
+ WorkbookFormattingEnvUtil.convertToWorkbookFormatting = function (workbookFormattingModel) {
+ if (!workbookFormattingModel) {
+ return undefined;
+ }
+ else {
+ var formattingMap = workbookFormattingModel.formattingSheets.map(function (currentFormattingSheet) {
+ var formattingSheet = {
+ classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey),
+ cssProperties: {
+ fontFamily: currentFormattingSheet.cssProperties.fontFamily,
+ fontSize: currentFormattingSheet.cssProperties.fontSize,
+ fontWeight: currentFormattingSheet.cssProperties.fontWeight,
+ fontStyle: currentFormattingSheet.cssProperties.fontStyle,
+ textDecoration: currentFormattingSheet.cssProperties.textDecoration,
+ color: currentFormattingSheet.cssProperties.color
+ }
+ };
+ return formattingSheet;
+ });
+ var result = {
+ formattingSheets: formattingMap
+ };
+ return result;
+ }
+ };
+ return WorkbookFormattingEnvUtil;
+}());
+exports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil;
+
+
/***/ }),
/***/ "../lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js":
@@ -13273,6 +14293,20 @@ var UIServiceImpl = /** @class */ (function (_super) {
return;
});
};
+ UIServiceImpl.prototype.setClickThroughAsync = function (clickThroughEnabled, extensionZoneId) {
+ var _a;
+ api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled');
+ if (extensionZoneId === undefined || extensionZoneId <= 0) {
+ throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.');
+ }
+ var parameters = (_a = {},
+ _a[api_internal_contract_js_1.ParameterId.ExtensionZoneId] = extensionZoneId,
+ _a[api_internal_contract_js_1.ParameterId.ClickThroughEnabled] = clickThroughEnabled,
+ _a);
+ return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(function (response) {
+ return;
+ });
+ };
return UIServiceImpl;
}(api_shared_js_1.ServiceImplBase));
exports.UIServiceImpl = UIServiceImpl;
@@ -13295,12 +14329,12 @@ var InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationS
var SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "../lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js");
var UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "../lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js");
function registerAllExtensionsServices(dispatcher) {
- api_shared_js_1.ApiServiceRegistry.instance.registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher));
- api_shared_js_1.ApiServiceRegistry.instance.registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher));
+ api_shared_js_1.ApiServiceRegistry.get().registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher));
+ api_shared_js_1.ApiServiceRegistry.get().registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher));
}
exports.registerAllExtensionsServices = registerAllExtensionsServices;
function registerInitializationExtensionsServices(dispatcher) {
- api_shared_js_1.ApiServiceRegistry.instance.registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher));
+ api_shared_js_1.ApiServiceRegistry.get().registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher));
}
exports.registerInitializationExtensionsServices = registerInitializationExtensionsServices;
@@ -13308,4 +14342,4 @@ exports.registerInitializationExtensionsServices = registerInitializationExtensi
/***/ })
/******/ });
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudHJ5LXVuYmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvZ3VpZC9ndWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL0VtYmVkZGluZ0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9WaXpJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvSnNBcGlJbnRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvY29udHJhY3QvUGFyYW1ldGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9jb250cmFjdC9WZXJicy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVR5cGVDaGVja3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvdmVyc2lvbmluZy9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvdmVyc2lvbmluZy9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL3NyYy9BcGlTaGFyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0Nvbm5lY3Rpb25TdW1tYXJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0RhdGFTb3VyY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9GaWVsZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvRmllbGRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW5mb0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvU2luZ2xlRXZlbnRNYW5hZ2VySW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9Xb3JrYm9va0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvV29ya3NoZWV0SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Nb2RlbHMvRmlsdGVyTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Nb2RlbHMvR2V0RGF0YU1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvTW9kZWxzL1NlbGVjdGlvbk1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvUG9pbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9SZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRGF0YVNvdXJjZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0dldERhdGFTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VydmljZUltcGxCYXNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1pvbmVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2l6ZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVGFibGVTdW1tYXJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1V0aWxzL0VudW1Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVXRpbHMvUGFyYW0udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVTaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVXb3Jrc2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9TZXR0aW5nc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1VJSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkT2JqZWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1BhcmFtZXRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9TaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3JrYm9vay50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3Jrc2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9TZXR0aW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvVUkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1NldHRpbmdzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1VJU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlD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QUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxlQUFlO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxvQkFBb0IsY0FBYztBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFL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Q0FBQyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUhELHNFQUdDO0FBRUQsU0FBZ0Isd0NBQXdDLENBQUMsVUFBaUM7SUFDeEYsa0NBQWtCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLHFEQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDekYsQ0FBQztBQUZELDRGQUVDIiwiZmlsZSI6InRhYmxlYXUuZXh0ZW5zaW9ucy4xLjYuMC1wcmUuMTguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9kaXN0LWV4dGVuc2lvbnMvXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4uL2xpYi9zcmMvRXh0ZW5zaW9uc0FwaS5qc1wiKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZmluZCcpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdBcnJheScsICdmaW5kJyk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mcm9tJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTWFwO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzSW50ZWdlcjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzTmFOO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5wYXJzZUZsb2F0O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIucGFyc2VJbnQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZW50cmllcztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYW55Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpICYmIGl0ICE9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGl0KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQsIHZhbHVlO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsInZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxudmFyIHB1c2ggPSBbXS5wdXNoO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlck91dCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBJU19GSUxURVJfT1VUID0gVFlQRSA9PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgfHwgSVNfRklMVEVSX09VVCA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2guY2FsbCh0YXJnZXQsIHZhbHVlKTsgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBmYWxzZTsgICAgICAgICAgICAgLy8gZXZlcnlcbiAgICAgICAgICBjYXNlIDc6IHB1c2guY2FsbCh0YXJnZXQsIHZhbHVlKTsgLy8gZmlsdGVyT3V0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4gIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJPdXRgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maWx0ZXJpbmdcbiAgZmlsdGVyT3V0OiBjcmVhdGVNZXRob2QoNylcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gbmV3IChDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEMpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCJ2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYXN0S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZmFzdEtleTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpbmRleDogY3JlYXRlKG51bGwpLFxuICAgICAgICBmaXJzdDogdW5kZWZpbmVkLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWQsXG4gICAgICAgIHNpemU6IDBcbiAgICAgIH0pO1xuICAgICAgaWYgKCFERVNDUklQVE9SUykgdGhhdC5zaXplID0gMDtcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjEuMy4xIE1hcC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5pbmRleFtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucHJldmlvdXMgPSBwcmV2O1xuICAgICAgICAgIGlmIChzdGF0ZS5maXJzdCA9PSBlbnRyeSkgc3RhdGUuZmlyc3QgPSBuZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjtcbiAgICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUtLTtcbiAgICAgICAgICBlbHNlIHRoYXQuc2l6ZS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyAyMy4xLjMuNiBNYXAucHJvdG90eXBlLmdldChrZXkpXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyAyMy4yLjMuMSBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkge1xuICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InO1xuICAgIHZhciBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgIGRlZmluZUl0ZXJhdG9yKEMsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICAgIHR5cGU6IElURVJBVE9SX05BTUUsXG4gICAgICAgIHRhcmdldDogaXRlcmF0ZWQsXG4gICAgICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksXG4gICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICAgICAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICAgICAgdmFyIGVudHJ5ID0gc3RhdGUubGFzdDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCFzdGF0ZS50YXJnZXQgfHwgIShzdGF0ZS5sYXN0ID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm5leHQgOiBzdGF0ZS5zdGF0ZS5maXJzdCkpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS5rZXksIGRvbmU6IGZhbHNlIH07XG4gICAgICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LnZhbHVlLCBkb25lOiBmYWxzZSB9O1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IFtlbnRyeS5rZXksIGVudHJ5LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoQ09OU1RSVUNUT1JfTkFNRSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgQ29uc3RydWN0b3IgPSBOYXRpdmVDb25zdHJ1Y3RvcjtcbiAgdmFyIGV4cG9ydGVkID0ge307XG5cbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgbmF0aXZlTWV0aG9kID0gTmF0aXZlUHJvdG90eXBlW0tFWV07XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywgdmFsdWUgPT09IDAgPyAwIDogdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gOiBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gdW5kZWZpbmVkIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHZhciBSRVBMQUNFID0gaXNGb3JjZWQoXG4gICAgQ09OU1RSVUNUT1JfTkFNRSxcbiAgICB0eXBlb2YgTmF0aXZlQ29uc3RydWN0b3IgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gICAgfSkpXG4gICk7XG5cbiAgaWYgKFJFUExBQ0UpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuUkVRVUlSRUQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHRydWUpKSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICB2YXIgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IGluc3RhbmNlLmhhcygxKTsgfSk7XG4gICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXcgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9IGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGl0ZXJhYmxlKTsgfSk7XG4gICAgLy8gZm9yIGVhcmx5IGltcGxlbWVudGF0aW9ucyAtMCBhbmQgKzAgbm90IHRoZSBzYW1lXG4gICAgdmFyIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWOCB+IENocm9taXVtIDQyLSBmYWlscyBvbmx5IHdpdGggNSsgZWxlbWVudHNcbiAgICAgIHZhciAkaW5zdGFuY2UgPSBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKTtcbiAgICAgIHZhciBpbmRleCA9IDU7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICB9KTtcblxuICAgIGlmICghQUNDRVBUX0lURVJBQkxFUykge1xuICAgICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgaXRlcmFibGUpIHtcbiAgICAgICAgYW5JbnN0YW5jZShkdW1teSwgQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBOYXRpdmVQcm90b3R5cGU7XG4gICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTtcblxuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyO1xuICB9XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBDb25zdHJ1Y3RvciAhPSBOYXRpdmVDb25zdHJ1Y3RvciB9LCBleHBvcnRlZCk7XG5cbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0cHJvdG90eXBlb2YgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEl0ZXJhdG9yc0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKTtcblxudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIGl0ZXJhYmxlIERPTSBjb2xsZWN0aW9uc1xuLy8gZmxhZyAtIGBpdGVyYWJsZWAgaW50ZXJmYWNlIC0gJ2VudHJpZXMnLCAna2V5cycsICd2YWx1ZXMnLCAnZm9yRWFjaCcgbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENTU1J1bGVMaXN0OiAwLFxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLFxuICBDU1NWYWx1ZUxpc3Q6IDAsXG4gIENsaWVudFJlY3RMaXN0OiAwLFxuICBET01SZWN0TGlzdDogMCxcbiAgRE9NU3RyaW5nTGlzdDogMCxcbiAgRE9NVG9rZW5MaXN0OiAxLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCxcbiAgRmlsZUxpc3Q6IDAsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiAwLFxuICBIVE1MQ29sbGVjdGlvbjogMCxcbiAgSFRNTEZvcm1FbGVtZW50OiAwLFxuICBIVE1MU2VsZWN0RWxlbWVudDogMCxcbiAgTWVkaWFMaXN0OiAwLFxuICBNaW1lVHlwZUFycmF5OiAwLFxuICBOYW1lZE5vZGVNYXA6IDAsXG4gIE5vZGVMaXN0OiAxLFxuICBQYWludFJlcXVlc3RMaXN0OiAwLFxuICBQbHVnaW46IDAsXG4gIFBsdWdpbkFycmF5OiAwLFxuICBTVkdMZW5ndGhMaXN0OiAwLFxuICBTVkdOdW1iZXJMaXN0OiAwLFxuICBTVkdQYXRoU2VnTGlzdDogMCxcbiAgU1ZHUG9pbnRMaXN0OiAwLFxuICBTVkdTdHJpbmdMaXN0OiAwLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiAwLFxuICBTb3VyY2VCdWZmZXJMaXN0OiAwLFxuICBTdHlsZVNoZWV0TGlzdDogMCxcbiAgVGV4dFRyYWNrQ3VlTGlzdDogMCxcbiAgVGV4dFRyYWNrTGlzdDogMCxcbiAgVG91Y2hMaXN0OiAwXG59O1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC8oPzppcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc29mKGdsb2JhbC5wcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTtcbn0gZWxzZSBpZiAodXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uICYmICt2ZXJzaW9uO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SLCBNRVRIT0QsIGxlbmd0aCkge1xuICByZXR1cm4gYmluZChjYWxsLCBnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdLCBsZW5ndGgpO1xufTtcbiIsIi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gKGdsb2JhbFtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuIiwidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCk7XG4gICAgfTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKVxuICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAmJiBpdC5NYXRoID09IE1hdGggJiYgaXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxubW9kdWxlLmV4cG9ydHMgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tZ2xvYmFsLXRoaXMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fFxuICBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYpIHx8XG4gIGNoZWNrKHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMgLS0gZmFsbGJhY2tcbiAgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pKCkgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH1cbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTtcbn0gOiBPYmplY3Q7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWluc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7XG4gIHZhciBOZXdUYXJnZXQsIE5ld1RhcmdldFByb3RvdHlwZTtcbiAgaWYgKFxuICAgIC8vIGl0IGNhbiB3b3JrIG9ubHkgd2l0aCBuYXRpdmUgYHNldFByb3RvdHlwZU9mYFxuICAgIHNldFByb3RvdHlwZU9mICYmXG4gICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpc1xuICAgIHR5cGVvZiAoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpID09ICdmdW5jdGlvbicgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZztcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGAzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBNRVRBREFUQSA9IHVpZCgnbWV0YScpO1xudmFyIGlkID0gMDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIG1ldGEuUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgUkVRVUlSRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrRGF0YTogZ2V0V2Vha0RhdGEsXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlO1xuIiwidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIHZhciB3bWdldCA9IHN0b3JlLmdldDtcbiAgdmFyIHdtaGFzID0gc3RvcmUuaGFzO1xuICB2YXIgd21zZXQgPSBzdG9yZS5zZXQ7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICB3bXNldC5jYWxsKHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY2xhc3NvZihhcmcpID09ICdBcnJheSc7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbnZhciBSZXN1bHQgPSBmdW5jdGlvbiAoc3RvcHBlZCwgcmVzdWx0KSB7XG4gIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7XG4gIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTtcbiAgdmFyIElOVEVSUlVQVEVEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklOVEVSUlVQVEVEKTtcbiAgdmFyIGZuID0gYmluZCh1bmJvdW5kRnVuY3Rpb24sIHRoYXQsIDEgKyBBU19FTlRSSUVTICsgSU5URVJSVVBURUQpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgIGlmIChpdGVyYXRvcikgaXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgY29uZGl0aW9uKTtcbiAgfTtcblxuICB2YXIgY2FsbEZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKEFTX0VOVFJJRVMpIHtcbiAgICAgIGFuT2JqZWN0KHZhbHVlKTtcbiAgICAgIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSwgc3RvcCkgOiBmbih2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgIH0gcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWUsIHN0b3ApIDogZm4odmFsdWUpO1xuICB9O1xuXG4gIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gY2FsbEZuKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG4gICAgfVxuICAgIGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpO1xuICB9XG5cbiAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGNhbGxGbihzdGVwLnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvcikge1xuICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKS52YWx1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9IEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0ge307XG4gIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZVxuICByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcblxuaWYgKE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5pZiAoKCFJU19QVVJFIHx8IE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX1dFQk9TX1dFQktJVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0Jyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlLCB0aGVuO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICAvLyBhbHNvIGV4Y2VwdCBXZWJPUyBXZWJraXQgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg5OFxuICBpZiAoIUlTX0lPUyAmJiAhSVNfTk9ERSAmJiAhSVNfV0VCT1NfV0VCS0lUICYmIE11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIHRoZW4gPSBwcm9taXNlLnRoZW47XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhlbi5jYWxsKHByb21pc2UsIGZsdXNoKTtcbiAgICB9O1xuICAvLyBOb2RlLmpzIHdpdGhvdXQgcHJvbWlzZXNcbiAgfSBlbHNlIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWV1ZU1pY3JvdGFzayB8fCBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICBpZiAoIWhlYWQpIHtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlO1xuIiwidmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuICFTeW1ib2wuc2hhbSAmJlxuICAgIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAoSVNfTk9ERSA/IFY4X1ZFUlNJT04gPT09IDM4IDogVjhfVkVSU0lPTiA+IDM3ICYmIFY4X1ZFUlNJT04gPCA0MSk7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcblxuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyICRwYXJzZUZsb2F0ID0gZ2xvYmFsLnBhcnNlRmxvYXQ7XG52YXIgRk9SQ0VEID0gMSAvICRwYXJzZUZsb2F0KHdoaXRlc3BhY2VzICsgJy0wJykgIT09IC1JbmZpbml0eTtcblxuLy8gYHBhcnNlRmxvYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWZsb2F0LXN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUZsb2F0KHN0cmluZykge1xuICB2YXIgdHJpbW1lZFN0cmluZyA9IHRyaW0oU3RyaW5nKHN0cmluZykpO1xuICB2YXIgcmVzdWx0ID0gJHBhcnNlRmxvYXQodHJpbW1lZFN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgdHJpbW1lZFN0cmluZy5jaGFyQXQoMCkgPT0gJy0nID8gLTAgOiByZXN1bHQ7XG59IDogJHBhcnNlRmxvYXQ7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHRyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciAkcGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7XG52YXIgaGV4ID0gL15bKy1dPzBbWHhdLztcbnZhciBGT1JDRUQgPSAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMHgxNicpICE9PSAyMjtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgpIHtcbiAgdmFyIFMgPSB0cmltKFN0cmluZyhzdHJpbmcpKTtcbiAgcmV0dXJuICRwYXJzZUludChTLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChTKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWFzc2lnbiAtLSBzYWZlXG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHNob3VsZCBoYXZlIGNvcnJlY3Qgb3JkZXIgb2Ygb3BlcmF0aW9ucyAoRWRnZSBidWcpXG4gIGlmIChERVNDUklQVE9SUyAmJiAkYXNzaWduKHsgYjogMSB9LCAkYXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zeW1ib2wgLS0gc2FmZVxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG4gIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkge1xuICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gb2JqZWN0S2V5cyhTKS5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xuXG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgU0NSSVBUID0gJ3NjcmlwdCc7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG52YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBBY3RpdmVYIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiAgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpO1xuICBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTtcbiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsgLy8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8qIGdsb2JhbCBBY3RpdmVYT2JqZWN0IC0tIG9sZCBJRSAqL1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IGRvY3VtZW50LmRvbWFpbiAmJiBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH1cbiAgTnVsbFByb3RvT2JqZWN0ID0gYWN0aXZlWERvY3VtZW50ID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKCk7XG4gIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyAkZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gTmFzaG9ybiB+IEpESzggYnVnXG52YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgISRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlXG5leHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICAgIHNldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldDtcbiAgICBzZXR0ZXIuY2FsbCh0ZXN0LCBbXSk7XG4gICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgYW5PYmplY3QoTyk7XG4gICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlci5jYWxsKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJykuZjtcblxuLy8gYE9iamVjdC57IGVudHJpZXMsIHZhbHVlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRPX0VOVFJJRVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IG9iamVjdEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKE8sIGtleSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goVE9fRU5UUklFUyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmVudHJpZXNcbiAgZW50cmllczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnZhbHVlc1xuICB2YWx1ZXM6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8ge30udG9TdHJpbmcgOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIHZhciBzdGF0ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7XG4gICAgfVxuICAgIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpO1xuICAgIGlmICghc3RhdGUuc291cmNlKSB7XG4gICAgICBzdGF0ZS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gICAgfVxuICB9XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIHNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXVuc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkge1xuICAgIHNpbXBsZSA9IHRydWU7XG4gIH1cbiAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpO1xufSk7XG4iLCIvLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsLCBrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkge1xuICB2YXIgQ29uc3RydWN0b3IgPSBnZXRCdWlsdEluKENPTlNUUlVDVE9SX05BTUUpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiBDb25zdHJ1Y3RvciAmJiAhQ29uc3RydWN0b3JbU1BFQ0lFU10pIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgU1BFQ0lFUywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgfSk7XG4gIH1cbn07XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG4iLCJ2YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4xMC4xJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDIxIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IGNvZGVQb2ludEF0LCBhdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICAgID8gQ09OVkVSVF9UT19TVFJJTkcgPyBTLmNoYXJBdChwb3NpdGlvbikgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgd2hpdGVzcGFjZSA9ICdbJyArIHdoaXRlc3BhY2VzICsgJ10nO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cCh3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIGlmIChUWVBFICYgMSkgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJ0cmltLCAnJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVJpZ2h0LCB0cmltRW5kIH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1lbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbnZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcblxudmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJ1bihpZCk7XG4gIH07XG59O1xuXG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIHBvc3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTtcbn07XG5cbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0IHx8ICFjbGVhcikge1xuICBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBzcGVjIHJlcXVpcmVtZW50XG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChJU19OT0RFKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2socnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIC8vIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjI0XG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgICFnbG9iYWwuaW1wb3J0U2NyaXB0cyAmJlxuICAgIGxvY2F0aW9uICYmIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKHBvc3QpXG4gICkge1xuICAgIGRlZmVyID0gcG9zdDtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiIsIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCJ2YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc05hTihhcmd1bWVudCA9ICthcmd1bWVudCkgPyAwIDogKGFyZ3VtZW50ID4gMCA/IGZsb29yIDogY2VpbCkoYXJndW1lbnQpO1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlcihhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsInZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJztcbiIsInZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgU3RyaW5nKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArICgrK2lkICsgcG9zdGZpeCkudG9TdHJpbmcoMzYpO1xufTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0xcbiAgJiYgIVN5bWJvbC5zaGFtXG4gICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCc7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkgfHwgIShOQVRJVkVfU1lNQk9MIHx8IHR5cGVvZiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPT0gJ3N0cmluZycpKSB7XG4gICAgaWYgKE5BVElWRV9TWU1CT0wgJiYgaGFzKFN5bWJvbCwgbmFtZSkpIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IFN5bWJvbFtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gY3JlYXRlV2VsbEtub3duU3ltYm9sKCdTeW1ib2wuJyArIG5hbWUpO1xuICAgIH1cbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcbiIsIi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzXG5tb2R1bGUuZXhwb3J0cyA9ICdcXHUwMDA5XFx1MDAwQVxcdTAwMEJcXHUwMDBDXFx1MDAwRFxcdTAwMjBcXHUwMEEwXFx1MTY4MFxcdTIwMDBcXHUyMDAxXFx1MjAwMicgK1xuICAnXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG52YXIgJEFnZ3JlZ2F0ZUVycm9yID0gZnVuY3Rpb24gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlKSB7XG4gIHZhciB0aGF0ID0gdGhpcztcbiAgaWYgKCEodGhhdCBpbnN0YW5jZW9mICRBZ2dyZWdhdGVFcnJvcikpIHJldHVybiBuZXcgJEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSk7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2Vycm9yLW1lc3NhZ2UgLS0gZXhwZWN0ZWRcbiAgICB0aGF0ID0gc2V0UHJvdG90eXBlT2YobmV3IEVycm9yKHVuZGVmaW5lZCksIGdldFByb3RvdHlwZU9mKHRoYXQpKTtcbiAgfVxuICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ21lc3NhZ2UnLCBTdHJpbmcobWVzc2FnZSkpO1xuICB2YXIgZXJyb3JzQXJyYXkgPSBbXTtcbiAgaXRlcmF0ZShlcnJvcnMsIGVycm9yc0FycmF5LnB1c2gsIHsgdGhhdDogZXJyb3JzQXJyYXkgfSk7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnZXJyb3JzJywgZXJyb3JzQXJyYXkpO1xuICByZXR1cm4gdGhhdDtcbn07XG5cbiRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNSwgJEFnZ3JlZ2F0ZUVycm9yKSxcbiAgbWVzc2FnZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICcnKSxcbiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICdBZ2dyZWdhdGVFcnJvcicpXG59KTtcblxuLy8gYEFnZ3JlZ2F0ZUVycm9yYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZ2dyZWdhdGUtZXJyb3ItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUgfSwge1xuICBBZ2dyZWdhdGVFcnJvcjogJEFnZ3JlZ2F0ZUVycm9yXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmQ7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIEZJTkQgPSAnZmluZCc7XG52YXIgU0tJUFNfSE9MRVMgPSB0cnVlO1xuXG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEZJTkQgaW4gW10pIEFycmF5KDEpW0ZJTkRdKGZ1bmN0aW9uICgpIHsgU0tJUFNfSE9MRVMgPSBmYWxzZTsgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcyhGSU5EKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZnJvbScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhYmxlKTtcbn0pO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC1vYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtaW50ZWdlcicpO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNJbnRlZ2VyOiBpc0ludGVnZXJcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbi8vIGBOdW1iZXIuaXNOYU5gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNuYW5cbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQnKTtcblxuLy8gYE51bWJlci5wYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLnBhcnNlRmxvYXRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItcGFyc2VmbG9hdCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUsIGZvcmNlZDogTnVtYmVyLnBhcnNlRmxvYXQgIT0gcGFyc2VGbG9hdCB9LCB7XG4gIHBhcnNlRmxvYXQ6IHBhcnNlRmxvYXRcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgcGFyc2VJbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludCcpO1xuXG4vLyBgTnVtYmVyLnBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLnBhcnNlaW50XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbnVtYmVyLXBhcnNlaW50IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBOdW1iZXIucGFyc2VJbnQgIT0gcGFyc2VJbnQgfSwge1xuICBwYXJzZUludDogcGFyc2VJbnRcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24nKTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWFzc2lnbiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHtcbiAgYXNzaWduOiBhc3NpZ25cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGVudHJpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5JykuZW50cmllcztcblxuLy8gYE9iamVjdC5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmVudHJpZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhPKSB7XG4gICAgcmV0dXJuICRlbnRyaWVzKE8pO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2ZcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgc2V0UHJvdG90eXBlT2Y6IHNldFByb3RvdHlwZU9mXG59KTtcbiIsInZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nJyk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xuaWYgKCFUT19TVFJJTkdfVEFHX1NVUFBPUlQpIHtcbiAgcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgdG9TdHJpbmcsIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBQcm9taXNlLmFsbFNldHRsZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbHNldHRsZWRcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uOiBlcnJvciB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbnZhciBQUk9NSVNFX0FOWV9FUlJPUiA9ICdObyBvbmUgcHJvbWlzZSByZXNvbHZlZCc7XG5cbi8vIGBQcm9taXNlLmFueWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYW55XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbnk6IGZ1bmN0aW9uIGFueShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICB2YXIgYWxyZWFkeVJlc29sdmVkID0gZmFsc2U7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5UmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZXJyb3JzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvcnNbaW5kZXhdID0gZXJyb3I7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbi8vIFNhZmFyaSBidWcgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMDgyOVxudmFyIE5PTl9HRU5FUklDID0gISFOYXRpdmVQcm9taXNlICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgTmF0aXZlUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXS5jYWxsKHsgdGhlbjogZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9IH0sIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gYFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IE5PTl9HRU5FUklDIH0sIHtcbiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHksXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5XG4gICAgKTtcbiAgfVxufSk7XG5cbi8vIHBhdGNoIG5hdGl2ZSBQcm9taXNlLnByb3RvdHlwZSBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHtcbiAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICdmaW5hbGx5JywgZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21pY3JvdGFzaycpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2U7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG52YXIgRElTUEFUQ0hfRVZFTlQgPSAhIShkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiBnbG9iYWwuZGlzcGF0Y2hFdmVudCk7XG52YXIgTkFUSVZFX1JFSkVDVElPTl9FVkVOVCA9IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJztcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuO1xuXG52YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IGluc3BlY3RTb3VyY2UoUHJvbWlzZUNvbnN0cnVjdG9yKSAhPT0gU3RyaW5nKFByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSkge1xuICAgIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgIGlmIChWOF9WRVJTSU9OID09PSA2NikgcmV0dXJuIHRydWU7XG4gICAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIGlmICghSVNfTk9ERSAmJiAhTkFUSVZFX1JFSkVDVElPTl9FVkVOVCkgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gV2UgbmVlZCBQcm9taXNlI2ZpbmFsbHkgaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICFQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlO1xuICAvLyBXZSBjYW4ndCB1c2UgQEBzcGVjaWVzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoVjhfVkVSU0lPTiA+PSA1MSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoUHJvbWlzZUNvbnN0cnVjdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBEZXRlY3QgY29ycmVjdG5lc3Mgb2Ygc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIHJldHVybiAhKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2UpO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIFByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAoc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQoc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGF0ZS5yZWFjdGlvbnMgPSBbXTtcbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKCFOQVRJVkVfUkVKRUNUSU9OX0VWRU5UICYmIChoYW5kbGVyID0gZ2xvYmFsWydvbicgKyBuYW1lXSkpIGhhbmRsZXIoZXZlbnQpO1xuICBlbHNlIGlmIChuYW1lID09PSBVTkhBTkRMRURfUkVKRUNUSU9OKSBob3N0UmVwb3J0RXJyb3JzKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCByZWFzb24pO1xufTtcblxudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgaWYgKElTX05PREUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeShzdGF0ZSwgdHJ1ZSk7XG59O1xuXG52YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdGUuZmFjYWRlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgdmFyIHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKTtcbiAgICBpZiAodGhlbikge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IGRvbmU6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlc29sdmUsIHdyYXBwZXIsIHN0YXRlKSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZWplY3QsIHdyYXBwZXIsIHN0YXRlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaW50ZXJuYWxSZWplY3Qod3JhcHBlciwgZXJyb3IsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IEZVTEZJTExFRDtcbiAgICAgIG5vdGlmeShzdGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnRlcm5hbFJlamVjdCh7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoRk9SQ0VEKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gIFByb21pc2VDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHN0YXRlLCBlcnJvcik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IFtdLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7XG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUudGhlblxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHN0YXRlLnN0YXRlICE9IFBFTkRJTkcpIG5vdGlmeShzdGF0ZSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIGlmICghSVNfUFVSRSAmJiB0eXBlb2YgTmF0aXZlUHJvbWlzZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2UucHJvdG90eXBlLnRoZW47XG5cbiAgICAvLyB3cmFwIG5hdGl2ZSBQcm9taXNlI3RoZW4gZm9yIG5hdGl2ZSBhc3luYyBmdW5jdGlvbnNcbiAgICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIG5hdGl2ZVRoZW4uY2FsbCh0aGF0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xuXG4gICAgLy8gd3JhcCBmZXRjaCByZXN1bHRcbiAgICBpZiAodHlwZW9mICRmZXRjaCA9PSAnZnVuY3Rpb24nKSAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKFByb21pc2VDb25zdHJ1Y3RvciwgJGZldGNoLmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoSVNfUFVSRSAmJiB0aGlzID09PSBQcm9taXNlV3JhcHBlciA/IFByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGFyQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNoYXJBdDtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogU3RyaW5nKGl0ZXJhdGVkKSxcbiAgICBpbmRleDogMFxuICB9KTtcbi8vIGAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICBzdGF0ZS5pbmRleCArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgQ09MTEVDVElPTl9OQU1FKTtcbiAgICB9XG4gICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykge1xuICAgICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkgdHJ5IHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIE1FVEhPRF9OQU1FLCBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gPSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIoZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsaWRhdG9yID0gbmV3IFJlZ0V4cChcIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kXCIsIFwiaVwiKTtcblxuICBmdW5jdGlvbiBnZW4oY291bnQpIHtcbiAgICB2YXIgb3V0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGk8Y291bnQ7IGkrKykge1xuICAgICAgb3V0ICs9ICgoKDErTWF0aC5yYW5kb20oKSkqMHgxMDAwMCl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIEd1aWQoZ3VpZCkge1xuICAgIGlmICghZ3VpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnQ7IGB2YWx1ZWAgaGFzIG5vIHZhbHVlLlwiKTtcbiAgICAgIFxuICAgIHRoaXMudmFsdWUgPSBHdWlkLkVNUFRZO1xuICAgIFxuICAgIGlmIChndWlkICYmIGd1aWQgaW5zdGFuY2VvZiBHdWlkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZC50b1N0cmluZygpO1xuXG4gICAgfSBlbHNlIGlmIChndWlkICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChndWlkKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIiAmJiBHdWlkLmlzR3VpZChndWlkKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIC8vIENvbXBhcmluZyBzdHJpbmcgYHZhbHVlYCBhZ2FpbnN0IHByb3ZpZGVkIGBndWlkYCB3aWxsIGF1dG8tY2FsbFxuICAgICAgLy8gdG9TdHJpbmcgb24gYGd1aWRgIGZvciBjb21wYXJpc29uXG4gICAgICByZXR1cm4gR3VpZC5pc0d1aWQob3RoZXIpICYmIHRoaXMudmFsdWUgPT0gb3RoZXI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IEd1aWQuRU1QVFk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIEd1aWQuRU1QVFkgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuXG4gIEd1aWQuaXNHdWlkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgR3VpZCB8fCB2YWxpZGF0b3IudGVzdCh2YWx1ZS50b1N0cmluZygpKSk7XG4gIH07XG5cbiAgR3VpZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEd1aWQoW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKSk7XG4gIH07XG5cbiAgR3VpZC5yYXcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKTtcbiAgfTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBHdWlkO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuR3VpZCA9IEd1aWQ7XG4gIH1cbn0pKCk7XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvLyBUaGlzIGZpbGUgcmUtZXhwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGV4dGVuc2lvbnMgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuLy8gRXhwb3J0IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc2hhcmVkIGZpbGVcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5cbi8vIEV4cG9ydCB0aGUgbmFtZXNwYWNlcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gZW1iZWRkaW5nXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL05hbWVzcGFjZXMvRW1iZWRkaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVGFibGVhdUVycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVml6SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zJztcbmV4cG9ydCB7XG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplT3B0aW9ucyxcbiAgU2hlZXQgYXMgRW1iZWRkaW5nU2hlZXQsXG4gIFdvcmtzaGVldCBhcyBFbWJlZGRpbmdXb3Jrc2hlZXQsXG4gIERhc2hib2FyZCBhcyBFbWJlZGRpbmdEYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFbWJlZGRpbmdEYXNoYm9hcmRPYmplY3Rcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0IHsgTWFyayB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU2VsZWN0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeVBvaW50IGFzIEVtYmVkZGluZ1N0b3J5UG9pbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5UG9pbnRJbnRlcmZhY2UnO1xuZXhwb3J0IHsgV29ya2Jvb2sgYXMgRW1iZWRkaW5nV29ya2Jvb2sgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dvcmtib29rSW50ZXJmYWNlJztcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG4vLyBFeHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoZSBzaGFyZWQgZmlsZVxuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcblxuLy8gRXhwb3J0IHRoZSBuYW1lc3BhY2VzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBleHRlbnNpb25zXG5leHBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9FdmVudEludGVyZmFjZSc7XG5leHBvcnQge1xuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgRGFzaGJvYXJkIGFzIEV4dGVuc2lvbkRhc2hib2FyZCxcbiAgRGFzaGJvYXJkT2JqZWN0IGFzIEV4dGVuc2lvbkRhc2hib2FyZE9iamVjdCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBXb3JrYm9vayBhcyBFeHRlbnNpb25Xb3JrYm9va1xufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9Xb3JrYm9va0ludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1JztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlbnNpb25zQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0VtYmVkZGluZ0FwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEVtYmVkZGluZyBkZXZlbG9wZXJzLlxuLy8gRW51bXMgc2hvdWxkIGJlIGtlcHQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLlxuXG4vKipcbiAqIFRPRE9cbiAqL1xuZXhwb3J0IGVudW0gRGV2aWNlVHlwZSB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gIFRhYmxldCA9ICd0YWJsZXQnLFxuICBQaG9uZSA9ICdwaG9uZSdcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBUaGUgYnJvd3NlciBpcyBub3QgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBUYWJsZWF1IEphdmFTY3JpcHQgQVBJXG4gICAqL1xuICBCcm93c2VyTm90Q2FwYWJsZSA9ICdicm93c2VyLW5vdC1jYXBhYmxlJyxcbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9ucyBvbiBhIHdvcmtib29rIG9yIGEgdmlldyBkbyBub3QgYWxsb3cgZG93bmxvYWRpbmcgdGhlIHdvcmtib29rLlxuICAgKi9cbiAgRG93bmxvYWRXb3JrYm9va05vdEFsbG93ZWQgPSAnZG93bmxvYWQtd29ya2Jvb2stbm90LWFsbG93ZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJycyB3aXRoaW4gdGhlIFRhYmxlYXUgSmF2YVNjcmlwdCBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGFnZ3JlZ2F0aW9uIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBmaWx0ZXIsIHN1Y2ggYXMgc2V0dGluZyBhIHJhbmdlIGZpbHRlciB0byBcIlNVTShTYWxlcylcIiBpbnN0ZWFkIG9mXG4gICAqIFwiU2FsZXNcIi5cbiAgICovXG4gIEludmFsaWRBZ2dyZWdhdGlvbkZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZ3JlZ2F0aW9uLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBJbnZhbGlkRmlsdGVyRmllbGROYW1lID0gJ2ludmFsaWQtZmlsdGVyLW5hbWUnLFxuICAvKipcbiAgICogRWl0aGVyIGEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UsIG9yIHRoZSB2YWx1ZSBzdXBwbGllZFxuICAgKiBpbiB0aGUgZmlsdGVyIG9wZXJhdGlvbiBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIGludmFsaWRGaWx0ZXJGaWVsZE5hbWVPclZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQSBmaWx0ZXIgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgdXNpbmcgYSB2YWx1ZSB0aGF0IGlzIHRoZSB3cm9uZyBkYXRhIHR5cGUgb3IgZm9ybWF0LlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkVmFsdWUgPSAnaW52YWxpZC1maWx0ZXItZmllbGRWYWx1ZScsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2VcbiAgICogZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgZGF0ZSB2YWx1ZSB3YXMgc3BlY2lmaWVkIGluIGEgU2hlZXQuc2VsZWN0TWFya3NBc3luYygpIGNhbGwgZm9yIGEgZGF0ZSBmaWVsZC5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25EYXRlID0gJ2ludmFsaWQtc2VsZWN0aW9uLWRhdGUnLFxuICAvKipcbiAgICogQSBmaWVsZCB3YXMgc3BlY2lmaWVkIGluIGEgU2hlZXQuc2VsZWN0TWFya3NBc3luYygpIGNhbGwgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBJbnZhbGlkU2VsZWN0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtc2VsZWN0aW9uLWZpZWxkTmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbC5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25WYWx1ZSA9ICdpbnZhbGlkLXNlbGVjdGlvbi12YWx1ZScsXG4gIC8qKlxuICAgKiBBIG5lZ2F0aXZlIHNpemUgd2FzIHNwZWNpZmllZCBvciB0aGUgbWF4U2l6ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gbWluU2l6ZSBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKS5cbiAgICovXG4gIEludmFsaWRTaXplID0gJ2ludmFsaWQtc2l6ZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG90aGVyIHRoYW4gU2hlZXRTaXplQmVoYXZpb3IuQVVUT01BVElDIHdhcyBzcGVjaWZpZWQgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiB0aGUgc2hlZXQgaXMgYVxuICAgKiBXb3Jrc2hlZXQgaW5zdGFuY2UuXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yLW9uLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBUaGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgVml6IGNsYXNzIGNvbnN0cnVjdG9yIGlzIG5vdCB2YWxpZC5cbiAgICovXG4gIEludmFsaWRVcmwgPSAnaW52YWxpZC11cmwnLFxuICAvKipcbiAgICogVGhlIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuQVRNT1NULlxuICAgKi9cbiAgTWlzc2luZ01heFNpemUgPSAnbWlzc2luZy1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BVExFQVNULlxuICAgKi9cbiAgTWlzc2luZ01pbk1heFNpemUgPSAnbWlzc2luZy1taW4tbWF4LXNpemUnLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQSBnZW5lcmFsLXB1cnBvc2Ugc2VydmVyIGVycm9yIG9jY3VycmVkLiBEZXRhaWxzIGFyZSBjb250YWluZWQgaW4gdGhlIEVycm9yIG9iamVjdC5cbiAgICovXG4gIFNlcnZlckVycm9yID0gJ3NlcnZlci1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHNoZWV0IHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgU2hlZXROb3RJbldvcmtib29rID0gJ3NoZWV0LW5vdC1pbi13b3JrYm9vaycsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGEgQ3VzdG9tVmlldyBvYmplY3QgdGhhdCBpcyBubyBsb25nZXIgdmFsaWQgKGl0IGhhcyBiZWVuIHJlbW92ZWQpLlxuICAgKi9cbiAgU3RhbGVEYXRhUmVmZXJlbmNlID0gJ3N0YWxlLWRhdGEtcmVmZXJlbmNlJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogTm90IGltcGxlbWVudGVkIHlldC5cbiAgICovXG4gIE5vdEltcGxlbWVudGVkID0gJ25vdC1pbXBsZW1lbnRlZCdcblxufVxuXG4vKipcbiAqIFRPRE9cbiAqL1xuZXhwb3J0IGVudW0gVG9vbGJhclBvc2l0aW9uIHtcbiAgVG9wID0gJ3RvcCcsXG4gIEJvdHRvbSA9ICdib3R0b20nXG59XG4iLCJpbXBvcnQgeyBEZXZpY2VUeXBlLCBUb29sYmFyUG9zaXRpb24gfSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudEhhbmRsZXJGbiB9IGZyb20gJy4uL1NoYXJlZC9FdmVudEludGVyZmFjZXMnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uL1NoYXJlZC9TaGVldEludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpeiB7XG5cbiAgLyoqXG4gICAqIFRPRE8gU2VlIGRldGFpbHMgaW4gVEZTMTI3MjkzNy5cbiAgICovXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2l6ZSB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgc2hlZXQgc2l6ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXRTaXplOiBTaGVldFNpemU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBjaHJvbWUgaGVpZ2h0XG4gICAqL1xuICByZWFkb25seSBjaHJvbWVIZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGVldFNpemUge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIGJlaGF2aW9yIG9mIHNoZWV0IHNpemVcbiAgICovXG4gIHJlYWRvbmx5IGJlaGF2aW9yOiBTaGVldFNpemVCZWhhdmlvcjtcblxuICAvKipcbiAgICogIEByZXR1cm5zIG1pblNpemUgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFLCBvciBBVExFQVNUXG4gICAqL1xuICByZWFkb25seSBtaW5TaXplOiBTaXplO1xuXG4gIC8qKlxuICAgKiAgQHJldHVybnMgbWF4U2l6ZSBkZWZpbmVkIHdoZW4gYmVoYXZpb3IgaXMgUkFOR0Ugb3IgQVRNT1NUXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplOiBTaXplO1xufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml6Q3JlYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUT0RPIFNlZSBkZXRhaWxzIGluIFRGUzEyNzI5MzguXG4gICAqL1xuICBkaXNwbGF5U3RhdGljSW1hZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUT0RPXG4gICAqL1xuICBoaWRlVGFicz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRPRE9cbiAgICovXG4gIGhpZGVUb29sYmFyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVE9ET1xuICAgKi9cbiAgaWZyYW1lU2l6ZWRUb1dpbmRvdz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRPRE9cbiAgICovXG4gIHdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUT0RPXG4gICAqL1xuICBoZWlnaHQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRPRE9cbiAgICovXG4gIGRldmljZT86IERldmljZVR5cGU7XG5cbiAgLyoqXG4gICAqIFRPRE9cbiAgICovXG4gIGluc3RhbmNlSWRUb0Nsb25lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUT0RPXG4gICAqL1xuICBuYXZUeXBlPzogc3RyaW5nOyAvLyBUT0RPIFNob3VsZCB0aGlzIGJlIGFuIGVudW0/Pz9cblxuICAvKipcbiAgICogVE9ET1xuICAgKi9cbiAgc3RhdGljSW1hZ2VVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRPRE9cbiAgICovXG4gIG9uRmlyc3RJbnRlcmFjdGl2ZT86IFRhYmxlYXVFdmVudEhhbmRsZXJGbjtcblxuICAvKipcbiAgICogVE9ET1xuICAgKi9cbiAgb25GaXJzdFZpelNpemVLbm93bj86IFRhYmxlYXVFdmVudEhhbmRsZXJGbjtcblxuICAvKipcbiAgICogVE9ET1xuICAgKi9cbiAgdG9vbGJhclBvc2l0aW9uPzogVG9vbGJhclBvc2l0aW9uO1xufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBFeHRlbnNpb25zIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgICBTZXJ2ZXIgPSAnc2VydmVyJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlIGluIHdoaWNoIHRoZSBFeHRlbnNpb25zIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXh0ZW5zaW9uTW9kZSB7XG4gICAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gICAgVmlld2luZyA9ICd2aWV3aW5nJ1xuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLyoqXG4gKiBUaGUgdGFibGVhdSBuYW1lc3BhY2UgZXhpc3RzIGZvciBvcmdhbml6YXRpb24gYW5kIHRvIGF2b2lkIHBvbGx1dGluZ1xuICogdGhlIGdsb2JhbCBuYW1lc3BhY2UuIEl0IGNvbnRhaW5zIG5vIGNvbnN0cnVjdHMgb3RoZXIgdGhhbiBzdWItbmFtZXNwYWNlcyBhbmQgdGhlIFRhYmxlYXUgZW51bWVyYXRpb25zLlxuICovXG5uYW1lc3BhY2UgVGFibGVhdSB7XG4gIGV4cG9ydCBlbnVtIEFuYWx5dGljc09iamVjdFR5cGUge1xuICAgIENsdXN0ZXIgPSAnY2x1c3RlcicsXG4gICAgRm9yZWNhc3QgPSAnZm9yZWNhc3QnLFxuICAgIFRyZW5kTGluZSA9ICd0cmVuZC1saW5lJ1xuICB9XG5cbiAgZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cydcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBhIHZhbHVlIGNhbiBoYXZlXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRhVHlwZSB7XG4gICAgU3RyaW5nID0gJ3N0cmluZycsXG4gICAgSW50ID0gJ2ludCcsXG4gICAgRmxvYXQgPSAnZmxvYXQnLFxuICAgIEJvb2wgPSAnYm9vbCcsXG4gICAgRGF0ZSA9ICdkYXRlJyxcbiAgICBEYXRlVGltZSA9ICdkYXRlLXRpbWUnLFxuICAgIFNwYXRpYWwgPSAnc3BhdGlhbCdcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZCBkYXRlIHJhbmdlcyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlci5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAgIExhc3QgPSAnbGFzdCcsXG4gICAgTGFzdE4gPSAnbGFzdC1uJyxcbiAgICBOZXh0ID0gJ25leHQnLFxuICAgIE5leHROID0gJ25leHQtbicsXG4gICAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgICBUb0RhdGUgPSAndG8tZGF0ZSdcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gICAgQ29sdW1uID0gJ2NvbHVtbicsXG4gICAgUm93ID0gJ3JvdycsXG4gICAgUGFnZSA9ICdwYWdlJyxcbiAgICBGaWx0ZXIgPSAnZmlsdGVyJyxcbiAgICBNYXJrc1R5cGUgPSAnbWFya3MtdHlwZScsXG4gICAgTWVhc3VyZVZhbHVlcyA9ICdtZWFzdXJlLXZhbHVlcycsXG4gICAgQ29sb3IgPSAnY29sb3InLFxuICAgIFNpemUgPSAnc2l6ZScsXG4gICAgTGFiZWwgPSAnbGFiZWwnLFxuICAgIERldGFpbCA9ICdkZXRhaWwnLFxuICAgIFRvb2x0aXAgPSAndG9vbHRpcCcsXG4gICAgU2hhcGUgPSAnc2hhcGUnLFxuICAgIFBhdGggPSAncGF0aCcsXG4gICAgQW5nbGUgPSAnYW5nbGUnXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb3VudCA9ICdjb3VudCcsXG4gICAgQ291bnRkID0gJ2NvdW50ZCcsXG4gICAgTWVkaWFuID0gJ21lZGlhbicsXG4gICAgQXR0ciA9ICdhdHRyJyxcbiAgICBOb25lID0gJ25vbmUnLFxuICAgIFllYXIgPSAneWVhcicsXG4gICAgUXRyID0gJ3F0cicsXG4gICAgTW9udGggPSAnbW9udGgnLFxuICAgIERheSA9ICdkYXknLFxuICAgIEhvdXIgPSAnaG91cicsXG4gICAgTWludXRlID0gJ21pbnV0ZScsXG4gICAgU2Vjb25kID0gJ3NlY29uZCcsXG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBXZWVrZGF5ID0gJ3dlZWtkYXknLFxuICAgIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgICBNZHkgPSAnbWR5JyxcbiAgICBFbmQgPSAnZW5kJyxcbiAgICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gICAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgICBUcnVuY01vbnRoID0gJ3RydW5jLW1vbnRoJyxcbiAgICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gICAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgICBUcnVuY0hvdXIgPSAndHJ1bmMtaG91cicsXG4gICAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICAgIFF1YXJ0MSA9ICdxdWFydDEnLFxuICAgIFF1YXJ0MyA9ICdxdWFydDMnLFxuICAgIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgICBLdXJ0b3NpcyA9ICdrdXJ0b3NpcycsXG4gICAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgICBVc2VyID0gJ3VzZXInXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHZhbGlkIHR5cGVzIG9mIGZpbHRlcnMgdGhhdCBjYW4gYmUgYXBwbGllZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlclR5cGUge1xuICAgIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgICBSYW5nZSA9ICdyYW5nZScsXG4gICAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG4gICAgUmVsYXRpdmVEYXRlID0gJ3JlbGF0aXZlLWRhdGUnXG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpZmZlcmVudCB1cGRhdGUgdHlwZXMgZm9yIGFwcGx5aW5nIGZpbHRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyVXBkYXRlVHlwZSB7XG4gICAgQWRkID0gJ2FkZCcsXG4gICAgQWxsID0gJ2FsbCcsXG4gICAgUmVwbGFjZSA9ICdyZXBsYWNlJyxcbiAgICBSZW1vdmUgPSAncmVtb3ZlJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnXG4gIH1cblxuICAvKipcbiAgICogVGhlIG9wdGlvbiBmb3Igc3BlY2lmeWluZyB3aGljaCB2YWx1ZXMgdG8gaW5jbHVkZSBmb3IgZmlsdGVyaW5nXG4gICAqIEluZGljYXRlcyB3aGF0IHRvIGRvIHdpdGggbnVsbCB2YWx1ZXMgZm9yIGEgZ2l2ZW4gZmlsdGVyIG9yIG1hcmsgc2VsZWN0aW9uIGNhbGwuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJOdWxsT3B0aW9uIHtcbiAgICBOdWxsVmFsdWVzID0gJ251bGwtdmFsdWVzJyxcbiAgICBOb25OdWxsVmFsdWVzID0gJ25vbi1udWxsLXZhbHVlcycsXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHNlcnZlcyBhcyBhIGZpbHRlciBvbiB0aGUgRGF0YVZhbHVlcyByZXR1cm5lZCBmcm9tIGBnZXRTdW1tYXJ5RGF0YUFzeW5jYCxcbiAgICogYGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luY2AgYW5kIGBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmNgLlxuICAgKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBvZiByZXR1cm5lZCBkYXRhIHZhbHVlcyBvbmx5LiBUYWJsZWF1IHZlcnNpb25zIHByaW9yIHRvIDIwMjEuMlxuICAgKiB3aWxsIHBhc3MgdGhlIGRhdGEgYWNyb3NzIGFuZCBwb3B1bGF0ZSB0aGUgRGF0YVZhbHVlIHByb3BlcnRpZXMuXG4gICAqIFBsZWFzZSBub3RlIHRoYXQgYWxsIHByb3BlcnRpZXMgbm90IHJlcXVlc3RlZCB3aWxsIGJlIGB1bmRlZmluZWRgIGluIHRoZSBEYXRhVmFsdWUgcmVzdWx0cy5cbiAgICogQHNpbmNlIDEuNS4wXG4gICAqL1xuICBleHBvcnQgZW51bSBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB7XG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBpbmNsdWRlIGFsbCBwcm9wZXJ0aWVzLiovXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnLFxuXG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBvbmx5IGluY2x1ZGUgdmFsdWUgYW5kIG5hdGl2ZVZhbHVlIHByb3BlcnRpZXMuKi9cbiAgICBPbmx5TmF0aXZlVmFsdWVzID0gJ29ubHktbmF0aXZlLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSBmb3JtYXR0ZWRWYWx1ZSBwcm9wZXJ0aWVzLiAqL1xuICAgIE9ubHlGb3JtYXR0ZWRWYWx1ZXMgPSAnb25seS1mb3JtYXR0ZWQtdmFsdWVzJ1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWxsb3dhYmxlIHZhbHVlcy5cbiAgICogVGhpcyBpcyB1c2VkIGZvciByZXN0cmljdGluZyB0aGUgZG9tYWluIG9mIGEgcGFyYW1ldGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBQYXJhbWV0ZXJWYWx1ZVR5cGUge1xuICAgIEFsbCA9ICdhbGwnLFxuICAgIExpc3QgPSAnbGlzdCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnXG4gIH1cblxuICAvKipcbiAgICogRGF0ZSBwZXJpb2QgdXNlZCBpbiBmaWx0ZXJzIGFuZCBpbiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGVyaW9kVHlwZSB7XG4gICAgWWVhcnMgPSAneWVhcnMnLFxuICAgIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgICBNb250aHMgPSAnbW9udGhzJyxcbiAgICBXZWVrcyA9ICd3ZWVrcycsXG4gICAgRGF5cyA9ICdkYXlzJyxcbiAgICBIb3VycyA9ICdob3VycycsXG4gICAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgICBTZWNvbmRzID0gJ3NlY29uZHMnXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCdcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdGlvblVwZGF0ZVR5cGUge1xuICAgIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICAgIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgICBSZW1vdmUgPSAnc2VsZWN0LXJlbW92ZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzaGVldCBhIFtbU2hlZXRdXSBvYmplY3QgcmVwcmVzZW50c1xuICAgKi9cbiAgZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBTdG9yeSA9ICdzdG9yeScsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCdcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIFNvcnREaXJlY3Rpb24ge1xuICAgIEluY3JlYXNpbmcgPSAnaW5jcmVhc2luZycsXG4gICAgRGVjcmVhc2luZyA9ICdkZWNyZWFzaW5nJ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBGaXJlZCB3aGVuIHZpeiBzaXplIGlzIGtub3duIHdoZW4gZW1iZWRkZWQgKi9cbiAgICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdC12aXotc2l6ZS1rbm93bicsXG5cbiAgICAvKiogRmlyZWQgd2hlbiBhIHZpeiBmaXJzdCBiZWNvbWVzIGludGVyYWN0aXZlIHdoZW4gZW1iZWRkZWQgKi9cbiAgICBGaXJzdEludGVyYWN0aXZlID0gJ2ZpcnN0LWludGVyYWN0aXZlJ1xuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCdcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIHpvbmUuXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gWm9uZVZpc2liaWxpdHlUeXBlIHtcbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvbiB0aGUgdmlzaWJpbGl0eSBvZiBhIHpvbmUgaW4gdGhlIGRhc2hib2FyZC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSB6b25lIGluIHRoZSBkYXNoYm9hcmQuKi9cbiAgICBIaWRlID0gJ2hpZGUnLFxuICB9XG5cbiAgLyoqXG4gKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAqIEBzaW5jZSAxLjYuMFxuICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlRW5jb2RpbmdUeXBlIHtcbiAgICBEaXNjcmV0ZSA9ICdkaXNjcmV0ZScsXG4gICAgQ29udGludW91cyA9ICdjb250aW51b3VzJ1xuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgZW1iZWRkaW5nIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVNvdXJjZUludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9EYXRhVGFibGVJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFuYWx5dGljc09iamVjdFR5cGUsXG4gIENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZVxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdSc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbi8vIFRoZSBmb2xsb3dpbmcgcG9seWZpbGxzIGFyZSBuZWVkZWQgZm9yIElFMTFcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlcic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbic7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L01vZGVscyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9QYXJhbWV0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvVmVyYnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIFRoZXNlIGFyZSB0aGUgZXhwb3J0cyBmcm9tIHRoZSBtZXNzYWdpbmcgc3R1ZmZcblxuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QuXG4vLyAgVGhpcyBpcyBwdWxsZWQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUuXG4vLyBOT1RFOiBzZW12ZXIgcGFja2FnZSBpcyBwcmVmZXJyZWQgaGVyZSwgYnV0IHJlcXVpcmVzIHRyYW5zcGlsZXJcbi8vICBsaWtlIGJhYmVsIGFzIHBhcnQgb2Ygb3VyIHdlYnBhY2sgY29uZmlnLlxuLy8gaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgKiBhcyBwYWNrSnNvbiBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgSW50ZXJuYWxUYWJsZWF1RXJyb3IgfSBmcm9tICcuL2NvbnRyYWN0L01vZGVscyc7XG5cbmxldCB2ZXJzaW9uUGFydHM7XG50cnkge1xuICB2ZXJzaW9uUGFydHMgPSBwYWNrSnNvbi52ZXJzaW9uLnNwbGl0KCcuJykubWFwKHAgPT4gcGFyc2VJbnQocCwgMTApKTtcbn0gY2F0Y2ggKGUpIHtcbiAgY29uc29sZS5lcnJvcihlKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgaW50ZXJuYWwgY29udHJhY3QgdmVyc2lvbiAke3BhY2tKc29uLnZlcnNpb259YCkgYXMgSW50ZXJuYWxUYWJsZWF1RXJyb3I7XG59XG5cbmV4cG9ydCBjb25zdCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OID0ge1xuICBtYWpvcjogdmVyc2lvblBhcnRzWzBdLFxuICBtaW5vcjogdmVyc2lvblBhcnRzWzFdLFxuICBmaXg6IHZlcnNpb25QYXJ0c1syXSxcbn07XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDBcbn07XG4iLCJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4vRW51bXMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVR5cGVDb252ZXJ0ZXIge1xuXG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3I6IHN0cmluZyA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBsZXQgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKG5vcm1hbGl6ZWRCb29sZWFuICE9PSAndHJ1ZScgJiYgbm9ybWFsaXplZEJvb2xlYW4gIT09ICdmYWxzZScpXG4gICAgICA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yXG4gICAgICA6IG5vcm1hbGl6ZWRCb29sZWFuID09PSAndHJ1ZSc7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgbGV0IHZhbHVlOiBudW1iZXIgPSBOdW1iZXIodmFsdWVBc1N0cmluZyk7XG4gICAgcmV0dXJuIGlzTmFOKHZhbHVlKSA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gTm90ZSB0aGF0IHdpdGhvdXQgYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQ1xuICAgIC8vIElucHV0IG9mIDIwMjAtMDMtMjUgaXMgcHJpbnRlZCBhczogTWFyIDI0IDIwMjAgMTc6MDA6MDAgR01ULTA3MDBcbiAgICAvLyBUaGlzIG1hdGNoZXMgc3R5bGUgdXNlZCBpbiBleGlzdGluZyBjb252ZXJ0RmlsdGVyVmFsdWVQcmVzTW9kZWxcbiAgICBsZXQgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICBsZXQgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGxldCB2YWx1ZSA9IG5ldyBEYXRlKGZvcm1hdHRlZERhdGVTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWVBc1N0cmluZzogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIFRoaXMgaXMgYm90aCBEYXRhRGljdGlvbmFyeSBhbmQgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb21wYXRpYmxlLlxuICAgIC8vIEluIHRoZSBEYXRhRGljdGlvbmFyeSwgdmFsdWVBc1N0cmluZyBjYW4gYmUgJyVudWxsJScgb3IgJyVtaXNzaW5nJScsIHdoaWxlIGluXG4gICAgLy8gU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgd2UgY2FuIGdldCAnbnVsbCcgb3IgJ21pc3NpbmcnLCBvciAnJW51bGwlJyBmb3Igc3RyaW5nIHNwZWNpYWwgdmFsdWVzLlxuICAgIC8vIEZvciBlaXRoZXIgb2YgdGhlc2UgY2FzZXMsIHdlIHJldHVybiBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgKG9yIHRoZSBvcmlnaW5hbCBzcGVjaWFsIHN0cmluZykuXG4gICAgLy8gVG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWx0eSwgdGhpcyBjb252ZXJ0ZXI6XG4gICAgLy8gMS4gcmV0dXJucyBhIHN0cmluZyBmb3IgYW55IHNwZWNpYWwgdmFsdWVzXG4gICAgLy8gMi4gcmV0dXJucyBhIHN0cmluZyBmb3IgYW55IGRhdGVcblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IHZhbHVlcyBjYW4gYmUgdW5kZWZpbmVkLCBzbyByZXN1bHQgaXMgYWxzbyB1bmRlZmluZWRcbiAgICBpZiAodmFsdWVBc1N0cmluZyA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlQXNTdHJpbmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmcpKSB7XG4gICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCb29sZWFuKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIC8vIFJldHVybiBzcGVjaWFsIHZhbHVlICclbnVsbCUnIGZvciBhbnkgZmFpbHVyZSBpbiBwYXJzaW5nLlxuICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSBTaG93RGF0YVRhYmxlUHJlc01vZGVsIHdpbGwgZ2l2ZSB1cyBzdHJpbmdzIGxpa2UgJ251bGwnXG4gICAgICAgIC8vIGZvciBzcGVjaWFsIHZhbHVlcy5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJy5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuICB9XG5cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICByZXR1cm4gdGhpcy5pc1NwZWNpYWwodmFsdWUpID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRTdHJpbmdWYWx1ZVRvTmF0aXZlVmFsdWUodmFsdWU6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyB8IG51bGwge1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBmcm9tIHN0cmluZyBkaXJlY3RseSB0byBuYXRpdmUgdmFsdWUgZm9yIGFsbCB0eXBlc1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUodGhpcy5jb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWUsIHR5cGUpLCB0eXBlKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gRXh0ZW5zaW9uQ29udGV4dCB7XG4gIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gIFNlcnZlciA9ICdzZXJ2ZXInLFxuICBVbmtub3duID0gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgVmlld2luZyA9ICd2aWV3aW5nJyxcbiAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcbiAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnXG59XG5cbmV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICBCbGFuayA9ICdibGFuaycsXG4gIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICBQYXJhbWV0ZXJDb250cm9sID0gJ3BhcmFtZXRlci1jb250cm9sJyxcbiAgUGFnZUZpbHRlciA9ICdwYWdlLWZpbHRlcicsXG4gIExlZ2VuZCA9ICdsZWdlbmQnLFxuICBUaXRsZSA9ICd0aXRsZScsXG4gIFRleHQgPSAndGV4dCcsXG4gIEltYWdlID0gJ2ltYWdlJyxcbiAgV2ViUGFnZSA9ICd3ZWItcGFnZScsXG4gIEV4dGVuc2lvbiA9ICdleHRlbnNpb24nXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCdcbn1cblxuZXhwb3J0IGVudW0gRW5jb2RlZERhdGFUeXBlIHtcbiAgTnVtYmVyID0gJ251bWJlcicsXG4gIFN0cmluZyA9ICdzdHJpbmcnLFxuICBEYXRlID0gJ2RhdGUnLFxuICBCb29sZWFuID0gJ2Jvb2xlYW4nXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgU3VtID0gJ3N1bScsXG4gIEF2ZyA9ICdhdmcnLFxuICBNaW4gPSAnbWluJyxcbiAgTWF4ID0gJ21heCcsXG4gIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gIFZhciA9ICd2YXInLFxuICBWYXJwID0gJ3ZhcnAnLFxuICBDb3VudCA9ICdjb3VudCcsXG4gIENvdW50ZCA9ICdjb3VudGQnLFxuICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgQXR0ciA9ICdhdHRyJyxcbiAgTm9uZSA9ICdub25lJyxcbiAgWWVhciA9ICd5ZWFyJyxcbiAgUXRyID0gJ3F0cicsXG4gIE1vbnRoID0gJ21vbnRoJyxcbiAgRGF5ID0gJ2RheScsXG4gIEhvdXIgPSAnaG91cicsXG4gIE1pbnV0ZSA9ICdtaW51dGUnLFxuICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgV2VlayA9ICd3ZWVrJyxcbiAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICBNZHkgPSAnbWR5JyxcbiAgRW5kID0gJ2VuZCcsXG4gIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICBRdWFydDEgPSAncXVhcnQxJyxcbiAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICBJbk91dCA9ICdpbi1vdXQnLFxuICBVc2VyID0gJ3VzZXInXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkUm9sZVR5cGUge1xuICBEaW1lbnNpb24gPSAnZGltZW5zaW9uJyxcbiAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJ1xufVxuXG5leHBvcnQgZW51bSBTaGVldFR5cGUge1xuICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgU3RvcnkgPSAnc3RvcnknLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0J1xufVxuXG5leHBvcnQgZW51bSBEb21haW5SZXN0cmljdGlvblR5cGUge1xuICBBbGwgPSAnYWxsJyxcbiAgTGlzdCA9ICdsaXN0JyxcbiAgUmFuZ2UgPSAncmFuZ2UnXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJ1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gIE51bGxWYWx1ZXMgPSAnbnVsbHZhbHVlcycsXG4gIE5vbk51bGxWYWx1ZXMgPSAnbm9ubnVsbHZhbHVlcycsXG4gIEFsbFZhbHVlcyA9ICdhbGx2YWx1ZXMnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgZmlsdGVyIGRvbWFpblxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJEb21haW5UeXBlIHtcbiAgUmVsZXZhbnQgPSAncmVsZXZhbnQnLFxuICBEYXRhYmFzZSA9ICdkYXRhYmFzZSdcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJ1xufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIGluY2x1ZGVkIHZhbHVlcyB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzIHtcbiAgSW5jbHVkZU51bGwgPSAnaW5jbHVkZS1udWxsJyxcbiAgSW5jbHVkZU5vbk51bGwgPSAnaW5jbHVkZS1ub24tbnVsbCcsXG4gIEluY2x1ZGVBbGwgPSAnaW5jbHVkZS1hbGwnXG59XG5cbi8qKlxuICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gKi9cbmV4cG9ydCBlbnVtIE1hcmtUeXBlIHtcbiAgQmFyID0gJ2JhcicsXG4gIExpbmUgPSAnbGluZScsXG4gIEFyZWEgPSAnYXJlYScsXG4gIFNxdWFyZSA9ICdzcXVhcmUnLFxuICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBNYXAgPSAnbWFwJyxcbiAgUGllID0gJ3BpZScsXG4gIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gIFBvbHlnb24gPSAncG9seWdvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCdcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBEYXRlUmFuZ2VUeXBlIG9mIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZVJhbmdlVHlwZSB7XG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGxhc3QgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0ID0gJ2xhc3QnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0TiA9ICdsYXN0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIG5leHQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0ID0gJ25leHQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0TiA9ICduZXh0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBDdXJyZW50ID0gJ2N1cnJlbnQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIFRvRGF0ZSA9ICd0b0RhdGUnXG59XG5cbi8qKlxuICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGxhdW5jaGluZyBvZiBhbiBleHRlbnNpb24gZGlhbG9nIHN1Y2NlZWRlZCBvciBmYWlsZWQuXG4gKi9cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCB7XG4gIERpYWxvZ0FscmVhZHlPcGVuID0gJ2RpYWxvZy1hbHJlYWR5LW9wZW4nLFxuICBJbnZhbGlkRG9tYWluID0gJ2ludmFsaWQtZG9tYWluJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG4vLyBFbnVtZXJhdGlvbiBmb3IgQXBpU2hvd0RhdGEgdGFibGUgaWQgc2VudGluZWxzLlxuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsIHtcblxuICAvLyBmaW5kIHRoZSBvbmUgbG9naWNhbCB0YWJsZSAtIHVzZWQgaW4gdmVyc2lvbiBjb21wYXRpYmlsaXR5IGNoZWNrIGZvciBnZXRVbmRlcmx5aW5nRGF0YVRhYmxlIGFuZCBnZXRMb2dpY2FsRGF0YVRhYmxlIGNvbW1hbmRzXG4gIFNpbmdsZVRhYmxlSWQgPSAnc2luZ2xlLXRhYmxlLWlkLXNlbnRpbmVsJyxcbiAgU2luZ2xlVGFibGVDYXB0aW9uID0gJ1NpbmdsZSB0YWJsZSBpZCBzZW50aW5lbCdcbn1cblxuLyoqXG4gKiBVc2VkIHRvIG9wdGltaXplIHRoZSBnZXRTdW1tYXJ5RGF0YS9nZXRVbmRlcmx5aW5nVGFibGVEYXRhIHJlc3VsdHNcbiAqIE1hcHBlZCBmcm9tIGV4dGVybmFsIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIEFwaVNob3dEYXRhVGFibGVGb3JtYXQge1xuICBOYXRpdmVWYWx1ZXNPbmx5ID0gJ25hdGl2ZS12YWx1ZXMtb25seScsXG4gIEZvcm1hdHRlZFZhbHVlc09ubHkgPSAnZm9ybWF0dGVkLXZhbHVlcy1vbmx5JyxcbiAgTmF0aXZlQW5kRm9ybWF0dGVkVmFsdWVzID0gJ25hdGl2ZS1hbmQtZm9ybWF0dGVkLXZhbHVlcydcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd3b3Jrc2hlZXQtdGl0bGUnLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICdzdG9yeS10aXRsZScsXG4gIERhc2hib2FyZFRpdGxlID0gJ2Rhc2hib2FyZC10aXRsZSdcbn1cbiIsImV4cG9ydCBlbnVtIE5vdGlmaWNhdGlvbklkIHtcbiAgU2VsZWN0ZWRNYXJrc0NoYW5nZWQgPSAnc2VsZWN0ZWQtbWFya3MtY2hhbmdlZCcsXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyLWNoYW5nZWQnLFxuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXBkYXRlID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXBkYXRlJyxcbiAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnLFxuICBDb250ZXh0TWVudUNsaWNrID0gJ2NvbnRleHQtbWVudS1jbGljaycsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdC12aXotc2l6ZS1rbm93bicsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG59XG4iLCJleHBvcnQgZW51bSBQYXJhbWV0ZXJJZCB7XG4gIEV4dGVuc2lvbkxvY2F0b3IgPSAnZXh0ZW5zaW9uLWxvY2F0b3InLFxuICBFeHRlbnNpb25Cb290c3RyYXBJbmZvID0gJ2V4dGVuc2lvbi1ib290c3RyYXAtaW5mbycsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyA9ICdleHRlbnNpb24tc2V0dGluZ3MtaW5mbycsXG4gIFZpc3VhbElkID0gJ3Zpc3VhbC1pZCcsXG4gIFNoZWV0UGF0aCA9ICdzaGVldC1wYXRoJyxcbiAgQ29sdW1uc1RvSW5jbHVkZUJ5SWQgPSAnY29sdW1ucy10by1pbmNsdWRlLWJ5LWlkJyxcbiAgSWdub3JlQWxpYXNlcyA9ICdpZ25vcmUtYWxpYXNlcycsXG4gIElnbm9yZVNlbGVjdGlvbiA9ICdpZ25vcmUtc2VsZWN0aW9uJyxcbiAgSW5jbHVkZUFsbENvbHVtbnMgPSAnaW5jbHVkZS1hbGwtY29sdW1ucycsXG4gIE1heFJvd3MgPSAnbWF4LXJvd3MnLFxuICBVbmRlcmx5aW5nRGF0YVRhYmxlID0gJ3VuZGVybHlpbmctZGF0YS10YWJsZScsXG4gIFVuZGVybHlpbmdTdW1tYXJ5RGF0YVRhYmxlID0gJ3VuZGVybHlpbmctc3VtbWFyeS1kYXRhLXRhYmxlJyxcbiAgRGF0YVNvdXJjZURhdGFUYWJsZSA9ICdkYXRhLXNvdXJjZS1kYXRhLXRhYmxlJyxcbiAgU2hvd0RhdGFUYWJsZUZvcm1hdCA9ICdzaG93LWRhdGEtdGFibGUtZm9ybWF0JyxcblxuICBTZXR0aW5nc1ZhbHVlcyA9ICdzZXR0aW5ncy12YWx1ZXMnLFxuICBTZWxlY3RlZERhdGEgPSAnc2VsZWN0ZWQtZGF0YScsXG4gIEhpZ2hsaWdodGVkRGF0YSA9ICdoaWdobGlnaHRlZC1kYXRhJyxcblxuICAvLyBGaWx0ZXIgUGFyYW1zXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyVmFsdWVzID0gJ2ZpbHRlci12YWx1ZXMnLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIElzRXhjbHVkZU1vZGUgPSAnaXMtZXhjbHVkZScsXG4gIEZpbHRlclJhbmdlTWluID0gJ2ZpbHRlci1yYW5nZS1taW4nLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VOdWxsT3B0aW9uID0gJ2ZpbHRlci1yYW5nZS1udWxsLW9wdGlvbicsXG4gIFdvcmtzaGVldEZpbHRlcnMgPSAnd29ya3NoZWV0LWZpbHRlcnMnLFxuICBGaWVsZElkID0gJ2ZpZWxkLWlkJyxcbiAgRG9tYWluVHlwZSA9ICdkb21haW4tdHlwZScsXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBGaWVsZCA9ICdmaWVsZCcsXG5cbiAgV29ya3NoZWV0TmFtZSA9ICd3b3Jrc2hlZXQtbmFtZScsXG4gIERhc2hib2FyZE5hbWUgPSAnZGFzaGJvYXJkJyxcblxuICBQYXJhbWV0ZXJJbmZvID0gJ3BhcmFtZXRlci1pbmZvJyxcbiAgUGFyYW1ldGVySW5mb3MgPSAncGFyYW1ldGVyLWluZm9zJyxcbiAgUGFyYW1ldGVyQ2FwdGlvbiA9ICdwYXJlbWV0ZXItY2FwdGlvbicsXG4gIFBhcmFtZXRlckZpZWxkTmFtZSA9ICdwYXJhbWV0ZXItZmllbGQtbmFtZScsXG4gIFBhcmFtZXRlclZhbHVlID0gJ3BhcmFtZXRlci12YWx1ZScsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24nLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBIaWVyVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2hpZXJhcmNoaWNhbFZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcbiAgUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVscyA9ICdxdWFudGF0aXZlUmFuZ2VTZWxlY3Rpb25Nb2RlbHMnLFxuICBEaW1WYWxTZWxlY3Rpb25Nb2RlbHMgPSAnZGltZW5zaW9uVmFsdWVTZWxlY3Rpb25Nb2RlbHMnLFxuXG4gIEFjdGl2ZVRhYmxlc0luZm8gPSAnYWN0aXZlLXRhYmxlcy1pbmZvJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERlbHRhVGltZU1zID0gJ2RlbHRhLXRpbWUtbXMnLFxuICBTaG91bGRSZWZyZXNoRFMgPSAnc2hvdWxkLXJlZnJlc2gtZHMnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZU5hbWUgPSAnZGF0YS1zb3VyY2UtbmFtZScsXG4gIENvbHVtbnNUb0luY2x1ZGUgPSAnY29sdW1ucy10by1pbmNsdWRlJyxcbiAgSm9pbkRlc2NyaXB0aW9uID0gJ2pvaW4tZGVzY3JpcHRpb24nLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuXG4gIEV4dGVuc2lvbkRpYWxvZ1VybCA9ICdleHRlbnNpb24tZGlhbG9nLXVybCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1BheWxvYWQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1wYXlsb2FkJyxcbiAgSXNFeHRlbnNpb25EaWFsb2cgPSAnaXMtZXh0ZW5zaW9uLWRpYWxvZycsXG4gIEV4dGVuc2lvbkRpYWxvZ0ggPSAnZXh0ZW5zaW9uLWRpYWxvZy1oZWlnaHQnLFxuICBFeHRlbnNpb25EaWFsb2dXID0gJ2V4dGVuc2lvbi1kaWFsb2ctd2lkdGgnLFxuICBFeHRlbnNpb25EaWFsb2dSZXN1bHQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1yZXN1bHQnLFxuXG4gIEV4dGVuc2lvbkNvbnRleHRNZW51SWRzID0gJ2V4dGVuc2lvbi1jb250ZXh0LW1lbnUtaWRzJyxcblxuICBUZXN0Q29udmVyc2lvblBhcmFtZXRlciA9ICd0ZXN0LWNvbnZlcnNpb24tcGFyYW1ldGVyJyxcblxuICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgWm9uZUlkc1Zpc2liaWxpdHlNYXAgPSAnem9uZS1pZHMtdmlzaWJpbGl0eS1tYXAnLFxuXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG5cbiAgVml6QVBJSW5wdXRKc29uID0gJ3ZpemFwaS1pbnB1dC1qc29uJyxcbiAgVml6QVBJU1ZHID0gJ3ZpemFwaS1zdmcnLFxuXG4gIEZ1bmN0aW9uTmFtZSA9ICdmdW5jdGlvbi1uYW1lJyxcbn1cbiIsIi8vIERlY2xhcmUgdGhpcyBrZXkgdHlwZSBhbmQgZXhwb3J0IHRoZSBOb3RpZmljYXRpb25JZCB0byBtYWtlIHRoaXMgYmVoYXZlIGxpa2UgYSBzdHJpbmcgZW51bVxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIENsZWFyRmlsdGVyID0gJ2NsZWFyLWZpbHRlcicsXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBHZXREYXRhU3VtbWFyeURhdGEgPSAnZ2V0LXN1bW1hcnktZGF0YScsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgU2F2ZUV4dGVuc2lvblNldHRpbmdzID0gJ3NhdmUtZXh0ZW5zaW9uLXNldHRpbmdzJyxcbiAgR2V0U2VsZWN0ZWRNYXJrcyA9ICdnZXQtc2VsZWN0ZWQtbWFya3MnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBGaW5kUGFyYW1ldGVyID0gJ2ZpbmQtcGFyYW1ldGVyJyxcbiAgQ2hhbmdlUGFyYW1ldGVyVmFsdWUgPSAnY2hhbmdlLXBhcmFtZXRlci12YWx1ZScsXG4gIENsZWFyU2VsZWN0ZWRNYXJrcyA9ICdjbGVhci1zZWxlY3RlZC1tYXJrcycsXG4gIFNlbGVjdEJ5VmFsdWUgPSAnc2VsZWN0LWJ5LXZhbHVlJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGaWVsZEFuZERhdGFTb3VyY2UgPSAnZ2V0LWZpZWxkLWFuZC1kYXRhc291cmNlJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldFJhbmdlRG9tYWluID0gJ2dldC1yYW5nZS1kb21haW4nLFxuICBHZXRKb2luRGVzY3JpcHRpb24gPSAnZ2V0LWpvaW4tZGVzY3JpcHRpb24nLFxuICBHZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnZ2V0LWNvbm5lY3Rpb24tZGVzY3JpcHRpb24tc3VtbWFyaWVzJyxcbiAgRGlzcGxheURpYWxvZyA9ICdkaXNwbGF5LWRpYWxvZycsXG4gIENsb3NlRGlhbG9nID0gJ2Nsb3NlLWRpYWxvZycsXG4gIFRlc3RDb252ZXJzaW9uVmVyYiA9ICd0ZXN0LWNvbnZlcnNpb24tdmVyYicsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXRBY3RpdmVUYWJsZXMgPSAnZ2V0LWFjdGl2ZS10YWJsZXMnLFxuICBTZXRab25lVmlzaWJpbGl0eSA9ICdzZXQtem9uZS12aXNpYmlsaXR5JyxcbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcbiAgR2V0TG9naWNhbFRhYmxlcyA9ICdnZXQtbG9naWNhbC10YWJsZXMnLFxuICBHZXRMb2dpY2FsVGFibGVEYXRhID0gJ2dldC1sb2dpY2FsLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVzID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlcycsXG4gIFZpekFQSSA9ICd2aXotYXBpJyxcbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5cbmltcG9ydCB7IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL0Nyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZVxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgTWVzc2VuZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2VuZ2VyJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5pbXBvcnQge1xuICBpc0NvbW1hbmRNZXNzYWdlLFxuICBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIGlzSW5pdE1lc3NhZ2UsXG4gIGlzTWVzc2FnZSxcbiAgaXNOb3RpZmljYXRpb25NZXNzYWdlLFxuICBpc0hhbmRzaGFrZU1lc3NhZ2Vcbn0gZnJvbSAnLi9NZXNzYWdlVHlwZUNoZWNrcyc7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyLCBWZXJiSWQsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQge1xuICBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyLFxuICBDb21tYW5kTWVzc2FnZUhhbmRsZXIsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyLFxuICBIYW5kc2hha2VNZXNzYWdlSGFuZGxlclxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlTGlzdGVuZXInO1xuXG4vKipcbiAqIFRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGlzIHRoZSBwcmltYXJ5IGV4cG9ydCBmcm9tIHRoZSBhcGktbWVzc2FnaW5nIG1vZHVsZS4gQW4gaW5zdGFuY2Ugb2ZcbiAqIHRoaXMgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZCBvbiBib3RoIHNpZGVzIG9mIGEgZnJhbWUgYm91bmRhcnkgdG8gZmFjaWxpdGF0ZSBjb21tdW5pY2F0aW9uXG4gKiBpbiBib3RoIGRpcmVjdGlvbnMgYmV0d2VlbiB0aGUgZnJhbWVzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYm90aCB0aGUgZGlzcGF0Y2hlciBhbmQgdGhlIGxpc3RlbmVyXG4gKiBwb3J0aW9ucywgYnV0IGRvZXNuJ3QgcmVxdWlyZSBjYWxsZXJzIHRvIGNhcmUgYWJvdXQgYm90aC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVNZXNzZW5nZXIgaW1wbGVtZW50cyBNZXNzZW5nZXIge1xuICBwcml2YXRlIHVucmVnaXN0ZXJGdW5jdGlvbj86ICgoKSA9PiB2b2lkKTtcbiAgcHJpdmF0ZSBpbml0aWFsaXplTWVzc2FnZUhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBoYW5kc2hha2VNZXNzYWdlSGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVNZXNzZW5nZXIuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBhcyBhIE1lc3NhZ2VMaXN0ZW5lcixcbiAgICogYmUgc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nIGFuZCByZWdpc3RlciBtZXNzYWdlIGhhbmRsZXJzLlxuICAgKiBAcGFyYW0gdGhpc1dpbmRvdyBUaGUgd2luZG93IG9iamVjdCB3aGljaCB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBsaXZlcy4gQW4gb25NZXNzYWdlIGxpc3RlbmVyIHdpbGwgYmUgYWRkZWQgaGVyZS5cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd10gT3B0aW9uYWwgb3RoZXJXaW5kb3cgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBwb3N0ZWQgdG8uXG4gICAqICAgICAgICAgICAgICAgICAgICAgIElmIGRlZmluZWQsIGluY29taW5nIG1lc3NhZ2VzIG11c3Qgb3JpZ2luYXRlIGZyb20gb3RoZXJXaW5kb3cgdG8gYmUgcGFzc2VkIG9uXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3dPcmlnaW5dIFRoZSB0YXJnZXQgb3JpZ2luIHdoaWNoIG90aGVyV2luZG93IG11c3QgaGF2ZSBpbiBvcmRlciB0byByZWNlaXZlIGRpc3BhdGNoZWQgbWVzc2FnZXMuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSBzZW50IGFzIHRoZSB0YXJnZXRPcmlnaW4gb2YgYSBwb3N0TWVzc2FnZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9wb3N0TWVzc2FnZSlcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHRoaXNXaW5kb3c6IFdpbmRvdywgcHJpdmF0ZSBvdGhlcldpbmRvdz86IFdpbmRvdywgcHJpdmF0ZSBvdGhlcldpbmRvd09yaWdpbj86IHN0cmluZykge1xuICAgIC8vIE1ha2Ugc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nXG4gIH1cblxuICAvLy8vLyBNZXNzYWdlTGlzdGVuZXIgSW1wbGVtZW50YXRpb25cblxuICBwdWJsaWMgc3RhcnRMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBhcmUgbGlzdGVuaW5nLCBpZiBub3QsIGhvb2sgdXAgYSBtZXNzYWdlIGxpc3RlbmVyXG4gICAgaWYgKCF0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgY29uc3QgYm91bmRIYW5kbGVyID0gdGhpcy5vbk1lc3NhZ2VSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy50aGlzV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSAoKSA9PiB0aGlzLnRoaXNXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0b3BMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gU3RvcCBsaXN0ZW5pbmcgaWYgd2UgaGF2ZSBzdGFydGVkIGxpc3RlbmluZ1xuICAgIGlmICh0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24oKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIYW5kc2hha2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VEaXNwYXRjaGVyIEltcGxlbWVudGF0aW9uXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhcGlWZXJzaW9uIGFwaS1pbnRlcm5hbC1jb250cmFjdC1qcyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gY3Jvc3NGcmFtZVZlcnNpb24gY3Jvc3NmcmFtZSBtZXNzYWdpbmcgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIG9wdGlvbnMgYWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCBpbml0aWFsaXphdGlvbiAoaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2ZcbiAgICogICAgICAgICAgICAgICAgZXh0ZXJuYWwgYmVpbmcgdXNlZCBmb3IgZXhhbXBsZSlcbiAgICovXG4gIHB1YmxpYyBwcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKFxuICAgIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXIsIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgICAgY3Jvc3NGcmFtZVZlcnNpb246IGNyb3NzRnJhbWVWZXJzaW9uLFxuICAgICAgYXBpVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICAgIHZlcmJJZDogdmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVyc1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShjb21tYW5kR3VpZDogc3RyaW5nLCBkYXRhOiBNb2RlbCB8IHVuZGVmaW5lZCwgZXJyb3I6IE1vZGVsIHwgdW5kZWZpbmVkKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICAgIGNvbW1hbmRHdWlkOiBjb21tYW5kR3VpZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAvLyBzdHJpbmdpZnkgZXJyb3Igb2JqZWN0IHRvIHJlbW92ZSB1bnNlcmlhbGl6YWJsZSBmaWVsZHMgbGlrZSBmdW5jdGlvbnMgYW5kIHByZXZlbnQgc2VyaWFsaXphdGlvbiBlcnJvcnNcbiAgICAgIG1lc3NhZ2UuZXJyb3IgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZU5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkLCBkYXRhOiBNb2RlbCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgICBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uSWQsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5BY2ssXG4gICAgICBwbGF0Zm9ybVZlcnNpb246IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT05cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBwZW5kaW5nIG1lc3NhZ2UgZm9yIHNlbmRpbmcgYW5kIHJldHVybnMgdGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICpcbiAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoaXMub3RoZXJXaW5kb3dcbiAgICogQHJldHVybnMgVGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZU1lc3NhZ2UobXNnOiBNZXNzYWdlKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBpZiAoIXRoaXMub3RoZXJXaW5kb3cgfHwgIXRoaXMub3RoZXJXaW5kb3dPcmlnaW4pIHtcbiAgICAgIHRocm93ICdPdGhlciB3aW5kb3cgbm90IGluaXRpYWxpemVkLCBjYW5ub3QgZGlzcGF0Y2ggbWVzc2FnZXMnO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXBhcmVkTWVzc2FnZSA9IG5ldyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlKG1zZywgdGhpcy5vdGhlcldpbmRvdywgdGhpcy5vdGhlcldpbmRvd09yaWdpbik7XG4gICAgcmV0dXJuIHByZXBhcmVkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuIERvZXMgc29tZSB2YWxpZGF0aW9uIG9mIHRoZSBtZXNzYWdlLCBhbmQgdGhlblxuICAgKiBjYWxscyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGhhbmRsZXIgaWYgb25lIGlzIGRlZmluZWRcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBpbmNvbWluZyBNZXNzYWdlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25NZXNzYWdlUmVjZWl2ZWQoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBvdGhlcldpbmRvdyBkZWZpbmVkLCBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gdGhlcmVcbiAgICBpZiAodGhpcy5vdGhlcldpbmRvdyAmJiBldmVudC5zb3VyY2UgIT09IHRoaXMub3RoZXJXaW5kb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEbyBzb21lIHZhbGlkYXRpb24gb24gZXZlbnQuZGF0YSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGEgcmVhbCBtZXNzYWdlXG4gICAgaWYgKCFldmVudC5kYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgZGVjbGFyZWQgbWVzc2FnZSB0eXBlLCB2YWxpZGF0ZSB0aGUgbWVzc2FnZSwgYW5kIGNhbGwgYW4gYXBwcm9wcmlhdGUgaGFuZGVyIGlmIG9uZSBleGlzdHNcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubXNnVHlwZSkge1xuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplOiB7XG4gICAgICAgIGlmICghaXNJbml0TWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZDoge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbjoge1xuICAgICAgICBpZiAoIWlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZToge1xuICAgICAgICBpZiAoIWlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gSnVzdCBpZ25vcmUgdGhpcyBzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIG1lc3NhZ2UgdHlwZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvdyhvdGhlcldpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvdyA9IG90aGVyV2luZG93O1xuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93T3JpZ2luKG9yaWdpbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvd09yaWdpbiA9IG9yaWdpbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQcmVwYXJlZE1lc3NhZ2UgaW50ZXJmYWNlIHVzZWQgdG8gcG9zdCBtZXNzYWdlcyBiZXR3ZWVuXG4gKiB0d28gZnJhbWVzIHVzaW5nIHdpbmRvdy5wb3N0TWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSBpbXBsZW1lbnRzIFByZXBhcmVkTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UuXG4gICAqIEBwYXJhbSBfbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBfdGFyZ2V0IFRoZSB0YXJnZXQgd2luZG93IHdoZXJlIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudFxuICAgKiBAcGFyYW0gX29yaWdpbiBUaGUgdGFyZ2V0T3JpZ2luIHdoZXJlIHRoaXMgbWVzc2FnZSBjYW4gYmUgcmVjZWl2ZWRcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzYWdlOiBNZXNzYWdlLCBwcml2YXRlIF90YXJnZXQ6IFdpbmRvdywgcHJpdmF0ZSBfb3JpZ2luOiBzdHJpbmcpIHtcblxuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlR3VpZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbWVzc2FnZS5tc2dHdWlkOyB9XG5cbiAgcHVibGljIHNlbmQoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICB0aGlzLl90YXJnZXQucG9zdE1lc3NhZ2UodGhpcy5fbWVzc2FnZSwgdGhpcy5fb3JpZ2luKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcblxuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5cbi8qIHRzbGludDpkaXNhYmxlIG5vLWFueSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWVzc2FnZShkYXRhOiBNZXNzYWdlIHwgYW55KTogZGF0YSBpcyBNZXNzYWdlIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGRhdGEgYXMgTWVzc2FnZTtcbiAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLm1zZ0d1aWQgfHwgIW1lc3NhZ2UubXNnVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQobWVzc2FnZS5tc2dHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbWVzc2FnZS5tc2dUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VUeXBlczogQXJyYXk8c3RyaW5nPiA9XG4gICAgW01lc3NhZ2VUeXBlLkNvbW1hbmQsIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSwgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSwgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLCBNZXNzYWdlVHlwZS5IYW5kc2hha2VdO1xuXG4gIGlmIChtZXNzYWdlVHlwZXMuaW5kZXhPZihtZXNzYWdlLm1zZ1R5cGUpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uKHZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIgfCBhbnkpOiB2ZXJzaW9uTnVtYmVyIGlzIFZlcnNpb25OdW1iZXIge1xuICBpZiAoIXZlcnNpb25OdW1iZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2ID0gdmVyc2lvbk51bWJlciBhcyBWZXJzaW9uTnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgdiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHYuZml4ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5taW5vciAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWFqb3IgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luaXRNZXNzYWdlKG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBJbml0aWFsaXplTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaW5pdE1lc3NhZ2UgPSBtZXNzYWdlIGFzIEluaXRpYWxpemVNZXNzYWdlO1xuICBpZiAoaW5pdE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmFwaVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNyTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZTtcbiAgaWYgKGNyTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKGNyTWVzc2FnZS5jb21tYW5kR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNyTWVzc2FnZS5kYXRhICYmICFjck1lc3NhZ2UuZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZE1lc3NhZ2U7XG4gIGlmIChjb21tYW5kTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UudmVyYklkIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS52ZXJiSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgTm90aWZpY2F0aW9uTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZSA9IG1lc3NhZ2UgYXMgTm90aWZpY2F0aW9uTWVzc2FnZTtcbiAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLmRhdGEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgfHwgdHlwZW9mIG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSGFuZHNoYWtlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaGFuZHNoYWtlTWVzc2FnZSA9IG1lc3NhZ2UgYXMgSGFuZHNoYWtlTWVzc2FnZTtcbiAgaWYgKGhhbmRzaGFrZU1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSGFuZHNoYWtlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyLCBWZXJiSWQsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5cbi8qKlxuICogRW51bSBkZWZpbmluZyB0aGUgNCBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMgd2UgaGF2ZSBkZWZpbmVkXG4gKi9cbmV4cG9ydCBlbnVtIE1lc3NhZ2VUeXBlIHtcbiAgSW5pdGlhbGl6ZSA9ICdpbml0aWFsaXplJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbicsXG4gIENvbW1hbmQgPSAnY29tbWFuZCcsXG4gIENvbW1hbmRSZXNwb25zZSA9ICdjb21tYW5kLXJlc3BvbnNlJyxcbiAgSGFuZHNoYWtlID0gJ3YtaGFuZHNoYWtlJyxcbiAgQWNrID0gJ3YtYWNrJ1xufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgRXhlY3V0ZVBhcmFtZXRlcnMgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGludGVybmFsIHZlcnNpb24gbnVtYmVyXG4qL1xuZXhwb3J0IGNsYXNzIElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVyczsgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVyc1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBFeGVjdXRlUGFyYW1ldGVycywgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhlIG9ubHlcbiAqIG1vZGUgaXQgc3VwcG9ydHMgaXMgZXh0ZXJuYWwncyB2ZXJzaW9uIDw9IHBsYXRmb3JtJ3MgdmVyc2lvbi4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIHVwZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIGRvd25ncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LiBTaW1pbGFybHkgZm9yIG5vdGlmaWNhdGlvbnMsIGl0IGNhblxuICogZG93bmdyYWRlIHRob3NlIG9uIHRoZSB3YXkgZnJvbSBwbGF0Zm9ybSB0byBleHRlcm5hbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICAqXG4gICAgKiBAcGFyYW0gX2V4dGVybmFsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj5cbiAgKTogU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoXG4gICAgICBleHRlcm5hbFZlcnNpb24ubWFqb3IsXG4gICAgICBwbGF0Zm9ybVZlcnNpb24ubWFqb3IsXG4gICAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybU1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2V4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4pIHtcblxuICAgIGlmICh0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbiA+IHRoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IGJldHdlZW4gZXh0ZXJuYWwgdmVyc2lvbiAke3RoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9ufSBhbmQgJHt0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzOyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IHVwZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLnZlcmIsIHVwZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIERvd25ncmFkZSB0aGUgbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQgeyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcywgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlEIH0gZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWYgbGhzIDwgcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkxlc3NUaGFuKGxoczogVmVyc2lvbk51bWJlciwgcmhzOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmIChsaHMubWFqb3IgPiByaHMubWFqb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxocy5tYWpvciA8IHJocy5tYWpvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiAobGhzLm1pbm9yIDwgcmhzLm1pbm9yKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKGxocy5tYWpvciA9PT0gcmhzLm1ham9yKSAmJiAobGhzLm1pbm9yID09PSByaHMubWlub3IpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ham9yTWlub3JUcmFuc2xhdG9yczxUPiB7IFttYWpvcjogbnVtYmVyXTogeyBbbWlub3I6IG51bWJlcl06IEFycmF5PFQ+IH07IH1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSxcbiAgICAxMDogW0Rvd25ncmFkZUZsaXBib2FyZFpvbmVJRF1cbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoXG4gIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuXG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMpO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHVwZ3JhZGUsIGRvd25ncmFkZSwgYW5kXG4gKiBub3RpZmljYXRpb24gYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICogQHBhcmFtIHVwZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgdXBncmFkZXNcbiAqIEBwYXJhbSBkb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgZG93bmdyYWRlc1xuICogQHBhcmFtIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBub3RpZmljYXRpb24gZG93bmdyYWRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHVwZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gIGRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIG5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPik6IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcblxuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGxldCBuZWVkZWRFeGVjdXRlVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID1cbiAgICBHZXROZWVkZWRUcmFuc2xhdGlvbnMoZXh0ZXJuYWxNYWpvclZlcnNpb24sIHBsYXRmb3JtTWFqb3JWZXJzaW9uLCBleHRlcm5hbE1pbm9yVmVyc2lvbiwgdXBncmFkZXMpO1xuXG4gIGxldCBuZWVkZWRFeGVjdXRlRG93bmdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+ID1cbiAgICBHZXROZWVkZWRUcmFuc2xhdGlvbnMoZXh0ZXJuYWxNYWpvclZlcnNpb24sIHBsYXRmb3JtTWFqb3JWZXJzaW9uLCBleHRlcm5hbE1pbm9yVmVyc2lvbiwgZG93bmdyYWRlcyk7XG5cbiAgbGV0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID1cbiAgICBHZXROZWVkZWRUcmFuc2xhdGlvbnMoZXh0ZXJuYWxNYWpvclZlcnNpb24sIHBsYXRmb3JtTWFqb3JWZXJzaW9uLCBleHRlcm5hbE1pbm9yVmVyc2lvbiwgbm90aWZpY2F0aW9uRG93bmdyYWRlcyk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24sIG5lZWRlZEV4ZWN1dGVVcGdyYWRlcywgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMpO1xufVxuXG5mdW5jdGlvbiBHZXROZWVkZWRUcmFuc2xhdGlvbnM8VD4oXG4gIGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gIHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gIGV4dGVybmFsTWlub3JWZXJzaW9uOiBudW1iZXIsXG4gIG1ham9yTWlub3JUcmFuc2xhdG9yczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+KTogQXJyYXk8VD4ge1xuXG4gIGxldCBuZWVkZWRUcmFuc2xhdGlvbnM6IEFycmF5PFQ+ID0gW107XG5cbiAgZm9yIChsZXQgbWFqb3IgPSBleHRlcm5hbE1ham9yVmVyc2lvbjsgbWFqb3IgPD0gcGxhdGZvcm1NYWpvclZlcnNpb247IG1ham9yKyspIHtcbiAgICBpZiAobWFqb3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzKSB7XG4gICAgICBsZXQgc3RhcnQgPSAobWFqb3IgPT09IGV4dGVybmFsTWFqb3JWZXJzaW9uKSA/IGV4dGVybmFsTWlub3JWZXJzaW9uIDogMDtcbiAgICAgIGxldCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gYSA+IGIgPyBhIDogYik7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJy4uL2NvbnRyYWN0L01vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBvbGQgdmVycyBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuZXhwb3J0IHR5cGUgVXBncmFkZUV4ZWN1dGVDYWxsID1cbiAgKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpID0+IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9O1xuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlZCBhIHJlc3BvbnNlIGJhY2sgZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byBkb3duZ3JhZGUgaXQgdG8gZXh0ZXJuYWwncyB2ZXJzaW9uICovXG5leHBvcnQgdHlwZSBEb3duZ3JhZGVFeGVjdXRlUmV0dXJuID1cbiAgKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PiBFeGVjdXRlUmVzcG9uc2U7XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byBkb3duZ3JhZGUgaXQgdG8gZXh0ZXJuYWwncyB2ZXJzaW9uICovXG5leHBvcnQgdHlwZSBEb3duZ3JhZGVOb3RpZmljYXRpb24gPVxuICAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pID0+IE5vdGlmaWNhdGlvbjtcblxuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG5cbiAgLy8gRml4IHRoZSBkYXNoYm9hcmQgZnJpZW5kbHkgbmFtZSBpc3N1ZS4gVGhlIHN0cnVjdHVyZXMgYXJlIGNvbXBhdGlibGUsXG4gIC8vIHNvIHdlIHN0aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgcmVwbHksIGJ1dCB3ZSBjb3B5IHRoZSBTaGVldEluZm8ubmFtZVxuICAvLyBpbnRvIHRoZSBEYXNoYm9hcmRab25lLm5hbWUsIHdoZXJlIHYxIHdhbnRzIHRvIGZpbmQgaXQuXG5cbiAgbGV0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKHpvbmUgPT4ge1xuICAgICAgaWYgKHpvbmUuc2hlZXRJbmZvKSB7XG4gICAgICAgIHpvbmUubmFtZSA9IHpvbmUuc2hlZXRJbmZvLm5hbWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlEKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcblxuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGxldCB2aXN1YWxNb2RlbCA9IG5vdGlmaWNhdGlvbi5kYXRhIGFzIFZpc3VhbElkO1xuICAgIGlmICh2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmlzdWFsTW9kZWwuZmxpcGJvYXJkWm9uZUlEID0gMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm90aWZpY2F0aW9uO1xufVxuIiwiaW1wb3J0IHsgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhpcyB2ZXJzaW9uIGNvbnZlcnRlciBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJ1dCBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiB3ZSBoYXZlXG4gKiBhIG1hdGNoaW5nIHBsYXRmb3JtIGFuZCBleHRlcm5hbCB2ZXJzaW9uIG51bWJlclxuKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzOyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyYjogdmVyYiBhcyBWZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIGFzIEV4ZWN1dGVQYXJhbWV0ZXJzXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXhlY3V0ZVJlc3BvbnNlLCBFeGVjdXRlUGFyYW1ldGVycywgTm90aWZpY2F0aW9uLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoaXMgY29udmVydGVyXG4gKiBzdXBwb3J0cyBleHRlcm5hbCdzIHZlcnNpb24obWlub3IpID49IHBsYXRmb3JtJ3MgdmVyc2lvbihtaW5vcikuIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byBkb3duZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIHVwZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBkb3duZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kIGlzIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSBub3RmaWNhdGlvbnMgdG8gcGVyZm9ybSBvbiBldmVudHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlTm90aWZpY2F0aW9uPikge1xuXG5cbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yID4gdGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IGJldHdlZW4gZXh0ZXJuYWwgdmVyc2lvbiAke3RoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvcn1cbiAgICAgIGFuZCAke3RoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7IH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIGRvd25ncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCBkb3duZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQudmVyYiwgZG93bmdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgdXBncmFkZU5vdGlmaWNhdGlvbiBvZiB0aGlzLl91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVOb3RpZmljYXRpb24odXBncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTWFqb3JNaW5vclRyYW5zbGF0b3JzLCBHZXRNYXhpbXVtTWlub3JJbmRleCwgVmVyc2lvbkVxdWFsVG8gfSBmcm9tICcuLi9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zRXh0ZXJuYWwgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IERvd25ncmFkZVVuZGVybHlpbmdUYWJsZURhdGFBc3luYywgRG93bmdyYWRlTG9naWNhbFRhYmxlRGF0YUFzeW5jLCBVcGdyYWRlRGF0YVRhYmxlVHlwZXMsIFVwZ3JhZGVEYXRhVGFibGVSb3dzQW5kQ29sdW1ucyB9IGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuXG4vLyBBIG1hcHBpbmcgZnJvbSB0aGUgY3VycmVudCBjbGllbnQgdmVyc2lvbiBvZiBpbnRlcm5hbC1jb250cmFjdCB0byBhbiBvbGRlciBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBjb250cmFjdC5cbi8vIEVhY2ggdmVyc2lvbiBidW1wIGNhbiBoYXZlIGFuIGFycmF5IG9mIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGluIG9yZGVyLlxuLy8gVGhlc2UgdHJhbnNsYXRpb25zIGhhbmRsZSBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBhbmQgdXBncmFkZUV4ZWN1dGVSZXR1cm4gYW5kIGFyZSBtZWFudCB0byBiZSBjYWxsZWQgb24gdGhlXG4vLyBjbGllbnQvZXh0ZXJuYWwgc2lkZS5cbi8vIFdoZW4gdXBkYXRpbmcgdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2Ygb3VyIGludGVybmFsLWNvbnRyYWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMuXG4vLyAqIElmIHRoZXJlIGFyZSB0cmFuc2xhdGlvbnMgdG8gYWRkLCBhZGQgdGhlbSB0byB0aGUgdmVyc2lvbiB0byAndXBncmFkZSBmcm9tJyBvciAnZG93bmdyYWRlIHRvJy5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JEb3duZ3JhZGVDYWxsRXh0ZXJuYWw6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSwgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gICAgMTM6IFtEb3duZ3JhZGVVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMsIERvd25ncmFkZUxvZ2ljYWxUYWJsZURhdGFBc3luY10sXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlUmV0dXJuRXh0ZXJuYWw6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA5OiBbVXBncmFkZURhdGFUYWJsZVR5cGVzXSwgICAgICAgLy8gTm90ZSB0aGF0IHdlIHB1dCB1cGdyYWRlcyBmcm9tIDEuOSB0byAxLjEwIGluIHRoZSBbMV1bOV0gYnVja2V0XG4gICAgMjk6IFtVcGdyYWRlRGF0YVRhYmxlUm93c0FuZENvbHVtbnNdLCAvLyAyMDIxLjEgd2FzIHJlbGVhc2VkIHdpdGggMS4yOS4gVXBncmFkZSBmcm9tIDEuMjkgaW4gdGhlIFsxXVsyOV0gYnVja2V0XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHB1dCB1cGdyYWRlcyBmcm9tIDEuOSB0byAxLjEwIGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG5cbiAgcmV0dXJuIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBFeGVjdXRlTWlub3JEb3duZ3JhZGVDYWxsRXh0ZXJuYWwsXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb25cbiAgKTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzLlxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlIGFycmF5cyBzbyB0aGF0IGFsbCB0aGUgbG9naWMgY2FuIGJlIHRlc3RlZC5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciByZXNwb25zZSB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBleGVjdXRlIGNhbGwgZG93bmdyYWRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIGRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gIHVwZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICB1cGdyYWRlTm90aWZpY2F0aW9uczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+KVxuICA6IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcblxuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuICBjb25zdCBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1pbm9yO1xuXG4gIC8vIFRoaXMgY2hlY2sgaXMgcHJlc2VudCBpbiBWZXJzaW9uQ29udmVydGVyRmFjdG9yeS4gV2UgdGhyb3cgdGhlIHNhbWUgZXJyb3IgaGVyZSBhcyB3ZWxsLlxuICAvLyBIZW5jZSB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIG1pbm9yIHZlcnNpb25zIGZvciB0cmFuc2xhdGlvbnMuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA8IHBsYXRmb3JtTWFqb3JWZXJzaW9uIHx8IFZlcnNpb25FcXVhbFRvKGV4dGVybmFsVmVyc2lvbiwgcGxhdGZvcm1WZXJzaW9uKSkge1xuICAgIHJldHVybiBuZXcgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIoKTtcbiAgfVxuXG4gIC8vIFdhbGsgdGhlIHNwYW4gYmV0d2VlbiB0aGUgdmVyc2lvbnMgd2UgaGF2ZSBoZXJlIGFuZCBjb2xsZWN0IHRoZSB1cGdyYWRlIGFuZCBkb3duZ3JhZGVzIG5lY2Vzc2FyeVxuICBsZXQgbmVlZGVkRXhlY3V0ZUNhbGxEb3duZ3JhZGU6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPiA9XG4gICAgR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMocGxhdGZvcm1NYWpvclZlcnNpb24sIHBsYXRmb3JtTWlub3JWZXJzaW9uLCBkb3duZ3JhZGVzKTtcblxuICBsZXQgbmVlZGVkRXhlY3V0ZVJldHVyblVwZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4gPVxuICAgIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zKHBsYXRmb3JtTWFqb3JWZXJzaW9uLCBwbGF0Zm9ybU1pbm9yVmVyc2lvbiwgdXBncmFkZXMpO1xuXG4gIGxldCBuZWVkZWROb3RpZmljYXRpb25VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4gPVxuICAgIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zKHBsYXRmb3JtTWFqb3JWZXJzaW9uLCBwbGF0Zm9ybU1pbm9yVmVyc2lvbiwgdXBncmFkZU5vdGlmaWNhdGlvbnMpO1xuXG4gIC8vIFJldmVyc2UgdGhlIGRvd25ncmFkZSBjYWxscywgc28gdGhhdCB3ZSBzdGFydCB0aGUgZG93bmdyYWRlIGZyb20gdGhlIGV4dGVybmFsIHZlcnNpb24gdG8gdGhlIHBsYXRmb3JtIHZlcnNpb25cbiAgbmVlZGVkRXhlY3V0ZUNhbGxEb3duZ3JhZGUucmV2ZXJzZSgpO1xuICByZXR1cm4gbmV3IEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyKFxuICAgIGV4dGVybmFsVmVyc2lvbiwgcGxhdGZvcm1WZXJzaW9uLCBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSwgbmVlZGVkRXhlY3V0ZVJldHVyblVwZ3JhZGVzLCBuZWVkZWROb3RpZmljYXRpb25VcGdyYWRlcyk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPik6IEFycmF5PFQ+IHtcblxuICBsZXQgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBsZXQgc3RhcnQgPSBwbGF0Zm9ybU1pbm9yVmVyc2lvbjtcbiAgICBsZXQgbWF4aW11bU1pbm9yVmVyc2lvbiA9IEdldE1heGltdW1NaW5vckluZGV4KE9iamVjdC5rZXlzKG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pKTtcbiAgICBmb3IgKGxldCBtaW5vciA9IHN0YXJ0OyBtaW5vciA8PSBtYXhpbXVtTWlub3JWZXJzaW9uOyBtaW5vcisrKSB7XG4gICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXSkge1xuICAgICAgICBuZWVkZWRUcmFuc2xhdGlvbnMucHVzaCguLi5tYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dW21pbm9yXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5lZWRlZFRyYW5zbGF0aW9ucztcbn1cbiIsImltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVTZW50aW5lbCxcbiAgRGF0YUhlYWRlcixcbiAgRGF0YVRhYmxlLFxuICBEYXRhVHlwZUNvbnZlcnRlcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxUYWJsZWF1RXJyb3IsXG4gIE5vdGlmaWNhdGlvbixcbiAgUGFyYW1ldGVySWQsXG4gIFNlbGVjdGVkTWFya3NUYWJsZSxcbiAgVW5kZXJseWluZ0RhdGFUYWJsZSxcbiAgVmVyYklkXG59IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG5ld2VyIHZlcnNpb24gYW5kIHBhcmFtZXRlcnMgZnJvbSB0aGUgZXh0ZXJuYWwgYmVmb3JlIHdlIHNlbmQgaXQgdG8gcGxhdGZvcm0gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVDYWxsID1cbiAgKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpID0+IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9O1xuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIHVwZ3JhZGUgaXQgdG8gZXh0ZXJuYWwncyB2ZXJzaW9uXG4gKiAgVGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgcHJvdmlkZSBhIGNvbnRleHQgdG8gZGVjaWRlIGhvdyB0byBoYW5kbGUgdGhlIHJlc3BvbnNlLlxuKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlUmV0dXJuID1cbiAgKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiBFeGVjdXRlUmVzcG9uc2U7XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byB1cGdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgVXBncmFkZU5vdGlmaWNhdGlvbiA9XG4gIChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyAxLjIgLT4gMS4wIFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjEgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMSBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjEnO1xuXG4vKipcbiAqIFByaW9yIHRvIDIwMTkuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuOSksIERhdGFWYWx1ZS52YWx1ZSB3ZXJlIGFsbCBzdHJpbmdzLlxuICogR28gdGhyb3VnaCBhbGwgRGF0YVZhbHVlIG9iamVjdHMuIElmIHdlIGhhdmUgYSBzdHJpbmcsIGJ1dCB0aGUgdHlwZSBzaG91bGQgbm90IGJlIGEgc3RyaW5nLFxuICogY29udmVydCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLiBUaGUgdHlwZSBvZiBEYXRhVmFsdWUudmFsdWUgaXMgJ2FueScgaW4gdGhlIGNvbnRyYWN0LCBzb1xuICogdGhpcyBjaGFuZ2UgZG9lc24ndCBuZWVkIGFueSB1cGRhdGVzIHRvIGNsYXNzZXMgb3IgdHlwZXMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIFVwZ3JhZGVEYXRhVGFibGVUeXBlcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGlmICghZXhlY3V0ZVJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGxldCBvbGRVbmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAob2xkVW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2xkVW5kZXJseWluZ0RhdGFUYWJsZS5pc1N1bW1hcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnZlcnREYXRhVmFsdWVzKG9sZFVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSk7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGxldCBvbGRTZWxlY3RlZE1hcmtzVGFibGUgPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgaWYgKG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShvbGRTZWxlY3RlZE1hcmtzVGFibGUuZGF0YSkpIHtcbiAgICBvbGRTZWxlY3RlZE1hcmtzVGFibGUuZGF0YS5mb3JFYWNoKG1hcmtzVGFibGUgPT4ge1xuICAgICAgY29udmVydERhdGFWYWx1ZXMobWFya3NUYWJsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMC4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4xMyBhbmQgb2xkZXIpLCB3b3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jIGRvZXNuJ3QgZXhpc3QuXG4gKiBNYXAgaXQgdG8gdGhlIG9sZGVyIEdldFVuZGVybHlpbmdEYXRhIHZlcmIgYW5kIHZhbGlkYXRlIHRoZSB0aGUgbG9naWNhbCB0YWJsZSBJZC5cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmModmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IHtcbiAgdmVyYjogVmVyYklkO1xuICBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVyc1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBQcmlvciB0byAyMDIwLjIgKGludGVybmFsLWNvbnRyYWN0IHYxLjEzIGFuZCBvbGRlciksIGRhdGFzb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jIGRvZXNuJ3QgZXhpc3QuXG4gKiBNYXAgaXQgdG8gdGhlIG9sZGVyIEdldERhdGFTb3VyY2VEYXRhIHZlcmIgYW5kIHZhbGlkYXRlIHRoZSB0aGUgbG9naWNhbCB0YWJsZSBJZC5cbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVMb2dpY2FsVGFibGVEYXRhQXN5bmModmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IHtcbiAgdmVyYjogVmVyYklkO1xuICBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVyc1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydERhdGFWYWx1ZXModGFibGU6IERhdGFUYWJsZSk6IHZvaWQge1xuICAvLyBkYXRhVGFibGUgaXMgYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgb2YgZGF0YS4gRmlyc3QgaW5kZXggaXMgdGhlIHJvdywgc2Vjb25kIGlzIHRoZSBjb2x1bW4uXG4gIGlmICh0YWJsZSA9PT0gdW5kZWZpbmVkIHx8IHRhYmxlLmRhdGFUYWJsZSA9PT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KHRhYmxlLmRhdGFUYWJsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0YWJsZS5kYXRhVGFibGUuZm9yRWFjaChyb3cgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChkYXRhVmFsdWUsIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBkYXRhVmFsdWUudmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgZGF0YVZhbHVlLnZhbHVlID0gRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0YWJsZS5oZWFkZXJzW2NvbHVtbkluZGV4XS5kYXRhVHlwZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBUb0RvOiBURlMxMDY5MDI3IFJlZmFjdG9yIGlucHV0IHZlcmJzICYgcGFyYW1ldGVycyBpbiBhcGktaW50ZXJuYWwtY29udHJhY3QgVXBncmFkZS9Eb3duZ3JhZGUgZnJhbWV3b3JrXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtZXRlcnNGb3JPYmplY3RNb2RlbCh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogdm9pZCB7XG4gIGlmIChwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkxvZ2ljYWxUYWJsZUlkXSAhPT0gQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLlNpbmdsZVRhYmxlSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbG9naWNhbCB0YWJsZSBpZCBwYXNzZWQgdG8gJHt2ZXJifS5gKSBhcyBJbnRlcm5hbFRhYmxlYXVFcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjEuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMjkgYW5kIGJlbG93KSwgZ2V0U3VtbWFyeURhdGFBc3luYyBkaWQgbm90IHN1cHBvcnQgbWF4Um93cyxcbiAqIGFuZCBhbnkgZ2V0Li4uRGF0YUFzeW5jIGRpZCBub3Qgc3VwcG9ydCBjb2x1bW5zVG9JbmNsdWRlQnlJZC5cbiAqIFRyaW0gcmVzdWx0IHRvIG1heFJvd3MgaWYgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGdldFN1bW1hcnlEYXRhQXN5bmNcbiAqIFRyaW0gY29sdW1ucyB0byBjb2x1bW5zVG9JbmNsdWRlIGlmIGluY2x1ZGVkIGluIHRoZSBwYXJhbWV0ZXJzIGZvciBhbnkgZ2V0Li4uRGF0YUFzeW5jXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIFVwZ3JhZGVEYXRhVGFibGVSb3dzQW5kQ29sdW1ucyhcbiAgZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsXG4gIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoaXNHZXRTdW1tYXJ5RGF0YVZlcmIodmVyYikgJiYgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSkge1xuICAgIGV4ZWN1dGVSZXNwb25zZSA9IGFkanVzdERhdGFSb3dMZW5ndGgoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdIGFzIG51bWJlcik7XG4gIH1cblxuICBpZiAoaXNHZXRUYWJsZURhdGFWZXJiKHZlcmIpICYmIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdKSB7XG4gICAgZXhlY3V0ZVJlc3BvbnNlID0gYWRqdXN0RGF0YUNvbHVtbnMoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSBhcyBzdHJpbmdbXSk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc0dldFN1bW1hcnlEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGE7XG59XG5cbmZ1bmN0aW9uIGlzR2V0VGFibGVEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFcbiAgICB8fCB2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YVxuICAgIHx8IHZlcmIgPT09IFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhXG4gICAgfHwgdmVyYiA9PT0gVmVyYklkLkdldERhdGFTb3VyY2VEYXRhXG4gICAgfHwgdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdEYXRhO1xufVxuXG5mdW5jdGlvbiBhZGp1c3REYXRhUm93TGVuZ3RoKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBtYXhSb3dzOiBudW1iZXIpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBsZXQgdW5kZXJseWluZ0RhdGFUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgaWYgKCF1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEgfHwgIUFycmF5LmlzQXJyYXkodW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZSkpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgaWYgKG1heFJvd3MgPiAwICYmIG1heFJvd3MgPCB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmxlbmd0aCkge1xuICAgIHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUubGVuZ3RoID0gbWF4Um93cztcbiAgfVxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBhZGp1c3REYXRhQ29sdW1ucyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgY29sdW1uc1RvSW5jbHVkZTogc3RyaW5nW10pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoY29sdW1uc1RvSW5jbHVkZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgLy8gdmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIHZhbGlkIFVuZGVybHlpbmdEYXRhVGFibGVcbiAgbGV0IHVuZGVybHlpbmdEYXRhVGFibGUgPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gIGlmICghdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhIHx8ICFBcnJheS5pc0FycmF5KHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUpIHx8ICFBcnJheS5pc0FycmF5KHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5oZWFkZXJzKSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICAvLyAxLiBmaWx0ZXIgdGhlIGhlYWRlcnMgdG8gb25seSBjb2x1bW5zVG9JbmNsdWRlXG4gIC8vIDIuIHVzZSB0aGUgbmV3IGhlYWRlcnMgdG8gZmlsdGVyIGFsbCByb3dzXG4gIC8vIDMuIHVwZGF0ZSB0aGUgaW5kaWNlcyBpbiBvdXIgbmV3IGhlYWRlcnNcbiAgbGV0IG5ld0hlYWRlcnM6IERhdGFIZWFkZXJbXVxuICAgID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmhlYWRlcnMuZmlsdGVyKChoZWFkZXIsIGluZGV4KSA9PiBjb2x1bW5zVG9JbmNsdWRlLmZpbmQobmFtZSA9PiBuYW1lID09PSBoZWFkZXIuZmllbGROYW1lKSk7XG4gIHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgIHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGVbaW5kZXhdXG4gICAgICA9IHJvdy5maWx0ZXIoKHZhbHVlLCB2YWx1ZUluZGV4KSA9PiBuZXdIZWFkZXJzLmZpbmRJbmRleChoZWFkZXIgPT4gaGVhZGVyLmluZGV4ID09PSB2YWx1ZUluZGV4KSAhPT0gLTEpO1xuICB9KTtcbiAgbGV0IG5ld0luZGV4ID0gMDtcbiAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmhlYWRlcnMgPSBuZXdIZWFkZXJzLm1hcChoZWFkZXIgPT4geyBoZWFkZXIuaW5kZXggPSBuZXdJbmRleCsrOyByZXR1cm4gaGVhZGVyOyB9KTtcblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuIiwiLy8gRXhwb3J0IGV2ZXJ5dGhpbmcgd2hpY2ggaGFkIGJlZW4gcHJldmlvdXNseSBpbiB0aGUgYXBpLXNoYXJlZCBtb2R1bGVcblxuZXhwb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9FdmVudExpc3RlbmVyTWFuYWdlcic7XG5leHBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9TaW5nbGVFdmVudE1hbmFnZXInO1xuZXhwb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9BcGlTaGFyZWQvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IEFwaVZlcnNpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9BcGlWZXJzaW9uJztcbmV4cG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCB7IFNpemUgfSBmcm9tICcuL0FwaVNoYXJlZC9TaXplJztcbmV4cG9ydCB7IFBvaW50IH0gZnJvbSAnLi9BcGlTaGFyZWQvUG9pbnQnO1xuXG5leHBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmV4cG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwnO1xuZXhwb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEltcGwnO1xuZXhwb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbCc7XG5leHBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9Xb3Jrc2hlZXRJbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkSW1wbCc7XG5leHBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmV4cG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZUJvb3RzdHJhcCc7XG5leHBvcnQgeyBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB9IGZyb20gJy4vQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXInO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9SZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5cbmV4cG9ydCB7IFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciB9IGZyb20gJy4vVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyJztcblxuZXhwb3J0IHsgVml6U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1ZpelNlcnZpY2UnO1xuZXhwb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9QYXJhbWV0ZXJzU2VydmljZSc7XG5cbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9EYXRhU291cmNlSW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlckNvbnRyYWN0IH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyQ29udHJhY3QnO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZXRvbiB3cmFwcGVyIG9mIFZlcnNpb25OdW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVZlcnNpb24ge1xuXG4gIC8vIFVzaW5nIHNvbWUgd2VicGFjayB0cmlja3MsIHdlIGNhbiBpbmplY3QgdGhpcyB2ZXJzaW9uIGludG8gb3VyIGNvZGUgKGtpbmRhIGxpa2UgYysrIHByZXByb2Nlc3NvciBzdHVmZilcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBWZXJzaW9uTnVtYmVyQ29udHJhY3Q7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgdmVyc2lvbiBudW1iZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICAgIHJldHVybiBBcGlWZXJzaW9uLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgU2V0VmVyc2lvbk51bWJlcihudW1TdHJpbmc6IHN0cmluZywgaXNBbHBoYTogYm9vbGVhbik6IHZvaWQge1xuICAgIEFwaVZlcnNpb24uX2luc3RhbmNlID0gbmV3IFZlcnNpb25OdW1iZXIobnVtU3RyaW5nLCBpc0FscGhhKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnkgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgY29ubmVjdGlvbiBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25uZWN0aW9uSW5mbzogQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXJ2ZXJVUkkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8uc2VydmVyVVJJO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnR5cGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBDcm9zc0ZyYW1lTWVzc2VuZ2VyLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxuICBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IENyb3NzRnJhbWVEaXNwYXRjaGVyIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lRGlzcGF0Y2hlcic7XG5cbi8vIENoZWNrcyB0byBzZWUgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYW4gaWZyYW1lIGN1cnJlbnRseTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMyNjA3Ni84ODIxMTUzXG5mdW5jdGlvbiBpbklmcmFtZSh0aGlzV2luZG93OiBXaW5kb3cpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpc1dpbmRvdy5zZWxmICE9PSB0aGlzV2luZG93LnBhcmVudDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gYm9vdHN0cmFwIHRoZSBleHRlbnNpb24gd2l0aCBhIGNyb3NzLWZyYW1lIHBhcmVudCB3aGVyZSBUYWJsZWF1IGlzIHJ1bm5pbmdcbiAqXG4gKiBAcGFyYW0gdGhpc1dpbmRvdyBUaGUgd2luZG93IHdoaWNoIHdlIGFyZSBydW5uaW5nIGluIChpbmplY3RlZCBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzKVxuICogQHBhcmFtIGludGVybmFsQ29udHJhY3RWZXJzaW9uIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2UgYXJlIHVzaW5nXG4gKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggaXMgZG9pbmcgdGhlIGFjdHVhbCBib290c3RyYXBwaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb0Nyb3NzRnJhbWVCb290c3RyYXAoXG4gIHRoaXNXaW5kb3c6IFdpbmRvdywgaW50ZXJuYWxDb250cmFjdFZlcnNpb246IENvbnRyYWN0LlZlcnNpb25OdW1iZXIsIG9wdGlvbnM6IEluaXRpYWxpemF0aW9uT3B0aW9ucylcbiAgOiBQcm9taXNlPENvbnRyYWN0LkludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+IHtcblxuICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9XG4gICAgICBtZXNzZW5nZXIucHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiwgQXBpTWVzc2FnaW5nVmVyc2lvbiwgb3B0aW9ucyk7XG5cbiAgICAvLyBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIHBhcmVudCwgd2UgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBndWlkcyBtYXRjaCBhbmQgdGhlbiB3ZSBrbm93XG4gICAgLy8gdGhhdCB0aGUgcGFyZW50IGlzIGF3YXJlIG9mIHVzIGFuZCB3ZSBjYW4gc3RhcnQgY29tbXVuaWNhdGluZ1xuICAgIG1lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihmdW5jdGlvbiAobXNnOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG5cbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG5cbiAgICAgICAgLy8gVGhlIHZlcnNpb25pbmcgb2YgdGhlIGRpc3BhdGNoZXIgaGFwcGVucyBvbiB0aGUgb3RoZXIgc2lkZSBvZiBvdXIgZnJhbWUsIGFuZFxuICAgICAgICAvLyBpbiBhIHdyYXBwZXIgb24gdGhpcyBzaWRlLiBUaGlzIG9uZSBkb2Vzbid0IGhhdmUgYW55IHZlcnNpb24ga25vd2xlZGdlLlxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyRmFjdG9yeSA9ICgpID0+IG5ldyBDcm9zc0ZyYW1lRGlzcGF0Y2hlcihtZXNzZW5nZXIpO1xuICAgICAgICByZXNvbHZlKGRpc3BhdGNoZXJGYWN0b3J5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE5vdyB0aGF0IG91ciBoYW5kbGVycyBhcmUgcmVhZHksIHN0YXJ0IGxpc3RlbmluZyBhbmQgc2VuZCBvdXIgaW5pdGlhbGl6YXRpb24gbWVzc2FnZVxuICAgIG1lc3Nlbmdlci5zdGFydExpc3RlbmluZygpO1xuICAgIGluaXRpYWxpemF0aW9uTWVzc2FnZS5zZW5kKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSGFuZGxlcixcbiAgVmVyYklkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSwgTWVzc2VuZ2VyLCBOb3RpZmljYXRpb25NZXNzYWdlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgaW50ZXJmYWNlIHdoaWNoIGZ1bmN0aW9ucyBieSBwYXNzaW5nIG1lc3NhZ2VzXG4gKiBhY3Jvc3MgYSBmcmFtZSBib3VuZGFyeS4gVGhpcyBpcyB1c3VhbGx5IGJldHdlZW4gdGhlIGNvZGUgd2hlcmUgb3VyIGphdnNjcmlwdCBsaWJyYXJ5IGhhcyBiZWVuIGluY2x1ZGVkXG4gKiBieSBhIDNyZCBwYXJ0eSBkZXYgYW5kIGFub3RoZXIgZnJhbWUgd2hlcmUgVGFibGVhdSBzZXJ2ZXIgaGFzIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEludGVybmFsQXBpRGlzcGF0Y2hlciB7XG5cbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczpcbiAgICB7IFttZXNzYWdlR3VpZDogc3RyaW5nXTogeyByZXNvbHZlOiAocmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSkgPT4gdm9pZCwgcmVqZWN0OiAoZXJyb3I6IE1vZGVsKSA9PiB2b2lkIH0gfSA9IHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIC8vIFNhdmUgb2ZmIHRoZSBwZW5kaW5nIHByb21pc2UgYnkgdGhlIG1lc3NhZ2VHdWlkIHdlIGFyZSBhYm91dCB0byBzZW5kLiBXaGVuIGEgcmVzcG9uc2UgaXNcbiAgICAgIC8vIHJlY2VpdmVkLCB3ZSdsbCBiZSBhYmxlIHRvIHJlc29sdmUgdGhpcyBwcm9taXNlIHdpdGggdGhlIHJlc3VsdFxuICAgICAgdGhpcy5fcGVuZGluZ1Byb21pc2VzW3ByZXBhcmVkTWVzc2FnZS5tZXNzYWdlR3VpZF0gPSB7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH07XG4gICAgfSk7XG5cbiAgICAvLyBBY3R1YWxseSBzZW5kIHRoZSBtZXNzYWdlIGFuZCByZXR1cm4gdGhlIHByb21pc2VcbiAgICBwcmVwYXJlZE1lc3NhZ2Uuc2VuZCgpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMgPSB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5maWx0ZXIoaCA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZ25vcmUgdGhpcy4gV3JhcCBpbiB0cnkvY2F0Y2ggc28gaWYgb25lIGhhbmRsZXIgZXJyb3JzLCB0aGUgb3RoZXIgc3RpbGwgZ2V0IHRoZSBtZXNzYWdlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHsgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRzKCk6IEFycmF5PENvbnRyYWN0LkZpZWxkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucmVmcmVzaEFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PiB7XG4gICAgY29uc29sZS53YXJuKCdEYXRhU291cmNlLmdldEFjdGl2ZVRhYmxlc0FzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMuJyk7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldEFjdGl2ZVRhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOlxuICAgIFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKCdEYXRhU291cmNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICdEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyBhbmQgRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMuJyk7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBvcHRpb25zKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuaW1wb3J0IHtcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBFeHRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgRXh0ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvblxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBGaWx0ZXJEb21haW5UeXBlIGFzIEludGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBJbnRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0XG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cblxuLyogdHNsaW50OmRpc2FibGU6dHlwZWRlZiAtIERpc2FibGUgdGhpcyB0byBtYWtlIGRlY2xhcmluZyB0aGVzZSBjbGFzc2VzIGEgYml0IGVhc2llciAqL1xuLyoqXG4gKiBNYXBzIGVudW1zIHVzZWQgYnkgdGhlIGV4dGVybmFsLWFwaS1jb250cmFjdCB0byB0aGUgZW51bXMgdXNlZFxuICogaW4gdGhlIGludGVybmFsLWFwaS1jb250cmFjdCwgd2hpY2ggZGV2ZWxvcGVycyBjb2RlIGFnYWluc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Mge1xuICBwdWJsaWMgc3RhdGljIGZpbHRlckRvbWFpblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERvbWFpblR5cGUsIEludGVybmFsRG9tYWluVHlwZT4oe1xuICAgIFtFeHRlcm5hbERvbWFpblR5cGUuUmVsZXZhbnRdOiBJbnRlcm5hbERvbWFpblR5cGUuUmVsZXZhbnQsXG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5EYXRhYmFzZV06IEludGVybmFsRG9tYWluVHlwZS5EYXRhYmFzZVxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXNcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZVxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFZpc2liaWxpdHlUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8Wm9uZVZpc2liaWxpdHlUeXBlLCBCb29sZWFuPih7XG4gICAgW1pvbmVWaXNpYmlsaXR5VHlwZS5TaG93XTogdHJ1ZSxcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLkhpZGVdOiBmYWxzZVxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHlcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIENvbHVtblR5cGUgYXMgRXh0ZXJuYWxDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlIGFzIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGF0YVR5cGUgYXMgRXh0ZXJuYWxEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlIGFzIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBDb2x1bW5UeXBlIGFzIEludGVybmFsQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSBhcyBJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlIGFzIEludGVybmFsRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCBhcyBJbnRlcm5hbERhdGVTdGVwUGVyaW9kLFxuICBEb21haW5SZXN0cmljdGlvblR5cGUgYXMgSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsXG4gIEVycm9yQ29kZXMgYXMgSW50ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgSW50ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBJbnRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXJcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Nb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zTW9kZSwgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZT4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZ106IEV4dGVybmFsRXh0ZW5zaW9uc01vZGUuQXV0aG9yaW5nLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmdcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjb2x1bW5UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxDb2x1bW5UeXBlLCBFeHRlcm5hbENvbHVtblR5cGU+KHtcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkNvbnRpbnVvdXNdOiBFeHRlcm5hbENvbHVtblR5cGUuQ29udGludW91cyxcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlXTogRXh0ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRkXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRW5kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSW5PdXQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkt1cnRvc2lzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1heF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1keV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1lZGlhbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1vbnRoWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQxXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDEsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3NdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNrZXduZXNzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdW1dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNEYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNIb3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGhdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jUXRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1NlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1dlZWtdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1llYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnAsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRSb2xlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmllbGRSb2xlVHlwZSwgRXh0ZXJuYWxGaWVsZFJvbGVUeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb25dOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuRGltZW5zaW9uLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuTWVhc3VyZV06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuVW5rbm93bl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNoZWV0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsU2hlZXRUeXBlLCBFeHRlcm5hbFNoZWV0VHlwZT4oe1xuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmRdOiBFeHRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmQsXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLlN0b3J5XTogRXh0ZXJuYWxTaGVldFR5cGUuU3RvcnksXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLldvcmtzaGVldF06IEV4dGVybmFsU2hlZXRUeXBlLldvcmtzaGVldFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXRcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0YVR5cGUsIEV4dGVybmFsRGF0YVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5Cb29sXTogRXh0ZXJuYWxEYXRhVHlwZS5Cb29sLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGUsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRGF0ZVRpbWVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGVUaW1lLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkZsb2F0XTogRXh0ZXJuYWxEYXRhVHlwZS5GbG9hdCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5JbnRdOiBFeHRlcm5hbERhdGFUeXBlLkludCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZ1xuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclVwZGF0ZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmVdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYWxsb3dhYmxlVmFsdWVzID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlPih7XG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkFsbF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkFsbCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuTGlzdF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLlJhbmdlXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHNcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlUmFuZ2VUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlUmFuZ2VUeXBlLCBFeHRlcm5hbERhdGVSYW5nZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3RdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGVdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXJyb3JDb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFcnJvckNvZGVzLCBFeHRlcm5hbEVycm9yQ29kZXM+KHtcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOSVRJQUxJWkFUSU9OX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuTUlTU0lOR19FTlVNX01BUFBJTkddOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfUEFSQU1FVEVSXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5VTktOT1dOX1ZFUkJfSURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5WSVNJQklMSVRZX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLlZpc2liaWxpdHlFcnJvcixcbiAgfSwgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IpO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmlsdGVyVHlwZSwgRXh0ZXJuYWxGaWx0ZXJUeXBlPih7XG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9TaW5nbGVFdmVudE1hbmFnZXInO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIENsYXNzIGRlc2lnbmVkIHRvIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIGhhbmRsZXJzIGZyb20gYSB1c2VyLiBPbmx5IHRob3NlIGV2ZW50c1xuICogd2hpY2ggYXJlIGFkZGVkIHZpYSBBZGROZXdFdmVudFR5cGUgd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5FdmVudExpc3RlbmVyTWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50TGlzdGVuZXJNYW5hZ2VyczogeyBbdGFibGVhdUV2ZW50VHlwZTogc3RyaW5nXTogU2luZ2xlRXZlbnRNYW5hZ2VyOyB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSxcbiAgICBoYW5kbGVyOiBDb250cmFjdC5UYWJsZWF1RXZlbnRIYW5kbGVyRm4pOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCBhZGQgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5hZGRFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBoYW5kbGVyOiBDb250cmFjdC5UYWJsZWF1RXZlbnRIYW5kbGVyRm4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRFdmVudE5hbWUsIGBDYW5ub3QgcmVtb3ZlIGV2ZW50LCB1bnN1cHBvcnRlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50VHlwZV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGROZXdFdmVudFR5cGUoZXZlbnRNYW5hZ2VyOiBTaW5nbGVFdmVudE1hbmFnZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRNYW5hZ2VyLmV2ZW50VHlwZV0gPSBldmVudE1hbmFnZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZpZWxkQWdncmVnYXRpb25UeXBlLCBGaWVsZFJvbGVUeXBlLCBDb2x1bW5UeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vSW1wbC9GaWVsZEltcGwnO1xuXG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIENvbnRyYWN0LkZpZWxkIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpZWxkSW1wbDogRmllbGRJbXBsKSB7IH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbigpOiBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5hZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRhdGFTb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvbGUoKTogRmllbGRSb2xlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5yb2xlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0dlbmVyYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzR2VuZXJhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5UeXBlKCk6IENvbHVtblR5cGUge1xuICAgIHRocm93IEVycm9ySGVscGVycy5hcGlOb3RJbXBsZW1lbnRlZCgnRmllbGQuY29sdW1uVHlwZScpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGFzaGJvYXJkWm9uZSxcbiAgU2hlZXRQYXRoLFxuICBWaXN1YWxJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL1BvaW50JztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTaXplIH0gZnJvbSAnLi4vU2l6ZSc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkSW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHByaXZhdGUgX3dvcmtzaGVldHNJbXBsOiBBcnJheTxXb3Jrc2hlZXRJbXBsPjtcbiAgcHJpdmF0ZSBfb2JqZWN0czogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPixcbiAgICBwcml2YXRlIF9zaGVldFBhdGg6IFNoZWV0UGF0aCxcbiAgICBpbmRleD86IG51bWJlcixcbiAgICBpc0FjdGl2ZT86IGJvb2xlYW4sXG4gICAgaXNIaWRkZW4/OiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcihuZXcgU2hlZXRJbmZvSW1wbChfbmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgbmV3IFNpemUoaGVpZ2h0LCB3aWR0aCksIGluZGV4LCBpc0FjdGl2ZSwgaXNIaWRkZW4pKTtcbiAgfVxuXG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRzSW1wbCgpOiBBcnJheTxXb3Jrc2hlZXRJbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldHNJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0cztcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTogdm9pZCB7XG5cbiAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbCA9IG5ldyBBcnJheTxXb3Jrc2hlZXRJbXBsPigpO1xuICAgIHRoaXMuX29iamVjdHMgPSBuZXcgQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcblxuICAgIC8vIFByb2Nlc3MgYWxsIHRoZSB6b25lcyB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoaXMgZGFzaGJvYXJkXG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBsZXQgd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgem9uZVNpemUgPSBuZXcgU2l6ZSh6b25lLmhlaWdodCwgem9uZS53aWR0aCk7XG5cbiAgICAgIGlmICh6b25lLnpvbmVUeXBlID09PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICAgIGxldCB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8gPyB6b25lLnNoZWV0SW5mby5uYW1lIDogem9uZS5uYW1lO1xuICAgICAgICBsZXQgc2hlZXRJbmZvSW1wbDtcbiAgICAgICAgLy8gSW5kZXhlcywgaXNBY3RpdmUgYW5kIHNvbWUgbW9yZSBwcm9wZXJ0aWVzIGluIHNoZWV0SW5mb0ltcGwgYXJlIGVtYmVkZGluZyBzcGVjaWZpYy5cbiAgICAgICAgLy8gQnV0IHdlIGluaXQgdGhlbSBmb3IgYm90aCBleHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgYXMgdGhlIE1vZGVscyB3aWxsIG9ubHkgdXNlIHdoYXQgaXMgcmVsZXZhbnQuXG4gICAgICAgIHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gICAgICAgICAgem9uZVNpemUsXG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwubGVuZ3RoLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHpvbmUuem9uZUlkKTtcblxuXG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgZGFzaGJvYXJkOiB0aGlzLl9uYW1lLFxuICAgICAgICAgIHN0b3J5Ym9hcmQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeWJvYXJkLFxuICAgICAgICAgIGZsaXBib2FyZFpvbmVJRDogdGhpcy5fc2hlZXRQYXRoLmZsaXBib2FyZFpvbmVJRCxcbiAgICAgICAgICBzdG9yeVBvaW50SUQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeVBvaW50SURcbiAgICAgICAgfTtcblxuICAgICAgICB3b3Jrc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoc2hlZXRJbmZvSW1wbCwgdml6SWQsIHRoaXMpO1xuICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5wdXNoKHdvcmtzaGVldEltcGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RJbXBsID0gbmV3IERhc2hib2FyZE9iamVjdEltcGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldEltcGwsXG4gICAgICAgIHpvbmUubmFtZSxcbiAgICAgICAgKHpvbmUuaXNGbG9hdGluZyAhPT0gdW5kZWZpbmVkKSA/IHpvbmUuaXNGbG9hdGluZyA6IGZhbHNlLCAgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzRmxvYXRpbmcsIHNvIHdlIGFzc3VtZSBmYWxzZVxuICAgICAgICAoem9uZS5pc1Zpc2libGUgIT09IHVuZGVmaW5lZCkgPyB6b25lLmlzVmlzaWJsZSA6IHRydWUsICAgICAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNWaXNpYmxlLCBzbyB3ZSBhc3N1bWUgdHJ1ZVxuICAgICAgICB6b25lLnpvbmVJZFxuICAgICAgKTtcblxuICAgICAgdGhpcy5fb2JqZWN0cy5wdXNoKGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRab25lVmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHpvbmVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLlpvbmUpO1xuXG4gICAgcmV0dXJuIHpvbmVTZXJ2aWNlLnNldFZpc2liaWxpdHlBc3luYygvKkRhc2hib2FyZCBOYW1lKi8gdGhpcy5uYW1lLCB0aGlzLm9iamVjdHMsIHpvbmVWaXNpYmlsaXR5TWFwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGFzaGJvYXJkIG9iamVjdHMgLSB0aGUgem9uZXMgaW4gYSBkYXNoYm9hcmQuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRPYmplY3RJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2Rhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwsXG4gICAgcHJpdmF0ZSBfdHlwZTogRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgICBwcml2YXRlIF9wb3NpdGlvbjogQ29udHJhY3QuUG9pbnQsXG4gICAgcHJpdmF0ZSBfc2l6ZTogQ29udHJhY3QuU2l6ZSxcbiAgICBwcml2YXRlIF93b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9pc0Zsb2F0aW5nOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzVmlzaWJsZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pZDogbnVtYmVyXG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRJbXBsKCk6IERhc2hib2FyZEltcGwge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRJbXBsKCk6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRmxvYXRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi9GaWVsZEltcGwnO1xuXG5pbXBvcnQgeyBDb25uZWN0aW9uU3VtbWFyeSB9IGZyb20gJy4uL0Nvbm5lY3Rpb25TdW1tYXJ5JztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vRmllbGQnO1xuaW1wb3J0IHsgVGFibGVTdW1tYXJ5IH0gZnJvbSAnLi4vVGFibGVTdW1tYXJ5JztcblxuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGUgfSBmcm9tICcuLi9Mb2dpY2FsVGFibGUnO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVNvdXJjZUltcGwge1xuICBwcml2YXRlIF9maWVsZHM6IEFycmF5PEZpZWxkPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGF0YVNvdXJjZUluZm86IEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZSkge1xuICAgIHRoaXMuX2ZpZWxkcyA9IF9kYXRhU291cmNlSW5mby5maWVsZHMubWFwKGZpZWxkTW9kZWwgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UucmVmcmVzaEFzeW5jKHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPihzdW1tYXJpZXMgPT4ge1xuICAgICAgcmV0dXJuIHN1bW1hcmllcy5tYXAoc3VtbWFyeSA9PiBuZXcgQ29ubmVjdGlvblN1bW1hcnkoc3VtbWFyeSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZVRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuVGFibGVTdW1tYXJ5Pj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+Pih0YWJsZUluZm9zID0+IHtcbiAgICAgIHJldHVybiB0YWJsZUluZm9zLm1hcCh0YWJsZUluZm8gPT4gbmV3IFRhYmxlU3VtbWFyeSh0YWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTpcbiAgICBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuXG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgICB0aGlzLmlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCwgICAgICAgLy8gMCBhbmQgW10gYXJlIGRlZmF1bHRzXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGUgfHwgW10sXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCwgICAgICAgLy8gMCBhbmQgW10gYXJlIGRlZmF1bHRzXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGUgfHwgW10sXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoZmllbGRNb2RlbCA9PiB7XG4gICAgICBjb25zdCBmaWVsZEltcGwgPSBuZXcgRmllbGRJbXBsKGZpZWxkTW9kZWwsIGRhdGFTb3VyY2UpO1xuICAgICAgcmV0dXJuIG5ldyBGaWVsZChmaWVsZEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlc0FzeW5jKHRoaXMuaWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4obG9naWNhbFRhYmxlSW5mb3MgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcChsb2dpY2FsVGFibGVJbmZvID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRBZ2dyZWdhdGlvblR5cGUuY29udmVydCh0aGlzLl9maWVsZEluZm8uYWdncmVnYXRpb24pO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRSb2xlVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5yb2xlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDYWxjdWxhdGVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0NhbGN1bGF0ZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDb21iaW5lZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDb21iaW5lZEZpZWxkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEYXRhVHlwZSwgUGVyaW9kVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcblxuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVySW1wbCB7XG4gIHByaXZhdGUgX2FsbG93YWJsZVZhbHVlczogQ29udHJhY3QuUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb247XG4gIHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9wYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvKSB7XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlckluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IERhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh0aGlzLl9wYXJhbWV0ZXJJbmZvLmN1cnJlbnRWYWx1ZSwgdGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGFUeXBlLmNvbnZlcnQodGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxEYXRhVmFsdWU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG5ld1ZhbHVlLCAnbmV3VmFsdWUnKTtcblxuICAgIGxldCBjb2VyY2VkVmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZShuZXdWYWx1ZSk7XG4gICAgY29uc3QgcGFyYW1ldGVyc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzU2VydmljZS5jaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgY29lcmNlZFZhbHVlKS50aGVuKHBhcmFtZXRlckluZm8gPT4ge1xuICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJJbmZvID0gcGFyYW1ldGVySW5mbztcbiAgICB0aGlzLl9nbG9iYWxGaWVsZE5hbWUgPSBwYXJhbWV0ZXJJbmZvLmZpZWxkTmFtZTtcblxuICAgIGNvbnN0IHR5cGUgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuYWxsb3dhYmxlVmFsdWVzLmNvbnZlcnQocGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXNUeXBlKTtcbiAgICBsZXQgbGlzdFZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWluVmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWF4VmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RlcFNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGF0ZVN0ZXBQZXJpb2Q6IFBlcmlvZFR5cGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtZXRlckluZm8uYWxsb3dhYmxlVmFsdWVzIHx8IFtdO1xuICAgICAgbGlzdFZhbHVlcyA9IHZhbHVlcy5tYXAodmFsID0+IERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh2YWwsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSkge1xuICAgICAgbWluVmFsdWUgPSBwYXJhbWV0ZXJJbmZvLm1pblZhbHVlICYmIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShwYXJhbWV0ZXJJbmZvLm1pblZhbHVlLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgICAgIG1heFZhbHVlID0gcGFyYW1ldGVySW5mby5tYXhWYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5tYXhWYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBzdGVwU2l6ZSA9IHBhcmFtZXRlckluZm8uc3RlcFNpemU7XG4gICAgICBkYXRlU3RlcFBlcmlvZCA9IHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QgJiZcbiAgICAgICAgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQocGFyYW1ldGVySW5mby5kYXRlU3RlcFBlcmlvZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWxsb3dhYmxlVmFsdWVzID0ge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGFsbG93YWJsZVZhbHVlczogbGlzdFZhbHVlcyxcbiAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlOiBtYXhWYWx1ZSxcbiAgICAgIHN0ZXBTaXplOiBzdGVwU2l6ZSxcbiAgICAgIGRhdGVTdGVwUGVyaW9kOiBkYXRlU3RlcFBlcmlvZFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcblxuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL1BhcmFtZXRlckltcGwnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwpIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBDb250cmFjdC5TaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRQYXRoKCk6IFNoZWV0UGF0aCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUgfCBDb250cmFjdC5TaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0U2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmlzSGlkZGVuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvcixcbiAgICAgIGBpc0hpZGRlbiBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvcixcbiAgICAgIGBhY3RpdmUgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXg7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgYGluZGV4IG5vdCBJbXBsZW1lbnRhdGlvbkVycm9yYCk7XG4gIH1cblxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lLCAncGFyYW1ldGVyTmFtZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKHBhcmFtZXRlck5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmModGhpcy5zaGVldFBhdGgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgYXMgRW1iZWRkaW5nU2hlZXRTaXplLCBTaXplIGFzIEV4dGVuc2lvblNoZWV0U2l6ZSwgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGVldEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9zaGVldFR5cGU6IFNoZWV0VHlwZSxcbiAgICBwcml2YXRlIF9zaGVldFNpemU6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSxcbiAgICBwcml2YXRlIF9pbmRleD86IG51bWJlcixcbiAgICBwcml2YXRlIF9pc0FjdGl2ZT86IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNIaWRkZW4/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX3pvbmVJbmRleD86IG51bWJlclxuXG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBzaGVldE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlzRGFzaGJvYXJkOiB0aGlzLnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZFxuICAgICAgLy8gVE9ETyAtIFN0b3JpZXNcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IHpvbmVJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl96b25lSW5kZXg7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFNpbmdsZUV2ZW50TWFuYWdlciBpbnRlcmZhY2UgZm9yIGEgc2luZ2xlIHR5cGUgb2YgVGFibGVhdSBldmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURXZlbnRUeXBlIFRoZSBUYWJsZWF1IGV2ZW50IHR5cGUgdGhpcyBjbGFzcyBzcGVjaWFsaXplc1xuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxURXZlbnRUeXBlIGV4dGVuZHMgQ29udHJhY3QuVGFibGVhdUV2ZW50PiBpbXBsZW1lbnRzIFNpbmdsZUV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZTtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IEFycmF5PChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTtcbiAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBldmVudFR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgdGhpcy5faGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcjogKGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVmb3JlQ291bnQgPSB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5maWx0ZXIoaCA9PiBoICE9PSBoYW5kbGVyKTtcbiAgICByZXR1cm4gYmVmb3JlQ291bnQgPiB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckV2ZW50KGV2ZW50R2VuZXJhdG9yOiAoKSA9PiBURXZlbnRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBldmVudE1vZGVsID0gZXZlbnRHZW5lcmF0b3IoKTtcbiAgICAgICAgaGFuZGxlcihldmVudE1vZGVsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2luY2UgdGhpcyBoYW5kbGVyIGNvdWxkIGJlIG91dHNpZGUgb3VyIGNvbnRyb2wsIGp1c3QgY2F0Y2ggYW55dGhpbmcgaXQgdGhyb3dzIGFuZCBjb250aW51ZSBvblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge1xuXG59XG5cbiIsImltcG9ydCB7IFNlbGVjdGlvblVwZGF0ZVR5cGUsIEZpbHRlclVwZGF0ZVR5cGUsIEZpbHRlck51bGxPcHRpb24sIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRhU2NoZW1hLFxuICBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLFxuICBWaXN1YWxJZCxcbiAgV29ya3NoZWV0RGF0YVNvdXJjZUluZm9cbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHNoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw/OiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoc2hlZXRJbmZvSW1wbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBEYXNoYm9hcmRJbXBsIHtcbiAgICBpZiAodGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGw7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgYFBhcmVudERhc2hvYXJkIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXN1YWxJZCgpOiBWaXN1YWxJZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc3VhbElkO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogQXJyYXk8c3RyaW5nPiwgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSwgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBGaWx0ZXJVcGRhdGVUeXBlLCAnRmlsdGVyVXBkYXRlVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5RmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmlsdGVyT3B0aW9ucywgJ2ZpbHRlck9wdGlvbnMnKTtcblxuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSYW5nZUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhckZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PihyZXN1bHQgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGxldCBkYXRhU291cmNlczogQXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4gPSBbXTtcblxuICAgICAgLy8gRmlyc3QsIGFkZCB0aGUgcHJpbWFyeSBkYXRhc291cmNlLiAgQnkgY29udmVudGlvbiwgaXQgY29tZXMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LlxuICAgICAgbGV0IHByaW1hcnlJZDogc3RyaW5nID0gd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucHJpbWFyeURhdGFTb3VyY2U7XG4gICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXNbcHJpbWFyeUlkXSkpO1xuXG4gICAgICAvLyBUaGVuLCBsb29wIHRocm91Z2ggYW55IHNlY29uZGFyeSBkYXRhIHNvdXJjZXMgYW5kIGFkZCB0aGVtLlxuICAgICAgZm9yIChsZXQgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEZpbHRlcnNBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuU3VtbWFyeSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KGxvZ2ljYWxUYWJsZUluZm9zID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAobG9naWNhbFRhYmxlSW5mbyA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICAhIW9wdGlvbnMuaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZWxlY3Rpb25zLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxTZWxlY3Rpb25VcGRhdGVUeXBlPihzZWxlY3Rpb25VcGRhdGVUeXBlLCBTZWxlY3Rpb25VcGRhdGVUeXBlLCAnU2VsZWN0aW9uVXBkYXRlVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZWxlY3Rpb25zLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxTZWxlY3Rpb25VcGRhdGVUeXBlPihzZWxlY3Rpb25VcGRhdGVUeXBlLCBTZWxlY3Rpb25VcGRhdGVUeXBlLCAnU2VsZWN0aW9uVXBkYXRlVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlJZEFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNvdXJjZUluZm86IERhdGFTb3VyY2VJbmZvKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZUltcGwgPSBuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZUluZm8pO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBsb2dpY2FsIHRhYmxlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgTG9naWNhbFRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuTG9naWNhbFRhYmxlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ2ljYWxUYWJsZTogTG9naWNhbFRhYmxlSW5mbykgeyB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmNhcHRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEZpbHRlclR5cGUsIEZpbHRlckRvbWFpblR5cGUsIFBlcmlvZFR5cGUsIERhdGVSYW5nZVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuXG5leHBvcnQgY2xhc3MgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmllbGROYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9maWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHByb3RlY3RlZCBfZmllbGRJZDogc3RyaW5nKSB7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJUeXBlKCk6IEZpbHRlclR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4pIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4Y2x1ZGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0V4Y2x1ZGVNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGlmICghZG9tYWluVHlwZSkge1xuICAgICAgZG9tYWluVHlwZSA9IEZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQ7XG4gICAgfVxuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJEb21haW5UeXBlPihkb21haW5UeXBlLCBGaWx0ZXJEb21haW5UeXBlLCAnRmlsdGVyRG9tYWluVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhbmdlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2luY2x1ZGVOdWxsVmFsdWVzOiBib29sZWFuKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluVmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXhWYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluY2x1ZGVOdWxsVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlTnVsbFZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXREb21haW5Bc3luYyhkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuUmFuZ2VEb21haW4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRSYW5nZURvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHByaXZhdGUgX2FuY2hvckRhdGU6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9wZXJpb2RUeXBlOiBQZXJpb2RUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlVHlwZTogRGF0ZVJhbmdlVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZU46IG51bWJlcikge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuY2hvckRhdGUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVyaW9kVHlwZSgpOiBQZXJpb2RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyaW9kVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VUeXBlKCk6IERhdGVSYW5nZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZU47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhbmdlRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSkge1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW4oKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXgoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG59XG4iLCJpbXBvcnQgeyBNYXJrVHlwZSwgRGF0YVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFUYWJsZSB7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4sXG4gICAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBwcml2YXRlIF90b3RhbFJvd0NvdW50OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNUb3RhbFJvd0NvdW50TGltaXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1N1bW1hcnlEYXRhOiBib29sZWFuLFxuICAgIHByaXZhdGUgX21hcmtzSW5mbz86IEFycmF5PE1hcmtJbmZvPikge1xuICAgIHRoaXMuX25hbWUgPSBfaXNTdW1tYXJ5RGF0YSA/ICdTdW1tYXJ5IERhdGEgVGFibGUnIDogJ1VuZGVybHlpbmcgRGF0YSBUYWJsZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8Q29udHJhY3QuQ29sdW1uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hcmtzSW5mbygpOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYXJrc0luZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNUb3RhbFJvd0NvdW50TGltaXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNUb3RhbFJvd0NvdW50TGltaXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTdW1tYXJ5RGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdW1tYXJ5RGF0YTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFya0luZm8gaW1wbGVtZW50cyBDb250cmFjdC5NYXJrSW5mbyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90eXBlOiBNYXJrVHlwZSxcbiAgICBwcml2YXRlIF9jb2xvcjogc3RyaW5nLFxuICAgIHByaXZhdGUgX3R1cGxlSWQ/OiBOdW1iZXJcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogTWFya1R5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHVwbGVJZCgpOiBOdW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90dXBsZUlkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW4gaW1wbGVtZW50cyBDb250cmFjdC5Db2x1bW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgX2RhdGFUeXBlOiBEYXRhVHlwZSxcbiAgICBwcml2YXRlIF9pc1JlZmVyZW5jZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcikgeyB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUmVmZXJlbmNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWZlcmVuY2VkO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZTogYW55LFxuICAgIHByaXZhdGUgX25hdGl2ZVZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcpIHsgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hdGl2ZVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdGl2ZVZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0ZWRWYWx1ZTtcbiAgfVxuICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWFueSAqL1xufVxuIiwiLyoqXG4gKiBTZWxlY3Rpb24gTW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBxdWFsaWZpZWRGaWVsZENhcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBWYWx1ZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWwuIE1lYW50IGZvciBoaWVyYXJjaGljYWwsIHJhbmdlIGFuZCBjYXRlZ29yaWNhbCBzZWxlY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdFZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7XG59XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7XG59XG4vKipcbiAqIFR1cGxlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVHVwbGVTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBzZWxlY3Rpb25UeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBvYmplY3RJZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuLyoqXG4gKiBDb250YWluZXIgY2xhc3MgdG8gcG9wdWxhdGUgYWxsIHRoZSBzZWxlY3Rpb24gbW9kZWxzIHdoZW4gcGFyc2luZyBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgcHVibGljIGhpZXJNb2RlbEFycjogQXJyYXk8SGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBkaW1Nb2RlbEFycjogQXJyYXk8RGltZW5zaW9uU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBxdWFudE1vZGVsQXJyOiBBcnJheTxSYW5nZVNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgc2VsZWN0aW9uOiBUdXBsZVNlbGVjdGlvbk1vZGVsO1xufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFBvaW50IGltcGxlbWVudHMgQ29udHJhY3QuUG9pbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfeDogbnVtYmVyLCBwcml2YXRlIF95OiBudW1iZXIpIHsgfVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGljaCB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlLlxuICovXG5leHBvcnQgZW51bSBHZXREYXRhVHlwZSB7XG4gIFN1bW1hcnkgPSAnc3VtbWFyeScsXG4gIFVuZGVybHlpbmcgPSAndW5kZXJseWluZydcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGxvZ2ljIGZvciB2YXJpb3VzIGdldERhdGEgY2FsbHNcbiAqXG4gKiBAaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlXG4gKiBAZXh0ZW5kcyB7QXBpU2VydmljZX1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXREYXRhU2VydmljZSBleHRlbmRzIEFwaVNlcnZpY2Uge1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAqL1xuICBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAqL1xuICBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAqL1xuICBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+O1xufVxuIiwiaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0RhdGFTb3VyY2VTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEludGVybmFsQXBpRGlzcGF0Y2hlciwgVmVyc2lvbk51bWJlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvUGFyYW1ldGVyc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFZpelNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1ZpelNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9ab25lU2VydmljZUltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlclNlcnZpY2UobmV3IEdldERhdGFTZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlclNlcnZpY2UobmV3IEZpbHRlclNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyU2VydmljZShuZXcgTm90aWZpY2F0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBQYXJhbWV0ZXJzU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZWxlY3Rpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlclNlcnZpY2UobmV3IFpvbmVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlclNlcnZpY2UobmV3IFZpelNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYW4gYXBpIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgZm9yIHRoaXMgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBzZXJ2aWNlIG5hbWUgd2hpY2ggd2lsbCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcGktc2hhcmVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VydmljZU5hbWVzIHtcbiAgRGF0YVNvdXJjZVNlcnZpY2UgPSAnZGF0YS1zb3VyY2Utc2VydmljZScsXG4gIEdldERhdGEgPSAnZ2V0LWRhdGEtc2VydmljZScsXG4gIEZpbHRlciA9ICdmaWx0ZXItc2VydmljZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24tc2VydmljZScsXG4gIFBhcmFtZXRlcnMgPSAncGFyYW1ldGVycy1zZXJ2aWNlJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbi1zZXJ2aWNlJyxcbiAgWm9uZSA9ICd6b25lLXNlcnZpY2UnLFxuICBFbWJlZGRpbmcgPSAnZW1iZWRkaW5nLXNlcnZpY2UnLFxuICBWaXogPSAndml6LXNlcnZpY2UnLFxufVxuXG4vKipcbiAqIERvIHNvbWUgZ2xvYmFibCBkZWNsYXJhdGlvbnMgc28gd2UgY2FuIGNyZWF0ZSBhIHNpbmdsZXRvbiBvbiB0aGUgd2luZG93IG9iamVjdFxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cgeyBfX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSB8IHVuZGVmaW5lZDsgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgc2VydmljZSBpbnRvIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LiBBbnkgZXhpc3Rpbmcgb25lIHdpbGxcbiAgICogYmUgb3ZlcndyaXR0ZW4uIHRoZSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgc2VydmljZS5zZXJ2aWNlTmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0FwaVNlcnZpY2V9IHNlcnZpY2UgVGhlIHNlcnZpdmUgdG8gcmVnaXN0ZXJcbiAgICovXG4gIHJlZ2lzdGVyU2VydmljZShzZXJ2aWNlOiBBcGlTZXJ2aWNlKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGVyZSBpcyBub3QgYVxuICAgKiBzZXJ2aWNlIHJlZ2lzdGVyZWQgdW5kZXIgdGhhdCBuYW1lLCB0aHJvd3MgYW5kIGVycm9yXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogQHJldHVybnMge1R9IFRoZSByZXF1ZXN0ZWQgc2VydmljZVxuICAgKi9cbiAgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQ7XG59XG5cbmNsYXNzIFNlcnZpY2VSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVnaXN0cnkge1xuICBwcml2YXRlIF9zZXJ2aWNlczogeyBbc2VydmljZU5hbWU6IHN0cmluZ106IEFwaVNlcnZpY2U7IH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogc3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgaW5zdGFuY2UoKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkpIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIG92ZXJyaWRlIHRoZSByZWdpc3RyeSBpbnN0YW5jZS4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2Uoc2VydmljZVJlZ2lzdHJ5PzogU2VydmljZVJlZ2lzdHJ5KTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHNlcnZpY2VSZWdpc3RyeTtcbiAgfVxuXG4gIC8vIFByaXZhdGUgdG8gYXZvaWQgYW55b25lIGNvbnN0cnVjdGluZyB0aGlzXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7IH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcblxuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcblxuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0ZpZWxkSW1wbCc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9EYXRhU291cmNlJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjb25zdCBTRU5USU5FTF9MT0dJQ0FMX1RBQkxFX0lORk86IExvZ2ljYWxUYWJsZUluZm8gPSB7XG4gIGlkOiBJbnRlcm5hbENvbnRyYWN0LkFwaVNob3dEYXRhVGFibGVTZW50aW5lbC5TaW5nbGVUYWJsZUlkLFxuICBjYXB0aW9uOiBJbnRlcm5hbENvbnRyYWN0LkFwaVNob3dEYXRhVGFibGVTZW50aW5lbC5TaW5nbGVUYWJsZUNhcHRpb25cbn07XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBEYXRhU291cmNlU2VydmljZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHByaXZhdGUgX3BsYXRmb3JtVmVyc2lvbjogSW50ZXJuYWxDb250cmFjdC5WZXJzaW9uTnVtYmVyKSB7XG4gICAgc3VwZXIoZGlzcGF0Y2hlcik7XG4gIH1cbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlZnJlc2hBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkRlbHRhVGltZU1zXTogMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG91bGRSZWZyZXNoRFNdOiB0cnVlXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlZnJlc2hEYXRhU291cmNlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRBY3RpdmVUYWJsZXMsIGpvaW5QYXJhbWV0ZXJzKS50aGVuPEFycmF5PFRhYmxlSW5mbz4+KGpvaW5SZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSxcbiAgICAgICAgICBgZ2V0QWN0aXZlVGFibGVzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MudGFibGVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhdGFTb3VyY2VzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVNjaGVtYTtcbiAgICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFsbERhdGFTb3VyY2VzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWxsRGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMsIHBhcmFtcykudGhlbjxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5GaWVsZD4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBEYXRhU291cmNlO1xuICAgICAgY29uc3QgZmllbGQgPSByZXNwb25zZS5yZXN1bHRbUGFyYW1ldGVySWQuRmllbGRdIGFzIEZpZWxkO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZpZWxkKGZpZWxkLCB0aGlzLmNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgaWYgKCF0aGlzLmlzT2JqZWN0TW9kZWxTdXBwb3J0ZWRCeVBsYXRmb3JtKCkpIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBzZW50aW5lbCBJRCBjYW4gYmUgcGFzc2VkIHRvIGRhdGFzb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YS5cbiAgICAgICAqIE9uY2UgdGhlIGRlc2t0b3AgaXMgdXBncmFkZWQgdG8gYSB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgb2JqZWN0IG1vZGVsLFxuICAgICAgICogdGhlIHNlbnRpbmVsIElEIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgdXBncmFkZWQgdGFibGUuXG4gICAgICAgKiAqL1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzb2x2ZSkgPT5cbiAgICAgICAgcmVzb2x2ZShbU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPXSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGlmICghdGhpcy5pc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgc2VudGluZWwgSUQgY2FuIGJlIHBhc3NlZCB0byB3b3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YS5cbiAgICAgICAqIE9uY2UgdGhlIGRlc2t0b3AgaXMgdXBncmFkZWQgdG8gYSB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgb2JqZWN0IG1vZGVsLFxuICAgICAgICogdGhlIHNlbnRpbmVsIElEIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgdXBncmFkZWQgdGFibGUuXG4gICAgICAgKiAqL1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzb2x2ZSkgPT5cbiAgICAgICAgcmVzb2x2ZShbU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPXSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWVsZChmaWVsZDogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkZpZWxkIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkKG5ldyBGaWVsZEltcGwoZmllbGQsIGRhdGFTb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZTogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGlzT2JqZWN0TW9kZWxTdXBwb3J0ZWRCeVBsYXRmb3JtKCk6IGJvb2xlYW4ge1xuICAgIGxldCBwbGF0Zm9ybVZlcnNpb25Ob09iamVjdE1vZGVsU3VwcG9ydCA9IHsgbWFqb3I6IDEsIG1pbm9yOiAxMywgZml4OiAwIH07XG4gICAgcmV0dXJuIEludGVybmFsQ29udHJhY3QuVmVyc2lvbkxlc3NUaGFuKHBsYXRmb3JtVmVyc2lvbk5vT2JqZWN0TW9kZWxTdXBwb3J0LCB0aGlzLl9wbGF0Zm9ybVZlcnNpb24pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEV4dGVybmFsRmlsdGVyVHlwZSxcbiAgRXJyb3JDb2Rlc1xufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5cbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBGaWx0ZXJUeXBlLFxuICBQYXJhbWV0ZXJJZCxcbiAgVmVyYklkLFxuICBWaXN1YWxJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgSW50ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5cbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsRG9tYWluLFxuICBDYXRlZ29yaWNhbEZpbHRlcixcbiAgUmFuZ2VEb21haW4sXG4gIFJhbmdlRmlsdGVyLFxuICBSZWxhdGl2ZURhdGVGaWx0ZXJcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL0ZpbHRlck1vZGVscyc7XG5cbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcblxuaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEZpbHRlclNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5GaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseUNhdGVnb3JpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseUZpbHRlckFzeW5jJ1xuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID1cbiAgICAgIChmaWx0ZXJPcHRpb25zID09PSB1bmRlZmluZWQgfHwgZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSYW5nZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSYW5nZUZpbHRlckFzeW5jJ1xuICAgIH07XG5cblxuICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiAhPT0gdW5kZWZpbmVkICYmIGZpbHRlck9wdGlvbnMubWluICE9PSBudWxsKSB7XG4gICAgICBsZXQgbWluOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBpZiAoZmlsdGVyT3B0aW9ucy5taW4gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG1pbiA9IFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybShmaWx0ZXJPcHRpb25zLm1pbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW4gPSBmaWx0ZXJPcHRpb25zLm1pbjtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VNaW5dID0gbWluO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlck9wdGlvbnMubWF4ICE9PSBudWxsKSB7XG4gICAgICBsZXQgbWF4OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBpZiAoZmlsdGVyT3B0aW9ucy5tYXggaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG1heCA9IFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybShmaWx0ZXJPcHRpb25zLm1heCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXggPSBmaWx0ZXJPcHRpb25zLm1heDtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VNYXhdID0gbWF4O1xuICAgIH1cblxuICAgIC8vIFRoZSBudWxsIG9wdGlvbiBpcyB1c2VkIHdpdGggbWluK21heCBmb3IgJ2luY2x1ZGUtcmFuZ2UnIG9yICdpbmNsdWRlLXJhbmdlLW9yLW51bGwnXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbikge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU51bGxPcHRpb25dID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLm51bGxPcHRpb25zLmNvbnZlcnQoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNsZWFyRmlsdGVyO1xuICAgIGxldCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJGaWx0ZXJBc3luYydcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KHJlc3Bvc25lID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmlsdGVycztcbiAgICBsZXQgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEZpbHRlcnNBc3luYydcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KHJlc3BvbnNlID0+IHtcbiAgICAgIGxldCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhdGVnb3JpY2FsRG9tYWluQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgbGV0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jJ1xuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWVcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPihyZXNwb25zZSA9PiB7XG4gICAgICBsZXQgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5nZURvbWFpbkFzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0UmFuZ2VEb21haW47XG4gICAgbGV0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRSYW5nZURvbWFpbkFzeW5jJ1xuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWVcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPihyZXNwb25zZSA9PiB7XG4gICAgICBsZXQgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW47XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSYW5nZURvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcbiAgcHJpdmF0ZSBjb252ZXJ0RG9tYWluRmlsdGVycyhkb21haW5GaWx0ZXJzOiBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj4pOiBBcnJheTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICBsZXQgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaChkb21haW5GaWx0ZXIgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQ2F0ZWdvcmljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgbGV0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSYW5nZUZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFJhbmdlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGU6IHtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGxldCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoZHYgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkdik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IENhdGVnb3JpY2FsRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNFeGNsdWRlLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyKTogQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICAgIGxldCBtaW5WYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5taW4pO1xuICAgIGxldCBtYXhWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLlJhbmdlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgbGV0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICBhbmNob3JEYXRlVmFsdWUsXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChkb21haW5GaWx0ZXIucGVyaW9kVHlwZSksXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KGRvbWFpbkZpbHRlci5yYW5nZVR5cGUpLFxuICAgICAgZG9tYWluRmlsdGVyLnJhbmdlTlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihcbiAgICBkb21haW46IEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4sXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBsZXQgdmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+ID0gZG9tYWluLnZhbHVlcy5tYXAoKGRvbWFpbkR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkR2KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IENhdGVnb3JpY2FsRG9tYWluKHZhbHVlcywgZG9tYWluVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSYW5nZURvbWFpbihkb21haW46IEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW4sIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gICAgbGV0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGxldCBtYXg6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRG9tYWluKFxuICAgICAgbWluLFxuICAgICAgbWF4LFxuICAgICAgZG9tYWluVHlwZVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRhVGFibGUgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEhpZ2hsaWdodGVkTWFya3NUYWJsZSxcbiAgUGFyYW1ldGVySWQsXG4gIFNlbGVjdGVkTWFya3NUYWJsZSxcbiAgVW5kZXJseWluZ0RhdGFUYWJsZSxcbiAgVmVyYklkLFxuICBWaXN1YWxJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmltcG9ydCB7IENvbHVtbiwgRGF0YVRhYmxlLCBNYXJrSW5mbyB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5cbmV4cG9ydCBjbGFzcyBHZXREYXRhU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBHZXREYXRhU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkdldERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwcml2YXRlIGdldExpbWl0ZWRNYXhSb3dzKHJlcXVlc3RlZFJvd3M6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgcm93Q291bnRMaW1pdCA9IHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDE7XG4gICAgcmV0dXJuIChyZXF1ZXN0ZWRSb3dzID4gMCAmJiByZXF1ZXN0ZWRSb3dzIDwgcm93Q291bnRMaW1pdCkgPyByZXF1ZXN0ZWRSb3dzIDogcm93Q291bnRMaW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICAvLyBDcmVhdGUgYWxsIG9mIG91ciBwYXJhbWV0ZXJzXG4gICAgY29uc3Qgc3VtbWFyeURhdGEgPSBnZXRUeXBlID09PSBHZXREYXRhVHlwZS5TdW1tYXJ5O1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHN1bW1hcnlEYXRhID8gJ2dldFN1bW1hcnlEYXRhQXN5bmMnIDogJ2dldFVuZGVybHlpbmdEYXRhQXN5bmMnO1xuICAgIGNvbnN0IHZlcmIgPSBzdW1tYXJ5RGF0YSA/IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGEgOiBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG4gICAgY29uc3QgcmVxdWVzdE1heFJvd3MgPSB2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGEgPyB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MpIDogbWF4Um93cztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiBmdW5jdGlvbk5hbWVcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIHJlc3BvbnNlRGF0YS5pc1N1bW1hcnkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhIGFzIERhdGFUYWJsZUludGVybmFsQ29udHJhY3Q7XG4gICAgICBjb25zdCBjb2x1bW5zID0gZGF0YVRhYmxlLmhlYWRlcnMubWFwKGggPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbixcbiAgICAgICAgaC5maWVsZE5hbWUsXG4gICAgICAgIGguZGF0YVR5cGUsXG4gICAgICAgIGguaXNSZWZlcmVuY2VkLFxuICAgICAgICBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRTZWxlY3RlZE1hcmtzLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCh0YWJsZSA9PiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUodGFibGUsIHRydWUpKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRIaWdobGlnaHRlZE1hcmtzLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCh0YWJsZSA9PiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUodGFibGUsIHRydWUpKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RGF0YVNvdXJjZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVdOiBjb2x1bW5zVG9JbmNsdWRlLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFzb3VyY2VJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbilcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAvLyBjb2x1bW5zIG11c3QgYmUgYSB2YWxpZCBhcnJheVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb2x1bW5zKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdjb2x1bW5zVG9JbmNsdWRlIGFuZCBjb2x1bW5zVG9JbmNsdWRlQnlJZCBtdXN0IGJlIHZhbGlkIGFycmF5cycpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZHVwbGljYXRlcyBmcm9tIHRoZSBpbnB1dCBhcnJheVxuICAgIGNvbnN0IGNvbHVtbnNBc1NldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KGNvbHVtbnMpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGNvbHVtbnNBc1NldCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGE6IERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsIGlzU3VtbWFyeTogYm9vbGVhbik6IERhdGFUYWJsZSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlRGF0YS5oZWFkZXJzLm1hcChoID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sXG4gICAgICBoLmZpZWxkTmFtZSxcbiAgICAgIGguZGF0YVR5cGUsXG4gICAgICBoLmlzUmVmZXJlbmNlZCxcbiAgICAgIGguaW5kZXgpKTtcblxuICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYXBpIHdpbGwgcmVzcG9uZCBtYXJrcyBpbmZvIG9yIG5vdFxuICAgIGxldCBtYXJrcztcbiAgICBpZiAocmVzcG9uc2VEYXRhLm1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHJlc3BvbnNlRGF0YS5tYXJrcy5tYXAoaCA9PiBuZXcgTWFya0luZm8oaC50eXBlLFxuICAgICAgICBoLmNvbG9yLFxuICAgICAgICBoLnR1cGxlSWQpKTtcbiAgICB9XG5cbiAgICAvLyBMaW1pdCsxIGlzIG91ciBzZW50aW5hbCB0aGF0IHVuZGVybHlpbmcgZGF0YSBjb250YWlucyBtb3JlIHJvd3MgdGhhbiB1c2VyIGlzIGFsbG93ZWQgdG8gZmV0Y2guXG4gICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgc28gd2UgYWx3YXlzIHJldHVybiBNYXhSb3dMaW1pdFxuICAgIGNvbnN0IGlzVG90YWxSb3dDb3VudExpbWl0ZWQgPSBpc1N1bW1hcnkgPT09IGZhbHNlICYmIHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubGVuZ3RoID09PSB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxO1xuICAgIGlmIChpc1RvdGFsUm93Q291bnRMaW1pdGVkKSB7XG4gICAgICByZXNwb25zZURhdGEuZGF0YVRhYmxlLmxlbmd0aCAtPSAxO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlID0gcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5tYXAocm93ID0+IHtcbiAgICAgIHJldHVybiByb3cubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlVGFibGVEYXRhVmFsdWUoY2VsbCwgaGVhZGVyc1tpbmRleF0uZGF0YVR5cGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAobWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGlzVG90YWxSb3dDb3VudExpbWl0ZWQsIGlzU3VtbWFyeSwgbWFya3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIE1vZGVsLCBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSwgVW5yZWdpc3RlckZuIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG5jbGFzcyBSZWdpc3RyYXRpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZmlsdGVyRm46IChub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpID0+IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfY2FsbGJhY2tGbjogKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCkgPT4gdm9pZCkge1xuICAgIC8vIE5vdGhpbmcgSGVyZVxuICB9XG5cbiAgcHVibGljIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9maWx0ZXJGbihub3RpZmljYXRpb25Nb2RlbCkpIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrRm4obm90aWZpY2F0aW9uTW9kZWwpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZUltcGwgaW1wbGVtZW50cyBOb3RpZmljYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IHsgW25vdGlmaWNhdGlvbklkOiBzdHJpbmddOiBBcnJheTxSZWdpc3RyYXRpb24+IH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKSB7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB7fTtcbiAgICB0aGlzLmRpc3BhdGNoZXIucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKHRoaXMub25Ob3RpZmljYXRpb24uYmluZCh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb247XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJIYW5kbGVyKGlkOiBOb3RpZmljYXRpb25JZCwgZmlsdGVyRm46IChtb2RlbDogTW9kZWwpID0+IGJvb2xlYW4sIGhhbmRsZXI6IChtb2RlbDogTW9kZWwpID0+IHZvaWQpOiBVbnJlZ2lzdGVyRm4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5faGFuZGxlcnNbaWRdIHx8IG5ldyBBcnJheTxSZWdpc3RyYXRpb24+KCk7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gbmV3IFJlZ2lzdHJhdGlvbihmaWx0ZXJGbiwgaGFuZGxlcik7XG4gICAgaGFuZGxlcnMucHVzaChyZWdpc3RyYXRpb24pO1xuICAgIHRoaXMuX2hhbmRsZXJzW2lkXSA9IGhhbmRsZXJzO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZVJlZ2lzdHJhdGlvbihpZCwgcmVnaXN0cmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKGlkOiBOb3RpZmljYXRpb25JZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYW5kbGVycy5oYXNPd25Qcm9wZXJ0eShpZCk7XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR28gdGhyb3VnaCBhbmQgY2hlY2sgZm9yIGFsbCB0aGUgaGFuZGxlcnMgb2YgdGhpcyBwYXJ0aWN1bGFyIG5vdGlmaWNhdGlvblxuICAgIHRoaXMuX2hhbmRsZXJzW25vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZF0uZm9yRWFjaChoID0+IGgub25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uLmRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVnaXN0cmF0aW9uKGlkOiBOb3RpZmljYXRpb25JZCwgcmVnaXN0cmF0aW9uOiBSZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKGlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZXJzW2lkXSA9IHRoaXMuX2hhbmRsZXJzW2lkXS5maWx0ZXIocmVnID0+IHJlZyAhPT0gcmVnaXN0cmF0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBNb2RlbCxcbiAgUGFyYW1ldGVySWQsXG4gIFBhcmFtZXRlckluZm8sXG4gIFNoZWV0UGF0aCxcbiAgVmVyYklkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuLi8uLi9JbXBsL1BhcmFtZXRlckltcGwnO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgUGFyYW1ldGVyc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHNoZWV0UGF0aDogU2hlZXRQYXRoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldFBhdGhdOiBzaGVldFBhdGhcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0UGFyYW1ldGVyc0ZvclNoZWV0LCBwYXJhbWV0ZXJzKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIC8vIFRPRE8gLSBDaGVjayBmb3IgZXJyb3JcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PFBhcmFtZXRlckluZm8+O1xuICAgICAgcmV0dXJuIHJlc3VsdC5tYXAocGFyYW1ldGVySW5mbyA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChwYXJhbWV0ZXJJbmZvKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckluZm8+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdOiBmaWVsZE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyVmFsdWVdOiBuZXdWYWx1ZVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DaGFuZ2VQYXJhbWV0ZXJWYWx1ZSwgcGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKHVuZGVmaW5lZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmFtZXRlckFzeW5jKFxuICAgIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdmaW5kUGFyYW1ldGVyQXN5bmMnXG4gICAgfTtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckNhcHRpb25dID0gbmFtZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnbmFtZSBvciBmaWVsZE5hbWUgbXVzdCBiZSBwcm92aWRlZCB0byBmaW5kIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkZpbmRQYXJhbWV0ZXIsIHBhcmFtZXRlcnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2VPZlBhcmFtZXRlckluZm8gPSAob2JqZWN0OiBNb2RlbCk6IG9iamVjdCBpcyBQYXJhbWV0ZXJJbmZvID0+IHtcbiAgICAgICAgcmV0dXJuICdmaWVsZE5hbWUnIGluIG9iamVjdDtcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHdlIGdvdCBhIHZhbGlkIHJlc3BvbnNlIGJhY2sgYWdhaW5cbiAgICAgIGlmIChpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyhyZXNwb25zZS5yZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBQYXJhbWV0ZXJJbmZvO1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckltcGwocmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCxcbiAgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwsXG4gIFJhbmdlU2VsZWN0aW9uTW9kZWwsXG4gIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcixcbiAgVHVwbGVTZWxlY3Rpb25Nb2RlbCxcbiAgVmFsdWVTZWxlY3Rpb25Nb2RlbFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIEZpbHRlck51bGxPcHRpb24sIFNlbGVjdGlvblVwZGF0ZVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIFBhcmFtZXRlcklkLFxuICBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSBhcyBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNlbGVjdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TZWxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNsZWFyIGFsbCB0aGUgc2VsZWN0ZWQgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbGVhclNlbGVjdGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ2xlYXJTZWxlY3RlZE1hcmtzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybjsgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGlvbkNyaXRlcmlhXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2VsZWN0aW9uQ3JpdGVyaWFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTZWxlY3Rpb24gY3JpdGVyaWEgbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IHZhbHVlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgbGV0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlU2VsZWN0aW9uTWFya3Moc2VsZWN0aW9uQ3JpdGVyaWFzKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZWxlY3RNYXJrc0J5VmFsdWVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25VcGRhdGVUeXBlXTogc2VsZWN0aW9uVHlwZVxuICAgIH07XG5cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSGllclZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnI7XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlF1YW50UmFuZ2VTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EaW1WYWxTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB0aGUgZXJyb3IgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBvdXRwdXQgcGFyYW1zIGFuZCB0aHJvdyBlcnJvciBhY2NvcmRpbmdseS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAqXG4gKiBAcGFyYW0gdmlzdWFsSWRcbiAqIEBwYXJhbSBNYXJrSW5mb1xuICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sXG4gICAgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnTWFya3MgaW5mbyBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgSWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBsZXQgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25JZHMobWFya3MpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlJZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbl06IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvblxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB0aGUgZXJyb3IgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBvdXRwdXQgcGFyYW1zIGFuZCB0aHJvdyBlcnJvciBhY2NvcmRpbmdseS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGxldCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBsZXQgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdHVwbGVJZDogTnVtYmVyIHwgdW5kZWZpbmVkID0gbWFya3NbaV0udHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCkgeyAvLyBJZiB0dXBsZSBpZCBpcyBwcm92aWRlZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHBhaXJcbiAgICAgICAgaWRzLnB1c2godHVwbGVJZC50b1N0cmluZygpKTsgLy8gY29sbGVjdCB0aGUgdHVwbGUgaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3R1cGxlSWQgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkgeyAvLyB0dXBsZSBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBsZXQgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IHZhbHVlcy5cbiAgICpcbiAgICogU3VwcG9ydHMgMyB0eXBlcyBmb3Igc2VsZWN0aW9uOlxuICAgKiAxKSBIaWVyYXJjaGljYWwgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDIpIFJhbmdlIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKiAzKSBEaW1lbnNpb24gdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBsZXQgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uQ3JpdGVyaWFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdCA9IHNlbGVjdGlvbkNyaXRlcmlhc1tpXTtcbiAgICAgIGlmICghKHN0LmZpZWxkTmFtZSAmJiAoc3QudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBzdC52YWx1ZSAhPT0gbnVsbCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VsZWN0aW9uIENyaXRlcmlhIHBhcnNpbmcgZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNhdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFxcW1tBLVphLXowLTldK10pLionLCAnZycpO1xuICAgICAgbGV0IHJhbmdlT3B0aW9uOiBDb250cmFjdC5SYW5nZVZhbHVlID0gc3QudmFsdWUgYXMgQ29udHJhY3QuUmFuZ2VWYWx1ZTtcbiAgICAgIGlmIChjYXRSZWdleC50ZXN0KHN0LmZpZWxkTmFtZSkpIHsgLy8gSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBsZXQgaGllck1vZGVsOiBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCA9XG4gICAgICAgICAgdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSBhcyBDb250cmFjdC5DYXRlZ29yaWNhbFZhbHVlKSBhcyBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbDtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLnB1c2goaGllck1vZGVsKTtcbiAgICAgIH0gZWxzZSBpZiAoKHJhbmdlT3B0aW9uIGFzIENvbnRyYWN0LlJhbmdlVmFsdWUpLm1pbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIChyYW5nZU9wdGlvbiBhcyBDb250cmFjdC5SYW5nZVZhbHVlKS5tYXggIT09IHVuZGVmaW5lZCkgeyAvLyBSYW5nZSB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgbGV0IHF1YW50TW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUmFuZ2VQYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgcmFuZ2VPcHRpb24pO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyLnB1c2gocXVhbnRNb2RlbCk7XG4gICAgICB9IGVsc2UgeyAvLyBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGxldCBkaW1Nb2RlbDogRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwgPVxuICAgICAgICAgIHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUgYXMgQ29udHJhY3QuQ2F0ZWdvcmljYWxWYWx1ZSkgYXMgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLnB1c2goZGltTW9kZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHZhbHVlIGJhc2VkIHByZXMgbW9kZWwgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1BhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5DYXRlZ29yaWNhbFZhbHVlKTogVmFsdWVTZWxlY3Rpb25Nb2RlbCB7XG4gICAgbGV0IHZhbHVlU2VsZWN0aW9uTW9kZWw6IFZhbHVlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVmFsdWVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIGxldCBtYXJrVmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgbGV0IHZhbHVlQXJyOiBBcnJheTxzdHJpbmc+ID0gdmFsdWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcmtWYWx1ZXMucHVzaChQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZUFycltpXSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUpKTtcbiAgICB9XG5cbiAgICB2YWx1ZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICB2YWx1ZVNlbGVjdGlvbk1vZGVsLnNlbGVjdFZhbHVlcyA9IG1hcmtWYWx1ZXM7XG4gICAgcmV0dXJuIHZhbHVlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUga2V5IHZhbHVlIHBhaXIgaW50byByYW5nZSBiYXNlZCBzZWxlY3Rpb24gcHJlcyBtb2RlbC5cbiAgICpcbiAgICogVE9ETzogTmVlZCB0byBoYW5kbGUgdGhlIHBhcnNpbmcgb2YgZGF0ZSB0eXBlIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlU2VsZWN0aW9uTW9kZWxcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYWRkVG9SYW5nZVBhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5SYW5nZVZhbHVlKTogUmFuZ2VTZWxlY3Rpb25Nb2RlbCB7XG4gICAgbGV0IHJhbmdlU2VsZWN0aW9uTW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSBuZXcgUmFuZ2VTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZS5tYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5tYXggIT09IG51bGwpIHtcbiAgICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwubWF4VmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZS5tYXgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUubWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWluICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1pblZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWluKTtcbiAgICB9XG4gICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5pbmNsdWRlZCA9IHRoaXMudmFsaWRhdGVOdWxsT3B0aW9uVHlwZSh2YWx1ZS5udWxsT3B0aW9uKTtcbiAgICByZXR1cm4gcmFuZ2VTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbiB1cGRhdGUgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBzdHJpbmcge1xuICAgIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBTZWxlY3Rpb25VcGRhdGVUeXBlLlJlcGxhY2UpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IFNlbGVjdGlvblVwZGF0ZVR5cGUuQWRkKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLkFkZDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IFNlbGVjdGlvblVwZGF0ZVR5cGUuUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlbW92ZTtcbiAgICB9XG4gICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZXBsYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5jbHVkZSB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBudWxsT3B0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTnVsbE9wdGlvblR5cGUobnVsbE9wdGlvbjogRmlsdGVyTnVsbE9wdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG51bGxPcHRpb24pIHtcbiAgICAgIGlmIChudWxsT3B0aW9uID09PSBGaWx0ZXJOdWxsT3B0aW9uLk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBGaWx0ZXJOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOb25OdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBGaWx0ZXJOdWxsT3B0aW9uLkFsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgSW50ZXJuYWxUYWJsZWF1RXJyb3IsXG4gIFZlcmJJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaG91bGRUaHJvdyB9IGZyb20gJy4uLy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKipcbiAqIEVhY2ggU2VydmNlSW1wbCBzaG91bGQgZXh0ZW5kIHRoaXMgYmFzZSBjbGFzcyBmb3IgdGhlIHNha2Ugb2ZcbiAqIHByb3BlciBlcnJvciBoYW5kbGluZy4gIFRoaXMgYmFzZSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uXG4gKiBmcm9tIGludGVybmFsIGVycm9ycyB0byBleHRlcm5hbCBlcnJvcnMgdGhhdCB3ZSB0aHJvdyB0byBkZXZlbG9wZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSW1wbEJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKSB7IH1cblxuICBwcm90ZWN0ZWQgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaGVyLmV4ZWN1dGUodmVyYiwgcGFyYW1zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIC8vIEFueSBpbnRlcm5hbCBlcnJvciB0aGF0IGNvbWVzIGZyb20gdGhlIGRpc3BhdGNoZXIgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgZXJyb3IgdXNpbmcgdGhlIGVudW0gbWFwcGVyIGZvciBlcnJvciBjb2Rlcy5cbiAgICAgIGNvbnN0IGludGVybmFsRXJyb3IgPSBlcnJvciBhcyBJbnRlcm5hbFRhYmxlYXVFcnJvcjtcbiAgICAgIGNvbnN0IGV4dGVybmFsRXJyb3JDb2RlOiBFcnJvckNvZGVzID0gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmVycm9yQ29kZS5jb252ZXJ0KGludGVybmFsRXJyb3IuZXJyb3JDb2RlLCBTaG91bGRUaHJvdy5Obyk7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKGV4dGVybmFsRXJyb3JDb2RlLCBpbnRlcm5hbEVycm9yLm1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVml6U2VydmljZSB9IGZyb20gJy4uL1ZpelNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFZpelNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVml6U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlZpejtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYzogb2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYylcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVml6QVBJLCBwYXJhbWV0ZXJzKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBab25lVmlzaWJpbGl0eVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogU3RyaW5nLFxuICAgIGRhc2hib2FyZE9iamVjdHNJbXBsOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICB6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldFZpc2liaWxpdHlBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLlpvbmVJZHNWaXNpYmlsaXR5TWFwXToge31cbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZE9iamVjdHNJbXBsLCBOdW1iZXIucGFyc2VJbnQoa2V5LCAxMCkpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxab25lVmlzaWJpbGl0eVR5cGU+KHZhbHVlLCBab25lVmlzaWJpbGl0eVR5cGUsICdab25lVmlzaWJpbGl0eVR5cGUnKTtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdW2tleV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0VmlzaWJpbGl0eVR5cGUuY29udmVydCh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRab25lVmlzaWJpbGl0eSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaXplIGltcGxlbWVudHMgQ29udHJhY3QuU2l6ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oZWlnaHQ6IG51bWJlciwgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcikgeyB9XG5cbiAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICB9XG5cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSB0YWJsZSBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVTdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RhYmxlSW5mbzogVGFibGVJbmZvKSB7IH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jb25uZWN0aW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1c3RvbVNRTCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY3VzdG9tU1FMO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBFbWJlZGRpbmdFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBDdXN0b20gZXJyb3IgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgRXJyb3Igb2JqZWN0LlxuICogVGhpcyBhbGxvd3MgdXMgdG8gcHJvdmlkZSBhIGZpZWxkIHdpdGggYSBzcGVjaWZpYyBlcnJvciBjb2RlXG4gKiBzbyB0aGF0IGRldmVsb3BlcnMgY2FuIG1vcmUgZWFzaWx5IHByb2dyYW1tYXRpY2FsbHkgcmVzcG9uZFxuICogdG8gZXJyb3Igc2NlbmFyaW9zLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVhdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZXJyb3JDb2RlOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYCR7X2Vycm9yQ29kZX06ICR7bWVzc2FnZX1gKTtcblxuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAvLyBFcnJvciBpbmhlcml0YW5jZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSB3aGVuIGNvbXBpbGluZyB0byBFUzUsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlXG4gICAgLy8gdGhlIHByb3RvIGNoYWluIHRvIGJlIGJ1aWx0IGNvcnJlY3RseS4gIFNlZSB0aGUgZ2l0aHViIGxpbmsgYWJvdmUgZm9yIGRldGFpbHMuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRhYmxlYXVFcnJvci5wcm90b3R5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBlcnJvckNvZGUoKTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlRmlsdGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRmlsdGVycyBhbHJlYWR5IGhhdmUgbmF0aXZlIHR5cGUgaW4gdmFsdWUsIGp1c3QgdXNlIHRoYXQgZm9yIG5hdGl2ZVZhbHVlIGFsc29cbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZVRhYmxlRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIERhdGFUYWJsZXMgY29udGFpbiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgZGF0ZSBhcyBzdHJpbmcgfCAnJW51bGwlXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBjb252ZXJ0cyBkYXRlcyBhcyBzdHJpbmcgdG8gZGF0ZXMsIGFuZCBhbnkgc3BlY2lhbCB0byBudWxsXG4gICAgLy8gKGJvb2xlYW4sIG51bWJlcnMsIHN0cmluZ3MgYXJlIHBhc3NlZCB0aHJvdWdoKVxuICAgIC8vIEJlY2F1c2Ugb2YgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gLSB3ZSBjYW4gaGF2ZSB1bmRlZmluZWQgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IHRoYW4gYW55IHNwZWNpYWxcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBjb252ZXJ0cyBmcm9tIGEgc291cmNlIGVudW0gdmFsdWUgdG8gZGVzdGluYXRpb24gZW51bVxuICogdmFsdWUgZ2l2ZW4gYSBtYXBwaW5nIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdoZW4gY29uc3RydWN0ZWQuXG4gKlxuICogTm90ZTogVGhpcyBleGFjdCBzYW1lIGNsYXNzIGlzIGRlZmluZWQgaW4gYXBpLWNvcmUuICBHaXZlbiBpdHMgc21hbGxcbiAqIG5hdHVyZSwgaXQgaXMgbm90IHdvcnRoIGhhdmluZyBpbiBhIHNlcGFyYXRlIHByb2plY3QgdG8gc2hhcmUgdGhpcyBiZXR3ZWVuXG4gKiBhcGktY29yZSBhbmQgYXBpLXNoYXJlZC4gIElmIG1vcmUgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IGlzIGFkZGVkIHRoYXQgaXMgdXNlZCBieSBhcGktY29yZVxuICogYW5kIGFwaS1zaGFyZWQgYnV0IGhhcyBubyBvdGhlciBkZXBlbmRlY2llcywgYSB1dGlsdGl0eSBwcm9qZWN0IG1pZ2h0IGJlIG1lcml0ZWQsXG4gKiBhbmQgdGhpcyBjbGFzcyBjb3VsZCBiZSBtb3ZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudW1Db252ZXJ0ZXI8VFNvdXJjZVR5cGUgZXh0ZW5kcyBzdHJpbmcsIFREZXN0aW5hdGlvblR5cGU+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX21hcHBpbmdzOiB7IFtlbnVtVmFsOiBzdHJpbmddOiBURGVzdGluYXRpb25UeXBlOyB9LFxuICAgIHByaXZhdGUgX2RlZmF1bHRWYWw/OiBURGVzdGluYXRpb25UeXBlKSB7IH1cblxuICBwdWJsaWMgY29udmVydChlbnVtVmFsOiBUU291cmNlVHlwZSwgdGhyb3dJZk1pc3Npbmc6IFNob3VsZFRocm93ID0gU2hvdWxkVGhyb3cuWWVzKTogVERlc3RpbmF0aW9uVHlwZSB7XG4gICAgaWYgKHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGVudW1WYWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwcGluZ3NbZW51bVZhbCBhcyBzdHJpbmddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZhdWx0VmFsICE9PSB1bmRlZmluZWQgJiYgdGhyb3dJZk1pc3NpbmcgIT09IFNob3VsZFRocm93Llllcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWw7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBFbnVtIE1hcHBpbmcgbm90IGZvdW5kIGZvcjogJHtlbnVtVmFsfWApO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIFNob3VsZFRocm93IHtcbiAgWWVzID0gJ3llcycsXG4gIE5vID0gJ25vJyxcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4vUGFyYW0nO1xuXG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5cbmludGVyZmFjZSBFbnVtTGlrZSB7XG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29uc3RydWN0IGNvbW1vbiBlcnJvcnMgdGhyb3VnaG91dCB0aGUgZXh0ZXJuYWxcbiAqIHByb2plY3RzIChhcGktc2hhcmVkLCBleHRlbnNpb25zLWFwaSwgZXRjLikuICBJdCBoYXMgc29tZSBkdXBsaWNhdGlvbiB3aXRoXG4gKiB0aGUgRXJyb3JIZWxwZXJzIGNsYXNzIGluIGFwaS1jb3JlLCBidXQgaXMgc2VwYXJhdGUgZHVlIHRvIHRoZSBuZWVkIHRvIHRocm93XG4gKiBhbiBleHRlcm5hbCBUYWJsZWF1RXJyb3IgdnMuIGFuIEludGVybmFsVGFibGVhdUVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JIZWxwZXJzIHtcbiAgLyoqXG4gICAqIFRocm93cyB3aXRoIGNvZGUgSW50ZXJuYWxFcnJvci5cbiAgICpcbiAgICogQHBhcmFtIGFwaU5hbWUgbmFtZSBvZiBhcGkgdGhhdCB3YXMgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcGlOb3RJbXBsZW1lbnRlZChhcGlOYW1lOiBzdHJpbmcpOiBUYWJsZWF1RXJyb3Ige1xuICAgIHJldHVybiBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YXBpTmFtZX0gQVBJIG5vdCB5ZXQgaW1wbGVtZW50ZWQuYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIGludGVybmFsIGVycm9yIGlmIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlJbnRlcm5hbFZhbHVlKGFyZ3VtZW50VmFsdWU6IGFueSwgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgKiBGb3Igb2JqZWN0cywgaXQganVzdCB0ZXN0cyB0aGF0IGl0IGlzIGFuIG9iamVjdFxuICAqXG4gICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICogQHBhcmFtIGV4cGVjdGVkVHlwZSBleHBlY3RlZCByZXN1bHQgb2YgdHlwZW9mXG4gICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIChhcmd1bWVudFZhbHVlKSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaGFzIGludmFsaWQgdHlwZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIGVtcHR5IHN0cmluZywgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVN0cmluZ1BhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBzdHJpbmcsIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGFyZ3VtZW50VmFsdWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW10ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhlbnVtVHlwZSkuZm9yRWFjaCgoZW51bUtleSkgPT4ge1xuICAgICAgaWYgKGVudW1UeXBlW2VudW1LZXldID09PSBlbnVtVmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBwYXJhbXMgbWluIGFuZCBtYXggZm9yIGFwcGx5aW5nIHJhbmdlIGZpbHRlci5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHJhbmdlIGlzIGludmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSBtaW4gcmFuZ2UgbWluXG4gICAqIEBwYXJhbSBtYXggcmFuZ2UgbWF4XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVJhbmdlUGFyYW1UeXBlKG1pbjogYW55LCBtYXg6IGFueSk6IHZvaWQge1xuICAgIGlmICghbWluICYmICFtYXgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBhdCBsZWFzdCBvbmUgb2YgbWluIG9yIG1heCBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBpZiAobWluICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWluKSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKG1heCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIG9ubHkgRGF0ZSBhbmQgbnVtYmVyIGFyZSBhbGxvd2VkIGZvciBwYXJhbWV0ZXIgbWF4LicpO1xuICAgIH1cblxuICAgIGlmIChtaW4gJiYgbWF4ICYmIHR5cGVvZiAobWluKSAhPT0gdHlwZW9mIChtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgcGFyYW1ldGVycyBtaW4gYW5kIG1heCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZS4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZUlkIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdHMgQW4gYXJyYXkgb2YgYWxsIERhc2hib2FyZE9iamVjdHMgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRPYmplY3RzSW1wbDogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4sIHpvbmVJRDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBsZXQgaXNWYWxpZCA9IGRhc2hib2FyZE9iamVjdHNJbXBsLnNvbWUoKGRhc2hib2FyZE9iamVjdEltcGwpID0+IHtcbiAgICAgIHJldHVybiBkYXNoYm9hcmRPYmplY3RJbXBsLmlkID09PSB6b25lSUQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBab25lIElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZU51bWJlcihpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiAoaW5wdXQpID09PSAnbnVtYmVyJyB8fCBpbnB1dCBpbnN0YW5jZW9mIE51bWJlcjtcbiAgfVxuICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWFueSAqL1xuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBEYXRlXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiAoaW5wdXQpID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZztcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVCb29sKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIChpbnB1dCkgPT09ICdib29sZWFuJyB8fCBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW47XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKFBhcmFtLmlzVHlwZU51bWJlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBQYXJhbS5zZXJpYWxpemVOdW1iZXJGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBudW1iZXIpO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0odmFsdWUgYXMgRGF0ZSk7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVCb29sKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybSh2YWx1ZSBhcyBib29sZWFuKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBVbmV4cGVjdGVkIGludmFsaWQgdmFsdWUgZm9yOiAke3ZhbHVlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgYWxyZWFkeSBhIE1hcCwgb3IgY29udmVydHMgYW4gb2JqZWN0IHRvIGEgTWFwLlxuICAgKiBJZiB0aGUgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCwgd2UgY29udmVydCBpdCB0byBhIE1hcCB1c2luZyBPYmplY3QuZW50cmllcy5cbiAgICogQHRocm93cyBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3Qgb3IgTWFwXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFBhcmFtZXRlclRvTWFwKHBhcmFtOiBvYmplY3QsIHBhcmFtTmFtZTogc3RyaW5nKTogTWFwPGFueSwgYW55PiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUocGFyYW0sICdvYmplY3QnLCBwYXJhbU5hbWUpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGBFeHBlY3Rpbmcgb2JqZWN0IG9yIE1hcCBmb3I6ICR7cGFyYW1OYW1lfS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW0gaW5zdGFuY2VvZiBNYXAgPyBwYXJhbSA6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMocGFyYW0pKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyQ29udHJhY3QgfSBmcm9tICcuL1ZlcnNpb25OdW1iZXJDb250cmFjdCc7XG5cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMgbGlicmFyeVxuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuXG4gIHB1YmxpYyBtYWpvcjogbnVtYmVyO1xuICBwdWJsaWMgbWlub3I6IG51bWJlcjtcbiAgcHVibGljIGZpeDogbnVtYmVyO1xuICBwdWJsaWMgYnVpbGQ6IG51bWJlcjtcbiAgcHVibGljIGlzQWxwaGE6IGJvb2xlYW47XG5cbiAgLy8gcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyBldmVyeW9uZSB1c2VzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgLy8gYnVpbGQgbnVtYmVycyBoYXZlIHRoaXMgZm9ybTogTS5tLmYtcHJlLk5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHZlcnNpb25TdHJpbmc6IHN0cmluZywgaXNBbHBoYTogYm9vbGVhbikge1xuICAgIGxldCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKHAgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEludmFsaWQgdmVyc2lvbiBudW1iZXI6ICR7dmVyc2lvblN0cmluZ31gKTtcbiAgICB9XG5cbiAgICB0aGlzLm1ham9yID0gcGFydHNbMF07XG4gICAgdGhpcy5taW5vciA9IHBhcnRzWzFdO1xuICAgIHRoaXMuZml4ID0gcGFydHNbMl07XG4gICAgdGhpcy5pc0FscGhhID0gaXNBbHBoYTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGROdW1iZXIocHJlUmVsZWFzZVN0cmluZzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBub0J1aWxkTnVtYmVyOiBudW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGxldCBwYXJ0U3RyID0gcHJlUmVsZWFzZVN0cmluZy5zcGxpdCgnLicpO1xuICAgIHJldHVybiBwYXJ0U3RyWzFdID8gcGFyc2VJbnQocGFydFN0clsxXSwgMTApIDogbm9CdWlsZE51bWJlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMuZml4fWA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZ1bGxGb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9LXByZS4ke3RoaXMuYnVpbGR9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcixcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgTm90aWZpY2F0aW9uLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBWZXJiSWQsXG4gIFZlcnNpb25MZXNzVGhhbixcbiAgVmVyc2lvbk51bWJlclxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICBwbGF0Zm9ybVZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIpIHtcblxuICAgIHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIgPSBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyKElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIHBsYXRmb3JtVmVyc2lvbk51bWJlcik7XG5cbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IFtdO1xuICAgIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cGdyYWRlZE5vdGlmaWNhdGlvbiA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIudXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgaGFuZGxlcih1cGdyYWRlZE5vdGlmaWNhdGlvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIElmIG91ciBwbGF0Zm9ybSBpcyBsZXNzIHRoYW4gZXh0ZXJuYWwgbGlicmFyeSB2ZXJzaW9uLCB0aGVuIHdlIG5lZWQgYSBjb252ZXJ0ZXJcbiAgICByZXR1cm4gVmVyc2lvbkxlc3NUaGFuKHBsYXRmb3JtVmVyc2lvbiwgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZG93bmdyYWRlUGFyYW1ldGVycyA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIuZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYiwgcGFyYW1ldGVycyk7XG4gICAgICByZXR1cm4gdGhpcy5fYXBpRGVsZWdhdGVEaXNwYXRjaGVyLmV4ZWN1dGUoZG93bmdyYWRlUGFyYW1ldGVycy52ZXJiLCBkb3duZ3JhZGVQYXJhbWV0ZXJzLnBhcmFtZXRlcnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBjb25zdCB1cGdyYWRlUmVzcG9uc2UgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVFeGVjdXRlUmV0dXJuKHJlc3BvbnNlLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHVwZ3JhZGVSZXNwb25zZTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcihoID0+IGggIT09IGhhbmRsZXIpO1xuICB9XG59XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbi8vIFRoZSBmb2xsb3dpbmcgcG9seWZpbGxzIGFyZSBuZWVkZWQgZm9yIElFMTFcblxuaW1wb3J0ICdjb3JlLWpzL2VzL3Byb21pc2UnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL21hcCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZmluZCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZnJvbSc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlcic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWludCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWZsb2F0JztcblxuLy8gRHVlIHRvIHRoZSB3YXkgd2UgY29uZmlndXJlZCB3ZWJwYWNrLCB3ZSBzaG91bGQgYmUgZXhwb3J0aW5nIHRoaW5ncyB3aGljaCB3aWxsIGJlIHVuZGVyXG4vLyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgXCJ0YWJsZWF1XCIuIEV4cG9ydCBldmVyeXRoaW5nIHdlIHdhbnQgdG8gYmUgdmlzaWJsZSB1bmRlciB0YWJsZWF1XG4vLyBmcm9tIHRoaXMgZmlsZS5cblxuaW1wb3J0IHsgRXh0ZW5zaW9uc0ltcGwgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmRlY2xhcmUgdmFyIEVYVEVOU0lPTl9WRVJTSU9OX0lTX0FMUEhBOiBib29sZWFuO1xuY29uc3QgaXNBbHBoYTogYm9vbGVhbiA9IHR5cGVvZiBFWFRFTlNJT05fVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBFWFRFTlNJT05fVkVSU0lPTl9JU19BTFBIQSA6IGZhbHNlO1xuXG5kZWNsYXJlIHZhciBFWFRFTlNJT05fQVBJX1ZFUlNJT05fTlVNQkVSOiBzdHJpbmc7XG5BcGlWZXJzaW9uLlNldFZlcnNpb25OdW1iZXIodHlwZW9mIEVYVEVOU0lPTl9BUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gRVhURU5TSU9OX0FQSV9WRVJTSU9OX05VTUJFUiA6ICcwLjAuMCcsIGlzQWxwaGEpO1xuXG5jb25zdCBleHRlbnNpb25JbXBsID0gbmV3IEV4dGVuc2lvbnNJbXBsKCk7XG5leHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IG5ldyBFeHRlbnNpb25zKGV4dGVuc2lvbkltcGwpO1xuXG4vLyBFeHBvcnQgRW51bXNcbi8vIFRoZXNlIHNob3cgdXAgdW5kZXIgdGhlIHRhYmxlYXUgb2JqZWN0LiBJLmUuIHRhYmxlYXUuRXh0ZW5zaW9uQ29udGV4dC5TZXJ2ZXJcbmV4cG9ydCB7XG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEFuYWx5dGljc09iamVjdFR5cGUsXG4gIENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZVxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIEZpbHRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCwgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLkZpbHRlckNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0LmdldEZpbHRlcnNBc3luYygpLnRoZW48Q29udHJhY3QuRmlsdGVyPihmaWx0ZXJzID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IChmaWx0ZXIuZmllbGROYW1lID09PSB0aGlzLl9maWVsZE5hbWUpKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgTWFya3NTZWxlY3RlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuTWFya3NTZWxlY3RlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMud29ya3NoZWV0LmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlLCBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcywgVGFibGVhdUVycm9yLCBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZ2xvYmFsRmllbGROYW1lOiBzdHJpbmcsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuUGFyYW1ldGVyQ2hhbmdlZCwgc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPiB7XG4gICAgLy8gQ2FsbCBkb3duIHRvIG91ciBzZXJ2aWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGJhY2sgdmlhIGl0cyBmaWVsZCBuYW1lXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmModGhpcy5fZ2xvYmFsRmllbGROYW1lKS50aGVuKHBhcmFtZXRlckltcGwgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ1BhcmFtZXRlciwgYENhbm5vdCBmaW5kIHBhcmFtZXRlcjogJHt0aGlzLl9nbG9iYWxGaWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMuc2hlZXQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1RXZlbnQge1xuICBwcml2YXRlIF90eXBlOiBUYWJsZWF1RXZlbnRUeXBlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlKSB7XG4gICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1U2hlZXRFdmVudCB7XG4gIHByaXZhdGUgX3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldDtcblxuICBwdWJsaWMgZ2V0IHNoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzLl9zaGVldCA9IHNoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVXb3Jrc2hlZXRFdmVudCB7XG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBwcm90ZWN0ZWQgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIodHlwZSwgX3dvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRhU2NoZW1hLFxuICBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFdvcmtib29rSW1wbCwgRGF0YVNvdXJjZUltcGwsIERhdGFTb3VyY2UsIERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbldvcmtib29rSW1wbCBleHRlbmRzIFdvcmtib29rSW1wbCB7XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PihyZXN1bHQgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgbGV0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goZHMgPT4ge1xuICAgICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRzKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNvdXJjZUluZm86IERhdGFTb3VyY2VJbmZvKTogRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZUltcGwgPSBuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZUluZm8pO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG5cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG4gIFNlcnZpY2VOYW1lc1xufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHtcbiAgRGFzaGJvYXJkXG59IGZyb20gJy4uL01vZGVscy9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ29udGVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvSW5pdGlhbGl6YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzLCByZWdpc3RlckluaXRpYWxpemF0aW9uRXh0ZW5zaW9uc1NlcnZpY2VzIH0gZnJvbSAnLi4vU2VydmljZXMvUmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMnO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuLi9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4vU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVUkgfSBmcm9tICcuLi9OYW1lc3BhY2VzL1VJJztcbmltcG9ydCB7IFVJSW1wbCB9IGZyb20gJy4vVUlJbXBsJztcbmltcG9ydCB7IEFwaVZlcnNpb24sIFZpelNlcnZpY2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuXG5pbXBvcnQge1xuICBDb250ZXh0TWVudUV2ZW50LFxuICBFeHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICBFeHRlbnNpb25TZXR0aW5nc0luZm8sXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksXG4gIE5vdGlmaWNhdGlvbklkLFxuICBTaGVldFBhdGgsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tICcuLi9Nb2RlbHMvV29ya2Jvb2snO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4ge30gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG5cbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ6IERhc2hib2FyZENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBpbml0T3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zID0geyBpc0FscGhhOiBBcGlWZXJzaW9uLkluc3RhbmNlLmlzQWxwaGEgfTtcbiAgICAgICAgLy8gRmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbyBpcyBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZXNrdG9wIGRpc3BhdGNoZXIgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB1c1xuICAgICAgICBpZiAoTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLmhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShpbml0T3B0aW9ucykpIHtcbiAgICAgICAgICAvLyBSdW5uaW5nIGluIGEgcHJlLTIwMTkuMyBkZXNrdG9wLCB1c2Ugb3VyIGxlZ2FjeSBkaXNwYXRjaGVyIHByb21pc2VcbiAgICAgICAgICBjb25zdCBkZXNrdG9wRGlzcGF0Y2hlclByb21pc2UgPSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKTtcbiAgICAgICAgICBkZXNrdG9wRGlzcGF0Y2hlclByb21pc2UhLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PlxuICAgICAgICAgICAgdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2UgbXVzdCBiZSBydW5uaW5nIGluIHNlcnZlciwgc28gd2Ugc2hvdWxkIHRyeSB0byBraWNrIG9mIHRoZSBzZXJ2ZXIgZGlzcGF0Y2hlciBib290c3RyYXBwaW5nXG4gICAgICAgICAgY29uc3Qgb25EaXNwYXRjaGVyUmVjZWl2ZWRDYWxsYmFjayA9IHRoaXMub25EaXNwYXRjaGVyUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgICBkb0Nyb3NzRnJhbWVCb290c3RyYXAod2luZG93LCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBpbml0T3B0aW9ucykudGhlbigoZmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICB9KS50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZpelNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxWaXpTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVml6KTtcblxuICAgIHJldHVybiB2aXpTZXJ2aWNlLmNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjKTtcbiAgfVxuXG4gIHByaXZhdGUgb25EaXNwYXRjaGVyUmVjZWl2ZWQoXG4gICAgZGlzcGF0Y2hlckZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksXG4gICAgaXNFeHRlbnNpb25EaWFsb2c6IGJvb2xlYW4sXG4gICAgY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICBsZXQgZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyID0gZGlzcGF0Y2hlckZhY3RvcnkoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG5cbiAgICAvLyBDYWxsIHRvIHJlZ2lzdGVyIGFsbCB0aGUgc2VydmljZXMgd2hpY2ggd2lsbCB1c2UgdGhlIG5ld2x5IGluaXRpYWxpemVkIGRpc3BhdGNoZXJcbiAgICByZWdpc3RlckluaXRpYWxpemF0aW9uRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBpbml0aWFsaXphdGlvbiBzZXJ2aWNlIGFuZCBpbml0aWFsaXplIHRoaXMgZXh0ZW5zaW9uXG4gICAgY29uc3QgaW5pdGlhbGl6YXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8SW5pdGlhbGl6YXRpb25TZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuSW5pdGlhbGl6YXRpb25TZXJ2aWNlKTtcblxuICAgIGNvbnN0IGNhbGxiYWNrTWFwS2V5cyA9IChjb250ZXh0TWVudUZ1bmN0aW9ucykgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KHJlc3VsdCA9PiB7XG4gICAgICBpZiAoIXJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbi4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgd2UgcmVjZWl2ZSBhbiBpbnZhbGlkIHBsYWZvcm0gdmVyc2lvbiwgdGhpcyBtZWFucyB0aGF0IHBsYXRmb3JtIGlzIHJ1bm5uaW5nIDEuNCBvciAyLjEgYW5kXG4gICAgICAvLyBkb2Vzbid0IHBhc3MgdGhlIHBsYXRmb3JtIHZlcnNpb24gdG8gZXh0ZXJuYWwuIEluIHRoaXMgY2FzZSB3ZSBhc3N1bWUgdGhlIHBsYXRmb3JtIHZlcnNpb24gdG8gYmUgMS45XG4gICAgICBsZXQgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXIpO1xuXG4gICAgICB0aGlzLmRhc2hib2FyZENvbnRlbnQgPSB0aGlzLmluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KFxuICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgcmVzdWx0LmV4dGVuc2lvbkluc3RhbmNlLmxvY2F0b3IuZGFzaGJvYXJkUGF0aCk7XG5cbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50KTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhyZXN1bHQuZXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTtcbiAgICAgIHRoaXMudWkgPSBuZXcgVUkobmV3IFVJSW1wbCgpKTtcbiAgICAgIHRoaXMud29ya2Jvb2sgPSBuZXcgV29ya2Jvb2sobmV3IEV4dGVuc2lvbldvcmtib29rSW1wbCgpKTtcblxuICAgICAgLy8gQWZ0ZXIgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZCwgc2V0dXAgbGlzdGVuZXJzIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXRcbiAgICAgIC8vIGFyZSBtZWFudCB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBjbGlja2VkLlxuICAgICAgdGhpcy5pbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnMpO1xuXG4gICAgICAvLyBJbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGNhc2UsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBXaGVuIHJldHVybmluZyBmcm9tIGluaXRpYWxpemVBc3luYyB0byB0aGVcbiAgICAgIC8vIGRldmVsb3Blciwgd2UganVzdCBpbmdvcmUgdGhhdCBzdHJpbmcuICBJbiB0aGUgY2FzZSBvZiBpbml0aWFsaXppbmcgZnJvbSBhbiBleHRlbnNpb24gZGlhbG9nLCB0aGlzIHN0cmluZ1xuICAgICAgLy8gaXMgYW4gb3B0aW9uYWwgcGF5bG9hZCBzZW50IGZyb20gdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICByZXR1cm4gcmVzdWx0LmV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgY29uc3QgZGFzaGJvYXJkSW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKGluZm8ubmFtZSwgaW5mby5zaXplLmgsIGluZm8uc2l6ZS53LCBpbmZvLnpvbmVzLCBzaGVldFBhdGgpO1xuICAgIGNvbnN0IGRhc2hib2FyZCA9IG5ldyBEYXNoYm9hcmQoZGFzaGJvYXJkSW1wbCk7XG4gICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRDb250ZW50KGRhc2hib2FyZCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5nc0ltcGwgPSBuZXcgU2V0dGluZ3NJbXBsKHNldHRpbmdzSW5mbyk7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5ncyhzZXR0aW5nc0ltcGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcblxuICAgIC8vIFVucmVnaXN0ZXIgZnVuY3Rpb24gbm90IHVzZWQgc2luY2UgdGhlc2Ugbm90aWZpY2F0aW9ucyBzaG91bGQgYmVcbiAgICAvLyBvYnNlcnZlZCBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihOb3RpZmljYXRpb25JZC5Db250ZXh0TWVudUNsaWNrLCAobW9kZWwpID0+IHtcbiAgICAgIC8vIExldCB0aHJvdWdoIGFueSBjb250ZXh0IG1lbnUgZXZlbnQsIHRoZXNlIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG9uIGFwaS1jb3JlXG4gICAgICAvLyBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uIGxvY2F0b3IuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LCAoZXZlbnQ6IENvbnRleHRNZW51RXZlbnQpID0+IHtcbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgbWVudSBJRFxuICAgICAgaWYgKGNvbnRleHRNZW51RnVuY3Rpb25zKSB7XG4gICAgICAgIGlmICghY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBSZWNlaXZlZCB1bmV4cGVjdGVkIGNvbnRleHQgbWVudSBJZCBmcm9tIGV2ZW50OiAke2V2ZW50LmlkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgVmVyYklkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIGhhcyBiZWVuIG1vdmVkIChhbmQgcmVuYW1lZCkgZnJvbSBhcGktaW50ZXJuYWwtY29udHJhY3QuXG4gKiBJdCBzdXBwb3J0cyBydW5uaW5nIGEgbmV3ZXIgZXh0ZXJuYWwgbGlicmFyeSBhZ2FpbnN0IGEgcHJlIDIwMTkuMyBkZXNrdG9wLlxuICogU3RhcnRpbmcgaW4gMjAxOS4zLCB3ZSBoYXZlIGEgbWVyZ2VkIGJvb3RzdHJhcCBzdHlsZSBmb3IgYm90aCBkZXNrdG9wIGFuZCBzZXJ2ZXIuXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGFscGhhIGNoZWNraW5nIHRoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgbm90IG5lY2Vzc2FyeSBpbiBleHRlcm5hbC1hcGktanNcbiAqICBhZnRlciAyMDE5LjMgYmVjYXVzZSB0aGF0IGNoZWNraW5nIGhhcHBlbnMgaW4gYXBpLXBsYXRmb3JtLWpzIChBcGlEaXNwYXRjaGVyVGVzdC50cylcbiAqIFRGU0lEOiAxMDkxNTYxIHRyYWNrcyBhbiBpbXByb3ZlbWVudCB0byB0aGlzIHN5c3RlbSB0byBtYWtlIGl0IGxlc3MgY29tcGxleCBhbmQgdGllIGl0IGRpcmVjdGx5IHRvXG4gKiAgdGFibGVhdSBiZXRhIHJlbGVhc2UgdmVyc2lvbnMuXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgbmFtZXNwYWNlIExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucy5pc0FscGhhID09PSAndW5kZWZpbmVkJykgJiYgIXdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1RoaXMgaXMgYSBiZXRhIHZlcnNpb24gb2YgdGhlIEV4dGVuc2lvbnMgQVBJLiBQbGVhc2UgdXBncmFkZSB0byBhbiBvZmZpY2lhbCByZWxlYXNlLicpO1xuICAgICAgd2luZG93Ll9fd2FybmluZ0lzc3VlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaXNBbHBoYSEgJiYgd2luZG93Ll9fcGxhdGZvcm1Jc09mZmljaWFsUmVsZWFzZSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcbiAgICAgICAgZGlzcGF0Y2hlci5leGVjdXRlKFZlcmJJZC5CbG9ja0V4dGVuc2lvbiwge30pLmNhdGNoKCk7XG4gICAgICB9KS5jYXRjaCgpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgd2lsbCBiZSB1bmRlZmluZWQgaWYgcHJvbWlzZSBpcyByZWplY3RlZCBvciB0aHJvd3NcbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PjtcbiAgICBfX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2U6IGJvb2xlYW47XG4gICAgX193YXJuaW5nSXNzdWVkOiBib29sZWFuO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBOb3RpZmljYXRpb25JZCwgU2V0dGluZ3NFdmVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2V0dGluZ3NTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9UYWJsZWF1RXZlbnQnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUzogc3RyaW5nID0gJ0FzeW5jIFNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHVwZGF0aW5nIHNldHRpbmdzIGlzIG5vdCBhbGxvd2VkLic7XG4gIHByaXZhdGUgX2lzTW9kaWZpZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2N1cnJlbnRTZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uO1xuXG4gIC8vIFNpbmNlIHByb21pc2VzIGNhbid0IGJlIGludHJvc3BlY3RlZCBmb3Igc3RhdGUsIGtlZXAgYSB2YXJpYWJsZSB0aGF0XG4gIC8vIGluZGljYXRlcyBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHNvIHRoYXQgc2V0L2VyYXNlIGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgYSBzYXZlLlxuICBwcml2YXRlIF9zYXZlSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgLy8gT25seSBtYWtlIGEgbW9kaWZpY2F0aW9uIGlmIHdlIGhhdmUgdGhlIGtleSBhbHJlYWR5XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldKSB7XG4gICAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICAgICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzZXR0aW5nc1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgLy8gSnVzdCByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIHNldHRpbmdzIGFyZSB1bmNoYW5nZWRcbiAgICBpZiAoIXRoaXMuX2lzTW9kaWZpZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmU8U2V0dGluZ3NDb2xsZWN0aW9uPih0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgc2V0dGluZ3Mgc2VydmljZSB0byBzYXZlIHNldHRpbmdzIHRvIHR3YlxuICAgIGNvbnN0IHNldHRpbmdzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2V0dGluZ3NTZXJ2aWNlLnNhdmVTZXR0aW5nc0FzeW5jKHRoaXMuX2N1cnJlbnRTZXR0aW5ncykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KG5ld1NldHRpbmdzID0+IHtcbiAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5fY3VycmVudFNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gbmV3U2V0dGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2N1cnJlbnRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgIH0sIChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGtleSwgJ2tleScpOyAvLyBLZXkgc2hvdWxkbid0IGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlLCAndmFsdWUnKTsgLy8gRW1wdHkgc3RyaW5nIHZhbHVlIGlzIGFsbG93ZWQuXG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gc2V0dGluZ3Mgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGEgc2V0dGluZ3NVcGRhdGUgZXZlbnQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuU2V0dGluZ3NDaGFuZ2VkLCAobW9kZWwpID0+IHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIChldmVudDogU2V0dGluZ3NFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gZXZlbnQubmV3U2V0dGluZ3M7XG4gICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgfSk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBUYWJsZWF1RXJyb3Jcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1VJU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBVSUltcGwge1xuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVpU2VydmljZS5kaXNwbGF5RGlhbG9nQXN5bmModXJsLCBwYXlsb2FkIHx8ICcnLCBvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgdW5yZWdpc3RlckZuID0gbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nVXBkYXRlLCAobW9kZWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gTGV0IHRocm91Z2ggYW55IGRpYWxvZyB1cGRhdGUgZXZlbnRcbiAgICAgICAgfSwgKGV2ZW50OiBEaWFsb2dVcGRhdGVFdmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5pc0Nsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoZXZlbnQuY2xvc2VQYXlsb2FkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dDbG9zZWRCeVVzZXIsICdFeHRlbnNpb24gZGlhbG9nIGNsb3NlZCBieSB1c2VyLicpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1bnJlZ2lzdGVyRm4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxVSVNlcnZpY2U+KFxuICAgICAgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuXG4gICAgdWlTZXJ2aWNlLmNsb3NlRGlhbG9nKHBheWxvYWQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsLCBEYXNoYm9hcmRPYmplY3RJbXBsLCBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3QgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCkge1xuICAgIHN1cGVyKF9kYXNoYm9hcmRJbXBsKTtcbiAgICBfZGFzaGJvYXJkSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRab25lVmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnNldFpvbmVWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsXG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LCBFdmVudExpc3RlbmVyTWFuYWdlciwgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLCBTaW5nbGVFdmVudE1hbmFnZXIsIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsIFBhcmFtZXRlckltcGwsIEVycm9ySGVscGVyc1xufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaChlID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jdXJyZW50VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IENvbnRyYWN0LkRhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmRhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGxvd2FibGVWYWx1ZXMoKTogQ29udHJhY3QuUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAqIEhlbHBlciBtZXRob2Qgd2hpY2ggZ29lcyB0aHJvdWdoIGFuZCByZWdpc3RlcnMgZWFjaCBldmVudCB0eXBlIHRoaXMgaW1wbCBrbm93cyBhYm91dFxuICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICpcbiAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlclxuICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlJbnRlcm5hbFZhbHVlKHNoZWV0LCAnc2hlZXQnKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKE5vdGlmaWNhdGlvbklkLlBhcmFtZXRlckNoYW5nZWQsIChtb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gbW9kZWwgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZSA9PT0gdGhpcy5wYXJhbWV0ZXJJbXBsLmlkO1xuICAgIH0sIChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyLCBTaGVldEltcGwsIFNpemUsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi9QYXJhbWV0ZXInO1xuXG5leHBvcnQgY2xhc3MgU2hlZXQgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NoZWV0SW1wbDogU2hlZXRJbXBsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IFNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW1wbC5zaXplIGluc3RhbmNlb2YgU2l6ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5zaXplO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckFzeW5jKHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5maW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlcj4oKHJlc29sdmUpID0+IHJlc29sdmUobmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHVuZGVmaW5lZD4oKHJlc29sdmUpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuUGFyYW1ldGVyPj4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuZ2V0UGFyYW1ldGVyc0FzeW5jKCkudGhlbigocGFyYW1ldGVyc0ltcGwpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXJzSW1wbC5tYXAocGFyYW1ldGVySW1wbCA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgfSBmcm9tICcuLi9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbCc7XG5cblxuZXhwb3J0IGNsYXNzIFdvcmtib29rIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya2Jvb2sge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya2Jvb2tJbXBsOiBFeHRlbnNpb25Xb3JrYm9va0ltcGwpIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya2Jvb2tJbXBsLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmlsdGVyVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBOb3RpZmljYXRpb25TZXJ2aWNlLCBTZXJ2aWNlTmFtZXMsIFNpbmdsZUV2ZW50TWFuYWdlciwgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCwgV29ya3NoZWV0SW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IERhc2hib2FyZCB9IGZyb20gJy4vRGFzaGJvYXJkJztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKGUgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnREYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7V29ya3NoZWV0fSB3b3Jrc2hlZXQgVGhlIHdvcmtzaGVldCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkLCAobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IHZpc3VhbElkID0gbW9kZWwgYXMgVmlzdWFsSWQ7XG4gICAgICByZXR1cm4gdGhpcy52aXN1YWxJZHNBcmVFcXVhbCh2aXN1YWxJZCwgdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZCk7XG4gICAgfSwgKHZpejogVmlzdWFsSWQpID0+IHtcbiAgICAgIG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxGaWx0ZXJDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuRmlsdGVyQ2hhbmdlZCwgKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJFdmVudFJlc3BvbnNlID0gbW9kZWwgYXMgRmlsdGVyRXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgIH0sIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgIGZpbHRlckV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRmlsdGVyQ2hhbmdlZEV2ZW50KHRoaXMsIGV2ZW50LmZpZWxkTmFtZSkpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0cy5wdXNoKG1hcmtzRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChmaWx0ZXJFdmVudCk7XG5cbiAgICAvLyBUT0RPIC0gb3RoZXIgZXZlbnQgdHlwZXNcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogQXJyYXk8c3RyaW5nPiwgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSwgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXREYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29sdW1uPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnNvbGUud2FybignV29ya3NoZWV0LmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlEQXN5bmMobWFya3NJbmZvOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhtYXJrc0luZm8sIHVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsSWRzQXJlRXF1YWwoYTogVmlzdWFsSWQsIGI6IFZpc3VhbElkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGEgJiYgYiAmJlxuICAgICAgYS53b3Jrc2hlZXQgPT09IGIud29ya3NoZWV0ICYmXG4gICAgICBhLmRhc2hib2FyZCA9PT0gYi5kYXNoYm9hcmQgJiZcbiAgICAgIGEuc3Rvcnlib2FyZCA9PT0gYi5zdG9yeWJvYXJkICYmXG4gICAgICBhLnN0b3J5UG9pbnRJRCA9PT0gYi5zdG9yeVBvaW50SUQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIERhc2hib2FyZENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBEYXNoYm9hcmRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZDogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkKSB7IH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4dGVuc2lvbkNvbnRleHQsIEV4dGVuc2lvbk1vZGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uRW52aXJvbm1lbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEVudW1NYXBwaW5ncywgQXBpVmVyc2lvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBuYW1lc3BhY2UuXG4gKiBFbnZpcm9ubWVudCBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpc1xuICoganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IGltcGxlbWVudHMgQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICBwcml2YXRlIF9hcGlWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRleHQ6IEV4dGVuc2lvbkNvbnRleHQ7XG4gIHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICBwcml2YXRlIF9tb2RlOiBFeHRlbnNpb25Nb2RlO1xuICBwcml2YXRlIF9vcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbiAgcHJpdmF0ZSBfdGFibGVhdVZlcnNpb246IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXh0ZW5zaW9uRW52aXJvbm1lbnQ6IEV4dGVuc2lvbkVudmlyb25tZW50KSB7XG4gICAgdGhpcy5fYXBpVmVyc2lvbiA9IEFwaVZlcnNpb24uSW5zdGFuY2UgJiYgQXBpVmVyc2lvbi5JbnN0YW5jZS5mb3JtYXR0ZWRWYWx1ZTsgLy8gbWFqLm1pbi5maXggKG5vIGJ1aWxkKVxuICAgIHRoaXMuX2NvbnRleHQgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uQ29udGV4dC5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQpO1xuICAgIHRoaXMuX2xhbmd1YWdlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTGFuZ3VhZ2U7XG4gICAgdGhpcy5fbG9jYWxlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTG9jYWxlO1xuICAgIHRoaXMuX21vZGUgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uTW9kZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbk1vZGUpO1xuICAgIHRoaXMuX29wZXJhdGluZ1N5c3RlbSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbTtcbiAgICB0aGlzLl90YWJsZWF1VmVyc2lvbiA9IGV4dGVuc2lvbkVudmlyb25tZW50LnRhYmxlYXVWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlO1xuICB9XG5cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlKCk6IEV4dGVuc2lvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVyYXRpbmdTeXN0ZW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW5nU3lzdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJsZWF1VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZWF1VmVyc2lvbjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgQ2FsbGJhY2tNYXAsIEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIEV4dGVuc2lvbnMgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9ucyBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbnMge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBleHRlbnNpb25JbXBsOiBFeHRlbnNpb25zSW1wbCkge1xuICAgIHRoaXMuZXh0ZW5zaW9uSW1wbCA9IGV4dGVuc2lvbkltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZENvbnRlbnQoKTogQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5kYXNoYm9hcmRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBlbnZpcm9ubWVudCgpOiBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5lbnZpcm9ubWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogQ29udHJhY3QuU2V0dGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVpKCk6IENvbnRyYWN0LlVJIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnVpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9vaygpOiBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3JrYm9vaztcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplQXN5bmMoY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKGZhbHNlLCBjb250ZXh0TWVudUNhbGxiYWNrcykudGhlbjx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEaWFsb2dBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXR0aW5ncyBhcyBTZXR0aW5nc0NvbnRyYWN0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4uL0ltcGwvU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNldHRpbmdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnRyYWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldHRpbmdzSW1wbDogU2V0dGluZ3NJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKGUgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmVyYXNlKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuc2F2ZUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBpbXBsZW1lbnRzIENvbnRyYWN0LlVJIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltcGw6IFVJSW1wbCkgeyB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9pbXBsLmNsb3NlRGlhbG9nKHBheWxvYWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vSW5pdGlhbGl6YXRpb25TZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIEluaXRpYWxpemF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBJbml0aWFsaXphdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuSW5pdGlhbGl6YXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2c6IGJvb2xlYW4sIGNvbnRleHRNZW51SWRzOiBzdHJpbmdbXSk6IFByb21pc2U8RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2luaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkNvbnRleHRNZW51SWRzXTogY29udGV4dE1lbnVJZHMsXG4gICAgICBbUGFyYW1ldGVySWQuSXNFeHRlbnNpb25EaWFsb2ddOiBpc0V4dGVuc2lvbkRpYWxvZ1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4ocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gVE9ETyAtIFZhbGlkYXRlIHJldHVybiB2YWx1ZVxuXG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHRlbnNpb25TZXR0aW5nc0luZm8sXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2V0dGluZ3NTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZXR0aW5nc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHNhdmVTZXR0aW5nc0FzeW5jKHNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb24pOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlU2V0dGluZ3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2V0dGluZ3NWYWx1ZXNdOiBzZXR0aW5nc1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlRXh0ZW5zaW9uU2V0dGluZ3MsIHBhcmFtZXRlcnMpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPih2YWx1ZSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQgYXMgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvO1xuXG4gICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnNldHRpbmdzVmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBzYXZpbmdzIHNldHRpbmdzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKHJlc3VsdC5zZXR0aW5nc1ZhbHVlcyk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpYWxvZ09wdGlvbnMsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LFxuICBQYXJhbWV0ZXJJZCxcbiAgVmVyYklkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVDogbnVtYmVyID0gNDAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1dJRFRIOiBudW1iZXIgPSA2MDA7IC8vIGluIHBpeGVsc1xuXG5leHBvcnQgY2xhc3MgVUlTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFVJU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkOiBzdHJpbmcsIG9wdGlvbnM/OiBEaWFsb2dPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdkaXNwbGF5RGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF06IHVybCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dQYXlsb2FkXTogcGF5bG9hZFxuICAgIH07XG5cbiAgICBjb25zdCBoOiBudW1iZXIgPSAoKG9wdGlvbnMpICYmIChvcHRpb25zLmhlaWdodCkpID8gb3B0aW9ucy5oZWlnaHQgOiBERUZBVUxUX0RJQUxPR19IRUlHSFQ7XG4gICAgY29uc3QgdzogbnVtYmVyID0gKChvcHRpb25zKSAmJiAob3B0aW9ucy53aWR0aCkpID8gb3B0aW9ucy53aWR0aCA6IERFRkFVTFRfRElBTE9HX1dJRFRIO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBkaWFsb2dSZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0O1xuICAgICAgc3dpdGNoIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgY2FzZSBFeHRlbnNpb25EaWFsb2dSZXN1bHQuRGlhbG9nQWxyZWFkeU9wZW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkRpYWxvZ0FscmVhZHlPcGVuLCAnVGhlcmUgYWxyZWFkeSBleGlzdHMgYW4gb3BlbiBkaWFsb2cgZm9yIHRoaXMgZXh0ZW5zaW9uLicpO1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5JbnZhbGlkRG9tYWluOlxuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkRG9tYWluRGlhbG9nLFxuICAgICAgICAgICAgJ1RoZSB1cmwgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBtdXN0IG1hdGNoIHRoZSBkb21haW4gb2YgdGhlIHBhcmVudCBleHRlbnNpb24uJyk7XG4gICAgICAgIGRlZmF1bHQ6IC8vIFN1Y2Nlc3MgY2FzZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbG9zZURpYWxvZydcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsb3NlRGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBTZXR0aW5nc1NlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1NldHRpbmdzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9VSVNlcnZpY2VJbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZXR0aW5nc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyU2VydmljZShuZXcgVUlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckluaXRpYWxpemF0aW9uRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0LmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudHJ5LXVuYmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L0Q6L2Rldi9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvRDovZGV2L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS9EOi9kZXYvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvZ3VpZC9ndWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL0VtYmVkZGluZ0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9WaXpJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvSnNBcGlJbnRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvY29udHJhY3QvUGFyYW1ldGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9jb250cmFjdC9WZXJicy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9pbnRlcmZhY2UvVnFsSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL21lc3NhZ2luZy9NZXNzYWdlVHlwZUNoZWNrcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL0FwaVNoYXJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvQXBpVmVyc2lvbi50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZUJvb3RzdHJhcC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ZpZWxkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXRhU291cmNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9TaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9TaW5nbGVFdmVudE1hbmFnZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9Xb3Jrc2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Mb2dpY2FsVGFibGUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL01vZGVscy9HZXREYXRhTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Qb2ludC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvR2V0RGF0YVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRmlsdGVyU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1BhcmFtZXRlcnNTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVml6U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TaXplLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9UYWJsZVN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1RhYmxlYXVFcnJvci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVXRpbHMvRW51bUNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVXRpbHMvRXJyb3JIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9VdGlscy9QYXJhbS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVmVyc2lvbk51bWJlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVTaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVXb3Jrc2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQ29ubmVjdGVkU2VydmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1NldHRpbmdzSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVUlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL0Rhc2hib2FyZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmRPYmplY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtib29rLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtzaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRW52aXJvbm1lbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1NldHRpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9VSS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvVUlTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFD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LElBQUksSUFBRywrQ0FBNEIsQ0FBQyxJQUFJO1FBQ3RFLEdBQUMsK0NBQTRCLENBQUMsS0FBSyxJQUFHLCtDQUE0QixDQUFDLEtBQUs7UUFDeEUsR0FBQywrQ0FBNEIsQ0FBQyxRQUFRLElBQUcsK0NBQTRCLENBQUMsUUFBUTtRQUM5RSxHQUFDLCtDQUE0QixDQUFDLEdBQUcsSUFBRywrQ0FBNEIsQ0FBQyxHQUFHO1FBQ3BFLEdBQUMsK0NBQTRCLENBQUMsR0FBRyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxNQUFNLElBQUcsK0NBQTRCLENBQUMsTUFBTTtRQUMxRSxHQUFDLCtDQUE0QixDQUFDLEdBQUcsSUFBRywrQ0FBNEIsQ0FBQyxHQUFHO1FBQ3BFLEdBQUMsK0NBQTRCLENBQUMsTUFBTSxJQUFHLCtDQUE0QixDQUFDLE1BQU07UUFDMUUsR0FBQywrQ0FBNEIsQ0FBQyxTQUFTLElBQUcsK0NBQTRCLENBQUMsU0FBUztRQUNoRixHQUFDLCtDQUE0QixDQUFDLElBQUksSUFBRywrQ0FBNEIsQ0FBQyxJQUFJO1FBQ3RFLEdBQUMsK0NBQTRCLENBQUMsR0FBRyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxNQUFNLElBQUcsK0NBQTRCLENBQUMsTUFBTTtRQUMxRSxHQUFDLCtDQUE0QixDQUFDLE1BQU0sSUFBRywrQ0FBNEIsQ0FBQyxNQUFNO1FBQzFFLEdBQUMsK0NBQTRCLENBQUMsTUFBTSxJQUFHLCtDQUE0QixDQUFDLE1BQU07UUFDMUUsR0FBQywrQ0FBNEIsQ0FBQyxRQUFRLElBQUcsK0NBQTRCLENBQUMsUUFBUTtRQUM5RSxHQUFDLCtDQUE0QixDQUFDLEtBQUssSUFBRywrQ0FBNEIsQ0FBQyxLQUFLO1FBQ3hFLEdBQUMsK0NBQTRCLENBQUMsTUFBTSxJQUFHLCtDQUE0QixDQUFDLE1BQU07UUFDMUUsR0FBQywrQ0FBNEIsQ0FBQyxHQUFHLElBQUcsK0NBQTRCLENBQUMsR0FBRztRQUNwRSxHQUFDLCtDQUE0QixDQUFD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QUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM5RSxrQ0FBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSw2QkFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUhELHNFQUdDO0FBRUQsU0FBZ0Isd0NBQXdDLENBQUMsVUFBaUM7SUFDeEYsa0NBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUkscURBQXlCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRkQsNEZBRUMiLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuNy4wLXByZS41MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QtZXh0ZW5zaW9ucy9cIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi4vbGliL3NyYy9FeHRlbnNpb25zQXBpLmpzXCIpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ0FycmF5JywgJ2ZpbmQnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5NYXA7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNOYU47XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLnBhcnNlRmxvYXQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5wYXJzZUludDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5Qcm9taXNlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgJiYgaXQgIT09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIgKyBTdHJpbmcoaXQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICByZXN1bHQgPSBuZXcgQygpO1xuICAgIGZvciAoOyEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWU7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICByZXN1bHQgPSBuZXcgQyhsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuICBpbmRleE9mOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwidmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCwgZmlsdGVyT3V0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIElTX0ZJTFRFUl9PVVQgPSBUWVBFID09IDc7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0LCBzcGVjaWZpY0NyZWF0ZSkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjcmVhdGUgPSBzcGVjaWZpY0NyZWF0ZSB8fCBhcnJheVNwZWNpZXNDcmVhdGU7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiB8fCBJU19GSUxURVJfT1VUID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaC5jYWxsKHRhcmdldCwgdmFsdWUpOyAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgNDogcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAvLyBldmVyeVxuICAgICAgICAgIGNhc2UgNzogcHVzaC5jYWxsKHRhcmdldCwgdmFsdWUpOyAvLyBmaWx0ZXJPdXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbiAgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgZmlsdGVyOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuc29tZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiAgc29tZTogY3JlYXRlTWV0aG9kKDMpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuICBmaW5kOiBjcmVhdGVNZXRob2QoNSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gIGZpbmRJbmRleDogY3JlYXRlTWV0aG9kKDYpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlck91dGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWZpbHRlcmluZ1xuICBmaWx0ZXJPdXQ6IGNyZWF0ZU1ldGhvZCg3KVxufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBuZXcgKEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQykobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSwgbm8tdGhyb3ctbGl0ZXJhbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsInZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5mYXN0S2V5O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGluZGV4OiBjcmVhdGUobnVsbCksXG4gICAgICAgIGZpcnN0OiB1bmRlZmluZWQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogMFxuICAgICAgfSk7XG4gICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgIHZhciBwcmV2aW91cywgaW5kZXg7XG4gICAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUubGFzdCA9IGVudHJ5ID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCxcbiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVtb3ZlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzdGF0ZS5maXJzdCkgc3RhdGUuZmlyc3QgPSBlbnRyeTtcbiAgICAgICAgaWYgKHByZXZpb3VzKSBwcmV2aW91cy5uZXh0ID0gZW50cnk7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSsrO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSsrO1xuICAgICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHN0YXRlLmluZGV4W2luZGV4XSA9IGVudHJ5O1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9O1xuXG4gICAgdmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIC8vIGZhc3QgY2FzZVxuICAgICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpO1xuICAgICAgdmFyIGVudHJ5O1xuICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiBzdGF0ZS5pbmRleFtpbmRleF07XG4gICAgICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgICAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkge1xuICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgcmV0dXJuIGVudHJ5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuY2xlYXIoKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmNsZWFyXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuY2xlYXJcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZGF0YSA9IHN0YXRlLmluZGV4O1xuICAgICAgICB2YXIgZW50cnkgPSBzdGF0ZS5maXJzdDtcbiAgICAgICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnByZXZpb3VzKSBlbnRyeS5wcmV2aW91cyA9IGVudHJ5LnByZXZpb3VzLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5maXJzdCA9IHN0YXRlLmxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSA9IDA7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplID0gMDtcbiAgICAgIH0sXG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5kZWxldGUoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgICBkZWxldGUgc3RhdGUuaW5kZXhbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm5leHQgPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnByZXZpb3VzID0gcHJldjtcbiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDtcbiAgICAgICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkgc3RhdGUubGFzdCA9IHByZXY7XG4gICAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplLS07XG4gICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZm9yZWFjaFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmZvcmVhY2hcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICAgICAgdmFyIGVudHJ5O1xuICAgICAgICB3aGlsZSAoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm5leHQgOiBzdGF0ZS5maXJzdCkge1xuICAgICAgICAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBgeyBNYXAsIFNldH0ucHJvdG90eXBlLmhhcyhrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuaGFzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuaGFzXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyBgTWFwLnByb3RvdHlwZS5nZXQoa2V5KWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuc2V0XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5hZGRcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkge1xuICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InO1xuICAgIHZhciBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7XG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUueyBrZXlzLCB2YWx1ZXMsIGVudHJpZXMsIEBAaXRlcmF0b3IgfSgpYCBtZXRob2RzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5lbnRyaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmtleXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUudmFsdWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLUBAaXRlcmF0b3JcbiAgICBkZWZpbmVJdGVyYXRvcihDLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGVbQEBzcGVjaWVzXWAgYWNjZXNzb3JzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtbWFwLUBAc3BlY2llc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXNldC1AQHNwZWNpZXNcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7XG4gIHZhciBJU19NQVAgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ01hcCcpICE9PSAtMTtcbiAgdmFyIElTX1dFQUsgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ1dlYWsnKSAhPT0gLTE7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7XG4gIHZhciBleHBvcnRlZCA9IHt9O1xuXG4gIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbiAoS0VZKSB7XG4gICAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldO1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb3RvdHlwZSwgS0VZLFxuICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdnZXQnID8gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IHVuZGVmaW5lZCA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICB2YXIgUkVQTEFDRSA9IGlzRm9yY2VkKFxuICAgIENPTlNUUlVDVE9SX05BTUUsXG4gICAgdHlwZW9mIE5hdGl2ZUNvbnN0cnVjdG9yICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IE5hdGl2ZVByb3RvdHlwZS5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKS5lbnRyaWVzKCkubmV4dCgpO1xuICAgIH0pKVxuICApO1xuXG4gIGlmIChSRVBMQUNFKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0ZvcmNlZChDT05TVFJVQ1RPUl9OQU1FLCB0cnVlKSkge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgIC8vIGVhcmx5IGltcGxlbWVudGF0aW9ucyBub3Qgc3VwcG9ydHMgY2hhaW5pbmdcbiAgICB2YXIgSEFTTlRfQ0hBSU5JTkcgPSBpbnN0YW5jZVtBRERFUl0oSVNfV0VBSyA/IHt9IDogLTAsIDEpICE9IGluc3RhbmNlO1xuICAgIC8vIFY4IH4gQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihpdGVyYWJsZSk7IH0pO1xuICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgIHZhciBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICB2YXIgJGluc3RhbmNlID0gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIUFDQ0VQVF9JVEVSQUJMRVMpIHtcbiAgICAgIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGl0ZXJhYmxlKSB7XG4gICAgICAgIGFuSW5zdGFuY2UoZHVtbXksIENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IgfSwgZXhwb3J0ZWQpO1xuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkucHJvdG90eXBlLnsgdmFsdWVzLCBAQGl0ZXJhdG9yIH0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7IH07XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JztcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3NvZihnbG9iYWwucHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC93ZWIwcyg/IS4qY2hyb21lKS9pLnRlc3QodXNlckFnZW50KTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ25hdmlnYXRvcicsICd1c2VyQWdlbnQnKSB8fCAnJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgdmVyc2lvbiA9IG1hdGNoWzBdIDwgNCA/IDEgOiBtYXRjaFswXSArIG1hdGNoWzFdO1xufSBlbHNlIGlmICh1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSBtYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb24gJiYgK3ZlcnNpb247XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24uY2FsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1IsIE1FVEhPRCwgbGVuZ3RoKSB7XG4gIHJldHVybiBiaW5kKGNhbGwsIGdsb2JhbFtDT05TVFJVQ1RPUl0ucHJvdG90eXBlW01FVEhPRF0sIGxlbmd0aCk7XG59O1xuIiwiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHNvdXJjZVByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSwgZXMvbm8tb2JqZWN0LXByZXZlbnRleHRlbnNpb25zIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG4iLCJ2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0KTtcbiAgICB9O1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCJ2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwidmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaGFzT3duIHx8IGZ1bmN0aW9uIGhhc093bihpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHRvT2JqZWN0KGl0KSwga2V5KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGNvbnNvbGUuZXJyb3IoYSkgOiBjb25zb2xlLmVycm9yKGEsIGIpO1xuICB9XG59O1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aWVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9IDc7XG59KTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG5cbi8vIG1ha2VzIHN1YmNsYXNzaW5nIHdvcmsgY29ycmVjdCBmb3Igd3JhcHBlZCBidWlsdC1pbnNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCR0aGlzLCBkdW1teSwgV3JhcHBlcikge1xuICB2YXIgTmV3VGFyZ2V0LCBOZXdUYXJnZXRQcm90b3R5cGU7XG4gIGlmIChcbiAgICAvLyBpdCBjYW4gd29yayBvbmx5IHdpdGggbmF0aXZlIGBzZXRQcm90b3R5cGVPZmBcbiAgICBzZXRQcm90b3R5cGVPZiAmJlxuICAgIC8vIHdlIGhhdmVuJ3QgY29tcGxldGVseSBjb3JyZWN0IHByZS1FUzYgd2F5IGZvciBnZXR0aW5nIGBuZXcudGFyZ2V0YCwgc28gdXNlIHRoaXNcbiAgICB0eXBlb2YgKE5ld1RhcmdldCA9IGR1bW15LmNvbnN0cnVjdG9yKSA9PSAnZnVuY3Rpb24nICYmXG4gICAgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmXG4gICAgaXNPYmplY3QoTmV3VGFyZ2V0UHJvdG90eXBlID0gTmV3VGFyZ2V0LnByb3RvdHlwZSkgJiZcbiAgICBOZXdUYXJnZXRQcm90b3R5cGUgIT09IFdyYXBwZXIucHJvdG90eXBlXG4gICkgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7XG4gIHJldHVybiAkdGhpcztcbn07XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBNRVRBREFUQSA9IHVpZCgnbWV0YScpO1xudmFyIGlkID0gMDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgaWQrKywgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIG1ldGEuUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgUkVRVUlSRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrRGF0YTogZ2V0V2Vha0RhdGEsXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlO1xuIiwidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCA9ICdPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCc7XG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHtcbiAgdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiAgdmFyIHdtZ2V0ID0gc3RvcmUuZ2V0O1xuICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7XG4gIHZhciB3bXNldCA9IHN0b3JlLnNldDtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmICh3bWhhcy5jYWxsKHN0b3JlLCBpdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21oYXMuY2FsbChzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAob2JqZWN0SGFzKGl0LCBTVEFURSkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KSB7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCB1bmJvdW5kRnVuY3Rpb24sIG9wdGlvbnMpIHtcbiAgdmFyIHRoYXQgPSBvcHRpb25zICYmIG9wdGlvbnMudGhhdDtcbiAgdmFyIEFTX0VOVFJJRVMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuQVNfRU5UUklFUyk7XG4gIHZhciBJU19JVEVSQVRPUiA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19JVEVSQVRPUik7XG4gIHZhciBJTlRFUlJVUFRFRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JTlRFUlJVUFRFRCk7XG4gIHZhciBmbiA9IGJpbmQodW5ib3VuZEZ1bmN0aW9uLCB0aGF0LCAxICsgQVNfRU5UUklFUyArIElOVEVSUlVQVEVEKTtcbiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDtcblxuICB2YXIgc3RvcCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICBpZiAoaXRlcmF0b3IpIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIGNvbmRpdGlvbik7XG4gIH07XG5cbiAgdmFyIGNhbGxGbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChBU19FTlRSSUVTKSB7XG4gICAgICBhbk9iamVjdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZVswXSwgdmFsdWVbMV0sIHN0b3ApIDogZm4odmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICB9IHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlLCBzdG9wKSA6IGZuKHZhbHVlKTtcbiAgfTtcblxuICBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3VsdCA9IGNhbGxGbihpdGVyYWJsZVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTtcbiAgfVxuXG4gIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHtcbiAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgaWYgKHJldHVybk1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSkudmFsdWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLWFycmF5LXByb3RvdHlwZS1rZXlzIC0tIHNhZmUgKi9cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxudmFyIE5FV19JVEVSQVRPUl9QUk9UT1RZUEUgPSBJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1AQGl0ZXJhdG9yXG5pZiAoKCFJU19QVVJFIHx8IE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX1dFQk9TX1dFQktJVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0Jyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlLCB0aGVuO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICAvLyBhbHNvIGV4Y2VwdCBXZWJPUyBXZWJraXQgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg5OFxuICBpZiAoIUlTX0lPUyAmJiAhSVNfTk9ERSAmJiAhSVNfV0VCT1NfV0VCS0lUICYmIE11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIC8vIHdvcmthcm91bmQgb2YgV2ViS2l0IH4gaU9TIFNhZmFyaSAxMC4xIGJ1Z1xuICAgIHByb21pc2UuY29uc3RydWN0b3IgPSBQcm9taXNlO1xuICAgIHRoZW4gPSBwcm9taXNlLnRoZW47XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhlbi5jYWxsKHByb21pc2UsIGZsdXNoKTtcbiAgICB9O1xuICAvLyBOb2RlLmpzIHdpdGhvdXQgcHJvbWlzZXNcbiAgfSBlbHNlIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWV1ZU1pY3JvdGFzayB8fCBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICBpZiAoIWhlYWQpIHtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlO1xuIiwiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGBnZXQtb3duLXByb3BlcnR5LXN5bWJvbHNgIHBvbHlmaWxsIHN5bWJvbHMgY29udmVydGVkIHRvIG9iamVjdCBhcmUgbm90IFN5bWJvbCBpbnN0YW5jZXNcbiAgcmV0dXJuICFTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fFxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgIVN5bWJvbC5zaGFtICYmIFY4X1ZFUlNJT04gJiYgVjhfVkVSU0lPTiA8IDQxO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoaW5zcGVjdFNvdXJjZShXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG5cbi8vIGBOZXdQcm9taXNlQ2FwYWJpbGl0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5ld3Byb21pc2VjYXBhYmlsaXR5XG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHRyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciAkcGFyc2VGbG9hdCA9IGdsb2JhbC5wYXJzZUZsb2F0O1xudmFyIEZPUkNFRCA9IDEgLyAkcGFyc2VGbG9hdCh3aGl0ZXNwYWNlcyArICctMCcpICE9PSAtSW5maW5pdHk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKFN0cmluZyhzdHJpbmcpKTtcbiAgdmFyIHJlc3VsdCA9ICRwYXJzZUZsb2F0KHRyaW1tZWRTdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHRyaW1tZWRTdHJpbmcuY2hhckF0KDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6ICRwYXJzZUZsb2F0O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgJHBhcnNlSW50ID0gZ2xvYmFsLnBhcnNlSW50O1xudmFyIGhleCA9IC9eWystXT8wW1h4XS87XG52YXIgRk9SQ0VEID0gJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzB4MTYnKSAhPT0gMjI7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4KSB7XG4gIHZhciBTID0gdHJpbShTdHJpbmcoc3RyaW5nKSk7XG4gIHJldHVybiAkcGFyc2VJbnQoUywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3QoUykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gc2FmZVxudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IG9iamVjdEtleXMoUykuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUgKi9cbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBkb2N1bWVudC5kb21haW4gJiYgbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IGFjdGl2ZVhEb2N1bWVudCA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0aWVzIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBQcm9wZXJ0aWVzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0cHJvdG90eXBlb2YgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWtleXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAtLSBzYWZlICovXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7XG4gICAgc2V0dGVyLmNhbGwodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbi8vIGBPYmplY3QueyBlbnRyaWVzLCB2YWx1ZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUT19FTlRSSUVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChpdCk7XG4gICAgdmFyIGtleXMgPSBvYmplY3RLZXlzKE8pO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGkpIHtcbiAgICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChPLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4gIGVudHJpZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYE9iamVjdC52YWx1ZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICB2YXIgc3RhdGU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIH1cbiAgICBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgICBpZiAoIXN0YXRlLnNvdXJjZSkge1xuICAgICAgc3RhdGUuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICAgIH1cbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0pO1xuIiwiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCwga2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgfVxufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlO1xuIiwidmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogJzMuMTUuMicsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAyMSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyBjb2RlUG9pbnRBdCwgYXQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChDT05WRVJUX1RPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBwb3MpIHtcbiAgICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgICB2YXIgZmlyc3QsIHNlY29uZDtcbiAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpIHJldHVybiBDT05WRVJUX1RPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklORyA/IFMuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgMikgOiAoZmlyc3QgLSAweEQ4MDAgPDwgMTApICsgKHNlY29uZCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmNvZGVwb2ludGF0XG4gIGNvZGVBdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuYXRgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0XG4gIGNoYXJBdDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyIHdoaXRlc3BhY2UgPSAnWycgKyB3aGl0ZXNwYWNlcyArICddJztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyB3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJyk7XG52YXIgcnRyaW0gPSBSZWdFeHAod2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKiQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltLCB0cmltU3RhcnQsIHRyaW1FbmQsIHRyaW1MZWZ0LCB0cmltUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHtcbiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgdHJpbTogY3JlYXRlTWV0aG9kKDMpXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247XG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBwb3N0ID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMgLS0gc3BlYyByZXF1aXJlbWVudFxuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKFxuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmXG4gICAgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiZcbiAgICAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiZcbiAgICBsb2NhdGlvbiAmJiBsb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6JyAmJlxuICAgICFmYWlscyhwb3N0KVxuICApIHtcbiAgICBkZWZlciA9IHBvc3Q7XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bihpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGNsZWFyOiBjbGVhclxufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIvLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gYFRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIFBSRUZFUlJFRF9TVFJJTkcpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGlucHV0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciB0ZXN0ID0ge307XG5cbnRlc3RbVE9fU1RSSU5HX1RBR10gPSAneic7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpID09PSAnW29iamVjdCB6XSc7XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJyArIFN0cmluZyhrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyAoKytpZCArIHBvc3RmaXgpLnRvU3RyaW5nKDM2KTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIWhhcyhXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpIHx8ICEoTkFUSVZFX1NZTUJPTCB8fCB0eXBlb2YgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID09ICdzdHJpbmcnKSkge1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTtcbiAgICB9XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCIvLyBhIHN0cmluZyBvZiBhbGwgdmFsaWQgdW5pY29kZSB3aGl0ZXNwYWNlc1xubW9kdWxlLmV4cG9ydHMgPSAnXFx1MDAwOVxcdTAwMEFcXHUwMDBCXFx1MDAwQ1xcdTAwMERcXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUyMDAwXFx1MjAwMVxcdTIwMDInICtcbiAgJ1xcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxudmFyICRBZ2dyZWdhdGVFcnJvciA9IGZ1bmN0aW9uIEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSkge1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIGlmICghKHRoYXQgaW5zdGFuY2VvZiAkQWdncmVnYXRlRXJyb3IpKSByZXR1cm4gbmV3ICRBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UpO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9lcnJvci1tZXNzYWdlIC0tIGV4cGVjdGVkXG4gICAgdGhhdCA9IHNldFByb3RvdHlwZU9mKG5ldyBFcnJvcih1bmRlZmluZWQpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7XG4gIH1cbiAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgU3RyaW5nKG1lc3NhZ2UpKTtcbiAgdmFyIGVycm9yc0FycmF5ID0gW107XG4gIGl0ZXJhdGUoZXJyb3JzLCBlcnJvcnNBcnJheS5wdXNoLCB7IHRoYXQ6IGVycm9yc0FycmF5IH0pO1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ2Vycm9ycycsIGVycm9yc0FycmF5KTtcbiAgcmV0dXJuIHRoYXQ7XG59O1xuXG4kQWdncmVnYXRlRXJyb3IucHJvdG90eXBlID0gY3JlYXRlKEVycm9yLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3RvcjogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICRBZ2dyZWdhdGVFcnJvciksXG4gIG1lc3NhZ2U6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAnJyksXG4gIG5hbWU6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAnQWdncmVnYXRlRXJyb3InKVxufSk7XG5cbi8vIGBBZ2dyZWdhdGVFcnJvcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWdncmVnYXRlLWVycm9yLWNvbnN0cnVjdG9yXG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHtcbiAgQWdncmVnYXRlRXJyb3I6ICRBZ2dyZWdhdGVFcnJvclxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5maW5kO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbnZhciBGSU5EID0gJ2ZpbmQnO1xudmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTtcblxuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORCk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZyb20nKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYWJsZSk7XG59KTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBmcm9tOiBmcm9tXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBBUlJBWV9JVEVSQVRPUiA9ICdBcnJheSBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5c1xuLy8gYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUudmFsdWVzXG4vLyBgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVJdGVyYXRvcihBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLFxuICAgIHRhcmdldDogdG9JbmRleGVkT2JqZWN0KGl0ZXJhdGVkKSwgLy8gdGFyZ2V0XG4gICAgaW5kZXg6IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gIH0pO1xuLy8gYCVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHRhcmdldCA9IHN0YXRlLnRhcmdldDtcbiAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleCsrO1xuICBpZiAoIXRhcmdldCB8fCBpbmRleCA+PSB0YXJnZXQubGVuZ3RoKSB7XG4gICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBpbmRleCwgZG9uZTogZmFsc2UgfTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiB0YXJnZXRbaW5kZXhdLCBkb25lOiBmYWxzZSB9O1xuICByZXR1cm4geyB2YWx1ZTogW2luZGV4LCB0YXJnZXRbaW5kZXhdXSwgZG9uZTogZmFsc2UgfTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZW1hcHBlZGFyZ3VtZW50c29iamVjdFxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY29sbGVjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uJyk7XG52YXIgY29sbGVjdGlvblN0cm9uZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyBgTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVnZXInKTtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNpbnRlZ2VyXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzSW50ZWdlcjogaXNJbnRlZ2VyXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTnVtYmVyLmlzTmFOYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzbmFuXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWZsb2F0Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VGbG9hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZUZsb2F0XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbnVtYmVyLXBhcnNlZmxvYXQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUZsb2F0ICE9IHBhcnNlRmxvYXQgfSwge1xuICBwYXJzZUZsb2F0OiBwYXJzZUZsb2F0XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYE51bWJlci5wYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZWludFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1wYXJzZWludCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUsIGZvcmNlZDogTnVtYmVyLnBhcnNlSW50ICE9IHBhcnNlSW50IH0sIHtcbiAgcGFyc2VJbnQ6IHBhcnNlSW50XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuICAgIHJldHVybiAkZW50cmllcyhPKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5cGVPZlxufSk7XG4iLCJ2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZycpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdyZWplY3RlZCcsIHJlYXNvbjogZXJyb3IgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG52YXIgUFJPTUlTRV9BTllfRVJST1IgPSAnTm8gb25lIHByb21pc2UgcmVzb2x2ZWQnO1xuXG4vLyBgUHJvbWlzZS5hbnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFueVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgYW55OiBmdW5jdGlvbiBhbnkoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIGVycm9ycy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3JzW2luZGV4XSA9IGVycm9yO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIE5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNmaW5hbGx5YCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbmlmICghSVNfUFVSRSAmJiB0eXBlb2YgTmF0aXZlUHJvbWlzZSA9PSAnZnVuY3Rpb24nKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddICE9PSBtZXRob2QpIHtcbiAgICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21pY3JvdGFzaycpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19CUk9XU0VSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1icm93c2VyJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZSAmJiBOYXRpdmVQcm9taXNlLnByb3RvdHlwZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGU7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIE5BVElWRV9SRUpFQ1RJT05fRVZFTlQgPSB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbic7XG52YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudmFyIFJFSkVDVElPTl9IQU5ETEVEID0gJ3JlamVjdGlvbmhhbmRsZWQnO1xudmFyIFBFTkRJTkcgPSAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xudmFyIEhBTkRMRUQgPSAxO1xudmFyIFVOSEFORExFRCA9IDI7XG52YXIgU1VCQ0xBU1NJTkcgPSBmYWxzZTtcbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuO1xuXG52YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICB2YXIgUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAvLyBXZSBuZWVkIFByb21pc2UjZmluYWxseSBpbiB0aGUgcHVyZSB2ZXJzaW9uIGZvciBwcmV2ZW50aW5nIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgaWYgKElTX1BVUkUgJiYgIVByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZVsnZmluYWxseSddKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBEZXRlY3QgY29ycmVjdG5lc3Mgb2Ygc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSgxKTsgfSk7XG4gIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgZXhlYyhmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG4gIH07XG4gIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTtcbiAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBGYWtlUHJvbWlzZTtcbiAgU1VCQ0xBU1NJTkcgPSBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICBpZiAoIVNVQkNMQVNTSU5HKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICByZXR1cm4gIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgSVNfQlJPV1NFUiAmJiAhTkFUSVZFX1JFSkVDVElPTl9FVkVOVDtcbn0pO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9IEZPUkNFRCB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBbXSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZUNvbnN0cnVjdG9yUHJvdG90eXBlLCB7XG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUudGhlblxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHN0YXRlLnN0YXRlICE9IFBFTkRJTkcpIG5vdGlmeShzdGF0ZSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIGlmICghSVNfUFVSRSAmJiB0eXBlb2YgTmF0aXZlUHJvbWlzZSA9PSAnZnVuY3Rpb24nICYmIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZS50aGVuO1xuXG4gICAgaWYgKCFTVUJDTEFTU0lORykge1xuICAgICAgLy8gbWFrZSBgUHJvbWlzZSN0aGVuYCByZXR1cm4gYSBwb2x5ZmlsbGVkIGBQcm9taXNlYCBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIG5hdGl2ZVRoZW4uY2FsbCh0aGF0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NDBcbiAgICAgIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xuXG4gICAgICAvLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNjYXRjaGAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG4gICAgICByZWRlZmluZShOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAnY2F0Y2gnLCBQcm9taXNlQ29uc3RydWN0b3JQcm90b3R5cGVbJ2NhdGNoJ10sIHsgdW5zYWZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIG1ha2UgYC5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIHRyeSB7XG4gICAgICBkZWxldGUgTmF0aXZlUHJvbWlzZVByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcbiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbiAgICAvLyBtYWtlIGBpbnN0YW5jZW9mIFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIHNldFByb3RvdHlwZU9mKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsIFByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5zZXRTcGVjaWVzKFBST01JU0UpO1xuXG5Qcm9taXNlV3JhcHBlciA9IGdldEJ1aWx0SW4oUFJPTUlTRSk7XG5cbi8vIHN0YXRpY3NcbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gYFByb21pc2UucmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdFxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIC8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2hhckF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jaGFyQXQ7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvck1ldGhvZHMudmFsdWVzO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHtcbiAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gIT09IEFycmF5VmFsdWVzKSB0cnkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7XG4gICAgfVxuICAgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7XG4gICAgfVxuICAgIGlmIChET01JdGVyYWJsZXNbQ09MTEVDVElPTl9OQU1FXSkgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHtcbiAgICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZhbGlkYXRvciA9IG5ldyBSZWdFeHAoXCJeW2EtejAtOV17OH0tW2EtejAtOV17NH0tW2EtejAtOV17NH0tW2EtejAtOV17NH0tW2EtejAtOV17MTJ9JFwiLCBcImlcIik7XG5cbiAgZnVuY3Rpb24gZ2VuKGNvdW50KSB7XG4gICAgdmFyIG91dCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaT0wOyBpPGNvdW50OyBpKyspIHtcbiAgICAgIG91dCArPSAoKCgxK01hdGgucmFuZG9tKCkpKjB4MTAwMDApfDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBHdWlkKGd1aWQpIHtcbiAgICBpZiAoIWd1aWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50OyBgdmFsdWVgIGhhcyBubyB2YWx1ZS5cIik7XG4gICAgICBcbiAgICB0aGlzLnZhbHVlID0gR3VpZC5FTVBUWTtcbiAgICBcbiAgICBpZiAoZ3VpZCAmJiBndWlkIGluc3RhbmNlb2YgR3VpZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQudG9TdHJpbmcoKTtcblxuICAgIH0gZWxzZSBpZiAoZ3VpZCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZ3VpZCkgPT09IFwiW29iamVjdCBTdHJpbmddXCIgJiYgR3VpZC5pc0d1aWQoZ3VpZCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAvLyBDb21wYXJpbmcgc3RyaW5nIGB2YWx1ZWAgYWdhaW5zdCBwcm92aWRlZCBgZ3VpZGAgd2lsbCBhdXRvLWNhbGxcbiAgICAgIC8vIHRvU3RyaW5nIG9uIGBndWlkYCBmb3IgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIEd1aWQuaXNHdWlkKG90aGVyKSAmJiB0aGlzLnZhbHVlID09IG90aGVyO1xuICAgIH07XG5cbiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBHdWlkLkVNUFRZO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgfTtcblxuICBHdWlkLkVNUFRZID0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcblxuICBHdWlkLmlzR3VpZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmICh2YWx1ZSBpbnN0YW5jZW9mIEd1aWQgfHwgdmFsaWRhdG9yLnRlc3QodmFsdWUudG9TdHJpbmcoKSkpO1xuICB9O1xuXG4gIEd1aWQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBHdWlkKFtnZW4oMiksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigzKV0uam9pbihcIi1cIikpO1xuICB9O1xuXG4gIEd1aWQucmF3ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFtnZW4oMiksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigzKV0uam9pbihcIi1cIik7XG4gIH07XG5cbiAgaWYodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gR3VpZDtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgd2luZG93Lkd1aWQgPSBHdWlkO1xuICB9XG59KSgpO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbi8vIEV4cG9ydCBldmVyeXRoaW5nIGZyb20gdGhlIHNoYXJlZCBmaWxlXG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuXG4vLyBFeHBvcnQgdGhlIG5hbWVzcGFjZXMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIGVtYmVkZGluZ1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9UYWJsZWF1RXJyb3InO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9WaXpJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIERldmljZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIFRhYmxlYXVFdmVudFR5cGUgYXMgRW1iZWRkaW5nVGFibGVhdUV2ZW50VHlwZSxcbiAgVG9vbGJhcixcbiAgU2hlZXRTaXplQmVoYXZpb3Jcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcyc7XG5leHBvcnQge1xuICBGaXJzdFZpelNpemVLbm93bkV2ZW50LFxuICBUYWJsZWF1U2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1U2hlZXRFdmVudCxcbiAgVGFibGVhdVdvcmtzaGVldEV2ZW50IGFzIEVtYmVkZGluZ1RhYmxlYXVXb3Jrc2hlZXRFdmVudCxcbiAgTWFya3NTZWxlY3RlZEV2ZW50IGFzIEVtYmVkZGluZ01hcmtTZWxlY3RlZEV2ZW50LFxuICBGaWx0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nRmlsdGVyQ2hhbmdlZEV2ZW50XG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplT3B0aW9ucyxcbiAgU2hlZXQgYXMgRW1iZWRkaW5nU2hlZXQsXG4gIFdvcmtzaGVldCBhcyBFbWJlZGRpbmdXb3Jrc2hlZXQsXG4gIERhc2hib2FyZCBhcyBFbWJlZGRpbmdEYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFbWJlZGRpbmdEYXNoYm9hcmRPYmplY3Rcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0IHsgTWFyayB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU2VsZWN0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeVBvaW50IGFzIEVtYmVkZGluZ1N0b3J5UG9pbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5UG9pbnRJbnRlcmZhY2UnO1xuZXhwb3J0IHsgV29ya2Jvb2sgYXMgRW1iZWRkaW5nV29ya2Jvb2sgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dvcmtib29rSW50ZXJmYWNlJztcbmV4cG9ydCB7IEN1c3RvbVZpZXcgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dvcmtib29rSW50ZXJmYWNlJztcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG4vLyBFeHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoZSBzaGFyZWQgZmlsZVxuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcblxuLy8gRXhwb3J0IHRoZSBuYW1lc3BhY2VzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBleHRlbnNpb25zXG5leHBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9FdmVudEludGVyZmFjZSc7XG5leHBvcnQge1xuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgRGFzaGJvYXJkIGFzIEV4dGVuc2lvbkRhc2hib2FyZCxcbiAgRGFzaGJvYXJkT2JqZWN0IGFzIEV4dGVuc2lvbkRhc2hib2FyZE9iamVjdCxcbiAgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5XG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBXb3JrYm9vayBhcyBFeHRlbnNpb25Xb3JrYm9va1xufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9Xb3JrYm9va0ludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1BhcmFtZXRlckludGVyZmFjZXMnO1xuIiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvLyBBbGwgZW51bSB2YWx1ZXMgbWFkZSBhdmFpbGFibGUgdG8gRW1iZWRkaW5nIGRldmVsb3BlcnMuXG4vLyBFbnVtcyBzaG91bGQgYmUga2VwdCBpbiBhbHBoYWJldGljYWwgb3JkZXIuXG4vLyBNb3N0IG9mIHRoZW0gc2hvdWxkIG1hdGNoIGFuIGVudW0gb24gdGhlIHNlcnZlciBkZWZpbmVkIGF0XG4vLyB3b3JrZ3JvdXAvdnFsd2ViL3NjcmlwdHNoYXJwL3NyYy9BcGlTaGFyZWQvUHVibGljRW51bXMuY3MjTDM5ODoxN1xuXG4vKipcbiAqIGRldmljZSB0eXBlcyBhdmFpbGFibGUgdG8gdXNlIHdpdGggQFZpekludGVyZmFjZXM6Vml6Q3JlYXRlT3B0aW9uczpkZXZpY2VcbiAqL1xuZXhwb3J0IGVudW0gRGV2aWNlVHlwZSB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gIFRhYmxldCA9ICd0YWJsZXQnLFxuICBQaG9uZSA9ICdwaG9uZSdcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBUaGUgYnJvd3NlciBpcyBub3QgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBUYWJsZWF1IEphdmFTY3JpcHQgQVBJXG4gICAqL1xuICBCcm93c2VyTm90Q2FwYWJsZSA9ICdicm93c2VyLW5vdC1jYXBhYmxlJyxcbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9ucyBvbiBhIHdvcmtib29rIG9yIGEgdmlldyBkbyBub3QgYWxsb3cgZG93bmxvYWRpbmcgdGhlIHdvcmtib29rLlxuICAgKi9cbiAgRG93bmxvYWRXb3JrYm9va05vdEFsbG93ZWQgPSAnZG93bmxvYWQtd29ya2Jvb2stbm90LWFsbG93ZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJycyB3aXRoaW4gdGhlIFRhYmxlYXUgSmF2YVNjcmlwdCBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGFnZ3JlZ2F0aW9uIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBmaWx0ZXIsIHN1Y2ggYXMgc2V0dGluZyBhIHJhbmdlIGZpbHRlciB0byBcIlNVTShTYWxlcylcIiBpbnN0ZWFkIG9mXG4gICAqIFwiU2FsZXNcIi5cbiAgICovXG4gIEludmFsaWRBZ2dyZWdhdGlvbkZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZ3JlZ2F0aW9uLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBJbnZhbGlkRmlsdGVyRmllbGROYW1lID0gJ2ludmFsaWQtZmlsdGVyLW5hbWUnLFxuICAvKipcbiAgICogRWl0aGVyIGEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UsIG9yIHRoZSB2YWx1ZSBzdXBwbGllZFxuICAgKiBpbiB0aGUgZmlsdGVyIG9wZXJhdGlvbiBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIGludmFsaWRGaWx0ZXJGaWVsZE5hbWVPclZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQSBmaWx0ZXIgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgdXNpbmcgYSB2YWx1ZSB0aGF0IGlzIHRoZSB3cm9uZyBkYXRhIHR5cGUgb3IgZm9ybWF0LlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkVmFsdWUgPSAnaW52YWxpZC1maWx0ZXItZmllbGRWYWx1ZScsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2VcbiAgICogZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgZGF0ZSB2YWx1ZSB3YXMgc3BlY2lmaWVkIGluIGEgU2hlZXQuc2VsZWN0TWFya3NBc3luYygpIGNhbGwgZm9yIGEgZGF0ZSBmaWVsZC5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25EYXRlID0gJ2ludmFsaWQtc2VsZWN0aW9uLWRhdGUnLFxuICAvKipcbiAgICogQSBmaWVsZCB3YXMgc3BlY2lmaWVkIGluIGEgU2hlZXQuc2VsZWN0TWFya3NBc3luYygpIGNhbGwgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBJbnZhbGlkU2VsZWN0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtc2VsZWN0aW9uLWZpZWxkTmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbC5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25WYWx1ZSA9ICdpbnZhbGlkLXNlbGVjdGlvbi12YWx1ZScsXG4gIC8qKlxuICAgKiBBIG5lZ2F0aXZlIHNpemUgd2FzIHNwZWNpZmllZCBvciB0aGUgbWF4U2l6ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gbWluU2l6ZSBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKS5cbiAgICovXG4gIEludmFsaWRTaXplID0gJ2ludmFsaWQtc2l6ZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG90aGVyIHRoYW4gU2hlZXRTaXplQmVoYXZpb3IuQVVUT01BVElDIHdhcyBzcGVjaWZpZWQgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiB0aGUgc2hlZXQgaXMgYVxuICAgKiBXb3Jrc2hlZXQgaW5zdGFuY2UuXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yLW9uLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBUaGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgVml6IGNsYXNzIGNvbnN0cnVjdG9yIGlzIG5vdCB2YWxpZC5cbiAgICovXG4gIEludmFsaWRVcmwgPSAnaW52YWxpZC11cmwnLFxuICAvKipcbiAgICogVGhlIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuQVRNT1NULlxuICAgKi9cbiAgTWlzc2luZ01heFNpemUgPSAnbWlzc2luZy1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BVExFQVNULlxuICAgKi9cbiAgTWlzc2luZ01pbk1heFNpemUgPSAnbWlzc2luZy1taW4tbWF4LXNpemUnLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQSBnZW5lcmFsLXB1cnBvc2Ugc2VydmVyIGVycm9yIG9jY3VycmVkLiBEZXRhaWxzIGFyZSBjb250YWluZWQgaW4gdGhlIEVycm9yIG9iamVjdC5cbiAgICovXG4gIFNlcnZlckVycm9yID0gJ3NlcnZlci1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHNoZWV0IHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgU2hlZXROb3RJbldvcmtib29rID0gJ3NoZWV0LW5vdC1pbi13b3JrYm9vaycsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGEgQ3VzdG9tVmlldyBvYmplY3QgdGhhdCBpcyBubyBsb25nZXIgdmFsaWQgKGl0IGhhcyBiZWVuIHJlbW92ZWQpLlxuICAgKi9cbiAgU3RhbGVEYXRhUmVmZXJlbmNlID0gJ3N0YWxlLWRhdGEtcmVmZXJlbmNlJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqL1xuICBOb3RJbXBsZW1lbnRlZCA9ICdub3QtaW1wbGVtZW50ZWQnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciBkdXJpbmcgZXZlbnQgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIEV2ZW50SW5pdGlhbGl6YXRpb25FcnJvciA9ICdldmVudC1pbml0aWFsaXphdGlvbi1lcnJvcicsXG59XG5cblxuLyoqXG4gKiBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCBkaXNwbGF5U3RhdGljSW1hZ2UgaW4gQFZpekludGVyZmFjZXNcbiAqL1xuZXhwb3J0IGVudW0gRmlsZUZvcm1hdHMge1xuICBQREYgPSAncGRmJyxcbiAgUE5HID0gJ3BuZydcbn1cblxuZXhwb3J0IGVudW0gUmV2ZXJ0Vml6U2VsZWN0aW9uIHtcbiAgQWxsID0gJ2FsbCcsXG4gIEF4ZXMgPSAnYXhlcycsXG4gIEZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFNvcnRzID0gJ3NvcnRzJyxcbiAgU2hlbHZlcyA9ICdzaGVsdmVzJ1xufVxuXG5leHBvcnQgZW51bSBUb29sYmFyQnV0dG9ucyB7XG4gIEFsZXJ0cyA9ICdhbGVydHMnLFxuICBBc2tEYXRhID0gJ2Fza0RhdGEnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b21WaWV3cycsXG4gIERhdGFEZXRhaWxzID0gJ2RhdGFEZXRhaWxzJyxcbiAgU2hhcmUgPSAnc2hhcmUnLFxuICBTdWJzY3JpYmUgPSAnc3Vic2NyaWJlJ1xufVxuXG5leHBvcnQgZW51bSBUb29sYmFyIHtcbiAgVG9wID0gJ3RvcCcsXG4gIEJvdHRvbSA9ICdib3R0b20nLFxuICBIaWRkZW4gPSAnaGlkZGVuJ1xufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnXG59XG5cbi8qKlxuICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBuZXcgZXZlbnQgdHlwZXMuIEV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBmb2xsb3cgdHdvIGRpZmZlcmVudCBwYXR0ZXJucyBvbiBob3cgZXZlbnRzIGFyZSBuYW1lZC5cbiAqIEV2ZW50cyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UgYW5kIHdpdGhvdXQgaHlwZW5zIG9yIHVuZGVyc2NvcmVzLlxuICovXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0YWJsZWF1IGVtYmVkZGluZyBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlYXVFdmVudFR5cGUge1xuICAvKiogUmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLiovXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyY2hhbmdlZCcsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGFzIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy4qL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEZpcmVkIHdoZW4gdml6IHNpemUgaXMga25vd24gKi9cbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3R2aXpzaXpla25vd24nLFxuXG4gIC8qKiBGaXJlZCB3aGVuIGEgdml6IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmUgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcbn1cblxuIiwiaW1wb3J0IHtcbiAgRGV2aWNlVHlwZSwgRmlsZUZvcm1hdHMsIFNoZWV0U2l6ZUJlaGF2aW9yLCBUb29sYmFyQnV0dG9ucywgVG9vbGJhcixcbiAgUmV2ZXJ0Vml6U2VsZWN0aW9uLFxuICBUYWJsZWF1RXZlbnRUeXBlXG59IGZyb20gJy4vRW51bXMnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uL1NoYXJlZC9TaGVldEludGVyZmFjZXMnO1xuaW1wb3J0IHsgV29ya3NoZWV0LCBTaGVldEluZm8gfSBmcm9tICcuL1NoZWV0SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4vV29ya2Jvb2tJbnRlcmZhY2UnO1xuXG4vKipcbiAqIEFsbCB0aGUgc3RyaW5nIGNvbnN0YW50cyB1c2VkIGFzIGF0dHJpYnV0ZSBuYW1lcyBpbiBodG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF0dHJpYnV0ZXMge1xuICBTcmMgPSAnc3JjJyxcbiAgV2lkdGggPSAnd2lkdGgnLFxuICBIZWlnaHQgPSAnaGVpZ2h0JyxcbiAgRGlzYWJsZVVybEFjdGlvbnNQb3B1cHMgPSAnZGlzYWJsZS11cmwtYWN0aW9ucycsXG4gIEhpZGVUYWJzID0gJ2hpZGUtdGFicycsXG4gIFRvb2xiYXIgPSAndG9vbGJhcicsXG4gIEluc3RhbmNlSWRUb0Nsb25lID0gJ2luc3RhbmNlLWlkLXRvLWNsb25lJyxcbiAgRGV2aWNlID0gJ2RldmljZScsXG4gIFRva2VuID0gJ3Rva2VuJyxcbiAgVG91Y2hPcHRpbWl6ZSA9ICd0b3VjaC1vcHRpbWl6ZScsXG4gIERlYnVnID0gJ2RlYnVnJ1xufVxuLyoqXG4gKiBTdHJpbmcgY29uc3RhbnRzIHVzZWQgYXMgY2hpbGQgdGFncyBpbiBodG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudHMge1xuICBWaXpGaWx0ZXIgPSAndml6LWZpbHRlcicsXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJ1xufVxuXG5leHBvcnQgZW51bSBWaXpDaGlsZEVsZW1lbnRBdHRyaWJ1dGVzIHtcbiAgRmllbGQgPSAnZmllbGQnLFxuICBWYWx1ZSA9ICd2YWx1ZScsXG4gIE5hbWUgPSAnbmFtZSdcbn1cblxuLyoqXG4gKiBUaGlzIGRlZmluZXMgdGhlIGludGVyZmFjZSB0aGF0IHVzZXJzIHNlZSBmb3IgdGhlIHRvcCBsZXZlbCB2aXogb2JqZWN0XG4gKiBUaGVyZSBzaG91bGQgYmUgYW4gYXR0cmlidXRlIGluIGhlcmUgZm9yIGVhY2ggdmFsdWUgaW4gVml6QXR0cmlidXRlTmFtZXNcbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6IGV4dGVuZHMgVml6U2V0dGluZ3MsIFZpekxvY2FsU2V0dGluZ3MsIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogT25lIFdvcmtib29rIGlzIHN1cHBvcnRlZCBwZXIgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rPzogV29ya2Jvb2s7XG59XG5cbi8qKlxuICogTm90IHlldCBpbXBsZW1lbnRlZCAtIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqIFBhdXNlIGxheW91dCB1cGRhdGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlc2l6aW5nIHRoZSB2aXN1YWxpemF0aW9uIG9yIHBlcmZvcm1pbmcgbXVsdGlwbGUgY2FsbHMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlIGxheW91dC5cbiAgICovXG4gIHBhdXNlQXV0b21hdGljVXBkYXRlc0FzeW5jPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogUmVzdW1lIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgcmVzdW1lQXV0b21hdGljVXBkYXRlc0FzeW5jPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgUmV2ZXJ0IEFsbCB0b29sYmFyIGJ1dHRvbiwgd2hpY2ggcmVzdG9yZXMgdGhlIHdvcmtib29rIHRvIGl0cyBzdGFydGluZyBzdGF0ZS5cbiAgICovXG4gIHJldmVydEFsbEFzeW5jPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgUmVmcmVzaCBEYXRhIHRvb2xiYXIgYnV0dG9uLlxuICAgKi9cbiAgcmVmcmVzaERhdGFBc3luYz8oKTogdm9pZDtcblxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIERvd25sb2FkIHRvb2xiYXIgYnV0dG9uLCB3aGljaCBkb3dubG9hZHMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCB3b3JrYm9vay5cbiAgICovXG4gIHNob3dEb3dubG9hZFdvcmtib29rRGlhbG9nPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgRXhwb3J0IEltYWdlIHRvb2xiYXIgYnV0dG9uLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHNob3dFeHBvcnRJbWFnZURpYWxvZz8oKTogdm9pZDtcblxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIEV4cG9ydCBQREYgdG9vbGJhciBidXR0b24sIHdoaWNoIHNob3dzIGEgZGlhbG9nIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNlbGVjdCBvcHRpb25zIGZvciB0aGUgZXhwb3J0LlxuICAgKi9cbiAgc2hvd0V4cG9ydFBERkRpYWxvZz8oKTogdm9pZDtcblxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqIFNob3dzIHRoZSBFeHBvcnQgRGF0YSBkaWFsb2csIHdoaWNoIGlzIGN1cnJlbnRseSBhIHBvcHVwIHdpbmRvdy4gVGhlIHdvcmtzaGVldEluRGFzaGJvYXJkIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgbm90IHNwZWNpZmllZCxcbiAgICogdGhlIGN1cnJlbnRseSBhY3RpdmUgV29ya3NoZWV0IGlzIHVzZWQuXG4gICAqL1xuICBzaG93RXhwb3J0RGF0YURpYWxvZz8od29ya3NoZWV0SW5EYXNoYm9hcmQ6IFdvcmtzaGVldCB8IFNoZWV0SW5mbyB8IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBOb3RJbXBsZW1lbnRlZFxuICAgKiBTaG93cyB0aGUgRXhwb3J0IENyb3NzVGFiIGRpYWxvZy4gVGhlIHdvcmtzaGVldEluRGFzaGJvYXJkIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGN1cnJlbnRseSBhY3RpdmUgV29ya3NoZWV0IGlzXG4gICAqIHVzZWQuXG4gICAqL1xuICBzaG93RXhwb3J0Q3Jvc3NUYWJEaWFsb2c/KHdvcmtzaGVldEluRGFzaGJvYXJkOiBXb3Jrc2hlZXQgfCBTaGVldEluZm8gfCBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgU2hhcmUgdG9vbGJhciBidXR0b24sIHdoaWNoIGRpc3BsYXlzIGEgZGlhbG9nIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNoYXJlIHRoZSB2aXN1YWxpemF0aW9uIGJ5IGVtYWlsIG9yXG4gICAqIGJ5IGVtYmVkZGluZyBpdHMgSFRNTCBpbiBhIHdlYiBwYWdlLlxuICAgKi9cbiAgc2hvd1NoYXJlRGlhbG9nPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICogR2V0cyB0aGUgU3JjIG9mIHRoZSB2aXN1YWxpemF0aW9uIGFzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZ2V0Q3VycmVudFNyY0FzeW5jPygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEBOb3RJbXBsZW1lbnRlZFxuICAgKiBSZWRvZXMgbGFzdCBhY3Rpb24gb24gYSBzaGVldCwgZGVmYXVsdHMgdG8gYSBzaW5nbGUgcmVkbyB1bmxlc3Mgb3B0aW9uYWwgcGFyYW1ldGVycyBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICByZWRvQXN5bmM/KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBOb3RJbXBsZW1lbnRlZFxuICAgKiBVbmRvZXMgYWN0aW9uIG9uIHNoZWV0LCBkZWZhdWx0cyB0byBhIHNpbmdsZSB1bmRvIHVubGVzcyBvcHRpb25hbCBwYXJhbWV0ZXJzIGlzIHNwZWNpZmllZC5cbiAgICovXG4gIHVuZG9Bc3luYz8oKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5hZGRFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZnVuY3Rpb24gKG1hcmtzKSB7XG4gICAqICAgIGNoYW5nZU15U2VsZWN0aW9uVUkobWFya3MpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRFdmVudExpc3RlbmVyKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LCBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogdml6LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtYXJrc2VsZWN0aW9uY2hhbmdlZFwiLCBjaGFuZ2VNeVNlbGVjdGlvblVJKTtcbiAgICogYGBgXG4gICAqL1xuICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LCBvcHRpb25zPzogYm9vbGVhbiB8IEV2ZW50TGlzdGVuZXJPcHRpb25zKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXpTaXplIHtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2hlZXRTaXplIHJlY29yZCBmb3IgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICovXG4gIHJlYWRvbmx5IHNoZWV0U2l6ZTogU2hlZXRTaXplO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIFRhYmxlYXUgVUkgZWxlbWVudHMgKHRoZSBjaHJvbWUpIHN1cnJvdW5kaW5nIHRoZSB2aWV3LlxuICAgKi9cbiAgcmVhZG9ubHkgY2hyb21lSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hlZXRTaXplIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGFuIGVudW1lcmF0aW9uIHZhbHVlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBBVVRPTUFUSUMsIEVYQUNUTFksIFJBTkdFLCBBVExFQVNULCBhbmQgQVRNT1NULlxuICAgKi9cbiAgcmVhZG9ubHkgYmVoYXZpb3I6IFNoZWV0U2l6ZUJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgd2hlbiBiZWhhdmlvciBpcyBFWEFDVExZLCBSQU5HRSwgb3IgQVRMRUFTVC5cbiAgICovXG4gIHJlYWRvbmx5IG1pblNpemU6IFNpemU7XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFIG9yIEFUTU9TVC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemU6IFNpemU7XG59XG5cbi8qKlxuICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhbGwgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdG8gdml6cWxcbiAqIE5hbWVzIG9mIGF0dHJpYnV0ZXMgb24gdGhpcyBpbnRlcmZhY2UgbXVzdCBtYXRjaCBuYW1lcyBvbiBWcWxJbnRlcmZhY2UuVml6T3B0aW9uTmFtZXNcbiAqIEZvciBEZXYgUHJldmlldywgaXQgaXMgbGltaXRlZCB0byBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB2MiBvbiBWaXpDcmVhdGVPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2V0dGluZ3Mge1xuXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHN1cHByZXNzIHRoZSBleGVjdXRpb24gb2YgVVJMIGFjdGlvbnMuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhlIFVSTCBhY3Rpb25cbiAgICogZXZlbnQgZnJvbSBiZWluZyByYWlzZWQuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBJZiBzZXRcbiAgICogdG8gdHJ1ZSBhbmQgeW91IGNyZWF0ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFVSTF9BQ1RJT04gZXZlbnQsIHlvdSBjYW4gdXNlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqIGhhbmRsZXIgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBkaXNhYmxlLXVybC1hY3Rpb25zIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJzIGFyZSBoaWRkZW4gb3Igc2hvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGhpZGUtdGFicyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVUYWJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbGJhciwgaWYgaXQgaXMgc2hvd24uIFRoZSB2YWx1ZXMgY2FuIGJlIFRvb2xiYXIuVG9wLFxuICAgKiBUb29sYmFyLkJvdHRvbSBvciBUb29sYmFyLkhpZGRlbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gVG9vbGJhci5Cb3R0b20uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIHRvb2xiYXI9XCJoaWRkZW5cIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvb2xiYXI/OiBUb29sYmFyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBkZXZpY2UgbGF5b3V0IGZvciBhIGRhc2hib2FyZCwgaWYgaXQgZXhpc3RzLlxuICAgKiBWYWx1ZXMgY2FuIGJlIGRlZmF1bHQsIGRlc2t0b3AsIHRhYmxldCwgb3IgcGhvbmUuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGxvYWRpbmcgYSBsYXlvdXQgYmFzZWQgb24gdGhlXG4gICAqIHNtYWxsZXN0IGRpbWVuc2lvbiBvZiB0aGUgaG9zdGluZyBpZnJhbWUgZWxlbWVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgZGV2aWNlPVwiZGVza3RvcFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGV2aWNlPzogRGV2aWNlVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBJRCBvZiBhbiBleGlzdGluZyBpbnN0YW5jZSB0byBtYWtlIGEgY29weSAoY2xvbmUpIG9mLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZSBhbmFseXNpcyBvZiBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uXG4gICAqIHdpdGhvdXQgbG9zaW5nIHRoZSBzdGF0ZSBvZiB0aGUgb3JpZ2luYWwuIElmIHRoZSBJRCBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uLFxuICAgKiB0aGUgY2xvbmVkIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBpbnN0YW5jZS1pZC10by1jbG9uZT1cImlkMVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zdGFuY2VJZFRvQ2xvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICogVGhlIHRva2VuIHVzZWQgZm9yIGF1dGhvcml6YXRpb25cbiAgKlxuICAqIGBgYFxuICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICogYGBgXG4gICovXG4gIHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0b3VjaCBvcHRpbWl6ZSB2aXogY29udHJvbHMuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIHRvdWNoLW9wdGltaXplIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG91Y2hPcHRpbWl6ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZWQgZGVidWdnaW5nIGZvciB0aGUgY29tcG9uZW50LCBhbmQgVGFibGVhdSBTZXJ2ZXIgaWYgaXQgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgZGVidWcgLz5cbiAgICogYGBgXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlciBzdXBwbGllZCBvcHRpb25zIHRoYXQgZG8gbm90IGdldCBwYXNzZWQgdGhyb3VnaCB0byB2aXpxbFxuICogRm9yIERldmVsb3BlciBQcmV2aWV3IHRoaXMgd2lsbCBpbXBsZW1lbnQgYWxsIHRoZSBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBpblxuICogaW4gdjIgb24gVml6Q3JlYXRlT3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekxvY2FsU2V0dGluZ3Mge1xuXG5cbiAgLyoqXG4gICAqIFRoZSB2aXogc3JjXG4gICAqL1xuICBzcmM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHdpZHRoIGluIHBpeGVsc1xuICAgKiBDYW4gYmUgYW55IHZhbGlkIENTUyBzaXplIHNwZWNpZmllci4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHB1Ymxpc2hlZCB3aWR0aCBvZiB0aGUgdmlldy5cbiAgICovXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGhlaWdodCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgaGVpZ2h0IG9mIHRoZSB2aWV3LlxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyUGFyYW1ldGVycyB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tUGFyYW1ldGVycyBhcmUgdXNlZCB0byBwYXNzIGFsb25nIHNldHRpbmdzLCBpbmZvcm1hdGlvbiwgZXRjLiwgdGhhdCBhcmVuJ3QgZXhwb3NlZCBvbiB0aGVcbiAqIHRhYmxlYXUtdml6IGVsZW1lbnQuIEN1c3RvbVBhcmFtZXRlcnMgd2lsbCBvdmVycmlkZSBhdHRyaWJ1dGVzLCBvciBmaWx0ZXJzLCBzZXQgb24gdGhlIHRhYmxlYXUtdml6IGVsZW1lbnQuXG4gKlxuICogKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICAgKiAgPGN1c3RvbS1wYXJhbWV0ZXIgbmFtZT1cInBhcmFtZXRlci1uYW1lXCIgdmFsdWU9XCJwYXJhbWV0ZXItdmFsdWVcIiAvPlxuICAgKiA8L3RhYmxlYXUtdml6PlxuICAgKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwcmVzZW50IGluIHYyIHRoYXQgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiAqIFdlIG1heSBub3Qgd2FudCB0byBpbXBsZW1lbnQgdGhlbSBhdCBhbGxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWMk9wdGlvbnMge1xuXG4gIG5hdlR5cGU/OiBzdHJpbmc7IC8vIHVzZWQgdG8gbWFuYWdlIHNlc3Npb25zIHNlcnZlci1zaWRlIFRPRE8gbWFrZSBhbiBlbnVtIHNob3dpbmcgYWNjZXB0YWJsZSB2YWx1ZXNcbiAgZGlzcGxheVN0YXRpY0ltYWdlPzogYm9vbGVhbjsgLy8gaWYgdGhpcyBpcyBzZXQsIG1vc3Qgb3B0aW9ucyBhcmUgaWdub3JlZFxuICBkaXNwbGF5U3RhdGljRm9ybWF0PzogRmlsZUZvcm1hdHM7IC8vIGlmIGRpc3BsYXlTdGF0aWNJbWFnZSwgd2hpY2ggZm9ybWF0IHRvIGRpc3BsYXlcbiAgc3RhdGljSW1hZ2VVcmw/OiBzdHJpbmc7XG5cbiAgZm9yY2VPcmlnaW5hbFZpZXc/OiBib29sZWFuOyAvLyB3aHkgd291bGQgeW91IG5lZWQgdGhpcz9cbiAgaWZyYW1lU2l6ZWRUb1dpbmRvdz86IGJvb2xlYW47IC8vIEluZGljYXRlcyB3aGV0aGVyIGlmcmFtZSBpcyBzZXQgdG8gdGhlIHNpemUgb2Ygd2luZG93IG9yIG5vdC5cbiAgbG9hZE9yZGVyPzogbnVtYmVyOyAvLyBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/XG4gIGxpbmtUYXJnZXQ/OiBzdHJpbmc7XG5cbiAgb3BlbmlkX2hkPzogYm9vbGVhbjtcbiAgb3BlbmlkX2xvZ2luX2hpbnQ/OiBzdHJpbmc7XG5cbiAgcmVjb3JkUGVyZm9ybWFuY2U/OiBib29sZWFuO1xuICBmZXRjaEZyZXNoRGF0YT86IGJvb2xlYW47IC8vID09IHJlZnJlc2g9eWVzXG5cbiAgcmVuZGVySW5Ccm93c2VyPzogbnVtYmVyOyAvLyAwID0gbm8sIDEwMCA9IGFsd2F5c1xuICByZXZlcnRXb3JrPzogUmV2ZXJ0Vml6U2VsZWN0aW9uO1xuXG5cbiAgaGlkZU1vYmlsZUFwcEJhbm5lcj86IGJvb2xlYW47XG4gIGhpZGVUb29sYmFyQnV0dG9ucz86IFRvb2xiYXJCdXR0b25zW107XG5cbiAgaGlkZVRvb2x0aXBzPzogYm9vbGVhbjtcbiAgb3B0aW1pemVGb3JUb3VjaD86IGJvb2xlYW47XG4gIHVzZUxvd0RwaT86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBtb3JlIHYyIG9wdGlvbnMgLSBzcGVjaWZpYyB0byBUYWJsZWF1IFB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlYXVQdWJsaWNPcHRpb25zIHtcbiAgc2hvd1ZpekhvbWU/OiBib29sZWFuO1xuICBzaG93RGlzcGxheUNvdW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBtb3JlIHYyIG9wdGlvbnMgLSBUcnVzdGVkIFRpY2tldHMgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcnVzdGVkVGlja2V0T3B0aW9ucyB7XG4gIHBhdGg/OiBzdHJpbmc7ICAvLyBkbyB3ZSBuZWVkIHRvIGtlZXAgdGhpcyBvcHRpb24/IG9yIG1heWJlIHdlIGtlZXAgdGhpcyBhbmQgbm90IHRpY2tldD9cbiAgc2l0ZVJvb3Q6IHN0cmluZzsgLy8gaW5jbHVkZXMgdGhlICM/Pz8gZXhhbXBsZSB2YWx1ZT0nLyMvU2FsZXMnXG4gIHRpY2tldD86IHN0cmluZzsgLy8gZXhhbXBsZSB2YWx1ZT0nOUQxT2J5cURRbVNJT3lRcEtkeTRTdz09OmRnNjJnQ3NTRTBRUkFyWE5UT3A2bWxKNSdcbiAgbmFtZT86IHN0cmluZzsgLy8gY29tcGxldGUgdml6IG5hbWU6IHZhbHVlPSdFeGFtcGxlQ29TYWxlcy9TYWxlcy9qc21pdGhAZXhhbXBsZS5jb20vRWFzdFJlZ2lvblNhbGVzJ1xufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBFeHRlbnNpb25zIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgICBTZXJ2ZXIgPSAnc2VydmVyJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlIGluIHdoaWNoIHRoZSBFeHRlbnNpb25zIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXh0ZW5zaW9uTW9kZSB7XG4gICAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gICAgVmlld2luZyA9ICd2aWV3aW5nJ1xuICB9XG5cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKiogUmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyLWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGFzIGNoYW5nZWQuXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4gKi9cbiAgICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrLXNlbGVjdGlvbi1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLiAqL1xuICAgIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyLWNoYW5nZWQnLFxuXG4gICAgLyoqIFNldHRpbmdzIGhhdmUgYmVlbiBjaGFuZ2VkIGZvciB0aGlzIGV4dGVuc2lvbi4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tTZXR0aW5nc11dIG9iamVjdHMuICovXG4gICAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSBkYXNoYm9hcmQgbGF5b3V0IGhhcyBjaGFuZ2VkICovXG4gICAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSBkYXNoYm9hcmQgbGF5b3V0IGhhcyBjaGFuZ2VkICovXG4gICAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLyoqXG4gKiBUaGUgdGFibGVhdSBuYW1lc3BhY2UgZXhpc3RzIGZvciBvcmdhbml6YXRpb24gYW5kIHRvIGF2b2lkIHBvbGx1dGluZ1xuICogdGhlIGdsb2JhbCBuYW1lc3BhY2UuIEl0IGNvbnRhaW5zIG5vIGNvbnN0cnVjdHMgb3RoZXIgdGhhbiBzdWItbmFtZXNwYWNlcyBhbmQgdGhlIFRhYmxlYXUgZW51bWVyYXRpb25zLlxuICovXG5uYW1lc3BhY2UgVGFibGVhdSB7XG4gIGV4cG9ydCBlbnVtIEFuYWx5dGljc09iamVjdFR5cGUge1xuICAgIENsdXN0ZXIgPSAnY2x1c3RlcicsXG4gICAgRm9yZWNhc3QgPSAnZm9yZWNhc3QnLFxuICAgIFRyZW5kTGluZSA9ICd0cmVuZC1saW5lJ1xuICB9XG5cbiAgZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cydcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENsYXNzTmFtZUtleSB7XG4gICAgV29ya3NoZWV0VGl0bGUgPSAndGFibGVhdS13b3Jrc2hlZXQtdGl0bGUnLFxuICAgIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gICAgVG9vbHRpcCA9ICd0YWJsZWF1LXRvb2x0aXAnLFxuICAgIFN0b3J5VGl0bGUgPSAndGFibGVhdS1zdG9yeS10aXRsZScsXG4gICAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnXG4gIH1cblxuICAvKipcbiAgICogV2hhdCB0aGUgb2JqZWN0IHJlcHJlc2VudHMgaW4gYSBkYXNoYm9hcmQuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgICBCbGFuayA9ICdibGFuaycsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gICAgUXVpY2tGaWx0ZXIgPSAncXVpY2stZmlsdGVyJyxcbiAgICBQYXJhbWV0ZXJDb250cm9sID0gJ3BhcmFtZXRlci1jb250cm9sJyxcbiAgICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgICBMZWdlbmQgPSAnbGVnZW5kJyxcbiAgICBUaXRsZSA9ICd0aXRsZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBJbWFnZSA9ICdpbWFnZScsXG4gICAgV2ViUGFnZSA9ICd3ZWItcGFnZScsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZCBkYXRlIHJhbmdlcyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlci5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAgIExhc3QgPSAnbGFzdCcsXG4gICAgTGFzdE4gPSAnbGFzdC1uJyxcbiAgICBOZXh0ID0gJ25leHQnLFxuICAgIE5leHROID0gJ25leHQtbicsXG4gICAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgICBUb0RhdGUgPSAndG8tZGF0ZSdcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gICAgQ29sdW1uID0gJ2NvbHVtbicsXG4gICAgUm93ID0gJ3JvdycsXG4gICAgUGFnZSA9ICdwYWdlJyxcbiAgICBGaWx0ZXIgPSAnZmlsdGVyJyxcbiAgICBNYXJrc1R5cGUgPSAnbWFya3MtdHlwZScsXG4gICAgTWVhc3VyZVZhbHVlcyA9ICdtZWFzdXJlLXZhbHVlcycsXG4gICAgQ29sb3IgPSAnY29sb3InLFxuICAgIFNpemUgPSAnc2l6ZScsXG4gICAgTGFiZWwgPSAnbGFiZWwnLFxuICAgIERldGFpbCA9ICdkZXRhaWwnLFxuICAgIFRvb2x0aXAgPSAndG9vbHRpcCcsXG4gICAgU2hhcGUgPSAnc2hhcGUnLFxuICAgIFBhdGggPSAncGF0aCcsXG4gICAgQW5nbGUgPSAnYW5nbGUnXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb3VudCA9ICdjb3VudCcsXG4gICAgQ291bnRkID0gJ2NvdW50ZCcsXG4gICAgTWVkaWFuID0gJ21lZGlhbicsXG4gICAgQXR0ciA9ICdhdHRyJyxcbiAgICBOb25lID0gJ25vbmUnLFxuICAgIFllYXIgPSAneWVhcicsXG4gICAgUXRyID0gJ3F0cicsXG4gICAgTW9udGggPSAnbW9udGgnLFxuICAgIERheSA9ICdkYXknLFxuICAgIEhvdXIgPSAnaG91cicsXG4gICAgTWludXRlID0gJ21pbnV0ZScsXG4gICAgU2Vjb25kID0gJ3NlY29uZCcsXG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBXZWVrZGF5ID0gJ3dlZWtkYXknLFxuICAgIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgICBNZHkgPSAnbWR5JyxcbiAgICBFbmQgPSAnZW5kJyxcbiAgICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gICAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgICBUcnVuY01vbnRoID0gJ3RydW5jLW1vbnRoJyxcbiAgICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gICAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgICBUcnVuY0hvdXIgPSAndHJ1bmMtaG91cicsXG4gICAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICAgIFF1YXJ0MSA9ICdxdWFydDEnLFxuICAgIFF1YXJ0MyA9ICdxdWFydDMnLFxuICAgIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgICBLdXJ0b3NpcyA9ICdrdXJ0b3NpcycsXG4gICAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgICBVc2VyID0gJ3VzZXInXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHZhbGlkIHR5cGVzIG9mIGZpbHRlcnMgdGhhdCBjYW4gYmUgYXBwbGllZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlclR5cGUge1xuICAgIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgICBSYW5nZSA9ICdyYW5nZScsXG4gICAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG4gICAgUmVsYXRpdmVEYXRlID0gJ3JlbGF0aXZlLWRhdGUnXG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpZmZlcmVudCB1cGRhdGUgdHlwZXMgZm9yIGFwcGx5aW5nIGZpbHRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyVXBkYXRlVHlwZSB7XG4gICAgQWRkID0gJ2FkZCcsXG4gICAgQWxsID0gJ2FsbCcsXG4gICAgUmVwbGFjZSA9ICdyZXBsYWNlJyxcbiAgICBSZW1vdmUgPSAncmVtb3ZlJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnXG4gIH1cblxuICAvKipcbiAgICogVGhlIG9wdGlvbiBmb3Igc3BlY2lmeWluZyB3aGljaCB2YWx1ZXMgdG8gaW5jbHVkZSBmb3IgZmlsdGVyaW5nXG4gICAqIEluZGljYXRlcyB3aGF0IHRvIGRvIHdpdGggbnVsbCB2YWx1ZXMgZm9yIGEgZ2l2ZW4gZmlsdGVyIG9yIG1hcmsgc2VsZWN0aW9uIGNhbGwuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJOdWxsT3B0aW9uIHtcbiAgICBOdWxsVmFsdWVzID0gJ251bGwtdmFsdWVzJyxcbiAgICBOb25OdWxsVmFsdWVzID0gJ25vbi1udWxsLXZhbHVlcycsXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHNlcnZlcyBhcyBhIGZpbHRlciBvbiB0aGUgRGF0YVZhbHVlcyByZXR1cm5lZCBmcm9tIGBnZXRTdW1tYXJ5RGF0YUFzeW5jYCxcbiAgICogYGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luY2AgYW5kIGBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmNgLlxuICAgKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBvZiByZXR1cm5lZCBkYXRhIHZhbHVlcyBvbmx5LiBUYWJsZWF1IHZlcnNpb25zIHByaW9yIHRvIDIwMjEuMlxuICAgKiB3aWxsIHBhc3MgdGhlIGRhdGEgYWNyb3NzIGFuZCBwb3B1bGF0ZSB0aGUgRGF0YVZhbHVlIHByb3BlcnRpZXMuXG4gICAqIFBsZWFzZSBub3RlIHRoYXQgYWxsIHByb3BlcnRpZXMgbm90IHJlcXVlc3RlZCB3aWxsIGJlIGB1bmRlZmluZWRgIGluIHRoZSBEYXRhVmFsdWUgcmVzdWx0cy5cbiAgICogQHNpbmNlIDEuNS4wXG4gICAqL1xuICBleHBvcnQgZW51bSBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB7XG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBpbmNsdWRlIGFsbCBwcm9wZXJ0aWVzLiovXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnLFxuXG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBvbmx5IGluY2x1ZGUgdmFsdWUgYW5kIG5hdGl2ZVZhbHVlIHByb3BlcnRpZXMuKi9cbiAgICBPbmx5TmF0aXZlVmFsdWVzID0gJ29ubHktbmF0aXZlLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSBmb3JtYXR0ZWRWYWx1ZSBwcm9wZXJ0aWVzLiAqL1xuICAgIE9ubHlGb3JtYXR0ZWRWYWx1ZXMgPSAnb25seS1mb3JtYXR0ZWQtdmFsdWVzJ1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWxsb3dhYmxlIHZhbHVlcy5cbiAgICogVGhpcyBpcyB1c2VkIGZvciByZXN0cmljdGluZyB0aGUgZG9tYWluIG9mIGEgcGFyYW1ldGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBQYXJhbWV0ZXJWYWx1ZVR5cGUge1xuICAgIEFsbCA9ICdhbGwnLFxuICAgIExpc3QgPSAnbGlzdCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnXG4gIH1cblxuICAvKipcbiAgICogRGF0ZSBwZXJpb2QgdXNlZCBpbiBmaWx0ZXJzIGFuZCBpbiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGVyaW9kVHlwZSB7XG4gICAgWWVhcnMgPSAneWVhcnMnLFxuICAgIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgICBNb250aHMgPSAnbW9udGhzJyxcbiAgICBXZWVrcyA9ICd3ZWVrcycsXG4gICAgRGF5cyA9ICdkYXlzJyxcbiAgICBIb3VycyA9ICdob3VycycsXG4gICAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgICBTZWNvbmRzID0gJ3NlY29uZHMnXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCdcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdGlvblVwZGF0ZVR5cGUge1xuICAgIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICAgIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgICBSZW1vdmUgPSAnc2VsZWN0LXJlbW92ZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzaGVldCBhIFtbU2hlZXRdXSBvYmplY3QgcmVwcmVzZW50c1xuICAgKi9cbiAgZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBTdG9yeSA9ICdzdG9yeScsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCdcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIFNvcnREaXJlY3Rpb24ge1xuICAgIEluY3JlYXNpbmcgPSAnaW5jcmVhc2luZycsXG4gICAgRGVjcmVhc2luZyA9ICdkZWNyZWFzaW5nJ1xuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCdcbiAgfVxuXG4gIC8qKlxuICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uLlxuICAqIEBzaW5jZSAxLjcuMFxuICAqL1xuICBleHBvcnQgZW51bSBSZXBsYXlTcGVlZFR5cGUge1xuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDAuNXguKi9cbiAgICBTbG93ID0gJ3Nsb3cnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMS4weC4qL1xuICAgIE5vcm1hbCA9ICdub3JtYWwnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMi4weC4qL1xuICAgIEZhc3QgPSAnZmFzdCcsXG4gIH1cblxuICAvKipcbiAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBkYXRhIHR5cGUgb2YgZW5jb2RpbmdzIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICogQHNpbmNlIDEuNi4wXG4gKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VFbmNvZGluZ1R5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnXG4gIH1cblxuICAvKipcbiAgICogWm9uZVZpc2liaWxpdHlUeXBlXG4gICAqIEBkZXByZWNhdGVkIHVzZSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZVxuICAgKi9cbiAgZXhwb3J0IGRlY2xhcmUgdHlwZSBab25lVmlzaWJpbGl0eVR5cGUgPSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZTtcbiAgZXhwb3J0IGNvbnN0IFpvbmVWaXNpYmlsaXR5VHlwZSA9IHsgLi4uRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUgfTtcbn1cbmV4cG9ydCA9IFRhYmxlYXU7XG4iLCIvLyBUaGlzIGZpbGUgcmUtZXhwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0Vudmlyb25tZW50SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0ZpbHRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvV29ya2Jvb2tGb3JtYXR0aW5nSW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBDbGFzc05hbWVLZXksXG4gIENvbHVtblR5cGUsXG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBWaXpJbWFnZUVuY29kaW5nVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9hc3NpZ24nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9FbnVtcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9WZXJicyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW50ZXJuYWxBcGlEaXNwYXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL1ZlcnNpb25OdW1iZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVnFsSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIFRoZXNlIGFyZSB0aGUgZXhwb3J0cyBmcm9tIHRoZSBtZXNzYWdpbmcgc3R1ZmZcblxuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QuXG4vLyAgVGhpcyBpcyBwdWxsZWQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUuXG4vLyBOT1RFOiBzZW12ZXIgcGFja2FnZSBpcyBwcmVmZXJyZWQgaGVyZSwgYnV0IHJlcXVpcmVzIHRyYW5zcGlsZXJcbi8vICBsaWtlIGJhYmVsIGFzIHBhcnQgb2Ygb3VyIHdlYnBhY2sgY29uZmlnLlxuLy8gaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgKiBhcyBwYWNrSnNvbiBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgSW50ZXJuYWxUYWJsZWF1RXJyb3IgfSBmcm9tICcuL2NvbnRyYWN0L01vZGVscyc7XG5cbmxldCB2ZXJzaW9uUGFydHM7XG50cnkge1xuICB2ZXJzaW9uUGFydHMgPSBwYWNrSnNvbi52ZXJzaW9uLnNwbGl0KCcuJykubWFwKHAgPT4gcGFyc2VJbnQocCwgMTApKTtcbn0gY2F0Y2ggKGUpIHtcbiAgY29uc29sZS5lcnJvcihlKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgaW50ZXJuYWwgY29udHJhY3QgdmVyc2lvbiAke3BhY2tKc29uLnZlcnNpb259YCkgYXMgSW50ZXJuYWxUYWJsZWF1RXJyb3I7XG59XG5cbmV4cG9ydCBjb25zdCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OID0ge1xuICBtYWpvcjogdmVyc2lvblBhcnRzWzBdLFxuICBtaW5vcjogdmVyc2lvblBhcnRzWzFdLFxuICBmaXg6IHZlcnNpb25QYXJ0c1syXSxcbn07XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDBcbn07XG4iLCJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4vRW51bXMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVR5cGVDb252ZXJ0ZXIge1xuXG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3I6IHN0cmluZyA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBsZXQgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKG5vcm1hbGl6ZWRCb29sZWFuICE9PSAndHJ1ZScgJiYgbm9ybWFsaXplZEJvb2xlYW4gIT09ICdmYWxzZScpXG4gICAgICA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yXG4gICAgICA6IG5vcm1hbGl6ZWRCb29sZWFuID09PSAndHJ1ZSc7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgbGV0IHZhbHVlOiBudW1iZXIgPSBOdW1iZXIodmFsdWVBc1N0cmluZyk7XG4gICAgcmV0dXJuIGlzTmFOKHZhbHVlKSA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gTm90ZSB0aGF0IHdpdGhvdXQgYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQ1xuICAgIC8vIElucHV0IG9mIDIwMjAtMDMtMjUgaXMgcHJpbnRlZCBhczogTWFyIDI0IDIwMjAgMTc6MDA6MDAgR01ULTA3MDBcbiAgICAvLyBUaGlzIG1hdGNoZXMgc3R5bGUgdXNlZCBpbiBleGlzdGluZyBjb252ZXJ0RmlsdGVyVmFsdWVQcmVzTW9kZWxcbiAgICBsZXQgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICBsZXQgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGxldCB2YWx1ZSA9IG5ldyBEYXRlKGZvcm1hdHRlZERhdGVTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWVBc1N0cmluZzogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIFRoaXMgaXMgYm90aCBEYXRhRGljdGlvbmFyeSBhbmQgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb21wYXRpYmxlLlxuICAgIC8vIEluIHRoZSBEYXRhRGljdGlvbmFyeSwgdmFsdWVBc1N0cmluZyBjYW4gYmUgJyVudWxsJScgb3IgJyVtaXNzaW5nJScsIHdoaWxlIGluXG4gICAgLy8gU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgd2UgY2FuIGdldCAnbnVsbCcgb3IgJ21pc3NpbmcnLCBvciAnJW51bGwlJyBmb3Igc3RyaW5nIHNwZWNpYWwgdmFsdWVzLlxuICAgIC8vIEZvciBlaXRoZXIgb2YgdGhlc2UgY2FzZXMsIHdlIHJldHVybiBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgKG9yIHRoZSBvcmlnaW5hbCBzcGVjaWFsIHN0cmluZykuXG4gICAgLy8gVG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWx0eSwgdGhpcyBjb252ZXJ0ZXI6XG4gICAgLy8gMS4gcmV0dXJucyBhIHN0cmluZyBmb3IgYW55IHNwZWNpYWwgdmFsdWVzXG4gICAgLy8gMi4gcmV0dXJucyBhIHN0cmluZyBmb3IgYW55IGRhdGVcblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IHZhbHVlcyBjYW4gYmUgdW5kZWZpbmVkLCBzbyByZXN1bHQgaXMgYWxzbyB1bmRlZmluZWRcbiAgICBpZiAodmFsdWVBc1N0cmluZyA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlQXNTdHJpbmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmcpKSB7XG4gICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCb29sZWFuKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIC8vIFJldHVybiBzcGVjaWFsIHZhbHVlICclbnVsbCUnIGZvciBhbnkgZmFpbHVyZSBpbiBwYXJzaW5nLlxuICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSBTaG93RGF0YVRhYmxlUHJlc01vZGVsIHdpbGwgZ2l2ZSB1cyBzdHJpbmdzIGxpa2UgJ251bGwnXG4gICAgICAgIC8vIGZvciBzcGVjaWFsIHZhbHVlcy5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJy5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuICB9XG5cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICByZXR1cm4gdGhpcy5pc1NwZWNpYWwodmFsdWUpID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRTdHJpbmdWYWx1ZVRvTmF0aXZlVmFsdWUodmFsdWU6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyB8IG51bGwge1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBmcm9tIHN0cmluZyBkaXJlY3RseSB0byBuYXRpdmUgdmFsdWUgZm9yIGFsbCB0eXBlc1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUodGhpcy5jb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWUsIHR5cGUpLCB0eXBlKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gRXh0ZW5zaW9uQ29udGV4dCB7XG4gIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gIFNlcnZlciA9ICdzZXJ2ZXInLFxuICBVbmtub3duID0gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgVmlld2luZyA9ICd2aWV3aW5nJyxcbiAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcbiAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnXG59XG5cbmV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICBCbGFuayA9ICdibGFuaycsXG4gIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICBQYXJhbWV0ZXJDb250cm9sID0gJ3BhcmFtZXRlci1jb250cm9sJyxcbiAgUGFnZUZpbHRlciA9ICdwYWdlLWZpbHRlcicsXG4gIExlZ2VuZCA9ICdsZWdlbmQnLFxuICBUaXRsZSA9ICd0aXRsZScsXG4gIFRleHQgPSAndGV4dCcsXG4gIEltYWdlID0gJ2ltYWdlJyxcbiAgV2ViUGFnZSA9ICd3ZWItcGFnZScsXG4gIEV4dGVuc2lvbiA9ICdleHRlbnNpb24nXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCdcbn1cblxuZXhwb3J0IGVudW0gRW5jb2RlZERhdGFUeXBlIHtcbiAgTnVtYmVyID0gJ251bWJlcicsXG4gIFN0cmluZyA9ICdzdHJpbmcnLFxuICBEYXRlID0gJ2RhdGUnLFxuICBCb29sZWFuID0gJ2Jvb2xlYW4nXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgU3VtID0gJ3N1bScsXG4gIEF2ZyA9ICdhdmcnLFxuICBNaW4gPSAnbWluJyxcbiAgTWF4ID0gJ21heCcsXG4gIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gIFZhciA9ICd2YXInLFxuICBWYXJwID0gJ3ZhcnAnLFxuICBDb3VudCA9ICdjb3VudCcsXG4gIENvdW50ZCA9ICdjb3VudGQnLFxuICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgQXR0ciA9ICdhdHRyJyxcbiAgTm9uZSA9ICdub25lJyxcbiAgWWVhciA9ICd5ZWFyJyxcbiAgUXRyID0gJ3F0cicsXG4gIE1vbnRoID0gJ21vbnRoJyxcbiAgRGF5ID0gJ2RheScsXG4gIEhvdXIgPSAnaG91cicsXG4gIE1pbnV0ZSA9ICdtaW51dGUnLFxuICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgV2VlayA9ICd3ZWVrJyxcbiAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICBNZHkgPSAnbWR5JyxcbiAgRW5kID0gJ2VuZCcsXG4gIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICBRdWFydDEgPSAncXVhcnQxJyxcbiAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICBJbk91dCA9ICdpbi1vdXQnLFxuICBVc2VyID0gJ3VzZXInXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkUm9sZVR5cGUge1xuICBEaW1lbnNpb24gPSAnZGltZW5zaW9uJyxcbiAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJ1xufVxuXG5leHBvcnQgZW51bSBTaGVldFR5cGUge1xuICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgU3RvcnkgPSAnc3RvcnknLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0J1xufVxuXG5leHBvcnQgZW51bSBEb21haW5SZXN0cmljdGlvblR5cGUge1xuICBBbGwgPSAnYWxsJyxcbiAgTGlzdCA9ICdsaXN0JyxcbiAgUmFuZ2UgPSAncmFuZ2UnXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJ1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gIE51bGxWYWx1ZXMgPSAnbnVsbHZhbHVlcycsXG4gIE5vbk51bGxWYWx1ZXMgPSAnbm9ubnVsbHZhbHVlcycsXG4gIEFsbFZhbHVlcyA9ICdhbGx2YWx1ZXMnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgZmlsdGVyIGRvbWFpblxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJEb21haW5UeXBlIHtcbiAgUmVsZXZhbnQgPSAncmVsZXZhbnQnLFxuICBEYXRhYmFzZSA9ICdkYXRhYmFzZSdcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJ1xufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIGluY2x1ZGVkIHZhbHVlcyB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzIHtcbiAgSW5jbHVkZU51bGwgPSAnaW5jbHVkZS1udWxsJyxcbiAgSW5jbHVkZU5vbk51bGwgPSAnaW5jbHVkZS1ub24tbnVsbCcsXG4gIEluY2x1ZGVBbGwgPSAnaW5jbHVkZS1hbGwnXG59XG5cbi8qKlxuICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gKi9cbmV4cG9ydCBlbnVtIE1hcmtUeXBlIHtcbiAgQmFyID0gJ2JhcicsXG4gIExpbmUgPSAnbGluZScsXG4gIEFyZWEgPSAnYXJlYScsXG4gIFNxdWFyZSA9ICdzcXVhcmUnLFxuICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBNYXAgPSAnbWFwJyxcbiAgUGllID0gJ3BpZScsXG4gIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gIFBvbHlnb24gPSAncG9seWdvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCdcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBEYXRlUmFuZ2VUeXBlIG9mIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZVJhbmdlVHlwZSB7XG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGxhc3QgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0ID0gJ2xhc3QnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0TiA9ICdsYXN0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIG5leHQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0ID0gJ25leHQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0TiA9ICduZXh0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBDdXJyZW50ID0gJ2N1cnJlbnQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIFRvRGF0ZSA9ICd0b0RhdGUnXG59XG5cbi8qKlxuICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGxhdW5jaGluZyBvZiBhbiBleHRlbnNpb24gZGlhbG9nIHN1Y2NlZWRlZCBvciBmYWlsZWQuXG4gKi9cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCB7XG4gIERpYWxvZ0FscmVhZHlPcGVuID0gJ2RpYWxvZy1hbHJlYWR5LW9wZW4nLFxuICBJbnZhbGlkRG9tYWluID0gJ2ludmFsaWQtZG9tYWluJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG4vLyBFbnVtZXJhdGlvbiBmb3IgQXBpU2hvd0RhdGEgdGFibGUgaWQgc2VudGluZWxzLlxuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsIHtcblxuICAvLyBmaW5kIHRoZSBvbmUgbG9naWNhbCB0YWJsZSAtIHVzZWQgaW4gdmVyc2lvbiBjb21wYXRpYmlsaXR5IGNoZWNrIGZvciBnZXRVbmRlcmx5aW5nRGF0YVRhYmxlIGFuZCBnZXRMb2dpY2FsRGF0YVRhYmxlIGNvbW1hbmRzXG4gIFNpbmdsZVRhYmxlSWQgPSAnc2luZ2xlLXRhYmxlLWlkLXNlbnRpbmVsJyxcbiAgU2luZ2xlVGFibGVDYXB0aW9uID0gJ1NpbmdsZSB0YWJsZSBpZCBzZW50aW5lbCdcbn1cblxuLyoqXG4gKiBVc2VkIHRvIG9wdGltaXplIHRoZSBnZXRTdW1tYXJ5RGF0YS9nZXRVbmRlcmx5aW5nVGFibGVEYXRhIHJlc3VsdHNcbiAqIE1hcHBlZCBmcm9tIGV4dGVybmFsIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIEFwaVNob3dEYXRhVGFibGVGb3JtYXQge1xuICBOYXRpdmVWYWx1ZXNPbmx5ID0gJ25hdGl2ZS12YWx1ZXMtb25seScsXG4gIEZvcm1hdHRlZFZhbHVlc09ubHkgPSAnZm9ybWF0dGVkLXZhbHVlcy1vbmx5JyxcbiAgTmF0aXZlQW5kRm9ybWF0dGVkVmFsdWVzID0gJ25hdGl2ZS1hbmQtZm9ybWF0dGVkLXZhbHVlcydcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnXG59XG4iLCJleHBvcnQgZW51bSBOb3RpZmljYXRpb25JZCB7XG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXItY2hhbmdlZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSA9ICdleHRlbnNpb24tZGlhbG9nLXVwZGF0ZScsXG4gIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBUZXN0Q29udmVyc2lvbk5vdGlmaWNhdGlvbiA9ICd0ZXN0LWNvbnZlcnNpb24tbm90aWZpY2F0aW9uJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxuICBWaXpJbnRlcmFjdGl2ZSA9ICd2aXotaW50ZXJhY3RpdmUnLFxuICBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtib29rLWZvcm1hdHRpbmctY2hhbmdlZCcsXG4gIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcbn1cbiIsImV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgRXh0ZW5zaW9uTG9jYXRvciA9ICdleHRlbnNpb24tbG9jYXRvcicsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvID0gJ2V4dGVuc2lvbi1zZXR0aW5ncy1pbmZvJyxcbiAgRXh0ZW5zaW9uWm9uZUlkID0gJ2V4dGVuc2lvbi16b25lLWlkJyxcbiAgVmlzdWFsSWQgPSAndmlzdWFsLWlkJyxcbiAgU2hlZXRQYXRoID0gJ3NoZWV0LXBhdGgnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBJZ25vcmVBbGlhc2VzID0gJ2lnbm9yZS1hbGlhc2VzJyxcbiAgSWdub3JlU2VsZWN0aW9uID0gJ2lnbm9yZS1zZWxlY3Rpb24nLFxuICBJbmNsdWRlQWxsQ29sdW1ucyA9ICdpbmNsdWRlLWFsbC1jb2x1bW5zJyxcbiAgTWF4Um93cyA9ICdtYXgtcm93cycsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUgPSAndW5kZXJseWluZy1kYXRhLXRhYmxlJyxcbiAgVW5kZXJseWluZ1N1bW1hcnlEYXRhVGFibGUgPSAndW5kZXJseWluZy1zdW1tYXJ5LWRhdGEtdGFibGUnLFxuICBEYXRhU291cmNlRGF0YVRhYmxlID0gJ2RhdGEtc291cmNlLWRhdGEtdGFibGUnLFxuICBTaG93RGF0YVRhYmxlRm9ybWF0ID0gJ3Nob3ctZGF0YS10YWJsZS1mb3JtYXQnLFxuXG4gIFNldHRpbmdzVmFsdWVzID0gJ3NldHRpbmdzLXZhbHVlcycsXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgSGlnaGxpZ2h0ZWREYXRhID0gJ2hpZ2hsaWdodGVkLWRhdGEnLFxuXG4gIC8vIEZpbHRlciBQYXJhbXNcbiAgRmllbGROYW1lID0gJ2ZpZWxkLW5hbWUnLFxuICBGaWx0ZXJWYWx1ZXMgPSAnZmlsdGVyLXZhbHVlcycsXG4gIEZpbHRlclVwZGF0ZVR5cGUgPSAnZmlsdGVyLXVwZGF0ZS10eXBlJyxcbiAgSXNFeGNsdWRlTW9kZSA9ICdpcy1leGNsdWRlJyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTWF4ID0gJ2ZpbHRlci1yYW5nZS1tYXgnLFxuICBGaWx0ZXJSYW5nZU51bGxPcHRpb24gPSAnZmlsdGVyLXJhbmdlLW51bGwtb3B0aW9uJyxcbiAgV29ya3NoZWV0RmlsdGVycyA9ICd3b3Jrc2hlZXQtZmlsdGVycycsXG4gIEZpZWxkSWQgPSAnZmllbGQtaWQnLFxuICBEb21haW5UeXBlID0gJ2RvbWFpbi10eXBlJyxcbiAgQ2F0ZWdvcmljYWxEb21haW4gPSAnY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgUXVhbnRpdGF0aXZlRG9tYWluID0gJ3F1YW50aXRhdGl2ZS1kbWFpbicsXG4gIEZpZWxkID0gJ2ZpZWxkJyxcblxuICBXb3Jrc2hlZXROYW1lID0gJ3dvcmtzaGVldC1uYW1lJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuXG4gIFBhcmFtZXRlckluZm8gPSAncGFyYW1ldGVyLWluZm8nLFxuICBQYXJhbWV0ZXJJbmZvcyA9ICdwYXJhbWV0ZXItaW5mb3MnLFxuICBQYXJhbWV0ZXJDYXB0aW9uID0gJ3BhcmVtZXRlci1jYXB0aW9uJyxcbiAgUGFyYW1ldGVyRmllbGROYW1lID0gJ3BhcmFtZXRlci1maWVsZC1uYW1lJyxcbiAgUGFyYW1ldGVyVmFsdWUgPSAncGFyYW1ldGVyLXZhbHVlJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgPSAnc2VsZWN0aW9uVXBkYXRlVHlwZScsXG4gIEhpZXJWYWxTZWxlY3Rpb25Nb2RlbHMgPSAnaGllcmFyY2hpY2FsVmFsdWVTZWxlY3Rpb25Nb2RlbHMnLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBEYXRhU291cmNlID0gJ2RhdGEtc291cmNlJyxcbiAgRGF0YVNvdXJjZUlkID0gJ2RhdGEtc291cmNlLWlkJyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIERhdGFTY2hlbWEgPSAnZGF0YS1zY2hlbWEnLFxuICBEYXRhU291cmNlTmFtZSA9ICdkYXRhLXNvdXJjZS1uYW1lJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdjb25uZWN0aW9uLWRlc2NyaXB0aW9uLXN1bW1hcmllcycsXG5cbiAgRXh0ZW5zaW9uRGlhbG9nVXJsID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXJsJyxcbiAgRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZCA9ICdleHRlbnNpb24tZGlhbG9nLXBheWxvYWQnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcbiAgRXh0ZW5zaW9uRGlhbG9nSCA9ICdleHRlbnNpb24tZGlhbG9nLWhlaWdodCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1cgPSAnZXh0ZW5zaW9uLWRpYWxvZy13aWR0aCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCA9ICdleHRlbnNpb24tZGlhbG9nLXJlc3VsdCcsXG5cbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuXG4gIFRlc3RDb252ZXJzaW9uUGFyYW1ldGVyID0gJ3Rlc3QtY29udmVyc2lvbi1wYXJhbWV0ZXInLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBab25lSWRzVmlzaWJpbGl0eU1hcCA9ICd6b25lLWlkcy12aXNpYmlsaXR5LW1hcCcsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSA9ICdkYXNoYm9hcmQtb2JqZWN0LXBvc2l0aW9uLWFuZC1zaXplLXVwZGF0ZScsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3QgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUtbGlzdCcsXG5cbiAgUmVwbGF5U3BlZWQgPSAncmVwbGF5LXNwZWVkJyxcblxuICBDbGlja1Rocm91Z2hFbmFibGVkID0gJ2NsaWNrLXRocm91Z2gtZW5hYmxlZCcsXG5cbiAgTG9naWNhbFRhYmxlSW5mb0xpc3QgPSAnbG9naWNhbC10YWJsZS1pbmZvLWxpc3QnLFxuICBMb2dpY2FsVGFibGVJZCA9ICdsb2dpY2FsLXRhYmxlLWlkJyxcblxuICBWaXpBUElJbnB1dEpzb24gPSAndml6YXBpLWlucHV0LWpzb24nLFxuICBWaXpBUElTVkcgPSAndml6YXBpLXN2ZycsXG5cbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuXG4gIEZvbnROYW1lTGlzdEl0ZW1zID0gJ2ZvbnQtbmFtZS1saXN0LWl0ZW1zJyxcbn1cbiIsIi8vIERlY2xhcmUgdGhpcyBrZXkgdHlwZSBhbmQgZXhwb3J0IHRoZSBOb3RpZmljYXRpb25JZCB0byBtYWtlIHRoaXMgYmVoYXZlIGxpa2UgYSBzdHJpbmcgZW51bVxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIENsZWFyRmlsdGVyID0gJ2NsZWFyLWZpbHRlcicsXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBHZXREYXRhU3VtbWFyeURhdGEgPSAnZ2V0LXN1bW1hcnktZGF0YScsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgU2F2ZUV4dGVuc2lvblNldHRpbmdzID0gJ3NhdmUtZXh0ZW5zaW9uLXNldHRpbmdzJyxcbiAgR2V0U2VsZWN0ZWRNYXJrcyA9ICdnZXQtc2VsZWN0ZWQtbWFya3MnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBGaW5kUGFyYW1ldGVyID0gJ2ZpbmQtcGFyYW1ldGVyJyxcbiAgQ2hhbmdlUGFyYW1ldGVyVmFsdWUgPSAnY2hhbmdlLXBhcmFtZXRlci12YWx1ZScsXG4gIENsZWFyU2VsZWN0ZWRNYXJrcyA9ICdjbGVhci1zZWxlY3RlZC1tYXJrcycsXG4gIFNlbGVjdEJ5VmFsdWUgPSAnc2VsZWN0LWJ5LXZhbHVlJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGaWVsZEFuZERhdGFTb3VyY2UgPSAnZ2V0LWZpZWxkLWFuZC1kYXRhc291cmNlJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldFJhbmdlRG9tYWluID0gJ2dldC1yYW5nZS1kb21haW4nLFxuICBHZXRKb2luRGVzY3JpcHRpb24gPSAnZ2V0LWpvaW4tZGVzY3JpcHRpb24nLFxuICBHZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnZ2V0LWNvbm5lY3Rpb24tZGVzY3JpcHRpb24tc3VtbWFyaWVzJyxcbiAgRGlzcGxheURpYWxvZyA9ICdkaXNwbGF5LWRpYWxvZycsXG4gIENsb3NlRGlhbG9nID0gJ2Nsb3NlLWRpYWxvZycsXG4gIFNldENsaWNrVGhyb3VnaCA9ICdzZXQtY2xpY2stdGhyb3VnaCcsXG4gIFRlc3RDb252ZXJzaW9uVmVyYiA9ICd0ZXN0LWNvbnZlcnNpb24tdmVyYicsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXRBY3RpdmVUYWJsZXMgPSAnZ2V0LWFjdGl2ZS10YWJsZXMnLFxuICBTZXRab25lVmlzaWJpbGl0eSA9ICdzZXQtem9uZS12aXNpYmlsaXR5JyxcbiAgTW92ZUFuZFJlc2l6ZVpvbmVzID0gJ21vdmUtYW5kLXJlc2l6ZS16b25lcycsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcbiAgR2V0TG9naWNhbFRhYmxlcyA9ICdnZXQtbG9naWNhbC10YWJsZXMnLFxuICBHZXRMb2dpY2FsVGFibGVEYXRhID0gJ2dldC1sb2dpY2FsLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVzID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlcycsXG4gIFZpekFQSSA9ICd2aXotYXBpJyxcbiAgR2V0Rm9udHMgPSAnZ2V0LWZvbnRzJyxcbn1cbiIsIi8qKlxuICogVGhlc2Ugc3RyaW5ncyB3ZXJlICptYW51YWxseSBjb3BpZWQqIGZyb20gdGhlIHNlcnZlcixcbiAqIHdvcmtncm91cC9zcmMvc2lsb3MvdGFibGVhdS1zZXJ2ZXIvbGlicmFyaWVzL3RhYi1jb250cm9sbGVyLXZpenFsL3NyYy9jb20vdGFibGVhdXNvZnR3YXJlL1xuICogY29udHJvbGxlci92aXpxbC9jb25zdGFudHMvUGFyYW1ldGVyS2V5cy5qYXZhI0w5XG4gKiBzaG91bGQgYmUgZXhwb3J0ZWQgaW5zdGVhZFxuICogcGFyYW1ldGVycyB0aGF0IHZpenFsIHdpbGwgYWNjZXB0IGluIGFuIGVtYmVkZGluZyBVUkxcbiAqKi9cbmVudW0gVnFsUGFyYW1ldGVyTmFtZXMge1xuICBPTkUgPSAnMScsXG4gIEFMRVJUUyA9ICc6YWxlcnRzJyxcbiAgQUxJQVMgPSAnYWxpYXMnLFxuICBBTExPV19ERUZFUlJFRF9CT09UU1RSQVAgPSAnOmFsbG93RGVmZXJyZWRCb290c3RyYXAnLFxuICBBTExPV19BVVRPR0VOX1dPUktTSEVFVF9QSE9ORV9MQVlPVVRTID0gJ2FsbG93QXV0b2dlbldvcmtzaGVldFBob25lTGF5b3V0cycsXG4gIEFQSV9JRCA9ICc6YXBpSUQnLFxuICBBUFAgPSAnOmFwcCcsXG4gIEFUVEFDSE1FTlQgPSAnYXR0YWNobWVudCcsXG4gIElTX0lQQURfQVBQID0gJ2FwcCcsXG4gIEFOSU1BVEVfVFJBTlNJVElPTiA9ICc6YW5pbWF0ZV90cmFuc2l0aW9uJyxcbiAgQVNDRU5ESU5HID0gJ2FzY2VuZGluZycsXG4gIEFVVEhFTlRJQ0FUSU9OID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQVRUUklCVVRFUyA9ICdhdHRyaWJ1dGVzJyxcbiAgQVVUSE9SSU5HX1NIRUVUID0gJzphdXRoU2hlZXQnLFxuICBBWElTID0gJ2F4aXMnLFxuICBCT09UU1RSQVBfV0hFTl9OT1RJRklFRCA9ICc6Ym9vdHN0cmFwV2hlbk5vdGlmaWVkJyxcbiAgQlJPV1NFUl9CQUNLX0JVVFRPTl9VTkRPID0gJzpicm93c2VyQmFja0J1dHRvblVuZG8nLFxuICBCUk9XU0VSX1JFTkRFUklOR19PTiA9ICdpc0Jyb3dzZXJSZW5kZXJpbmcnLFxuICBCUk9XU0VSX1JFTkRFUklOR19USFJFU0hPTEQgPSAnYnJvd3NlclJlbmRlcmluZ1RocmVzaG9sZCcsXG4gIENIQVJTRVQgPSAnY2hhcnNldCcsXG4gIENMSUVOVF9ESU1FTlNJT04gPSAnY2xpZW50RGltZW5zaW9uJyxcbiAgQ0xJRU5UX0lQID0gJ2NsaWVudF9pcCcsXG4gIENMSUVOVF9OVU0gPSAnY2xpZW50TnVtJyxcbiAgQ09MT05fRU1CRURERUQgPSAnOmVtYmVkZGVkJyxcbiAgQ09MT05fTU9CSUxFID0gJzptb2JpbGUnLFxuICBDT0xPTl9ERUVQX0xJTktJTkdfRElTQUJMRUQgPSAnOmRlZXBMaW5raW5nRGlzYWJsZWQnLFxuICBDT0xPTl9XQVRFUk1BUksgPSAnOndhdGVybWFyaycsXG4gIENPTU1FTlRTID0gJzpjb21tZW50cycsXG4gIENPTU1FTlRJTkdfRU5BQkxFRCA9ICc6Y29tbWVudGluZ0VuYWJsZWQnLFxuICBDT01NRU5USU5HX01FTlRJT05TX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdNZW50aW9ucycsXG4gIENPTk5FQ1RJT04gPSAnY29ubmVjdGlvbicsXG4gIENSRUFURURfQllfRkVBVFVSRSA9ICdjcmVhdGVkQnlGZWF0dXJlJyxcbiAgQ1JZUFRFRF9QQVNTV09SRCA9ICdjcnlwdGVkJyxcbiAgQ1NTREVCVUcgPSAnOmNzc2RlYnVnJyxcbiAgQ1NWID0gJ2NzdicsXG4gIENVU1RPTV9WSUVXUyA9ICc6Y3VzdG9tVmlld3MnLFxuICBDViA9ICc6Y3YnLFxuICBDVl9JRCA9ICdjdklkJyxcbiAgREFTSEJPQVJEX1BPUlRfU0laRSA9ICdkYXNoYm9hcmRQb3J0U2l6ZScsXG4gIERBVEFfREVUQUlMUyA9ICc6ZGF0YURldGFpbHMnLFxuICBEQVRBU09VUkNFID0gJ2RhdGFzb3VyY2UnLFxuICBERUJVRyA9ICc6ZGVidWcnLFxuICBERUxBWSA9ICc6ZGVsYXknLFxuICBERVBUSCA9ICdkZXB0aCcsXG4gIERFVklDRV9UWVBFID0gJzpkZXZpY2UnLFxuICBERVZJQ0VfUElYRUxfUkFUSU8gPSAnZGV2aWNlUGl4ZWxSYXRpbycsXG4gIERFVklDRV9QUkVWSUVXX01PREUgPSAnOmRldmljZXByZXZpZXdtb2RlJyxcbiAgRElNRU5TSU9OUyA9ICc6ZGltZW5zaW9ucycsXG4gIERJU0FCTEVfU0hBUkVEX1NFU1NJT05TID0gJzpkaXNhYmxlX3NoYXJlZF9zZXNzaW9ucycsXG4gIERJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTID0gJzpkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcycsXG4gIERJUkVDVElPTiA9ICdkaXJlY3Rpb24nLFxuICBESVNQTEFZX09WRVJMQVkgPSAnOmRpc3BsYXlfb3ZlcmxheScsXG4gIERJU1BMQVlfU0hBUkUgPSAnOmRpc3BsYXlfc2hhcmUnLFxuICBESVNQTEFZX1NQSU5ORVIgPSAnOmRpc3BsYXlfc3Bpbm5lcicsXG4gIERJU1BMQVlfU1RBVElDX0lNQUdFID0gJzpkaXNwbGF5X3N0YXRpY19pbWFnZScsXG4gIERJU1BMQVlfVEFCUyA9ICdkaXNwbGF5X3RhYnMnLFxuICBESVNQTEFZX1ZJRVdfQ09VTlQgPSAnOmRpc3BsYXlfY291bnQnLFxuICBJR05PUkVfU1RJQ0tZX1NFU1NJT04gPSAnOmlnbm9yZV9zdGlja3lfc2Vzc2lvbicsXG4gIElOQ1JFTUVOVF9WSUVXX0NPVU5UID0gJzppbmNyZW1lbnRfdmlld19jb3VudCcsXG4gIERPQ01PREUgPSAnZG9jbW9kZScsXG4gIERPTUFJTiA9ICdkb21haW4nLFxuICBET19XT1JLID0gJ2RvX3dvcmsnLFxuICBEWCA9ICdkeCcsXG4gIERZID0gJ2R5JyxcbiAgRURJVF9EQVRBX0FMRVJUID0gJzplZGl0RGF0YUFsZXJ0JyxcbiAgRU1CRUQgPSAnOmVtYmVkJyxcbiAgRU1CRURERUQgPSAnZW1iZWRkZWQnLFxuICBFTkNSWVBURUQgPSAnZW5jcnlwdGVkJyxcbiAgRU1CRURESU5HX1YzID0gJzplbWJlZGRpbmdWMycsXG4gIEFQSV9FWFRFUk5BTF9WRVJTSU9OID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBUElfSU5URVJOQUxfVkVSU0lPTiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgRVhDTFVERSA9ICdleGNsdWRlJyxcbiAgRVhQT1JUX0ZPUk1BVCA9ICc6ZXhwb3J0X2Zvcm1hdCcsXG4gIEZJRUxETkFNRSA9ICdmaWVsZG5hbWUnLFxuICBGSUVMRF9OQU1FID0gJ2ZpZWxkX25hbWUnLFxuICBGSUVMRF9TRVAgPSAnZmllbGRfc2VwJyxcbiAgRklMRSA9ICdmaWxlJyxcbiAgRklMVEVSX1RJTEVfU0laRSA9ICdmaWx0ZXJUaWxlU2l6ZScsXG4gIEZOID0gJ2ZuJyxcbiAgRk9DVVMgPSAnZm9jdXMnLFxuICBGT1JDRV9DQUNIRSA9ICdmb3JjZV9jYWNoZScsXG4gIEZPUk1BVCA9ICdmb3JtYXQnLFxuICBGT1JNQVRfREFUQV9WQUxVRV9MT0NBTExZID0gJ2Zvcm1hdERhdGFWYWx1ZUxvY2FsbHknLFxuICBGUk9NX1dHID0gJzpmcm9tX3dnJyxcbiAgR1JBUEhRTF9EQVRBQkFTRV9JRCA9ICc6Z3JhcGhRTERhdGFiYXNlSWQnLFxuICBHUkFQSFFMX1RBQkxFX0lEID0gJzpncmFwaFFMVGFibGVJZCcsXG4gIEdVSUQgPSAnOmd1aWQnLFxuICBIID0gJ2gnLFxuICBISUdIX0RQSSA9ICc6aGlnaGRwaScsXG4gIEhJRERFTiA9ICdoaWRkZW4nLFxuICBJTUFHRV9TSVpFX0xJTUlUID0gJ2ltYWdlU2l6ZUxpbWl0JyxcbiAgVFJBTlNQQVJFTlRfTElORV9NQVJLU19MSU1JVCA9ICd0cmFuc3BhcmVudExpbmVNYXJrTGltaXQnLFxuICBDTElFTlRfUkVOREVSX1BJWEVMX0xJTUlUID0gJ2NsaWVudFJlbmRlclBpeGVsTGltaXQnLFxuICBJTiA9ICdpbicsXG4gIElOU1RBTkNFX0lEID0gJzppaWQnLFxuICBJU19HVUVTVF9SRURJUkVDVF9GUk9NX1ZJWlBPUlRBTCA9ICc6aXNHdWVzdFJlZGlyZWN0RnJvbVZpenBvcnRhbCcsXG4gIElTX01BUktfQU5JTUFUSU9OX0VOQUJMRUQgPSAnaXNNYXJrQW5pbWF0aW9uRW5hYmxlZCcsXG4gIElTX1ZJWlBPUlRBTCA9ICc6aXNWaXpQb3J0YWwnLFxuICBJTlBVVF8gPSAnaW5wdXRfc3RyaW5nJyxcbiAgSlNERUJVRyA9ICc6anNkZWJ1ZycsXG4gIEpTT04gPSAnanNvbicsXG4gIEpTT05fT05MWSA9ICc6anNvbk9ubHknLFxuICBLRUVQRklMRSA9ICdrZWVwZmlsZScsXG4gIEtFWSA9ICdrZXknLFxuICBMQU5HVUFHRSA9ICdsYW5ndWFnZScsXG4gIExBTkdVQUdFX1JFUVVFU1RFRCA9ICc6bGFuZ3VhZ2UnLFxuICBMSU5LVEFSR0VUID0gJzpsaW5rdGFyZ2V0JyxcbiAgTE9BRF9PUkRFUl9JRCA9ICc6bG9hZE9yZGVySUQnLCAvLyB1c2VkIGZvciBQdWJsaWNcbiAgTE9BRF9ORVdFU1RfUkVWSVNJT04gPSAnOmxvYWROZXdlc3RSZXZpc2lvbicsXG4gIExPQ0FMX1BBVEhTID0gJzpsb2NhbFBhdGhzJyxcbiAgTE9DQUxFID0gJ2xvY2FsZScsXG4gIExPQ0FUSU9OX0lEID0gJ2xvY2F0aW9uaWQnLFxuICBMT0NBVElPTl9UWVBFID0gJ2xvY2F0aW9udHlwZScsXG4gIFdPUktCT09LX0xPQ0FMRSA9ICd3b3JrYm9va0xvY2FsZScsXG4gIE1BWFJPV1MgPSAnbWF4cm93cycsXG4gIE1BWF9BR0UgPSAnbWF4QWdlJyxcbiAgTUFYX1JPV1MgPSAnbWF4Um93cycsXG4gIE1FVEhPRCA9ICdtZXRob2QnLFxuICBNT0JJTEUgPSAnbW9iaWxlJyxcbiAgTU9ESUZJRVIgPSAnbW9kaWZpZXInLFxuICBOQU1FID0gJ25hbWUnLFxuICBOQVZfVFlQRSA9ICduYXZUeXBlJyxcbiAgTkFWX1NSQyA9ICduYXZTcmMnLFxuICBOT0FUVEFDSE1FTlQgPSAnbm8tYXR0YWNobWVudCcsXG4gIE5PX09WRVJXUklURSA9ICdub19vdmVyd3JpdGUnLFxuICBPUEVOX0FVVEhPUklOR19JTl9UT1BfV0lORE9XID0gJzpvcGVuQXV0aG9yaW5nSW5Ub3BXaW5kb3cnLFxuICBPUEVOSURfSEQgPSAnOm9wZW5pZF9oZCcsXG4gIE9QRU5JRF9MT0dJTl9ISU5UID0gJzpvcGVuaWRfbG9naW5faGludCcsXG4gIE9BVVRIUkVRVUVTVCA9ICdvYXV0aHJlcXVlc3QnLFxuICBPQVVUSF9DUkVERU5USUFMX0lEUyA9ICdvYXV0aF9jcmVkZW50aWFsX2lkcycsXG4gIE9GRkxJTkVfTU9ERSA9ICc6b2ZmbGluZW1vZGUnLFxuICBPUklHSU4gPSAnOm9yaWdpbicsXG4gIE9WRVJMQVkgPSAnOm92ZXJsYXknLFxuICBQID0gJ3AnLFxuICBQQVRIID0gJ3BhdGgnLFxuICBQQU5FX1JFU09MVkVSX1ggPSAncGFuZVJlc29sdmVyWCcsXG4gIFBBTkVfUkVTT0xWRVJfWSA9ICdwYW5lUmVzb2x2ZXJZJyxcbiAgUEFSQU0gPSAncGFyYW0nLFxuICBQQVJFTlRfSUQgPSAncGFyZW50X2lkJyxcbiAgUEFTU1dPUkQgPSAncGFzc3dvcmQnLFxuICBQQVRURVJOID0gJ3BhdHRlcm4nLFxuICBQSVhFTF9SQVRJTyA9ICc6cGl4ZWxyYXRpbycsXG4gIFBSRUZJWCA9ICc6cHJlZml4JyxcbiAgUFJFVklFVyA9ICc6cHJldmlldycsXG4gIFBSSU1BUllfQ09OVEVOVF9VUkwgPSAncHJpbWFyeV9jb250ZW50X3VybCcsXG4gIFBST0pFQ1QgPSAncHJvamVjdCcsXG4gIFBST1RPQ09MID0gJ3Byb3RvY29sJyxcbiAgUFNFVURPID0gJzpwc2V1ZG8nLFxuICBRVUVSWSA9ICdxdWVyeScsXG4gIFIgPSAncicsXG4gIFJBTkdFX1RZUEUgPSAncmFuZ2VfdHlwZScsXG4gIFJFQ09SRF9TRVAgPSAncmVjb3JkX3NlcCcsXG4gIFJFQ09SRF9DTElFTlRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9jbGllbnRfcGVyZm9ybWFuY2UnLFxuICBSRUNPUkRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9wZXJmb3JtYW5jZScsXG4gIFJFQ09WRVJfT0xEX1NFU1NJT05fSUQgPSAnOnJlY292ZXJfb2xkX3Nlc3Npb25faWQnLFxuICBSRUNPVkVSX1NFU1NJT05fU1RBVEVfVElDS0VUUyA9ICc6cmVjb3Zlcl9zZXNzaW9uX3N0YXRlX3RpY2tldHMnLFxuICBSRUZSRVNIID0gJzpyZWZyZXNoJyxcbiAgUkVGUkVTSFVOTU9ESUZJRUQgPSAnOnJlZnJlc2h1bm1vZGlmaWVkJyxcbiAgUkVHSU9OID0gJ3JlZ2lvbicsXG4gIFJFTE9BRF9PTl9DVVNUT01fVklFV19TQVZFID0gJzpyZWxvYWRPbkN1c3RvbVZpZXdTYXZlJyxcbiAgUkVOREVSID0gJzpyZW5kZXInLFxuICBSRU5ERVJfTUFQU19DTElFTlRfU0lERSA9ICdyZW5kZXJNYXBzQ2xpZW50U2lkZScsXG4gIFJFVFJZID0gJzpyZXRyeScsXG4gIFJFVVNFID0gJ3JldXNlJyxcbiAgUkVVU0VfRk9SRVZFUiA9ICdyZXVzZV9mb3JldmVyJyxcbiAgUkVWRVJUID0gJzpyZXZlcnQnLFxuICBTQVZFX0RCX1BBU1NXT1JEUyA9ICdzYXZlX2RiX3Bhc3N3b3JkcycsXG4gIFNFTEVDVF9YID0gJ3NlbGVjdF94JyxcbiAgU0VMRUNUX1kgPSAnc2VsZWN0X3knLFxuICBTRVNTSU9OX0ZFQVRVUkVfUFJFRklYID0gJzpmZl8nLFxuICBTRVNTSU9OX0ZMQUdTID0gJzpzZXNzaW9uX2ZlYXR1cmVfZmxhZ3MnLFxuICBTSEFSRV9CVVRUT04gPSAnc2hhcmVfYnV0dG9uJyxcbiAgU0hFRVRfSUQgPSAnc2hlZXRfaWQnLFxuICBTSEFSRUQgPSAnc2hhcmVkJyxcbiAgU0hPV0FMTCA9ICdzaG93YWxsJyxcbiAgU0hPV19BUFBfQkFOTkVSID0gJzpzaG93QXBwQmFubmVyJyxcbiAgU0hPV19BU0tfREFUQSA9ICc6c2hvd0Fza0RhdGEnLFxuICBTSE9XX1BBUkFNUyA9ICdzaG93UGFyYW1zJyxcbiAgU0hPV19TSEFSRV9PUFRJT05TID0gJzpzaG93U2hhcmVPcHRpb25zJyxcbiAgU0laRSA9ICc6c2l6ZScsXG4gIFNPVVJDRSA9ICdzb3VyY2UnLFxuICBTVEFURSA9ICdzdGF0ZScsXG4gIFNUSUNLWV9TRVNTSU9OX0tFWSA9ICdzdGlja3lTZXNzaW9uS2V5JyxcbiAgU1VCU0NSSVBUSU9OUyA9ICc6c3Vic2NyaXB0aW9ucycsXG4gIFNVTU1BUlkgPSAnc3VtbWFyeScsXG4gIFNZTkNfU0VTU0lPTiA9ICc6c3luY19zZXNzaW9uJyxcbiAgU1lOQ19TRVNTSU9OX1NUQVRFID0gJ3N5bmNfc2Vzc2lvbl9zdGF0ZScsXG4gIFRBQlMgPSAnOnRhYnMnLFxuICBUQVJHRVQgPSAndGFyZ2V0JyxcbiAgVEFSR0VUX1NJVEUgPSAndGFyZ2V0X3NpdGUnLFxuICBUT09MQkFSID0gJzp0b29sYmFyJyxcbiAgVE9PTFRJUCA9ICc6dG9vbHRpcCcsXG4gIFRTID0gJ3RzJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9JRCA9ICd1bmRlcmx5aW5nX3RhYmxlX2lkJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9DQVBUSU9OID0gJ3VuZGVybHlpbmdfdGFibGVfY2FwdGlvbicsXG4gIFVQREFURV9UWVBFID0gJ3VwZGF0ZV90eXBlJyxcbiAgVVNFX0dVRVNUID0gJzp1c2VHdWVzdCcsXG4gIFVTRV9JTkxJTkVfSU1BR0VTID0gJ3VzZV9pbmxpbmVfaW1hZ2VzJyxcbiAgVVNFUkFHRU5UID0gJ3VzZXJhZ2VudCcsXG4gIFVTRVJOQU1FID0gJ3VzZXJuYW1lJyxcbiAgVkFMVUUgPSAndmFsdWUnLFxuICBWRVJCT1NFX01PREUgPSAndmVyYm9zZU1vZGUnLFxuICBWSUVXX0lEID0gJ3ZpZXdzX2lkJyxcbiAgVklaX1NOQVBTSE9UX0lEID0gJ3Zpel9zbmFwc2hvdF9pZCcsXG4gIFZXID0gJzp2dycsXG4gIFcgPSAndycsXG4gIFdPUktTSEVFVF9QT1JUX1NJWkUgPSAnd29ya3NoZWV0UG9ydFNpemUnLFxuICBXQVRFUk1BUksgPSAnd2F0ZXJtYXJrJyxcbiAgV0FURVJNQVJLX01BUkdJTiA9ICc6d2F0ZXJtYXJrX21hcmdpbicsXG4gIFdCID0gJzp3YicsXG4gIFdISUNIID0gJ3doaWNoJyxcbiAgWCA9ICd4JyxcbiAgWSA9ICd5JyxcbiAgWklEID0gJ3ppZCcsXG4gIFpPTkVfSUQgPSAnem9uZV9pZCcsXG4gIEtFWUNIQUlOX1ZFUlNJT04gPSAna2V5Y2hhaW5fdmVyc2lvbicsXG4gIERBVEFTT1VSQ0VfSUQgPSAnZGF0YXNvdXJjZV9pZCcsXG4gIERBVEFTT1VSQ0VfTkFNRSA9ICdkYXRhc291cmNlX25hbWUnLFxuICBMRU5TX0lEID0gJ2xlbnNfaWQnLFxuICBXSURUSCA9ICd3aWR0aCcsXG4gIEhFSUdIVCA9ICdoZWlnaHQnLFxuXG4gIC8vIERlZmF1bHQgTGF5b3V0IHBhcmFtc1xuICBMQVlPVVRfVklFV1MgPSAndmlld3MnLFxuICBMQVlPVVRfTUVOVVMgPSAnbWVudXMnLFxuICBMQVlPVVRfR0VPTUVUUlkgPSAnZ2VvbWV0cnknLFxuICBMQVlPVVRfUEFHRVMgPSAncGFnZXMnLFxuICBMQVlPVVRfQ0FDSEVVUkwgPSAnY2FjaGV1cmwnLFxuICBMQVlPVVRfU0hFRVQgPSAnc2hlZXQnLFxuICBMQVlPVVRfREVQVEggPSAnZGVwdGgnLFxufVxuXG4vKipcbiAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgb25seSByZWxldmFudCB3aGVuIHdvcmtpbmcgd2l0aCBUYWJsZWF1IFB1YmxpY1xuICogbWF5YmUgbm90IHJlYWxseSBuZWNlc3NyeSB0byBzcGxpdCB0aGVtIG91dFxuICovXG5lbnVtIFB1YmxpY1BhcmFtZXRlck5hbWVzIHtcbiAgU0hPV19WSVpfSE9NRSA9ICc6c2hvd1ZpekhvbWUnXG4gIC8vIGRpc3BsYXkgdmlldyBjb3VudFxufVxuXG5cbi8qKlxuICogTWFwIHRoZSBwYXJhbWV0ZXIgbmFtZXMgYXMgdXNlZCBpbiB0aGUgdXJsIHRvIHdoYXQgd2UgY2FsbCB0aGVtIHB1YmxpY2x5IGluIHRoZSBlbWJlZGRpbmcgbGlicmFyeS5cbiAqIFRoZSBvbmx5IHBhcmFtZXRlcnMgbGlzdGVkIGhlcmUgc2hvdWxkIGJlIHRoZSBvbmVzIHRoYXQgZ2V0IHNlbnQgdG8gdml6cWxcbiAqICAtIHRoaXMgc2hvdWxkIG1hdGNoIHRoZSBpbnRlcmZhY2UgYXQgZXh0ZXJuYWwtY29udHJhY3Q6Vml6SW50ZXJmYWNlczpWaXpTZXR0aW5nc1xuICovXG5leHBvcnQgZW51bSBWaXpPcHRpb25OYW1lcyB7XG4gIC8vIHB1YmxpY05hbWUgPSBpbnRlcm5hbFN0cmluZ1ZhbHVlXG4gIFNpemUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5TSVpFLFxuICBFbWJlZCA9IFZxbFBhcmFtZXRlck5hbWVzLkVNQkVELFxuICBFbWJlZFYzID0gVnFsUGFyYW1ldGVyTmFtZXMuRU1CRURESU5HX1YzLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSU5URVJOQUxfVkVSU0lPTixcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0VYVEVSTkFMX1ZFUlNJT04sXG4gIFNob3dWaXpIb21lID0gUHVibGljUGFyYW1ldGVyTmFtZXMuU0hPV19WSVpfSE9NRSxcbiAgSnNkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEJvb3RzdHJhcFdoZW5Ob3RpZmllZCA9IFZxbFBhcmFtZXRlck5hbWVzLkJPT1RTVFJBUF9XSEVOX05PVElGSUVELFxuICBOYXZUeXBlID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1RZUEUsXG4gIE5hdlNyYyA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9TUkMsXG4gIGRlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQXBpSUQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSUQsXG5cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyxcbiAgaGlkZVRhYnMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UQUJTLFxuICB0b29sYmFyID0gVnFsUGFyYW1ldGVyTmFtZXMuVE9PTEJBUixcbiAgZGV2aWNlID0gVnFsUGFyYW1ldGVyTmFtZXMuREVWSUNFX1RZUEUsXG4gIGluc3RhbmNlSWRUb0Nsb25lID0gVnFsUGFyYW1ldGVyTmFtZXMuSU5TVEFOQ0VfSUQsXG4gIHRvdWNoT3B0aW1pemUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5NT0JJTEUsXG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuXG5pbXBvcnQgeyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2Vcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IE1lc3NlbmdlciB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgaXNDb21tYW5kTWVzc2FnZSxcbiAgaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBpc0luaXRNZXNzYWdlLFxuICBpc01lc3NhZ2UsXG4gIGlzTm90aWZpY2F0aW9uTWVzc2FnZSxcbiAgaXNIYW5kc2hha2VNZXNzYWdlXG59IGZyb20gJy4vTWVzc2FnZVR5cGVDaGVja3MnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciwgVmVyYklkLCBFeGVjdXRlUGFyYW1ldGVycywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgTW9kZWwsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuaW1wb3J0IHtcbiAgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcixcbiAgQ29tbWFuZE1lc3NhZ2VIYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcixcbiAgSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXJcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcblxuLyoqXG4gKiBUaGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpcyB0aGUgcHJpbWFyeSBleHBvcnQgZnJvbSB0aGUgYXBpLW1lc3NhZ2luZyBtb2R1bGUuIEFuIGluc3RhbmNlIG9mXG4gKiB0aGlzIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQgb24gYm90aCBzaWRlcyBvZiBhIGZyYW1lIGJvdW5kYXJ5IHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvblxuICogaW4gYm90aCBkaXJlY3Rpb25zIGJldHdlZW4gdGhlIGZyYW1lcy4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGRpc3BhdGNoZXIgYW5kIHRoZSBsaXN0ZW5lclxuICogcG9ydGlvbnMsIGJ1dCBkb2Vzbid0IHJlcXVpcmUgY2FsbGVycyB0byBjYXJlIGFib3V0IGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGltcGxlbWVudHMgTWVzc2VuZ2VyIHtcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyRnVuY3Rpb24/OiAoKCkgPT4gdm9pZCk7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZE1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lTWVzc2VuZ2VyLiBJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgYXMgYSBNZXNzYWdlTGlzdGVuZXIsXG4gICAqIGJlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZyBhbmQgcmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVycy5cbiAgICogQHBhcmFtIHRoaXNXaW5kb3cgVGhlIHdpbmRvdyBvYmplY3Qgd2hpY2ggdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgbGl2ZXMuIEFuIG9uTWVzc2FnZSBsaXN0ZW5lciB3aWxsIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3ddIE9wdGlvbmFsIG90aGVyV2luZG93IHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgcG9zdGVkIHRvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiBkZWZpbmVkLCBpbmNvbWluZyBtZXNzYWdlcyBtdXN0IG9yaWdpbmF0ZSBmcm9tIG90aGVyV2luZG93IHRvIGJlIHBhc3NlZCBvblxuICAgKiBAcGFyYW0gW290aGVyV2luZG93T3JpZ2luXSBUaGUgdGFyZ2V0IG9yaWdpbiB3aGljaCBvdGhlcldpbmRvdyBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gcmVjZWl2ZSBkaXNwYXRjaGVkIG1lc3NhZ2VzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgc2VudCBhcyB0aGUgdGFyZ2V0T3JpZ2luIG9mIGEgcG9zdE1lc3NhZ2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvcG9zdE1lc3NhZ2UpXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSB0aGlzV2luZG93OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3c/OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3dPcmlnaW4/OiBzdHJpbmcpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZ1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZUxpc3RlbmVyIEltcGxlbWVudGF0aW9uXG5cbiAgcHVibGljIHN0YXJ0TGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgYXJlIGxpc3RlbmluZywgaWYgbm90LCBob29rIHVwIGEgbWVzc2FnZSBsaXN0ZW5lclxuICAgIGlmICghdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IGJvdW5kSGFuZGxlciA9IHRoaXMub25NZXNzYWdlUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudGhpc1dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gKCkgPT4gdGhpcy50aGlzV2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdG9wTGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIFN0b3AgbGlzdGVuaW5nIGlmIHdlIGhhdmUgc3RhcnRlZCBsaXN0ZW5pbmdcbiAgICBpZiAodGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKCk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0SW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0SGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvLy8vLyBNZXNzYWdlRGlzcGF0Y2hlciBJbXBsZW1lbnRhdGlvblxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXBpVmVyc2lvbiBhcGktaW50ZXJuYWwtY29udHJhY3QtanMgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIGNyb3NzRnJhbWVWZXJzaW9uIGNyb3NzZnJhbWUgbWVzc2FnaW5nIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXQgaW5pdGlhbGl6YXRpb24gKGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mXG4gICAqICAgICAgICAgICAgICAgIGV4dGVybmFsIGJlaW5nIHVzZWQgZm9yIGV4YW1wbGUpXG4gICAqL1xuICBwdWJsaWMgcHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShcbiAgICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlciwgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBjcm9zc0ZyYW1lVmVyc2lvbixcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiSWQ6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmQsXG4gICAgICB2ZXJiSWQ6IHZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgICBjb21tYW5kR3VpZDogY29tbWFuZEd1aWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZXJyb3I6IGVycm9yXG4gICAgfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgLy8gc3RyaW5naWZ5IGVycm9yIG9iamVjdCB0byByZW1vdmUgdW5zZXJpYWxpemFibGUgZmllbGRzIGxpa2UgZnVuY3Rpb25zIGFuZCBwcmV2ZW50IHNlcmlhbGl6YXRpb24gZXJyb3JzXG4gICAgICBtZXNzYWdlLmVycm9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVOb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZCwgZGF0YTogTW9kZWwpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgICAgbm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbklkLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQWNrTWVzc2FnZSgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQWNrLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgcGVuZGluZyBtZXNzYWdlIGZvciBzZW5kaW5nIGFuZCByZXR1cm5zIHRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byB0aGlzLm90aGVyV2luZG93XG4gICAqIEByZXR1cm5zIFRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVNZXNzYWdlKG1zZzogTWVzc2FnZSk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLm90aGVyV2luZG93IHx8ICF0aGlzLm90aGVyV2luZG93T3JpZ2luKSB7XG4gICAgICB0aHJvdyAnT3RoZXIgd2luZG93IG5vdCBpbml0aWFsaXplZCwgY2Fubm90IGRpc3BhdGNoIG1lc3NhZ2VzJztcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSBuZXcgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZShtc2csIHRoaXMub3RoZXJXaW5kb3csIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4pO1xuICAgIHJldHVybiBwcmVwYXJlZE1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLiBEb2VzIHNvbWUgdmFsaWRhdGlvbiBvZiB0aGUgbWVzc2FnZSwgYW5kIHRoZW5cbiAgICogY2FsbHMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBoYW5kbGVyIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgaW5jb21pbmcgTWVzc2FnZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIG9uTWVzc2FnZVJlY2VpdmVkKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gb3RoZXJXaW5kb3cgZGVmaW5lZCwgbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGlzIGNvbWluZyBmcm9tIHRoZXJlXG4gICAgaWYgKHRoaXMub3RoZXJXaW5kb3cgJiYgZXZlbnQuc291cmNlICE9PSB0aGlzLm90aGVyV2luZG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG8gc29tZSB2YWxpZGF0aW9uIG9uIGV2ZW50LmRhdGEgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhIHJlYWwgbWVzc2FnZVxuICAgIGlmICghZXZlbnQuZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhO1xuICAgIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIG1lc3NhZ2UgdHlwZSwgdmFsaWRhdGUgdGhlIG1lc3NhZ2UsIGFuZCBjYWxsIGFuIGFwcHJvcHJpYXRlIGhhbmRlciBpZiBvbmUgZXhpc3RzXG4gICAgc3dpdGNoIChtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZToge1xuICAgICAgICBpZiAoIWlzSW5pdE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZToge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmQ6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb246IHtcbiAgICAgICAgaWYgKCFpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5IYW5kc2hha2U6IHtcbiAgICAgICAgaWYgKCFpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEp1c3QgaWdub3JlIHRoaXMgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHR5cGVcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3cob3RoZXJXaW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3cgPSBvdGhlcldpbmRvdztcbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvd09yaWdpbihvcmlnaW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4gPSBvcmlnaW47XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJlcGFyZWRNZXNzYWdlIGludGVyZmFjZSB1c2VkIHRvIHBvc3QgbWVzc2FnZXMgYmV0d2VlblxuICogdHdvIGZyYW1lcyB1c2luZyB3aW5kb3cucG9zdE1lc3NhZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgaW1wbGVtZW50cyBQcmVwYXJlZE1lc3NhZ2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLlxuICAgKiBAcGFyYW0gX21lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudFxuICAgKiBAcGFyYW0gX3RhcmdldCBUaGUgdGFyZ2V0IHdpbmRvdyB3aGVyZSB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnRcbiAgICogQHBhcmFtIF9vcmlnaW4gVGhlIHRhcmdldE9yaWdpbiB3aGVyZSB0aGlzIG1lc3NhZ2UgY2FuIGJlIHJlY2VpdmVkXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWVzc2FnZTogTWVzc2FnZSwgcHJpdmF0ZSBfdGFyZ2V0OiBXaW5kb3csIHByaXZhdGUgX29yaWdpbjogc3RyaW5nKSB7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVzc2FnZUd1aWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2UubXNnR3VpZDsgfVxuXG4gIHB1YmxpYyBzZW5kKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgdGhpcy5fdGFyZ2V0LnBvc3RNZXNzYWdlKHRoaXMuX21lc3NhZ2UsIHRoaXMuX29yaWdpbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5cbmltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBuby1hbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lc3NhZ2UoZGF0YTogTWVzc2FnZSB8IGFueSk6IGRhdGEgaXMgTWVzc2FnZSB7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhIGFzIE1lc3NhZ2U7XG4gIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS5tc2dHdWlkIHx8ICFtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKG1lc3NhZ2UubXNnR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UubXNnVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlVHlwZXM6IEFycmF5PHN0cmluZz4gPVxuICAgIFtNZXNzYWdlVHlwZS5Db21tYW5kLCBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsIE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbiwgTWVzc2FnZVR5cGUuSGFuZHNoYWtlXTtcblxuICBpZiAobWVzc2FnZVR5cGVzLmluZGV4T2YobWVzc2FnZS5tc2dUeXBlKSA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVyc2lvbih2ZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyIHwgYW55KTogdmVyc2lvbk51bWJlciBpcyBWZXJzaW9uTnVtYmVyIHtcbiAgaWYgKCF2ZXJzaW9uTnVtYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdiA9IHZlcnNpb25OdW1iZXIgYXMgVmVyc2lvbk51bWJlcjtcblxuICBpZiAodHlwZW9mIHYgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2LmZpeCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWlub3IgIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1ham9yICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbml0TWVzc2FnZShtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSW5pdGlhbGl6ZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGluaXRNZXNzYWdlID0gbWVzc2FnZSBhcyBJbml0aWFsaXplTWVzc2FnZTtcbiAgaWYgKGluaXRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmFwaVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5hcGlWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjck1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2U7XG4gIGlmIChjck1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChjck1lc3NhZ2UuY29tbWFuZEd1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjck1lc3NhZ2UuZGF0YSAmJiAhY3JNZXNzYWdlLmVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRNZXNzYWdlO1xuICBpZiAoY29tbWFuZE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnZlcmJJZCB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UudmVyYklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIE5vdGlmaWNhdGlvbk1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSBtZXNzYWdlIGFzIE5vdGlmaWNhdGlvbk1lc3NhZ2U7XG4gIGlmIChub3RpZmljYXRpb25NZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkIHx8IHR5cGVvZiBub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEhhbmRzaGFrZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRzaGFrZU1lc3NhZ2UgPSBtZXNzYWdlIGFzIEhhbmRzaGFrZU1lc3NhZ2U7XG4gIGlmIChoYW5kc2hha2VNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciwgVmVyYklkLCBFeGVjdXRlUGFyYW1ldGVycywgTW9kZWwsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuXG4vKipcbiAqIEVudW0gZGVmaW5pbmcgdGhlIDQgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzIHdlIGhhdmUgZGVmaW5lZFxuICovXG5leHBvcnQgZW51bSBNZXNzYWdlVHlwZSB7XG4gIEluaXRpYWxpemUgPSAnaW5pdGlhbGl6ZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24nLFxuICBDb21tYW5kID0gJ2NvbW1hbmQnLFxuICBDb21tYW5kUmVzcG9uc2UgPSAnY29tbWFuZC1yZXNwb25zZScsXG4gIEhhbmRzaGFrZSA9ICd2LWhhbmRzaGFrZScsXG4gIEFjayA9ICd2LWFjaydcbn1cblxuLyoqXG4gKiBUaGUgTWVzc2FnZSBpbnRlcmZhY2UgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhbGwgdGhlIG90aGVyXG4gKiBtZXNzYWdlIHR5cGUgaW50ZXJmYWNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ0d1aWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhpcyBtZXNzYWdlXG4gICAqL1xuICBtc2dUeXBlOiBNZXNzYWdlVHlwZTtcbn1cblxuLyoqXG4gKiBUaGUgaW5pdGlhbGl6ZSBtZXNzYWdlIGlzIHRoZSBmaXJzdCBtZXNzYWdlIHdoaWNoIHdpbGwgYmUgc2VudFxuICogZnJvbSB0aGUgamF2YXNjcmlwdCB0byBzZXQgdXAgY29tbXVuaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsaXplTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGFwaSB3aGljaCB0aGUgc2VuZGVyIHdhbnRzIHRvIHVzZVxuICAgKi9cbiAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBtZXNzYWdpbmcgY29udHJhY3QgdG8gYmUgdXNlZC4gRm9yIG5vdywgdGhlcmVcbiAgICogc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgdmVyc2lvbiBidXQgc2VuZGluZyB0aGlzIGFsb25nIHNob3VsZCBoZWxwXG4gICAqIGlmIHdlIG5lZWQgdG8gYWRkIGEgbmV3IHZlcnNpb24gaW4gYSBmdXR1cmUgcmVsZWFzZVxuICAgKi9cbiAgY3Jvc3NGcmFtZVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXQgdGhlIHRpbWUgb2YgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnM7XG59XG5cbi8qKlxuICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiBhIG5vdGlmaWNhdGlvbiBvY2N1cnMgZnJvbSB0aGUgcHJlc2xheWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIGZvciB0aGlzIHR5cGUgb2Ygbm90aWZpY2F0aW9uXG4gICAqL1xuICBub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHdoaWNoIGNhbWUgYWxvbmcgd2l0aCB0aGUgbm90aWZpY2F0aW9uXG4gICAqL1xuICBkYXRhOiBNb2RlbDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGNhbGxpbmcgYW4gaW50ZXJuYWwgY29udHJhY3QgY29tbWFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGNvbW1hbmQgd2hpY2ggc2hvdWxkIGJlIGV4ZWN1dGVkXG4gICAqL1xuICB2ZXJiSWQ6IFZlcmJJZDtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kXG4gICAqL1xuICBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCBpbiByZXNwb25zZSB0byBhIENvbW1hbmRNZXNzYWdlIHdpdGggdGhlXG4gKiByZXN1bHQgb2YgdGhhdCBjb21tYW5kcyBpbnZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogR3VpZCBvZiB0aGUgQ29tbWFuZE1lc3NhZ2Ugd2hpY2ggdGhpcyBpcyBpbiByZXNwb25zZSB0b1xuICAgKi9cbiAgY29tbWFuZEd1aWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhlcmUgd2FzIGFuIGVycm9yIHJldHVybmVkIGZyb20gdGhlIGNvbW1hbmQsIHRoaXMgd2lsbCBiZSBkZWZpbmVkXG4gICAqIGFuZCBjb250YWluIHRoZSBlcnJvclxuICAgKi9cbiAgZXJyb3I/OiBNb2RlbDtcblxuICAvKipcbiAgICogSWYgdGhlIGNvbW1hbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGlzIHdpbGwgY29udGFpbiB0aGUgY29tbWFuZCByZXN1bHRcbiAgICovXG4gIGRhdGE/OiBNb2RlbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIYW5kc2hha2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBJbnRlcm5hbCBBUEkgY29udHJhY3QgdmVyc2lvblxuICAgKi9cbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQsIEV4ZWN1dGVQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhpcyB2ZXJzaW9uIGNvbnZlcnRlciBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJ1dCBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiB3ZSBoYXZlXG4gKiBhIG1hdGNoaW5nIHBsYXRmb3JtIGFuZCBpbnRlcm5hbCB2ZXJzaW9uIG51bWJlclxuKi9cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7IH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnNcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoZSBvbmx5XG4gKiBtb2RlIGl0IHN1cHBvcnRzIGlzIGV4dGVybmFsJ3MgdmVyc2lvbiA8PSBwbGF0Zm9ybSdzIHZlcnNpb24uIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byB1cGdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCBkb3duZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC4gU2ltaWxhcmx5IGZvciBub3RpZmljYXRpb25zLCBpdCBjYW5cbiAqIGRvd25ncmFkZSB0aG9zZSBvbiB0aGUgd2F5IGZyb20gcGxhdGZvcm0gdG8gZXh0ZXJuYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAgKlxuICAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+XG4gICk6IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKFxuICAgICAgZXh0ZXJuYWxWZXJzaW9uLm1ham9yLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLm1ham9yLFxuICAgICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbE1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1NYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+KSB7XG5cbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb24gPiB0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbn0gYW5kICR7dGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVyczsgfSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCB1cGdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgdXBncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVUcmFuc2xhdGlvbih1cGdyYWRlZC52ZXJiLCB1cGdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSByZXNwb25zZSB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBub3RpZmljYXRpb247XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRG93bmdyYWRlV29ya3NoZWV0TmFtZXMsIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRCB9IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA8IHJocyAoaWdub3JpbmcgZml4IG51bWJlcilcbiAqIEBwYXJhbSBsaHNcbiAqIEBwYXJhbSByaHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFZlcnNpb25MZXNzVGhhbihsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAobGhzLm1ham9yID4gcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsaHMubWFqb3IgPCByaHMubWFqb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gKGxocy5taW5vciA8IHJocy5taW5vcik7XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPT0gcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkVxdWFsVG8obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChsaHMubWFqb3IgPT09IHJocy5tYWpvcikgJiYgKGxocy5taW5vciA9PT0gcmhzLm1pbm9yKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VD4geyBbbWFqb3I6IG51bWJlcl06IHsgW21pbm9yOiBudW1iZXJdOiBBcnJheTxUPiB9OyB9XG5cbi8vIEEgbWFwcGluZyBmcm9tIGFuIG9sZGVyIGNsaWVudCB2ZXJzaW9uIG9mIGludGVybmFsLWNvbnRyYWN0IHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtIHZlcnNpb24gb2YgdGhpcyBjb250cmFjdC5cbi8vIEVhY2ggdmVyc2lvbiBidW1wIGNhbiBoYXZlIGFuIGFycmF5IG9mIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGluIG9yZGVyLiBOb3RpY2UgdGhhdCB0aGlzIGlzXG4vLyBkaWZmZXJlbnQgdGhhbiB0aGUgbWFqb3IgdXBncmFkZXMvZG93bmdyYWRlcyBhYm92ZSBiZWNhdXNlIGl0IGhhbmRsZXMgYm90aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLlxuLy8gQWxzbyBwbGVhc2Ugbm90ZTogZG93bmdyYWRlRXhlY3V0ZUNhbGwgaXMgaGFuZGxlZCBvbiB0aGUgY2xpZW50L2V4dGVybmFsIHNpZGUgcmF0aGVyIHRoYW4gcGxhdGZvcm0gc2lkZS5cbi8vIFdoZW4gdXBkYXRpbmcgdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2Ygb3VyIGludGVybmFsLWNvbnRyYWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMuXG4vLyAqIElmIHRoZXJlIGFyZSB0cmFuc2xhdGlvbnMgdG8gYWRkLCBhZGQgdGhlbSB0byB0aGUgdmVyc2lvbiB0byBcInVwZ3JhZGUgZnJvbVwiIG9yIFwiZG93bmdyYWRlIHRvXCIuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHB1dCB1cGdyYWRlcyBmcm9tIDEuOSB0byAxLjEwIGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgNTogW0Rvd25ncmFkZVdvcmtzaGVldE5hbWVzXSxcbiAgICA5OiBbXSxcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10sXG4gICAgMTA6IFtEb3duZ3JhZGVGbGlwYm9hcmRab25lSURdXG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlIHRoZSBjb250cmFjdFxuICogYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zLCB3aGljaCBhcmUgc3BlY2lmaWVkLiBJZiBleHRlcm5hbE1ham9yVmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gKiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBiZWNhdXNlIHdlIHdvbid0IGtub3cgaG93IHRvIGRvIHRob3NlIGNvbnZlcnNpb25zLlxuICogVGhpcyBjb252ZXJ0ZXIgY2FuIGhhbmRsZSBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzIHdoZW4gdGhlIHBsYXRmb3JtIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGV4dGVybmFsIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcik6IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcblxuICByZXR1cm4gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgICBleHRlcm5hbFZlcnNpb24sXG4gICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVzLFxuICAgIEV4ZWN1dGVNaW5vckRvd25ncmFkZXMsXG4gICAgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzKTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBDcmVhdGVWZXJzaW9uQ29udmVydGVyLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUsIGFuZFxuICogbm90aWZpY2F0aW9uIGFycmF5cyBzbyB0aGF0IGFsbCB0aGUgbG9naWMgY2FuIGJlIHRlc3RlZC5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGRvd25ncmFkZXNcbiAqIEBwYXJhbSBub3RpZmljYXRpb25Eb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3Igbm90aWZpY2F0aW9uIGRvd25ncmFkZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICB1cGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICBkb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICBub3RpZmljYXRpb25Eb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4pOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG5cbiAgY29uc3QgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5taW5vcjtcbiAgY29uc3QgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5tYWpvcjtcblxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPiBwbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgdmVyc2lvbiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwbGF0Zm9ybSB2ZXJzaW9uLlxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uPSR7ZXh0ZXJuYWxNYWpvclZlcnNpb259IHBsYXRmb3JtTWFqb3JWZXJzaW9uPSR7cGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGV4YWN0IHNhbWUgdmVyc2lvbnMgKG1ham9yLm1pbm9yKSwganVzdCB1c2UgdGhlIGlkZW50aXR5IGNvbnZlcnRlclxuICBpZiAoVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIoKTtcbiAgfVxuXG4gIC8vIFdhbGsgdGhlIHNwYW4gYmV0d2VlbiB0aGUgdmVyc2lvbnMgd2UgaGF2ZSBoZXJlIGFuZCBjb2xsZWN0IHRoZSB1cGdyYWRlIGFuZCBkb3duZ3JhZGVzIG5lY2Vzc2FyeVxuICBsZXQgbmVlZGVkRXhlY3V0ZVVwZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPiA9XG4gICAgR2V0TmVlZGVkVHJhbnNsYXRpb25zKGV4dGVybmFsTWFqb3JWZXJzaW9uLCBwbGF0Zm9ybU1ham9yVmVyc2lvbiwgZXh0ZXJuYWxNaW5vclZlcnNpb24sIHVwZ3JhZGVzKTtcblxuICBsZXQgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9XG4gICAgR2V0TmVlZGVkVHJhbnNsYXRpb25zKGV4dGVybmFsTWFqb3JWZXJzaW9uLCBwbGF0Zm9ybU1ham9yVmVyc2lvbiwgZXh0ZXJuYWxNaW5vclZlcnNpb24sIGRvd25ncmFkZXMpO1xuXG4gIGxldCBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9XG4gICAgR2V0TmVlZGVkVHJhbnNsYXRpb25zKGV4dGVybmFsTWFqb3JWZXJzaW9uLCBwbGF0Zm9ybU1ham9yVmVyc2lvbiwgZXh0ZXJuYWxNaW5vclZlcnNpb24sIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMpO1xuXG4gIC8vIFdlIHdhbnQgdG8gYXBwbHkgdGhlIGRvd25ncmFkZXMgaW4gcmV2ZXJzZSBvcmRlciBpbiBjYXNlIG9mIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW1cbiAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMucmV2ZXJzZSgpO1xuICBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzLnJldmVyc2UoKTtcblxuICByZXR1cm4gU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLmZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbiwgcGxhdGZvcm1WZXJzaW9uLCBuZWVkZWRFeGVjdXRlVXBncmFkZXMsIG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzLCBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPik6IEFycmF5PFQ+IHtcblxuICBsZXQgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgbGV0IHN0YXJ0ID0gKG1ham9yID09PSBleHRlcm5hbE1ham9yVmVyc2lvbikgPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBsZXQgbWF4aW11bU1pbm9yVmVyc2lvbiA9IEdldE1heGltdW1NaW5vckluZGV4KE9iamVjdC5rZXlzKG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pKTtcbiAgICAgIGZvciAobGV0IG1pbm9yID0gc3RhcnQ7IG1pbm9yIDw9IG1heGltdW1NaW5vclZlcnNpb247IG1pbm9yKyspIHtcbiAgICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pIHtcbiAgICAgICAgICBuZWVkZWRUcmFuc2xhdGlvbnMucHVzaCguLi5tYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdW21pbm9yXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZGVkVHJhbnNsYXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR2V0TWF4aW11bU1pbm9ySW5kZXgobWlub3JWZXJzaW9uczogQXJyYXk8c3RyaW5nPik6IG51bWJlciB7XG4gIHJldHVybiBtaW5vclZlcnNpb25zLm1hcCgoYSkgPT4gTnVtYmVyKGEpKS5yZWR1Y2UoKGEsIGIpID0+IGEgPiBiID8gYSA6IGIpO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgVmlzdWFsSWQgfSBmcm9tICcuLi9jb250cmFjdC9Nb2RlbHMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgb2xkIHZlcnMgYW5kIHBhcmFtZXRlcnMgZnJvbSB0aGUgZXh0ZXJuYWwgYmVmb3JlIHdlIHNlbmQgaXQgdG8gcGxhdGZvcm0gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlQ2FsbCA9XG4gICh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZWQgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZVJldHVybiA9XG4gIChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSkgPT4gRXhlY3V0ZVJlc3BvbnNlO1xuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlTm90aWZpY2F0aW9uID1cbiAgKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PiBOb3RpZmljYXRpb247XG5cblxuLy8gVGhpcyBpcyB3aGVyZSB3ZSB3aWxsIHN0YXJ0IHRvIGRlZmluZSBzb21lIG9mIHRoZXNlIHRyYW5zbGF0aW9ucy5cbi8vIFdoZW4gbW9kaWZ5aW5nIGV4aXN0aW5nIG1vZGVscywgYWRkIHRoZSByZXF1aXNpdGUgY29udmVyc2lvbiBmdW5jdGlvbnMgaGVyZSwgdGhlbiB1c2UgdGhlbVxuLy8gaW4gdGhlIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5IGltcGxlbWVudGF0aW9uLiBJbXBvcnQgb2xkIHZlcnNpb25zIGFzIHlvdSB3b3VsZCBhbnkgb3RoZXIgbW9kdWxlXG5cbi8vIDAgPC0+IFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjAgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMCBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjAnO1xuXG4vLyAxIDwtPiAyIFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjEgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMSBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjEnO1xuXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlV29ya3NoZWV0TmFtZXMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuXG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGxldCBib290c3RyYXBJbmZvID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICBpZiAoYm9vdHN0cmFwSW5mby5leHRlbnNpb25EYXNoYm9hcmRJbmZvICE9PSB1bmRlZmluZWQpIHtcbiAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8uem9uZXMuZm9yRWFjaCh6b25lID0+IHtcbiAgICAgIGlmICh6b25lLnNoZWV0SW5mbykge1xuICAgICAgICB6b25lLm5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG5cbiAgLy8gRml4IHRoZSBGbGlwYm9hcmRab25lSWQgaXNzdWUuIE9sZGVyIGV4dGVybmFsIHZlcnNpb25zIHN0aWxsIGNoZWNrIGZvciBmbGlwYm9hcmRab25lSURzLlxuICAvLyBXaGVuIHJ1bm5pbmcgYWdhaW5zdCBhIG5ld2VyIHNlcnZlciwgaWYgZmxpcGJvYXJkWm9uZUlkIGlzIGFic2VudCwgc2V0IGl0IHRvIGRlZmF1bHQoMCkuXG5cbiAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZCA9PT0gTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQpIHtcbiAgICBsZXQgdmlzdWFsTW9kZWwgPSBub3RpZmljYXRpb24uZGF0YSBhcyBWaXN1YWxJZDtcbiAgICBpZiAodmlzdWFsTW9kZWwuZmxpcGJvYXJkWm9uZUlEID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbn1cbiIsImltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVyczsgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVyc1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4ZWN1dGVSZXNwb25zZSwgRXhlY3V0ZVBhcmFtZXRlcnMsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBjb252ZXJ0ZXIgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIGFuZCBleHRlcm5hbCBtb2R1bGVzXG4gKiB0byBzZWVtbGVzc2x5IGNvbW11bmljYXRlIG92ZXIgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJuYWwgQVBJLiBUaGlzIGNvbnZlcnRlclxuICogc3VwcG9ydHMgZXh0ZXJuYWwncyB2ZXJzaW9uKG1pbm9yKSA+PSBwbGF0Zm9ybSdzIHZlcnNpb24obWlub3IpLiBXaGVuIGV4ZWN1dGluZ1xuICogY29tbWFuZHMsIGl0IGlzIHVzZWQgdG8gZG93bmdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCB1cGdyYWRlIHRoZSByZXByZXNlbnRhdGlvbnMgb24gdGhlIHdheSBvdXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gZG93bmdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZCBpcyBleGVjdXRlZFxuICAgKiBAcGFyYW0gX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgbm90ZmljYXRpb25zIHRvIHBlcmZvcm0gb24gZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZU5vdGlmaWNhdGlvbj4pIHtcblxuXG4gICAgaWYgKHRoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvciA+IHRoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3J9XG4gICAgICBhbmQgJHt0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzOyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSBkb3duZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkLnZlcmIsIGRvd25ncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVOb3RpZmljYXRpb24gb2YgdGhpcy5fdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlTm90aWZpY2F0aW9uKHVwZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1ham9yTWlub3JUcmFuc2xhdG9ycywgR2V0TWF4aW11bU1pbm9ySW5kZXgsIFZlcnNpb25FcXVhbFRvIH0gZnJvbSAnLi4vVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0V4dGVybmFsIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBEb3duZ3JhZGVVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMsIERvd25ncmFkZUxvZ2ljYWxUYWJsZURhdGFBc3luYywgVXBncmFkZURhdGFUYWJsZVR5cGVzLCBVcGdyYWRlRGF0YVRhYmxlUm93c0FuZENvbHVtbnMgfSBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgcHV0IGRvd25ncmFkZXMgZnJvbSAxLjEwIHRvIDEuOSBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICAgIDEzOiBbRG93bmdyYWRlVW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jLCBEb3duZ3JhZGVMb2dpY2FsVGFibGVEYXRhQXN5bmNdLFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW1VwZ3JhZGVEYXRhVGFibGVUeXBlc10sICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICAgIDI5OiBbVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zXSwgLy8gMjAyMS4xIHdhcyByZWxlYXNlZCB3aXRoIDEuMjkuIFVwZ3JhZGUgZnJvbSAxLjI5IGluIHRoZSBbMV1bMjldIGJ1Y2tldFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZU5vdGlmaWNhdGlvbjogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10gICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgd2hpY2ggaGFzIHRoZSBhYmlsaXR5IHRvIHVwZ3JhZGUgYW5kIGRvd25ncmFkZVxuICogdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucyB3aGljaCBhcmUgc3BlY2lmaWVkLiBJZiBleHRlcm5hbE1ham9yVmVyc2lvbiBpcyBsZXNzIHRoYW5cbiAqIHBsYXRmb3JtTWFqb3JWZXJzaW9uLCBhbiBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB3aWxsIGJlIHJldHVybmVkLlxuICogSGFuZGxlcyB1cGdyYWRlL2Rvd25ncmFkZSBmb3IgYm90aCBtYWpvciBhbmQgbWlub3IgdXBkYXRlcy5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIoXG4gIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuXG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycy5cbiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHVwZ3JhZGUsIGRvd25ncmFkZSBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICogQHBhcmFtIHVwZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgcmVzcG9uc2UgdXBncmFkZXNcbiAqIEBwYXJhbSBkb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgZXhlY3V0ZSBjYWxsIGRvd25ncmFkZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBkb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICB1cGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgdXBncmFkZU5vdGlmaWNhdGlvbnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPilcbiAgOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG5cbiAgY29uc3QgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgcGxhdGZvcm1NaW5vclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5taW5vcjtcblxuICAvLyBUaGlzIGNoZWNrIGlzIHByZXNlbnQgaW4gVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkuIFdlIHRocm93IHRoZSBzYW1lIGVycm9yIGhlcmUgYXMgd2VsbC5cbiAgLy8gSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBtaW5vciB2ZXJzaW9ucyBmb3IgdHJhbnNsYXRpb25zLlxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPiBwbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgdmVyc2lvbiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwbGF0Zm9ybSB2ZXJzaW9uLlxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uPSR7ZXh0ZXJuYWxNYWpvclZlcnNpb259IHBsYXRmb3JtTWFqb3JWZXJzaW9uPSR7cGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gIH1cblxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPCBwbGF0Zm9ybU1ham9yVmVyc2lvbiB8fCBWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyKCk7XG4gIH1cblxuICAvLyBXYWxrIHRoZSBzcGFuIGJldHdlZW4gdGhlIHZlcnNpb25zIHdlIGhhdmUgaGVyZSBhbmQgY29sbGVjdCB0aGUgdXBncmFkZSBhbmQgZG93bmdyYWRlcyBuZWNlc3NhcnlcbiAgbGV0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPVxuICAgIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zKHBsYXRmb3JtTWFqb3JWZXJzaW9uLCBwbGF0Zm9ybU1pbm9yVmVyc2lvbiwgZG93bmdyYWRlcyk7XG5cbiAgbGV0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID1cbiAgICBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhwbGF0Zm9ybU1ham9yVmVyc2lvbiwgcGxhdGZvcm1NaW5vclZlcnNpb24sIHVwZ3JhZGVzKTtcblxuICBsZXQgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID1cbiAgICBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhwbGF0Zm9ybU1ham9yVmVyc2lvbiwgcGxhdGZvcm1NaW5vclZlcnNpb24sIHVwZ3JhZGVOb3RpZmljYXRpb25zKTtcblxuICAvLyBSZXZlcnNlIHRoZSBkb3duZ3JhZGUgY2FsbHMsIHNvIHRoYXQgd2Ugc3RhcnQgdGhlIGRvd25ncmFkZSBmcm9tIHRoZSBleHRlcm5hbCB2ZXJzaW9uIHRvIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uXG4gIG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlLnJldmVyc2UoKTtcbiAgcmV0dXJuIG5ldyBFeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcihcbiAgICBleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbiwgbmVlZGVkRXhlY3V0ZUNhbGxEb3duZ3JhZGUsIG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlcywgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMpO1xufVxuXG5mdW5jdGlvbiBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9uczxUPihcbiAgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgcGxhdGZvcm1NaW5vclZlcnNpb246IG51bWJlcixcbiAgbWFqb3JNaW5vclRyYW5zbGF0b3JzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VD4pOiBBcnJheTxUPiB7XG5cbiAgbGV0IG5lZWRlZFRyYW5zbGF0aW9uczogQXJyYXk8VD4gPSBbXTtcblxuICBpZiAocGxhdGZvcm1NYWpvclZlcnNpb24gaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzKSB7XG4gICAgbGV0IHN0YXJ0ID0gcGxhdGZvcm1NaW5vclZlcnNpb247XG4gICAgbGV0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCJpbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwsXG4gIERhdGFIZWFkZXIsXG4gIERhdGFUYWJsZSxcbiAgRGF0YVR5cGVDb252ZXJ0ZXIsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEludGVybmFsVGFibGVhdUVycm9yLFxuICBOb3RpZmljYXRpb24sXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZFxufSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBuZXdlciB2ZXJzaW9uIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBEb3duZ3JhZGVFeGVjdXRlQ2FsbCA9XG4gICh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byB1cGdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvblxuICogIFRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHByb3ZpZGUgYSBjb250ZXh0IHRvIGRlY2lkZSBob3cgdG8gaGFuZGxlIHRoZSByZXNwb25zZS5cbiovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZVJldHVybiA9XG4gIChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4gRXhlY3V0ZVJlc3BvbnNlO1xuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVOb3RpZmljYXRpb24gPVxuICAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pID0+IE5vdGlmaWNhdGlvbjtcblxuLy8gMS4yIC0+IDEuMCBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYxIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjEgZnJvbSAnQHRhYmxlYXUtYXBpLWludGVybmFsLWNvbnRyYWN0LWpzX3YxJztcblxuLyoqXG4gKiBQcmlvciB0byAyMDE5LjIgKGludGVybmFsLWNvbnRyYWN0IHYxLjkpLCBEYXRhVmFsdWUudmFsdWUgd2VyZSBhbGwgc3RyaW5ncy5cbiAqIEdvIHRocm91Z2ggYWxsIERhdGFWYWx1ZSBvYmplY3RzLiBJZiB3ZSBoYXZlIGEgc3RyaW5nLCBidXQgdGhlIHR5cGUgc2hvdWxkIG5vdCBiZSBhIHN0cmluZyxcbiAqIGNvbnZlcnQgaXQgdG8gdGhlIGNvcnJlY3QgdHlwZS4gVGhlIHR5cGUgb2YgRGF0YVZhbHVlLnZhbHVlIGlzICdhbnknIGluIHRoZSBjb250cmFjdCwgc29cbiAqIHRoaXMgY2hhbmdlIGRvZXNuJ3QgbmVlZCBhbnkgdXBkYXRlcyB0byBjbGFzc2VzIG9yIHR5cGVzLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlVHlwZXMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoIWV4ZWN1dGVSZXNwb25zZSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBsZXQgb2xkVW5kZXJseWluZ0RhdGFUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgaWYgKG9sZFVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSAhPT0gdW5kZWZpbmVkICYmIG9sZFVuZGVybHlpbmdEYXRhVGFibGUuaXNTdW1tYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb252ZXJ0RGF0YVZhbHVlcyhvbGRVbmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEpO1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBsZXQgb2xkU2VsZWN0ZWRNYXJrc1RhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBTZWxlY3RlZE1hcmtzVGFibGU7XG4gIGlmIChvbGRTZWxlY3RlZE1hcmtzVGFibGUuZGF0YSAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkob2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEpKSB7XG4gICAgb2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEuZm9yRWFjaChtYXJrc1RhYmxlID0+IHtcbiAgICAgIGNvbnZlcnREYXRhVmFsdWVzKG1hcmtzVGFibGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjAuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMTMgYW5kIG9sZGVyKSwgd29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXRVbmRlcmx5aW5nRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlVW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiB7XG4gIHZlcmI6IFZlcmJJZDtcbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnNcbn0ge1xuICBpZiAodmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEpIHtcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcnNGb3JPYmplY3RNb2RlbCh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB2ZXJiID0gVmVyYklkLkdldFVuZGVybHlpbmdEYXRhO1xuICB9XG4gIHJldHVybiB7XG4gICAgdmVyYjogdmVyYixcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG4gIH07XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMC4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4xMyBhbmQgb2xkZXIpLCBkYXRhc291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXREYXRhU291cmNlRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlTG9naWNhbFRhYmxlRGF0YUFzeW5jKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiB7XG4gIHZlcmI6IFZlcmJJZDtcbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnNcbn0ge1xuICBpZiAodmVyYiA9PT0gVmVyYklkLkdldExvZ2ljYWxUYWJsZURhdGEpIHtcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcnNGb3JPYmplY3RNb2RlbCh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB2ZXJiID0gVmVyYklkLkdldERhdGFTb3VyY2VEYXRhO1xuICB9XG4gIHJldHVybiB7XG4gICAgdmVyYjogdmVyYixcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhVmFsdWVzKHRhYmxlOiBEYXRhVGFibGUpOiB2b2lkIHtcbiAgLy8gZGF0YVRhYmxlIGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IG9mIGRhdGEuIEZpcnN0IGluZGV4IGlzIHRoZSByb3csIHNlY29uZCBpcyB0aGUgY29sdW1uLlxuICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCB8fCB0YWJsZS5kYXRhVGFibGUgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheSh0YWJsZS5kYXRhVGFibGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFibGUuZGF0YVRhYmxlLmZvckVhY2gocm93ID0+IHtcbiAgICByb3cuZm9yRWFjaCgoZGF0YVZhbHVlLCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGF0YVZhbHVlLnZhbHVlO1xuICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGRhdGFWYWx1ZS52YWx1ZSA9IERhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZSwgdGFibGUuaGVhZGVyc1tjb2x1bW5JbmRleF0uZGF0YVR5cGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gVG9EbzogVEZTMTA2OTAyNyBSZWZhY3RvciBpbnB1dCB2ZXJicyAmIHBhcmFtZXRlcnMgaW4gYXBpLWludGVybmFsLWNvbnRyYWN0IFVwZ3JhZGUvRG93bmdyYWRlIGZyYW1ld29ya1xuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbWV0ZXJzRm9yT2JqZWN0TW9kZWwodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IHZvaWQge1xuICBpZiAocGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF0gIT09IEFwaVNob3dEYXRhVGFibGVTZW50aW5lbC5TaW5nbGVUYWJsZUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxvZ2ljYWwgdGFibGUgaWQgcGFzc2VkIHRvICR7dmVyYn0uYCkgYXMgSW50ZXJuYWxUYWJsZWF1RXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmlvciB0byAyMDIxLjIgKGludGVybmFsLWNvbnRyYWN0IHYxLjI5IGFuZCBiZWxvdyksIGdldFN1bW1hcnlEYXRhQXN5bmMgZGlkIG5vdCBzdXBwb3J0IG1heFJvd3MsXG4gKiBhbmQgYW55IGdldC4uLkRhdGFBc3luYyBkaWQgbm90IHN1cHBvcnQgY29sdW1uc1RvSW5jbHVkZUJ5SWQuXG4gKiBUcmltIHJlc3VsdCB0byBtYXhSb3dzIGlmIGl0IGlzIGluY2x1ZGVkIGluIHRoZSBwYXJhbWV0ZXJzIGZvciBnZXRTdW1tYXJ5RGF0YUFzeW5jXG4gKiBUcmltIGNvbHVtbnMgdG8gY29sdW1uc1RvSW5jbHVkZSBpZiBpbmNsdWRlZCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgYW55IGdldC4uLkRhdGFBc3luY1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlUm93c0FuZENvbHVtbnMoXG4gIGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLFxuICB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgaWYgKGlzR2V0U3VtbWFyeURhdGFWZXJiKHZlcmIpICYmIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTWF4Um93c10pIHtcbiAgICBleGVjdXRlUmVzcG9uc2UgPSBhZGp1c3REYXRhUm93TGVuZ3RoKGV4ZWN1dGVSZXNwb25zZSwgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSBhcyBudW1iZXIpO1xuICB9XG5cbiAgaWYgKGlzR2V0VGFibGVEYXRhVmVyYih2ZXJiKSAmJiBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSkge1xuICAgIGV4ZWN1dGVSZXNwb25zZSA9IGFkanVzdERhdGFDb2x1bW5zKGV4ZWN1dGVSZXNwb25zZSwgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gYXMgc3RyaW5nW10pO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gaXNHZXRTdW1tYXJ5RGF0YVZlcmIodmVyYjogVmVyYklkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhO1xufVxuXG5mdW5jdGlvbiBpc0dldFRhYmxlRGF0YVZlcmIodmVyYjogVmVyYklkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhXG4gICAgfHwgdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGFcbiAgICB8fCB2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVxuICAgIHx8IHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU291cmNlRGF0YVxuICAgIHx8IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0RGF0YVJvd0xlbmd0aChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgbWF4Um93czogbnVtYmVyKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgbGV0IHVuZGVybHlpbmdEYXRhVGFibGUgPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gIGlmICghdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhIHx8ICFBcnJheS5pc0FycmF5KHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUpKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGlmIChtYXhSb3dzID4gMCAmJiBtYXhSb3dzIDwgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5sZW5ndGgpIHtcbiAgICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmxlbmd0aCA9IG1heFJvd3M7XG4gIH1cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0RGF0YUNvbHVtbnMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIGNvbHVtbnNUb0luY2x1ZGU6IHN0cmluZ1tdKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgaWYgKGNvbHVtbnNUb0luY2x1ZGUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIC8vIHZlcmlmeSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBVbmRlcmx5aW5nRGF0YVRhYmxlXG4gIGxldCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycykpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgLy8gMS4gZmlsdGVyIHRoZSBoZWFkZXJzIHRvIG9ubHkgY29sdW1uc1RvSW5jbHVkZVxuICAvLyAyLiB1c2UgdGhlIG5ldyBoZWFkZXJzIHRvIGZpbHRlciBhbGwgcm93c1xuICAvLyAzLiB1cGRhdGUgdGhlIGluZGljZXMgaW4gb3VyIG5ldyBoZWFkZXJzXG4gIGxldCBuZXdIZWFkZXJzOiBEYXRhSGVhZGVyW11cbiAgICA9IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5oZWFkZXJzLmZpbHRlcigoaGVhZGVyLCBpbmRleCkgPT4gY29sdW1uc1RvSW5jbHVkZS5maW5kKG5hbWUgPT4gbmFtZSA9PT0gaGVhZGVyLmZpZWxkTmFtZSkpO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlW2luZGV4XVxuICAgICAgPSByb3cuZmlsdGVyKCh2YWx1ZSwgdmFsdWVJbmRleCkgPT4gbmV3SGVhZGVycy5maW5kSW5kZXgoaGVhZGVyID0+IGhlYWRlci5pbmRleCA9PT0gdmFsdWVJbmRleCkgIT09IC0xKTtcbiAgfSk7XG4gIGxldCBuZXdJbmRleCA9IDA7XG4gIHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5oZWFkZXJzID0gbmV3SGVhZGVycy5tYXAoaGVhZGVyID0+IHsgaGVhZGVyLmluZGV4ID0gbmV3SW5kZXgrKzsgcmV0dXJuIGhlYWRlcjsgfSk7XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cbiIsIi8vIEV4cG9ydCBldmVyeXRoaW5nIHdoaWNoIGhhZCBiZWVuIHByZXZpb3VzbHkgaW4gdGhlIGFwaS1zaGFyZWQgbW9kdWxlXG5cbmV4cG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXInO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBTaXplIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2l6ZSc7XG5leHBvcnQgeyBQb2ludCB9IGZyb20gJy4vQXBpU2hhcmVkL1BvaW50JztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuXG5leHBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmV4cG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwnO1xuZXhwb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEltcGwnO1xuZXhwb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbCc7XG5leHBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9Xb3Jrc2hlZXRJbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkSW1wbCc7XG5leHBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmV4cG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZUJvb3RzdHJhcCc7XG5leHBvcnQgeyBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB9IGZyb20gJy4vQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXInO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSwgVW5yZWdpc3RlckZuIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvTm90aWZpY2F0aW9uU2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcblxuZXhwb3J0IHsgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnLi9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXInO1xuXG5leHBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5leHBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuZXhwb3J0IHsgVml6U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1ZpelNlcnZpY2UnO1xuXG5leHBvcnQgeyBXb3JrYm9va0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvRGF0YVNvdXJjZSc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5cbi8vIEZvciB0ZXN0aW5nXG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4vVmVyc2lvbk51bWJlcic7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyQ29udHJhY3QgfSBmcm9tICcuL1ZlcnNpb25OdW1iZXJDb250cmFjdCc7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2luZ2xldG9uIHdyYXBwZXIgb2YgVmVyc2lvbk51bWJlclxuICovXG5leHBvcnQgY2xhc3MgQXBpVmVyc2lvbiB7XG5cbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7IH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlcnZlclVSSSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5zZXJ2ZXJVUkk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8udHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIENyb3NzRnJhbWVNZXNzZW5nZXIsXG4gIE1FU1NBR0lOR19WRVJTSU9OIGFzIEFwaU1lc3NhZ2luZ1ZlcnNpb24sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LCBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlciwgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zKVxuICA6IFByb21pc2U8Q29udHJhY3QuSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4ge1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICBsZXQgcGFyZW50OiBXaW5kb3c7XG5cbiAgICAvLyBOb3JtYWxseSwgd2UgYXJlIHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZS4gIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpc1xuICAgIC8vIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYW4gZXh0ZW5zaW9uIGluc2lkZSBhIGRpYWxvZyBhcyBwYXJ0IG9mIHRoZSBVSU5hbWVzcGFjZVxuICAgIC8vIGZ1bmN0aW9uYWxpdHkuICBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgdGhlIG9wZW5lciBvZiB0aGlzIHdpbmRvdyByYXRoZXIgdGhhbiB0aGUgcGFyZW50LlxuICAgIGlmICghaW5JZnJhbWUodGhpc1dpbmRvdykpIHtcbiAgICAgIHBhcmVudCA9IHRoaXNXaW5kb3cub3BlbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93LnBhcmVudDtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmVqZWN0KCdUaGlzIGV4dGVuc2lvbiBpcyBub3QgcnVubmluZyBpbnNpZGUgYW4gaWZyYW1lLCBkZXNrdG9wLCBvciBwb3B1cCB3aW5kb3cuIEluaXRpYWxpemF0aW9uIGZhaWxlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIG1lc3NlbmdlciB3aGljaCB3aWxsIGRvIGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGlzIHdpbmRvdyBhbmQgb3VyIHBhcmVudFxuICAgIC8vIFNpbmNlIHdlIGRvbid0IGtub3cgd2hlcmUgd2UgYXJlIHJ1bm5pbmcgeWV0LCB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBpbml0aWFsIG9yaWdpbiAnKicuIE9uY2VcbiAgICAvLyB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBvdXIgZXh0ZW5zaW9uLCB3ZSB3aWxsIGxpbWl0IHdoZXJlIHdlIHNlbmQgbWVzc2FnZXNcbiAgICBjb25zdCBtZXNzZW5nZXIgPSBuZXcgQ3Jvc3NGcmFtZU1lc3Nlbmdlcih0aGlzV2luZG93LCBwYXJlbnQsICcqJyk7XG5cbiAgICAvLyBQcmVwYXJlIHRvIHNlbmQgYW4gaW5pdGlhbGl6YXRpb24gbWVzc2FnZSB0byB0aGUgcGFyZW50IGZyYW1lXG4gICAgY29uc3QgaW5pdGlhbGl6YXRpb25NZXNzYWdlID1cbiAgICAgIG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcblxuICAgICAgLy8gVmVyaWZ5IHdlIGFyZSBnZXR0aW5nIGEgcmVzcG9uc2UgZnJvbSBvdXIgaW5pdGlhbGl6ZSBtZXNzYWdlXG4gICAgICBpZiAobXNnLmNvbW1hbmRHdWlkID09PSBpbml0aWFsaXphdGlvbk1lc3NhZ2UubWVzc2FnZUd1aWQpIHtcblxuICAgICAgICAvLyBUaGUgdmVyc2lvbmluZyBvZiB0aGUgZGlzcGF0Y2hlciBoYXBwZW5zIG9uIHRoZSBvdGhlciBzaWRlIG9mIG91ciBmcmFtZSwgYW5kXG4gICAgICAgIC8vIGluIGEgd3JhcHBlciBvbiB0aGlzIHNpZGUuIFRoaXMgb25lIGRvZXNuJ3QgaGF2ZSBhbnkgdmVyc2lvbiBrbm93bGVkZ2UuXG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXJGYWN0b3J5ID0gKCkgPT4gbmV3IENyb3NzRnJhbWVEaXNwYXRjaGVyKG1lc3Nlbmdlcik7XG4gICAgICAgIHJlc29sdmUoZGlzcGF0Y2hlckZhY3RvcnkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTm93IHRoYXQgb3VyIGhhbmRsZXJzIGFyZSByZWFkeSwgc3RhcnQgbGlzdGVuaW5nIGFuZCBzZW5kIG91ciBpbml0aWFsaXphdGlvbiBtZXNzYWdlXG4gICAgbWVzc2VuZ2VyLnN0YXJ0TGlzdGVuaW5nKCk7XG4gICAgaW5pdGlhbGl6YXRpb25NZXNzYWdlLnNlbmQoKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLCBNZXNzZW5nZXIsIE5vdGlmaWNhdGlvbk1lc3NhZ2UgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcblxuICAvLyBDb2xsZWN0aW9uIG9mIHBlbmRpbmcgcHJvbWlzZXMgd2hpY2ggYXJlIHdhaXRpbmcgdG8gYmUgcmVzb2x2ZWQuIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgb3RoZXIgZnJhbWUsXG4gIC8vIHRoZXNlIHByb21pc2VzIGNhbiBiZSBlaXRoZXIgcmVzb2x2ZWQgb3IgcmVqZWN0ZWRcbiAgcHJpdmF0ZSBfcGVuZGluZ1Byb21pc2VzOlxuICAgIHsgW21lc3NhZ2VHdWlkOiBzdHJpbmddOiB7IHJlc29sdmU6IChyZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PiB2b2lkLCByZWplY3Q6IChlcnJvcjogTW9kZWwpID0+IHZvaWQgfSB9ID0ge307XG5cbiAgLy8gVGhlIGNvbGxlY3Rpb24gb2Ygbm90aWZpY2F0aW9uIGhhbmRsZXJzIHdoaWNoIGhhdmUgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhpcyBkaXNwYXRjaGVyXG4gIHByaXZhdGUgX25vdGlmaWNhdGlvbkhhbmRsZXJzOiBBcnJheTxOb3RpZmljYXRpb25IYW5kbGVyPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVEaXNwYXRjaGVyIHdoaWNoIHdpbGwgdXNlIHRoZSBnaXZlbiBtZXNzZW5nZXIgdG8gY29tbXVuaWNhdGVcbiAgICogQHBhcmFtIF9tZXNzZW5nZXIgYW4gaW5zdGFudGlhdGVkIGFuZCBsaXN0ZW5pbmcgbWVzc2VuZ2VyIG9iamVjdFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NlbmdlcjogTWVzc2VuZ2VyKSB7XG4gICAgaWYgKCF0aGlzLl9tZXNzZW5nZXIpIHtcbiAgICAgIHRocm93ICdNaXNzaW5nIG1lc3NlbmdlciBvYmplY3QnO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBvdXIgbWVzc2FnZSBoYW5kbGVycy4gV2Ugb25seSBjYXJlIGFib3V0IGluY29taW5nIG5vdGlmaWNhdGlvbnMgYW5kIGNvbW1hbmQgcmVzcG9uc2VzXG4gICAgdGhpcy5fbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKHRoaXMub25Db21tYW5kUmVzcG9uc2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fbWVzc2VuZ2VyLnNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKHRoaXMub25Ob3RpZmljYXRpb24uYmluZCh0aGlzKSk7XG4gIH1cblxuICAvLy8vLy8gU3RhcnQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHVibGljIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgLy8gVG8gZXhlY3V0ZSBhIHZlcmIsIHdlIGZpcnN0IHByZXBhcmUgYSBjb21tYW5kIG1lc3NhZ2UgYW5kIHRoZW4gZGVmaW5lIGEgcHJvbWlzZS5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSB0aGlzLl9tZXNzZW5nZXIucHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgLy8gU2F2ZSBvZmYgdGhlIHBlbmRpbmcgcHJvbWlzZSBieSB0aGUgbWVzc2FnZUd1aWQgd2UgYXJlIGFib3V0IHRvIHNlbmQuIFdoZW4gYSByZXNwb25zZSBpc1xuICAgICAgLy8gcmVjZWl2ZWQsIHdlJ2xsIGJlIGFibGUgdG8gcmVzb2x2ZSB0aGlzIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0XG4gICAgICB0aGlzLl9wZW5kaW5nUHJvbWlzZXNbcHJlcGFyZWRNZXNzYWdlLm1lc3NhZ2VHdWlkXSA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcbiAgICB9KTtcblxuICAgIC8vIEFjdHVhbGx5IHNlbmQgdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB0aGUgcHJvbWlzZVxuICAgIHByZXBhcmVkTWVzc2FnZS5zZW5kKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcihoID0+IGggIT09IGhhbmRsZXIpO1xuICB9XG5cbiAgLy8vLy8vIEVuZCBJbnRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50YXRpb25cblxuICBwcml2YXRlIG9uQ29tbWFuZFJlc3BvbnNlKHJlc3BvbnNlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG4gICAgLy8gV2UgZ290IGEgY29tbWFuZCByZXNwb25zZSwgbG9vayB0aHJvdWdoIHRoZSBwZW5kaW5nIHByb21pc2VzIGFuZCByZXNvbHZlXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdQcm9taXNlcykuaW5kZXhPZihyZXNwb25zZS5jb21tYW5kR3VpZCkgPCAwKSB7XG4gICAgICByZXR1cm47IC8vIFdlIGRvbid0IGhhdmUgYW55IHJlZmVyZW5jZSB0byB0aGlzIGNvbW1hbmQsIGp1c3QgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGVuZGluZ1Byb21pc2UgPSB0aGlzLl9wZW5kaW5nUHJvbWlzZXNbcmVzcG9uc2UuY29tbWFuZEd1aWRdO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBlcnJvciBkZWZpbmVkLCByZWplY3QgdGhlIHByb21pc2VcbiAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlamVjdChyZXNwb25zZS5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBkYXRhIGRlZmluZWQsIHJlc29sdmUgdGhlIHByb21pc2VcbiAgICBpZiAocmVzcG9uc2UuZGF0YSkge1xuICAgICAgcGVuZGluZ1Byb21pc2UucmVzb2x2ZSh7IHJlc3VsdDogcmVzcG9uc2UuZGF0YSB9KTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBvdXIgcGVuZGluZyBwcm9taXNlcyBvYmplY3RcbiAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uTWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIEdvIHRocm91Z2ggZWFjaCBub3RpZmljYXRpb24gaGFuZGxlciB3ZSBoYXZlIHJlZ2lzdGVyZWQgYW5kIGxldCB0aGVtIGtub3cgYSBub3RpZmljYXRpb24gY2FtZSBpblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcih7IG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkLCBkYXRhOiBub3RpZmljYXRpb25NZXNzYWdlLmRhdGEgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGlzLiBXcmFwIGluIHRyeS9jYXRjaCBzbyBpZiBvbmUgaGFuZGxlciBlcnJvcnMsIHRoZSBvdGhlciBzdGlsbCBnZXQgdGhlIG1lc3NhZ2VcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0RhdGFTb3VyY2VJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2UgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RhdGFTb3VyY2VJbXBsOiBEYXRhU291cmNlSW1wbCkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgJ0RhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlc0FzeW5jIGFuZCBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTpcbiAgICBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQsIG9wdGlvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5pbXBvcnQge1xuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJEb21haW5UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxEb21haW5UeXBlLCBJbnRlcm5hbERvbWFpblR5cGU+KHtcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLlJlbGV2YW50XTogSW50ZXJuYWxEb21haW5UeXBlLlJlbGV2YW50LFxuICAgIFtFeHRlcm5hbERvbWFpblR5cGUuRGF0YWJhc2VdOiBJbnRlcm5hbERvbWFpblR5cGUuRGF0YWJhc2VcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBudWxsT3B0aW9ucyA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsTnVsbE9wdGlvbiwgSW50ZXJuYWxOdWxsT3B0aW9uPih7XG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXNdOiBJbnRlcm5hbE51bGxPcHRpb24uQWxsVmFsdWVzLFxuICAgIFtFeHRlcm5hbE51bGxPcHRpb24uTm9uTnVsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzLFxuICAgIFtFeHRlcm5hbE51bGxPcHRpb24uTnVsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzZXRWaXNpYmlsaXR5VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFpvbmVWaXNpYmlsaXR5VHlwZSwgQm9vbGVhbj4oe1xuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuU2hvd106IHRydWUsXG4gICAgW1pvbmVWaXNpYmlsaXR5VHlwZS5IaWRlXTogZmFsc2VcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzZXRSZXBsYXlTcGVlZFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxSZXBsYXlTcGVlZFR5cGUsIG51bWJlcj4oe1xuICAgIC8vIHRoZXNlIG51bWJlcnMgYXJlIGR1cmF0aW9uIG11bHRpcGxpZXJzXG4gICAgLy8gMi4wLCBmb3IgZXhhbXBsZSwgZG91YmxlcyB0aGUgZHVyYXRpb24gb2YgdGhlIHJlcGxheSwgc2xvd2luZyBpdCBkb3duIHRvIDAuNXggc3BlZWRcbiAgICBbUmVwbGF5U3BlZWRUeXBlLlNsb3ddOiAyLjAsXG4gICAgW1JlcGxheVNwZWVkVHlwZS5Ob3JtYWxdOiAxLjAsXG4gICAgW1JlcGxheVNwZWVkVHlwZS5GYXN0XTogMC41XG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiwgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdD4oe1xuICAgIFtJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZUFuZEZvcm1hdHRlZFZhbHVlcyxcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uT25seU5hdGl2ZVZhbHVlc106IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uT25seUZvcm1hdHRlZFZhbHVlc106IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuRm9ybWF0dGVkVmFsdWVzT25seVxuICB9KTtcbn1cbi8qIHRzbGludDplbmFibGU6dHlwZWRlZiAqL1xuIiwiaW1wb3J0IHtcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEV4dGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRXJyb3JDb2RlcyBhcyBFeHRlcm5hbEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQgYXMgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSBhcyBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSBhcyBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlIGFzIEV4dGVybmFsRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBQYXJhbWV0ZXJWYWx1ZVR5cGUgYXMgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUsXG4gIFBlcmlvZFR5cGUgYXMgRXh0ZXJuYWxEYXRlUGVyaW9kLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIFNoZWV0VHlwZSBhcyBJbnRlcm5hbFNoZWV0VHlwZSxcbiAgQ2xhc3NOYW1lS2V5IGFzIEludGVybmFsQ2xhc3NOYW1lS2V5LFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXJcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Nb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zTW9kZSwgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZT4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZ106IEV4dGVybmFsRXh0ZW5zaW9uc01vZGUuQXV0aG9yaW5nLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmdcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjb2x1bW5UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxDb2x1bW5UeXBlLCBFeHRlcm5hbENvbHVtblR5cGU+KHtcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkNvbnRpbnVvdXNdOiBFeHRlcm5hbENvbHVtblR5cGUuQ29udGludW91cyxcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlXTogRXh0ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRkXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRW5kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSW5PdXQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkt1cnRvc2lzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1heF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1keV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1lZGlhbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1vbnRoWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQxXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDEsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3NdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNrZXduZXNzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdW1dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNEYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNIb3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGhdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jUXRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1NlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1dlZWtdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1llYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnAsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRSb2xlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmllbGRSb2xlVHlwZSwgRXh0ZXJuYWxGaWVsZFJvbGVUeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb25dOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuRGltZW5zaW9uLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuTWVhc3VyZV06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuVW5rbm93bl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNoZWV0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsU2hlZXRUeXBlLCBFeHRlcm5hbFNoZWV0VHlwZT4oe1xuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmRdOiBFeHRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmQsXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLlN0b3J5XTogRXh0ZXJuYWxTaGVldFR5cGUuU3RvcnksXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLldvcmtzaGVldF06IEV4dGVybmFsU2hlZXRUeXBlLldvcmtzaGVldFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXRcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0YVR5cGUsIEV4dGVybmFsRGF0YVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5Cb29sXTogRXh0ZXJuYWxEYXRhVHlwZS5Cb29sLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGUsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRGF0ZVRpbWVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGVUaW1lLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkZsb2F0XTogRXh0ZXJuYWxEYXRhVHlwZS5GbG9hdCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5JbnRdOiBFeHRlcm5hbERhdGFUeXBlLkludCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZ1xuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclVwZGF0ZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmVdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYWxsb3dhYmxlVmFsdWVzID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlPih7XG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkFsbF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkFsbCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuTGlzdF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLlJhbmdlXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHNcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlUmFuZ2VUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlUmFuZ2VUeXBlLCBFeHRlcm5hbERhdGVSYW5nZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3RdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGVdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXJyb3JDb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFcnJvckNvZGVzLCBFeHRlcm5hbEVycm9yQ29kZXM+KHtcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOSVRJQUxJWkFUSU9OX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuTUlTU0lOR19FTlVNX01BUFBJTkddOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfUEFSQU1FVEVSXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5VTktOT1dOX1ZFUkJfSURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5WSVNJQklMSVRZX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLlZpc2liaWxpdHlFcnJvcixcbiAgfSwgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IpO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmlsdGVyVHlwZSwgRXh0ZXJuYWxGaWx0ZXJUeXBlPih7XG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgLy8gVGVtcG9yYXJ5IHVudGlsIHdlIGZpeCAxMzE3MjY2IC0gUGxhdGZvcm0gaGFzbid0IGJlZW4gdXBkYXRlZCBjdXJyZW50bHkgYmVjYXVzZSBuZWFyIGJyYW5jaCBpcyBjbG9zZWRcbiAgICBbJ2Rhc2hib2FyZC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbJ3N0b3J5LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgWyd0b29sdGlwJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgWyd3b3Jrc2hlZXQnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFsnd29ya3NoZWV0LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICB9KTtcbn1cbi8qIHRzbGludDplbmFibGU6dHlwZWRlZiAqL1xuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQ2xhc3MgZGVzaWduZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgaGFuZGxlcnMgZnJvbSBhIHVzZXIuIE9ubHkgdGhvc2UgZXZlbnRzXG4gKiB3aGljaCBhcmUgYWRkZWQgdmlhIEFkZE5ld0V2ZW50VHlwZSB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV2ZW50TGlzdGVuZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRMaXN0ZW5lck1hbmFnZXJzOiB7IFt0YWJsZWF1RXZlbnRUeXBlOiBzdHJpbmddOiBTaW5nbGVFdmVudE1hbmFnZXI7IH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2VycyA9IHt9O1xuICB9XG5cbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlLFxuICAgIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IGFkZCBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCByZW1vdmUgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5ld0V2ZW50VHlwZShldmVudE1hbmFnZXI6IFNpbmdsZUV2ZW50TWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudE1hbmFnZXIuZXZlbnRUeXBlXSA9IGV2ZW50TWFuYWdlcjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmllbGRBZ2dyZWdhdGlvblR5cGUsIEZpZWxkUm9sZVR5cGUsIENvbHVtblR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi9JbXBsL0ZpZWxkSW1wbCc7XG5cbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkIGltcGxlbWVudHMgQ29udHJhY3QuRmllbGQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbXBsOiBGaWVsZEltcGwpIHsgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBGaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLnJvbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtblR5cGUoKTogQ29sdW1uVHlwZSB7XG4gICAgdGhyb3cgRXJyb3JIZWxwZXJzLmFwaU5vdEltcGxlbWVudGVkKCdGaWVsZC5jb2x1bW5UeXBlJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZFpvbmUsXG4gIFNoZWV0UGF0aCxcbiAgVmlzdWFsSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9Qb2ludCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvWm9uZVNlcnZpY2UnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uL1NpemUnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRPYmplY3RJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF93b3Jrc2hlZXRzSW1wbDogQXJyYXk8V29ya3NoZWV0SW1wbD47XG4gIHByaXZhdGUgX29iamVjdHM6IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+O1xuICBwcml2YXRlIHpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBfc2hlZXRJbmZvOiBTaGVldEluZm9JbXBsLFxuICAgIHByaXZhdGUgX3pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPixcbiAgICBwcml2YXRlIF9zaGVldFBhdGg6IFNoZWV0UGF0aCxcbiAgICBfcmVnaXN0cnlJZD86IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIoX3NoZWV0SW5mbywgX3JlZ2lzdHJ5SWQpO1xuICB9XG5cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHNJbXBsKCk6IEFycmF5PFdvcmtzaGVldEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0c0ltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpOiB2b2lkIHtcblxuICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsID0gbmV3IEFycmF5PFdvcmtzaGVldEltcGw+KCk7XG4gICAgdGhpcy5fb2JqZWN0cyA9IG5ldyBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuICAgIHRoaXMuem9uZU1hcCA9IG5ldyBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuXG4gICAgLy8gUHJvY2VzcyBhbGwgdGhlIHpvbmVzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gdGhpcyBkYXNoYm9hcmRcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGxldCB3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB6b25lU2l6ZSA9IG5ldyBTaXplKHpvbmUuaGVpZ2h0LCB6b25lLndpZHRoKTtcbiAgICAgIC8vIEFzIHRoZSBkYXNoYm9hcmQgaXMgYWN0aXZlLCBhbGwgb3ZlciB6b25lcyBpbiB0aGUgZGFzaGJvYXJkIGFyZSBpbmFjdGl2ZS5cbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAvLyBUb2RvOiBURlMxMjg0OTExIDogaXNIaWRkZW4gaXMgbm90IGFsd2F5cyBmYWxzZS4gVmVyaWZ5IGlzIHNoZWV0IGlzIHBhcnQgb2YgcHVibGlzaGVkIHNoZWV0cyBmaXJzdFxuICAgICAgY29uc3QgaXNIaWRkZW4gPSBmYWxzZTtcblxuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgIC8vIHpvbmUuc2hlZXRJbmZvIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW50ZXJuYWwtY29udHJhY3QgMS42LjBcbiAgICAgICAgY29uc3Qgd29ya3NoZWV0TmFtZSA9IHpvbmUuc2hlZXRJbmZvID8gem9uZS5zaGVldEluZm8ubmFtZSA6IHpvbmUubmFtZTtcbiAgICAgICAgbGV0IHNoZWV0SW5mb0ltcGw7XG4gICAgICAgIC8vIEluZGV4ZXMsIGlzQWN0aXZlIGFuZCBzb21lIG1vcmUgcHJvcGVydGllcyBpbiBzaGVldEluZm9JbXBsIGFyZSBlbWJlZGRpbmcgc3BlY2lmaWMuXG4gICAgICAgIC8vIEJ1dCB3ZSBpbml0IHRoZW0gZm9yIGJvdGggZXh0ZW5zaW9ucyBhbmQgZW1iZWRkaW5nIGFzIHRoZSBNb2RlbHMgd2lsbCBvbmx5IHVzZSB3aGF0IGlzIHJlbGV2YW50LlxuICAgICAgICBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoXG4gICAgICAgICAgd29ya3NoZWV0TmFtZSxcbiAgICAgICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgICAgIHpvbmVTaXplLFxuICAgICAgICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsLmxlbmd0aCxcbiAgICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgICBpc0hpZGRlbik7XG5cblxuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIGRhc2hib2FyZDogdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIHN0b3J5Ym9hcmQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeWJvYXJkLFxuICAgICAgICAgIGZsaXBib2FyZFpvbmVJRDogdGhpcy5fc2hlZXRQYXRoLmZsaXBib2FyZFpvbmVJRCxcbiAgICAgICAgICBzdG9yeVBvaW50SUQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeVBvaW50SURcbiAgICAgICAgfTtcblxuICAgICAgICB3b3Jrc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoc2hlZXRJbmZvSW1wbCwgdml6SWQsIHRoaXMpO1xuICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5wdXNoKHdvcmtzaGVldEltcGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RJbXBsID0gbmV3IERhc2hib2FyZE9iamVjdEltcGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldEltcGwsXG4gICAgICAgIHpvbmUubmFtZSxcbiAgICAgICAgKHpvbmUuaXNGbG9hdGluZyAhPT0gdW5kZWZpbmVkKSA/IHpvbmUuaXNGbG9hdGluZyA6IGZhbHNlLCAgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzRmxvYXRpbmcsIHNvIHdlIGFzc3VtZSBmYWxzZVxuICAgICAgICAoem9uZS5pc1Zpc2libGUgIT09IHVuZGVmaW5lZCkgPyB6b25lLmlzVmlzaWJsZSA6IHRydWUsICAgICAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNWaXNpYmxlLCBzbyB3ZSBhc3N1bWUgdHJ1ZVxuICAgICAgICB6b25lLnpvbmVJZFxuICAgICAgKTtcblxuICAgICAgdGhpcy5fb2JqZWN0cy5wdXNoKGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgICAgdGhpcy56b25lTWFwLnNldCh6b25lLnpvbmVJZCwgZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwIHwgb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLlpvbmUpO1xuXG4gICAgcmV0dXJuIHpvbmVTZXJ2aWNlLnNldFZpc2liaWxpdHlBc3luYygvKkRhc2hib2FyZCBOYW1lKi8gdGhpcy5uYW1lLCB0aGlzLnpvbmVNYXAsIGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnpvbmVNYXAuZ2V0KGRhc2hib2FyZE9iamVjdElkKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVab25lcyhuZXdab25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT4pOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICAvLyBnZXR0aW5nIHByZXZpb3VzIGRhc2hib2FyZCBvYmplY3RzXG4gICAgY29uc3Qgb2xkRGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3Qgb2xkWm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICAvLyB1cGRhdGluZyB6b25lcywgYW5kIHJlaW5pdGlhbGl6aW5nIGluc3RhbmNlIHZhcmlhYmxlc1xuICAgIHRoaXMuX3pvbmVzID0gbmV3Wm9uZXM7XG4gICAgdGhpcy5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICAvLyBnZXR0aW5nIG5ldyBkYXNoYm9hcmQgb2JqZWN0c1xuICAgIGNvbnN0IG5ld0Rhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG5ld1pvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgLy8gaW5pdGlhbGl6aW5nIG1hcCBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gY29tcGFyaW5nIG9sZCBkYXNoYm9hcmQgb2JqZWN0cyB3aXRoIG5ldyBvbmVzXG4gICAgb2xkRGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChvbGRPYmplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9sZElkOiBudW1iZXIgPSBvbGRPYmplY3QhLmlkO1xuXG4gICAgICAvLyBjaGVja2luZyBpZiB6b25lIHdhcyByZW1vdmVkXG4gICAgICBpZiAoIW5ld1pvbmVNYXAuaGFzKG9sZElkKSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5SZW1vdmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSBuZXdab25lTWFwLmdldChvbGRJZCk7XG4gICAgICBpZiAob2xkT2JqZWN0IS5pc0Zsb2F0aW5nICE9PSBuZXdPYmplY3QhLmlzRmxvYXRpbmcpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuSXNGbG9hdGluZ0NoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0IS5pc1Zpc2libGUgIT09IG5ld09iamVjdCEuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzVmlzaWJsZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0IS5uYW1lICE9PSBuZXdPYmplY3QhLm5hbWUpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuTmFtZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0IS5wb3NpdGlvbiEueCAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbiEueCB8fFxuICAgICAgICBvbGRPYmplY3QhLnBvc2l0aW9uIS55ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uIS55KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlBvc2l0aW9uQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QhLnNpemUhLmhlaWdodCAhPT0gbmV3T2JqZWN0IS5zaXplIS5oZWlnaHQgfHxcbiAgICAgICAgb2xkT2JqZWN0IS5zaXplIS53aWR0aCAhPT0gbmV3T2JqZWN0IS5zaXplIS53aWR0aCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5TaXplQ2hhbmdlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBmb3IgYW55IGFkZGVkIHpvbmVzXG4gICAgbmV3RGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChuZXdPYmplY3QpID0+IHtcbiAgICAgIGlmICghb2xkWm9uZU1hcC5oYXMobmV3T2JqZWN0LmlkKSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdPYmplY3QuaWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuQWRkZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHpvbmVDaGFuZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFuZ2Uoem9uZUlkOiBudW1iZXIsIHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBjaGFuZ2U6IERhc2hib2FyZExheW91dENoYW5nZSk6IHZvaWQge1xuICAgIGlmICghem9uZUNoYW5nZXMuaGFzKHpvbmVJZCkpIHtcbiAgICAgIHpvbmVDaGFuZ2VzLnNldCh6b25lSWQsIFtdKTtcbiAgICB9XG5cbiAgICB6b25lQ2hhbmdlcy5nZXQoem9uZUlkKSEucHVzaChjaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6XG4gICAgQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB6b25lU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxab25lU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuWm9uZSk7XG5cbiAgICByZXR1cm4gem9uZVNlcnZpY2UubW92ZUFuZFJlc2l6ZUFzeW5jKC8qRGFzaGJvYXJkIE5hbWUqLyB0aGlzLm5hbWUsIHRoaXMuem9uZU1hcCxcbiAgICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYW5pbWF0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbmltYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5BbmltYXRpb24pO1xuXG4gICAgcmV0dXJuIGFuaW1hdGlvblNlcnZpY2UucmVwbGF5QXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCxcbiAgICBwcml2YXRlIF90eXBlOiBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBDb250cmFjdC5Qb2ludCxcbiAgICBwcml2YXRlIF9zaXplOiBDb250cmFjdC5TaXplLFxuICAgIHByaXZhdGUgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2lzRmxvYXRpbmc6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lkOiBudW1iZXJcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZEltcGwoKTogRGFzaGJvYXJkSW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldEltcGwoKTogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ZpZWxkSW1wbCc7XG5cbmltcG9ydCB7IENvbm5lY3Rpb25TdW1tYXJ5IH0gZnJvbSAnLi4vQ29ubmVjdGlvblN1bW1hcnknO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9GaWVsZCc7XG5pbXBvcnQgeyBUYWJsZVN1bW1hcnkgfSBmcm9tICcuLi9UYWJsZVN1bW1hcnknO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlSW1wbCB7XG4gIHByaXZhdGUgX2ZpZWxkczogQXJyYXk8RmllbGQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW5mbzogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlLCBwcml2YXRlIF9yZWdpc3RyeUlkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5fZmllbGRzID0gX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoZmllbGRNb2RlbCA9PiB7XG4gICAgICBjb25zdCBmaWVsZEltcGwgPSBuZXcgRmllbGRJbXBsKGZpZWxkTW9kZWwsIHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBGaWVsZChmaWVsZEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRzKCk6IEFycmF5PENvbnRyYWN0LkZpZWxkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8ucHVibGlzaGVkVXJsO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlkKS50aGVuPENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5W10+KHN1bW1hcmllcyA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcChzdW1tYXJ5ID0+IG5ldyBDb25uZWN0aW9uU3VtbWFyeShzdW1tYXJ5KSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+Pih0YWJsZUluZm9zID0+IHtcbiAgICAgIHJldHVybiB0YWJsZUluZm9zLm1hcCh0YWJsZUluZm8gPT4gbmV3IFRhYmxlU3VtbWFyeSh0YWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTpcbiAgICBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuXG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsICAgICAgIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOlxuICAgIFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgICB0aGlzLmlkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLCAgICAgICAvLyAwIGFuZCBbXSBhcmUgZGVmYXVsdHNcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZSB8fCBbXSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShkYXRhU291cmNlLCAnZGF0YVNvdXJjZScpO1xuXG4gICAgdGhpcy5fZmllbGRzID0gdGhpcy5fZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcChmaWVsZE1vZGVsID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlc0FzeW5jKHRoaXMuaWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4obG9naWNhbFRhYmxlSW5mb3MgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcChsb2dpY2FsVGFibGVJbmZvID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRBZ2dyZWdhdGlvblR5cGUuY29udmVydCh0aGlzLl9maWVsZEluZm8uYWdncmVnYXRpb24pO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRSb2xlVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5yb2xlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDYWxjdWxhdGVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0NhbGN1bGF0ZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDb21iaW5lZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDb21iaW5lZEZpZWxkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEYXRhVHlwZSwgUGVyaW9kVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcblxuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVySW1wbCB7XG4gIHByaXZhdGUgX2FsbG93YWJsZVZhbHVlczogQ29udHJhY3QuUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb247XG4gIHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9wYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvLCBwcml2YXRlIF9yZWdpc3RyeUlkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlckluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IERhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh0aGlzLl9wYXJhbWV0ZXJJbmZvLmN1cnJlbnRWYWx1ZSwgdGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGFUeXBlLmNvbnZlcnQodGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxEYXRhVmFsdWU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG5ld1ZhbHVlLCAnbmV3VmFsdWUnKTtcblxuICAgIGNvbnN0IGNvZXJjZWRWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzU2VydmljZS5jaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgY29lcmNlZFZhbHVlKS50aGVuKHBhcmFtZXRlckluZm8gPT4ge1xuICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJJbmZvID0gcGFyYW1ldGVySW5mbztcbiAgICB0aGlzLl9nbG9iYWxGaWVsZE5hbWUgPSBwYXJhbWV0ZXJJbmZvLmZpZWxkTmFtZTtcblxuICAgIGNvbnN0IHR5cGUgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuYWxsb3dhYmxlVmFsdWVzLmNvbnZlcnQocGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXNUeXBlKTtcbiAgICBsZXQgbGlzdFZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWluVmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWF4VmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RlcFNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGF0ZVN0ZXBQZXJpb2Q6IFBlcmlvZFR5cGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtZXRlckluZm8uYWxsb3dhYmxlVmFsdWVzIHx8IFtdO1xuICAgICAgbGlzdFZhbHVlcyA9IHZhbHVlcy5tYXAodmFsID0+IERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh2YWwsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSkge1xuICAgICAgbWluVmFsdWUgPSBwYXJhbWV0ZXJJbmZvLm1pblZhbHVlICYmIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShwYXJhbWV0ZXJJbmZvLm1pblZhbHVlLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgICAgIG1heFZhbHVlID0gcGFyYW1ldGVySW5mby5tYXhWYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5tYXhWYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBzdGVwU2l6ZSA9IHBhcmFtZXRlckluZm8uc3RlcFNpemU7XG4gICAgICBkYXRlU3RlcFBlcmlvZCA9IHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QgJiZcbiAgICAgICAgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQocGFyYW1ldGVySW5mby5kYXRlU3RlcFBlcmlvZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWxsb3dhYmxlVmFsdWVzID0ge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGFsbG93YWJsZVZhbHVlczogbGlzdFZhbHVlcyxcbiAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlOiBtYXhWYWx1ZSxcbiAgICAgIHN0ZXBTaXplOiBzdGVwU2l6ZSxcbiAgICAgIGRhdGVTdGVwUGVyaW9kOiBkYXRlU3RlcFBlcmlvZFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcblxuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL1BhcmFtZXRlckltcGwnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCwgcHJvdGVjdGVkIF9yZWdpc3RyeUlkPzogbnVtYmVyKSB7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0UGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHwgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZGRlbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsXG4gICAgICBgaXNIaWRkZW4gbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsXG4gICAgICBgYWN0aXZlIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmluZGV4O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvcixcbiAgICAgIGBpbmRleCBub3QgSW1wbGVtZW50YXRpb25FcnJvcmApO1xuICB9XG5cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckFzeW5jKHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSwgJ3BhcmFtZXRlck5hbWUnKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5maW5kUGFyYW1ldGVyQnlOYW1lQXN5bmMocGFyYW1ldGVyTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmModGhpcy5zaGVldFBhdGgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgYXMgRW1iZWRkaW5nU2hlZXRTaXplLCBTaXplIGFzIEV4dGVuc2lvblNoZWV0U2l6ZSwgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGVldEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9zaGVldFR5cGU6IFNoZWV0VHlwZSxcbiAgICBwcml2YXRlIF9zaGVldFNpemU6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSxcbiAgICBwcml2YXRlIF9pbmRleD86IG51bWJlcixcbiAgICBwcml2YXRlIF9pc0FjdGl2ZT86IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNIaWRkZW4/OiBib29sZWFuXG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBzaGVldE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlzRGFzaGJvYXJkOiB0aGlzLnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZFxuICAgICAgLy8gVE9ETyAtIFN0b3JpZXNcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNIaWRkZW47XG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFNpbmdsZUV2ZW50TWFuYWdlciBpbnRlcmZhY2UgZm9yIGEgc2luZ2xlIHR5cGUgb2YgVGFibGVhdSBldmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURXZlbnRUeXBlIFRoZSBUYWJsZWF1IGV2ZW50IHR5cGUgdGhpcyBjbGFzcyBzcGVjaWFsaXplc1xuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxURXZlbnRUeXBlIGV4dGVuZHMgQ29udHJhY3QuVGFibGVhdUV2ZW50PiBpbXBsZW1lbnRzIFNpbmdsZUV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZTtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IEFycmF5PChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTtcbiAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBldmVudFR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgdGhpcy5faGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcjogKGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVmb3JlQ291bnQgPSB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5maWx0ZXIoaCA9PiBoICE9PSBoYW5kbGVyKTtcbiAgICByZXR1cm4gYmVmb3JlQ291bnQgPiB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckV2ZW50KGV2ZW50R2VuZXJhdG9yOiAoKSA9PiBURXZlbnRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBldmVudE1vZGVsID0gZXZlbnRHZW5lcmF0b3IoKTtcbiAgICAgICAgaGFuZGxlcihldmVudE1vZGVsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2luY2UgdGhpcyBoYW5kbGVyIGNvdWxkIGJlIG91dHNpZGUgb3VyIGNvbnRyb2wsIGp1c3QgY2F0Y2ggYW55dGhpbmcgaXQgdGhyb3dzIGFuZCBjb250aW51ZSBvblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge1xuXG59XG5cbiIsImltcG9ydCB7IFNlbGVjdGlvblVwZGF0ZVR5cGUsIEZpbHRlclVwZGF0ZVR5cGUsIEZpbHRlck51bGxPcHRpb24sIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRhU2NoZW1hLFxuICBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLFxuICBWaXN1YWxJZCxcbiAgV29ya3NoZWV0RGF0YVNvdXJjZUluZm9cbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHNoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw/OiBEYXNoYm9hcmRJbXBsLFxuICAgIF9yZWdpc3RyeUlkPzogbnVtYmVyKSB7XG4gICAgc3VwZXIoc2hlZXRJbmZvSW1wbCwgX3JlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnREYXNoYm9hcmQoKTogRGFzaGJvYXJkSW1wbCB7XG4gICAgaWYgKHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvcixcbiAgICAgIGBQYXJlbnREYXNob2FyZCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNQYXJlbnREYXNoYm9hcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZXM6IEFycmF5PHN0cmluZz4sIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgRmlsdGVyVXBkYXRlVHlwZSwgJ0ZpbHRlclVwZGF0ZVR5cGUnKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbikge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJOdWxsT3B0aW9uPihmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24sIEZpbHRlck51bGxPcHRpb24sICdGaWx0ZXJOdWxsT3B0aW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZVBhcmFtVHlwZShmaWx0ZXJPcHRpb25zLm1pbiwgZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSYW5nZUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuY2xlYXJGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXREYXRhU291cmNlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+KHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICBjb25zdCB3b3Jrc2hlZXREYXRhU291cmNlSW5mbzogV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gPSBkYXRhU2NoZW1hLndvcmtzaGVldERhdGFTY2hlbWFNYXBbdGhpcy5uYW1lXTtcblxuICAgICAgY29uc3QgZGF0YVNvdXJjZXM6IEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+ID0gW107XG5cbiAgICAgIC8vIEZpcnN0LCBhZGQgdGhlIHByaW1hcnkgZGF0YXNvdXJjZS4gIEJ5IGNvbnZlbnRpb24sIGl0IGNvbWVzIGZpcnN0IGluIHRoZSByZXR1cm5lZCBhcnJheS5cbiAgICAgIGNvbnN0IHByaW1hcnlJZDogc3RyaW5nID0gd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucHJpbWFyeURhdGFTb3VyY2U7XG4gICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXNbcHJpbWFyeUlkXSkpO1xuXG4gICAgICAvLyBUaGVuLCBsb29wIHRocm91Z2ggYW55IHNlY29uZGFyeSBkYXRhIHNvdXJjZXMgYW5kIGFkZCB0aGVtLlxuICAgICAgZm9yIChjb25zdCBzZWNvbmRhcnlJZCBvZiB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5yZWZlcmVuY2VkRGF0YVNvdXJjZUxpc3QpIHtcbiAgICAgICAgaWYgKHNlY29uZGFyeUlkICE9PSBwcmltYXJ5SWQpIHtcbiAgICAgICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXNbc2Vjb25kYXJ5SWRdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEZpbHRlcnNBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuU3VtbWFyeSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5VbmRlcmx5aW5nLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KGxvZ2ljYWxUYWJsZUluZm9zID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAobG9naWNhbFRhYmxlSW5mbyA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZWxlY3Rpb25zLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxTZWxlY3Rpb25VcGRhdGVUeXBlPihzZWxlY3Rpb25VcGRhdGVUeXBlLCBTZWxlY3Rpb25VcGRhdGVUeXBlLCAnU2VsZWN0aW9uVXBkYXRlVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTb3VyY2VJbmZvOiBEYXRhU291cmNlSW5mbyk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJbXBsID0gbmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2VJbmZvKTtcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoZGF0YVNvdXJjZUltcGwpO1xuICAgIGRhdGFTb3VyY2VJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlKTtcbiAgICByZXR1cm4gZGF0YVNvdXJjZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgbG9naWNhbCB0YWJsZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2ljYWxUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkxvZ2ljYWxUYWJsZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2dpY2FsVGFibGU6IExvZ2ljYWxUYWJsZUluZm8pIHsgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5jYXB0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGaWx0ZXJUeXBlLCBGaWx0ZXJEb21haW5UeXBlLCBQZXJpb2RUeXBlLCBEYXRlUmFuZ2VUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ/OiBudW1iZXIpIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4pIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4Y2x1ZGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0V4Y2x1ZGVNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGlmICghZG9tYWluVHlwZSkge1xuICAgICAgZG9tYWluVHlwZSA9IEZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQ7XG4gICAgfVxuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJEb21haW5UeXBlPihkb21haW5UeXBlLCBGaWx0ZXJEb21haW5UeXBlLCAnRmlsdGVyRG9tYWluVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9tYXg6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9pbmNsdWRlTnVsbFZhbHVlczogYm9vbGVhbikge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmNsdWRlTnVsbFZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZU51bGxWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFJhbmdlRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJpdmF0ZSBfYW5jaG9yRGF0ZTogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX3BlcmlvZFR5cGU6IFBlcmlvZFR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VUeXBlOiBEYXRlUmFuZ2VUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlTjogbnVtYmVyKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yRGF0ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJpb2RUeXBlKCk6IFBlcmlvZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9wZXJpb2RUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZVR5cGUoKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlTjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sXG4gICAgcHJpdmF0ZSBfZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSkge1xuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9tYXg6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbigpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heCgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1hcmtUeXBlLCBEYXRhVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlIHtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXRhOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PixcbiAgICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHByaXZhdGUgX3RvdGFsUm93Q291bnQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9pc1RvdGFsUm93Q291bnRMaW1pdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzU3VtbWFyeURhdGE6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfbWFya3NJbmZvPzogQXJyYXk8TWFya0luZm8+KSB7XG4gICAgdGhpcy5fbmFtZSA9IF9pc1N1bW1hcnlEYXRhID8gJ1N1bW1hcnkgRGF0YSBUYWJsZScgOiAnVW5kZXJseWluZyBEYXRhIFRhYmxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxDb250cmFjdC5Db2x1bW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya3NJbmZvKCk6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1RvdGFsUm93Q291bnRMaW1pdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1RvdGFsUm93Q291bnRMaW1pdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1N1bW1hcnlEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1N1bW1hcnlEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrSW5mbyBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtJbmZvIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3R5cGU6IE1hcmtUeXBlLFxuICAgIHByaXZhdGUgX2NvbG9yOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfdHVwbGVJZD86IE51bWJlclxuICApIHsgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBNYXJrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB0dXBsZUlkKCk6IE51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R1cGxlSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbHVtbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbHVtbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZGF0YVR5cGU6IERhdGFUeXBlLFxuICAgIHByaXZhdGUgX2lzUmVmZXJlbmNlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyKSB7IH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNSZWZlcmVuY2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1JlZmVyZW5jZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVmFsdWUge1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSxcbiAgICBwcml2YXRlIF9mb3JtYXR0ZWRWYWx1ZT86IHN0cmluZykgeyB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmF0aXZlVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlZFZhbHVlO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCIvKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbn1cblxuLyoqXG4gKiBSYW5nZSBiYXNlZCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbmdlU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBtaW5WYWx1ZTogc3RyaW5nO1xuICBwdWJsaWMgbWF4VmFsdWU6IHN0cmluZztcbiAgcHVibGljIGluY2x1ZGVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGltZW5zaW9uIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbn1cbi8qKlxuICogVHVwbGUgYmFzZWQgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXBsZVNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdGlvblR5cGU6IHN0cmluZztcbiAgcHVibGljIG9iamVjdElkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIENvbnRhaW5lciBjbGFzcyB0byBwb3B1bGF0ZSBhbGwgdGhlIHNlbGVjdGlvbiBtb2RlbHMgd2hlbiBwYXJzaW5nIGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICBwdWJsaWMgaGllck1vZGVsQXJyOiBBcnJheTxIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIGRpbU1vZGVsQXJyOiBBcnJheTxEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHF1YW50TW9kZWxBcnI6IEFycmF5PFJhbmdlU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBzZWxlY3Rpb246IFR1cGxlU2VsZWN0aW9uTW9kZWw7XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgUG9pbnQgaW1wbGVtZW50cyBDb250cmFjdC5Qb2ludCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF94OiBudW1iZXIsIHByaXZhdGUgX3k6IG51bWJlcikgeyB9XG5cbiAgcHVibGljIGdldCB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3g7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5feTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBEZWZpbmVzIHdoaWNoIHR5cGUgb2YgZ2V0RGF0YSBjYWxsIHRvIG1ha2UuXG4gKi9cbmV4cG9ydCBlbnVtIEdldERhdGFUeXBlIHtcbiAgU3VtbWFyeSA9ICdzdW1tYXJ5JyxcbiAgVW5kZXJseWluZyA9ICd1bmRlcmx5aW5nJ1xufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpbWl0IG9mIHJvd3MgZm9yIGdldFVuZGVybHlpbmdEYXRhQXN5bmNcbiAgICovXG4gIGdldE1heFJvd0xpbWl0KCk6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5kZXJseWluZyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7R2V0RGF0YVR5cGV9IGdldFR5cGUgIFRoZSB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBvciBub3QgYWxpYXNlcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBvciBub3Qgc2VsZWN0aW9uIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyAgTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICovXG4gIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICovXG4gIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICovXG4gIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj47XG59XG4iLCJpbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnkgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRGF0YVNvdXJjZVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9HZXREYXRhU2VydmljZUltcGwnO1xuaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZD86IG51bWJlciwgcGxhdGZvcm1WZXJzaW9uPzogVmVyc2lvbk51bWJlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5pbWF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRGF0YVNvdXJjZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHBsYXRmb3JtVmVyc2lvbikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgR2V0RGF0YVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEZpbHRlclNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZWxlY3Rpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBab25lU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVml6U2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbiBhcGkgc2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNlcnZpY2Uge1xuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIHNlcnZpY2UgbmFtZSB3aGljaCB3aWxsIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGFwaS1zaGFyZWQgcHJvamVjdFxuICovXG5leHBvcnQgY29uc3QgZW51bSBTZXJ2aWNlTmFtZXMge1xuICBEYXRhU291cmNlU2VydmljZSA9ICdkYXRhLXNvdXJjZS1zZXJ2aWNlJyxcbiAgR2V0RGF0YSA9ICdnZXQtZGF0YS1zZXJ2aWNlJyxcbiAgRmlsdGVyID0gJ2ZpbHRlci1zZXJ2aWNlJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbi1zZXJ2aWNlJyxcbiAgUGFyYW1ldGVycyA9ICdwYXJhbWV0ZXJzLXNlcnZpY2UnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uLXNlcnZpY2UnLFxuICBab25lID0gJ3pvbmUtc2VydmljZScsXG4gIEFuaW1hdGlvbiA9ICdhbmltYXRpb24tc2VydmljZScsXG4gIEVtYmVkZGluZyA9ICdlbWJlZGRpbmctc2VydmljZScsXG4gIFZpeiA9ICd2aXotc2VydmljZScsXG59XG5cbi8qKlxuICogRG8gc29tZSBnbG9iYWJsIGRlY2xhcmF0aW9ucyBzbyB3ZSBjYW4gY3JlYXRlIGEgc2luZ2xldG9uIG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7IF9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeTogeyBbcmVnaXN0cnlJZDogbnVtYmVyXTogU2VydmljZVJlZ2lzdHJ5IH07IH1cbn1cblxud2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwge307XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBzZXJ2aWNlIGludG8gdGhlIHNlcnZpY2UgcmVnaXN0cnkuIEFueSBleGlzdGluZyBvbmUgd2lsbFxuICAgKiBiZSBvdmVyd3JpdHRlbi4gdGhlIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCB1bmRlciBzZXJ2aWNlLnNlcnZpY2VOYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7QXBpU2VydmljZX0gc2VydmljZSBUaGUgc2Vydml2ZSB0byByZWdpc3RlclxuICAgKi9cbiAgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGdpdmVuIHNlcnZpY2UgZnJvbSB0aGUgcmVnaXN0cnkuIElmIHRoZXJlIGlzIG5vdCBhXG4gICAqIHNlcnZpY2UgcmVnaXN0ZXJlZCB1bmRlciB0aGF0IG5hbWUsIHRocm93cyBhbmQgZXJyb3JcbiAgICpcbiAgICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIHNlcnZpY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcnZpY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7VH0gVGhlIHJlcXVlc3RlZCBzZXJ2aWNlXG4gICAqL1xuICBnZXRTZXJ2aWNlPFQgZXh0ZW5kcyBBcGlTZXJ2aWNlPihzZXJ2aWNlTmFtZTogc3RyaW5nKTogVDtcbn1cblxuY2xhc3MgU2VydmljZVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VSZWdpc3RyeSB7XG4gIHByaXZhdGUgX3NlcnZpY2VzOiB7IFtzZXJ2aWNlTmFtZTogc3RyaW5nXTogQXBpU2VydmljZTsgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2VydmljZXMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2Uuc2VydmljZU5hbWVdID0gc2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXJ2aWNlPFQgZXh0ZW5kcyBBcGlTZXJ2aWNlPihzZXJ2aWNlTmFtZTogc3RyaW5nKTogVCB7XG4gICAgaWYgKCF0aGlzLl9zZXJ2aWNlcy5oYXNPd25Qcm9wZXJ0eShzZXJ2aWNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgU2VydmljZSBub3QgcmVnaXN0ZXJlZDogJHtzZXJ2aWNlTmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VydmljZXNbc2VydmljZU5hbWVdIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBmb3IgZ2V0dGluZyBhY2Nlc3MgdG8gdGhlIHNpbmdsZSBpbnN0YW5jZVxuICogb2YgdGhlIEFwaVNlcnZpY2VSZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5SWQuXG4gKlxuICogRXh0ZW5zaW9ucyBieSBkZXNpZ24gZG9uJ3QgbmVlZCB0byBzdG9yZS9hY2Nlc3MgbXVsdGlwbGUgc2VydmljZSByZWdpc3RyaWVzLiBUaGVpciBzaW5nbGUgaW5zdGFuY2Ugb2YgU2VydmljZVJlZ2lzdHJ5IGlzXG4gKiBzdG9yZWQvYWNjZXNzIHdpdGggcmVnaXN0cnlJZCA9IDAuXG4gKlxuICogV2hlcmVhcyBFbWJlZGRpbmcgbmVlZHMgdG8gYmUgYXdhcmUgb2Ygd2hpY2ggU2VydmljZVJlZ2lzdHJ5IHRvIHVzZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB2aXp6ZXMgZW1iZWRkZWQuXG4gKiBBbiBleGFtcGxlIG9mIGhvdyB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHdpbGwgbG9vayB3aGVuIHRoZXJlIGFyZSB0d28gdml6emVzOiB7IDAgOiBTZXJ2aWNlUmVnaXN0cnksIDEgOiBTZXJ2aWNlUmVnaXN0cnl9XG4gKiB3aGVyZSByZWdpc3RyeSBJRCBvZiAwICYgMSByZWZlcnMgdG8gdml6J3MgaW50ZXJuYWwgaWRlbnRpZmllciAod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IFZpek1hbmFnZXIpLlxuICovXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgU2VydmljZVJlZ2lzdHJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldChyZWdpc3RyeUlkOiBudW1iZXIgPSAwKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHsgfVxufVxuIiwiaW1wb3J0IHsgUmVwbGF5U3BlZWRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5pbWF0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFuaW1hdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5BbmltYXRpb247XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QXN5bmMoXG4gICAgcmVwbGF5U3BlZWQ6IFJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMFxuICAgIH07XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFJlcGxheVNwZWVkVHlwZT4ocmVwbGF5U3BlZWQsIFJlcGxheVNwZWVkVHlwZSwgJ1JlcGxheVNwZWVkVHlwZScpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmVwbGF5U3BlZWRdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnNldFJlcGxheVNwZWVkVHlwZS5jb252ZXJ0KHJlcGxheVNwZWVkKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlcGxheUFuaW1hdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcblxuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcblxuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0ZpZWxkSW1wbCc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9EYXRhU291cmNlJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjb25zdCBTRU5USU5FTF9MT0dJQ0FMX1RBQkxFX0lORk86IExvZ2ljYWxUYWJsZUluZm8gPSB7XG4gIGlkOiBJbnRlcm5hbENvbnRyYWN0LkFwaVNob3dEYXRhVGFibGVTZW50aW5lbC5TaW5nbGVUYWJsZUlkLFxuICBjYXB0aW9uOiBJbnRlcm5hbENvbnRyYWN0LkFwaVNob3dEYXRhVGFibGVTZW50aW5lbC5TaW5nbGVUYWJsZUNhcHRpb25cbn07XG5cbi8vIFRoZSBtaW5pbXVtIHBsYXRmb3JtIHZlcnNpb24gd2hlbiBPYmplY3QgTW9kZWwgd2FzIHN1cHBvcnRlZFxuY29uc3QgcGxhdGZvcm1WZXJzaW9uT2JqZWN0TW9kZWxTdXBwb3J0ID0geyBtYWpvcjogMSwgbWlub3I6IDIwLCBmaXg6IDEgfTtcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VTZXJ2aWNlIHtcbiAgLy8gU2luY2UgT2JqZWN0IE1vZGVsIGlzIHN1cHBvcnRlZCBzaW5jZSBUYWJsZWF1IDIwMjAuMiwgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZVxuICAvLyBwbGF0Zm9ybSB2ZXJzaW9uIHdoZW4gT00gd2FzIHN1cHBvcnRlZC4gT25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIFRhYmxlYXUgdmVyc2lvbnMgPD0gMjAyMC4xLCBhbGwgYWRkaXRpb25hbFxuICAvLyBjb2RlIGluIGhlcmUgZm9yIE9iamVjdCBNb2RlbCBjYW4gYmUgcmVtb3ZlZC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybVZlcnNpb246IEludGVybmFsQ29udHJhY3QuVmVyc2lvbk51bWJlciA9IHBsYXRmb3JtVmVyc2lvbk9iamVjdE1vZGVsU3VwcG9ydCkge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWZyZXNoQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBqb2luUGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFjdGl2ZVRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWRcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pihqb2luUmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgdGFibGVJbmZvcyA9IGpvaW5SZXNwb25zZS5yZXN1bHQgYXMgVGFibGVJbmZvcztcblxuICAgICAgLy8gZ2V0QWN0aXZlVGFibGVzIGlzIHVuc3VwcG9ydGVkIGZvciBjdWJlcyBhbmQgR0EuIFdlIGRvIG5vdCBoYXZlIGEgY29ubmVjdGlvbiB0eXBlIHByb3BlcnR5XG4gICAgICAvLyBhdmFpbGFibGUgZnJvbSB0aGUgcGxhdGZvcm0gKGludGVudGlvbmFsbHksIHRvIHJlZHVjZSBjb2RlIGNodXJuIGFzIG5ldyBjb25uZWN0aW9ucyBhcmUgYWRkZWQpLlxuICAgICAgLy8gSW5zdGVhZCxqdXN0IGNoZWNrIGlmIGFueSB0YWJsZXMgYXJlIHJldHVybmVkLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIGFueSBub24tdGFibGUgYmFzZWQgZGF0YXNvdXJjZS5cbiAgICAgIGlmICh0YWJsZUluZm9zLnRhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUsXG4gICAgICAgICAgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlcywgcGFyYW1ldGVycykudGhlbjxEYXRhU2NoZW1hPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVNjaGVtYTtcbiAgICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWRcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvblN1bW1hcmllcyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W107XG4gICAgICByZXR1cm4gZGVzY3JpcHRpb25TdW1tYXJpZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYyhnbG9iYWxmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8Q29udHJhY3QuRmllbGQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEZpZWxkQW5kRGF0YVNvdXJjZTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmllbGRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRmllbGRJZF06IGdsb2JhbGZpZWxkTmFtZVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSByZXNwb25zZS5yZXN1bHRbUGFyYW1ldGVySWQuRGF0YVNvdXJjZV0gYXMgSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlO1xuICAgICAgY29uc3QgZmllbGQgPSByZXNwb25zZS5yZXN1bHRbUGFyYW1ldGVySWQuRmllbGRdIGFzIEZpZWxkO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZpZWxkKGZpZWxkLCB0aGlzLmNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgaWYgKCF0aGlzLmlzT2JqZWN0TW9kZWxTdXBwb3J0ZWRCeVBsYXRmb3JtKCkpIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBzZW50aW5lbCBJRCBjYW4gYmUgcGFzc2VkIHRvIGRhdGFzb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YS5cbiAgICAgICAqIE9uY2UgdGhlIGRlc2t0b3AgaXMgdXBncmFkZWQgdG8gYSB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgb2JqZWN0IG1vZGVsLFxuICAgICAgICogdGhlIHNlbnRpbmVsIElEIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgdXBncmFkZWQgdGFibGUuXG4gICAgICAgKiAqL1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzb2x2ZSkgPT5cbiAgICAgICAgcmVzb2x2ZShbU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPXSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGlmICghdGhpcy5pc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgc2VudGluZWwgSUQgY2FuIGJlIHBhc3NlZCB0byB3b3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YS5cbiAgICAgICAqIE9uY2UgdGhlIGRlc2t0b3AgaXMgdXBncmFkZWQgdG8gYSB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgb2JqZWN0IG1vZGVsLFxuICAgICAgICogdGhlIHNlbnRpbmVsIElEIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgdXBncmFkZWQgdGFibGUuXG4gICAgICAgKiAqL1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzb2x2ZSkgPT5cbiAgICAgICAgcmVzb2x2ZShbU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPXSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWVsZChmaWVsZDogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkZpZWxkIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkKG5ldyBGaWVsZEltcGwoZmllbGQsIGRhdGFTb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZTogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGlzT2JqZWN0TW9kZWxTdXBwb3J0ZWRCeVBsYXRmb3JtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbk5vT2JqZWN0TW9kZWxTdXBwb3J0ID0geyBtYWpvcjogMSwgbWlub3I6IDEzLCBmaXg6IDAgfTtcbiAgICByZXR1cm4gSW50ZXJuYWxDb250cmFjdC5WZXJzaW9uTGVzc1RoYW4ocGxhdGZvcm1WZXJzaW9uTm9PYmplY3RNb2RlbFN1cHBvcnQsIHRoaXMuX3BsYXRmb3JtVmVyc2lvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBFcnJvckNvZGVzXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcblxuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEZpbHRlclR5cGUsXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBJbnRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxEb21haW4sXG4gIENhdGVnb3JpY2FsRmlsdGVyLFxuICBSYW5nZURvbWFpbixcbiAgUmFuZ2VGaWx0ZXIsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlclxufSBmcm9tICcuLi8uLi9Nb2RlbHMvRmlsdGVyTW9kZWxzJztcblxuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRmlsdGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkZpbHRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RmlsdGVyQXN5bmMnXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseUZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPVxuICAgICAgKGZpbHRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGUgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseVJhbmdlRmlsdGVyQXN5bmMnXG4gICAgfTtcblxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyRmlsdGVyQXN5bmMnXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPihyZXNwb3NuZSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEZpbHRlcnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEZpbHRlcnNBc3luYydcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+O1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERvbWFpbkZpbHRlcnMoZmlsdGVycyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRDYXRlZ29yaWNhbERvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYydcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5nZURvbWFpbkFzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0UmFuZ2VEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFJhbmdlRG9tYWluQXN5bmMnXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZVxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRvbWFpblR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlckRvbWFpblR5cGUuY29udmVydChkb21haW5UeXBlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuUmFuZ2VEb21haW4+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG4gIHByaXZhdGUgY29udmVydERvbWFpbkZpbHRlcnMoZG9tYWluRmlsdGVyczogQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+KTogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgY29uc3QgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaChkb21haW5GaWx0ZXIgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBDYXRlZ29yaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmFuZ2U6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmFuZ2VGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSYW5nZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcChkdiA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGR2KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSYW5nZUZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXIpOiBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gICAgY29uc3QgbWluVmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWluKTtcbiAgICBjb25zdCBtYXhWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLlJhbmdlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgY29uc3QgYW5jaG9yRGF0ZVZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLmFuY2hvckRhdGUpO1xuICAgIHJldHVybiBuZXcgUmVsYXRpdmVEYXRlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICAgIGFuY2hvckRhdGVWYWx1ZSxcbiAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KGRvbWFpbkZpbHRlci5wZXJpb2RUeXBlKSxcbiAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5kYXRlUmFuZ2VUeXBlLmNvbnZlcnQoZG9tYWluRmlsdGVyLnJhbmdlVHlwZSksXG4gICAgICBkb21haW5GaWx0ZXIucmFuZ2VOXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRG9tYWluKFxuICAgIGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbixcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiA9IGRvbWFpbi52YWx1ZXMubWFwKChkb21haW5EdikgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5Edik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbERvbWFpbih2YWx1ZXMsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICAgIGNvbnN0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGNvbnN0IG1heDogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VEb21haW4oXG4gICAgICBtaW4sXG4gICAgICBtYXgsXG4gICAgICBkb21haW5UeXBlXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGFUYWJsZSBhcyBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlLFxuICBQYXJhbWV0ZXJJZCxcbiAgU2VsZWN0ZWRNYXJrc1RhYmxlLFxuICBVbmRlcmx5aW5nRGF0YVRhYmxlLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuaW1wb3J0IHsgQ29sdW1uLCBEYXRhVGFibGUsIE1hcmtJbmZvIH0gZnJvbSAnLi4vLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9yQ29kZXMsIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcblxuZXhwb3J0IGNsYXNzIEdldERhdGFTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEdldERhdGFTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuR2V0RGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiAxMDAwMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGltaXRlZE1heFJvd3MocmVxdWVzdGVkUm93czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCByb3dDb3VudExpbWl0ID0gdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMTtcbiAgICByZXR1cm4gKHJlcXVlc3RlZFJvd3MgPiAwICYmIHJlcXVlc3RlZFJvd3MgPCByb3dDb3VudExpbWl0KSA/IHJlcXVlc3RlZFJvd3MgOiByb3dDb3VudExpbWl0O1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cykgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZVxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdID0gaWdub3JlQWxpYXNlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl0gPSBpZ25vcmVTZWxlY3Rpb247XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc10gPSBpbmNsdWRlQWxsQ29sdW1ucztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSA9IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdID0gcmVxdWVzdE1heFJvd3M7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XSA9IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgcmVzcG9uc2VEYXRhLmlzU3VtbWFyeSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgLy8gQ3JlYXRlIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgR2V0RGF0YVR5cGUgb2YgU3VtbWFyeSB3aXRoIDEgcm93LCBhbmQgb25seSBuYXRpdmUgdmFsdWVzXG4gICAgLy8gVGhlbiByZXR1cm4ganVzdCB0aGUgY29sdW1uc1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiB0cnVlLFxuICAgICAgW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogMSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVWYWx1ZXNPbmx5XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxBcnJheTxDb250cmFjdC5Db2x1bW4+PihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICBjb25zdCBkYXRhVGFibGUgPSB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdDtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkYXRhVGFibGUuaGVhZGVycy5tYXAoaCA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLFxuICAgICAgICBoLmZpZWxkTmFtZSxcbiAgICAgICAgaC5kYXRhVHlwZSxcbiAgICAgICAgaC5pc1JlZmVyZW5jZWQsXG4gICAgICAgIGguaW5kZXgpKTtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTZWxlY3RlZE1hcmtzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLmRhdGEubWFwKHRhYmxlID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEhpZ2hsaWdodGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLmRhdGEubWFwKHRhYmxlID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cyksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbilcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbik6IFByb21pc2U8RGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldExvZ2ljYWxUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IGNvbHVtbnNUb0luY2x1ZGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YXNvdXJjZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLkxvZ2ljYWxUYWJsZUlkXTogbG9naWNhbFRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cyksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbilcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgIC8vIGNvbHVtbnMgbXVzdCBiZSBhIHZhbGlkIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ2NvbHVtbnNUb0luY2x1ZGUgYW5kIGNvbHVtbnNUb0luY2x1ZGVCeUlkIG11c3QgYmUgdmFsaWQgYXJyYXlzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoY29sdW1ucyk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YTogRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCwgaXNTdW1tYXJ5OiBib29sZWFuKTogRGF0YVRhYmxlIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VEYXRhLmhlYWRlcnMubWFwKGggPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbixcbiAgICAgIGguZmllbGROYW1lLFxuICAgICAgaC5kYXRhVHlwZSxcbiAgICAgIGguaXNSZWZlcmVuY2VkLFxuICAgICAgaC5pbmRleCkpO1xuXG4gICAgLy8gVE9ETyBUaGlzIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBhcGkgd2lsbCByZXNwb25kIG1hcmtzIGluZm8gb3Igbm90XG4gICAgbGV0IG1hcmtzO1xuICAgIGlmIChyZXNwb25zZURhdGEubWFya3MpIHtcbiAgICAgIG1hcmtzID0gcmVzcG9uc2VEYXRhLm1hcmtzLm1hcChoID0+IG5ldyBNYXJrSW5mbyhoLnR5cGUsXG4gICAgICAgIGguY29sb3IsXG4gICAgICAgIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIC8vIExpbWl0KzEgaXMgb3VyIHNlbnRpbmFsIHRoYXQgdW5kZXJseWluZyBkYXRhIGNvbnRhaW5zIG1vcmUgcm93cyB0aGFuIHVzZXIgaXMgYWxsb3dlZCB0byBmZXRjaC5cbiAgICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBzbyB3ZSBhbHdheXMgcmV0dXJuIE1heFJvd0xpbWl0XG4gICAgY29uc3QgaXNUb3RhbFJvd0NvdW50TGltaXRlZCA9IGlzU3VtbWFyeSA9PT0gZmFsc2UgJiYgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggPT09IHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDE7XG4gICAgaWYgKGlzVG90YWxSb3dDb3VudExpbWl0ZWQpIHtcbiAgICAgIHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubGVuZ3RoIC09IDE7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcChyb3cgPT4ge1xuICAgICAgcmV0dXJuIHJvdy5tYXAoKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VUYWJsZURhdGFWYWx1ZShjZWxsLCBoZWFkZXJzW2luZGV4XS5kYXRhVHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgaXNUb3RhbFJvd0NvdW50TGltaXRlZCwgaXNTdW1tYXJ5LCBtYXJrcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGlzVG90YWxSb3dDb3VudExpbWl0ZWQsIGlzU3VtbWFyeSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsQXBpRGlzcGF0Y2hlciwgTW9kZWwsIE5vdGlmaWNhdGlvbiwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuLi9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5cbmNsYXNzIFJlZ2lzdHJhdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWx0ZXJGbjogKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbixcbiAgICBwcml2YXRlIF9jYWxsYmFja0ZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiB2b2lkKSB7XG4gICAgLy8gTm90aGluZyBIZXJlXG4gIH1cblxuICBwdWJsaWMgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlckZuKG5vdGlmaWNhdGlvbk1vZGVsKSkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tGbihub3RpZmljYXRpb25Nb2RlbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNlcnZpY2Uge1xuICBwcml2YXRlIF9oYW5kbGVyczogeyBbbm90aWZpY2F0aW9uSWQ6IHN0cmluZ106IEFycmF5PFJlZ2lzdHJhdGlvbj4gfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpIHtcbiAgICB0aGlzLl9oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIodGhpcy5vbk5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWQ6IE5vdGlmaWNhdGlvbklkLCBmaWx0ZXJGbjogKG1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1vZGVsOiBNb2RlbCkgPT4gdm9pZCk6IFVucmVnaXN0ZXJGbiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc1tpZF0gfHwgbmV3IEFycmF5PFJlZ2lzdHJhdGlvbj4oKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKGZpbHRlckZuLCBoYW5kbGVyKTtcbiAgICBoYW5kbGVycy5wdXNoKHJlZ2lzdHJhdGlvbik7XG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gaGFuZGxlcnM7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlUmVnaXN0cmF0aW9uKGlkLCByZWdpc3RyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQ6IE5vdGlmaWNhdGlvbklkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHbyB0aHJvdWdoIGFuZCBjaGVjayBmb3IgYWxsIHRoZSBoYW5kbGVycyBvZiB0aGlzIHBhcnRpY3VsYXIgbm90aWZpY2F0aW9uXG4gICAgdGhpcy5faGFuZGxlcnNbbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkXS5mb3JFYWNoKGggPT4gaC5vbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWdpc3RyYXRpb24oaWQ6IE5vdGlmaWNhdGlvbklkLCByZWdpc3RyYXRpb246IFJlZ2lzdHJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gdGhpcy5faGFuZGxlcnNbaWRdLmZpbHRlcihyZWcgPT4gcmVnICE9PSByZWdpc3RyYXRpb24pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIE1vZGVsLFxuICBQYXJhbWV0ZXJJZCxcbiAgUGFyYW1ldGVySW5mbyxcbiAgU2hlZXRQYXRoLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5cbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBQYXJhbWV0ZXJzU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlBhcmFtZXRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMoc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0UGF0aF06IHNoZWV0UGF0aFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRQYXJhbWV0ZXJzRm9yU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gVE9ETyAtIENoZWNrIGZvciBlcnJvclxuXG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8UGFyYW1ldGVySW5mbz47XG4gICAgICByZXR1cm4gcmVzdWx0Lm1hcChwYXJhbWV0ZXJJbmZvID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJJbXBsKHBhcmFtZXRlckluZm8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW5mbz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlBhcmFtZXRlckZpZWxkTmFtZV06IGZpZWxkTmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJWYWx1ZV06IG5ld1ZhbHVlXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNoYW5nZVBhcmFtZXRlclZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBQYXJhbWV0ZXJJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQnlOYW1lQXN5bmMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKG5hbWUsIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyYW1ldGVyQXN5bmModW5kZWZpbmVkLCBmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyYW1ldGVyQXN5bmMoXG4gICAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2ZpbmRQYXJhbWV0ZXJBc3luYydcbiAgICB9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyQ2FwdGlvbl0gPSBuYW1lO1xuICAgIH0gZWxzZSBpZiAoZmllbGROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICduYW1lIG9yIGZpZWxkTmFtZSBtdXN0IGJlIHByb3ZpZGVkIHRvIGZpbmQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRmluZFBhcmFtZXRlciwgcGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyA9IChvYmplY3Q6IE1vZGVsKTogb2JqZWN0IGlzIFBhcmFtZXRlckluZm8gPT4ge1xuICAgICAgICByZXR1cm4gJ2ZpZWxkTmFtZScgaW4gb2JqZWN0O1xuICAgICAgfTtcblxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgZ290IGEgdmFsaWQgcmVzcG9uc2UgYmFjayBhZ2FpblxuICAgICAgaWYgKGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvKHJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFBhcmFtZXRlckluZm87XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChyZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsLFxuICBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCxcbiAgUmFuZ2VTZWxlY3Rpb25Nb2RlbCxcbiAgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLFxuICBUdXBsZVNlbGVjdGlvbk1vZGVsLFxuICBWYWx1ZVNlbGVjdGlvbk1vZGVsXG59IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgRmlsdGVyTnVsbE9wdGlvbiwgU2VsZWN0aW9uVXBkYXRlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgUGFyYW1ldGVySWQsXG4gIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlIGFzIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbCxcbiAgVmVyYklkLFxuICBWaXN1YWxJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2VsZWN0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlNlbGVjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gY2xlYXIgYWxsIHRoZSBzZWxlY3RlZCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbGVhclNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuOyAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBzZWxlY3QgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gc2VsZWN0aW9uQ3JpdGVyaWFcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sXG4gICAgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1NlbGVjdGlvbiBjcml0ZXJpYSBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGVcbiAgICB9O1xuXG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyciAmJiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkhpZXJWYWxTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyciAmJiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5RdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnI7XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyciAmJiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGltVmFsU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbGVjdEJ5VmFsdWUsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4ocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE8gSW52ZXN0aWdhdGUgdGhlIGVycm9yIHJlc3BvbnNlIHdpdGggbXVsdGlwbGUgb3V0cHV0IHBhcmFtcyBhbmQgdGhyb3cgZXJyb3IgYWNjb3JkaW5nbHkuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIE1ldGhvZCB0byBzZWxlY3QgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gKlxuICogQHBhcmFtIHZpc3VhbElkXG4gKiBAcGFyYW0gTWFya0luZm9cbiAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAobWFya3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ01hcmtzIGluZm8gbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IElkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25JZHMobWFya3MpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlJZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbl06IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvblxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB0aGUgZXJyb3IgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBvdXRwdXQgcGFyYW1zIGFuZCB0aHJvdyBlcnJvciBhY2NvcmRpbmdseS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdHVwbGVJZDogTnVtYmVyIHwgdW5kZWZpbmVkID0gbWFya3NbaV0udHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCkgeyAvLyBJZiB0dXBsZSBpZCBpcyBwcm92aWRlZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHBhaXJcbiAgICAgICAgaWRzLnB1c2godHVwbGVJZC50b1N0cmluZygpKTsgLy8gY29sbGVjdCB0aGUgdHVwbGUgaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3R1cGxlSWQgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkgeyAvLyB0dXBsZSBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBjb25zdCB0dXBsZVNlbGVjdGlvbk1vZGVsOiBUdXBsZVNlbGVjdGlvbk1vZGVsID0gbmV3IFR1cGxlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uVHlwZSA9ICd0dXBsZXMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgdmFsdWVzLlxuICAgKlxuICAgKiBTdXBwb3J0cyAzIHR5cGVzIGZvciBzZWxlY3Rpb246XG4gICAqIDEpIEhpZXJhcmNoaWNhbCB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMikgUmFuZ2UgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDMpIERpbWVuc2lvbiB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uTWFya3Moc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkNyaXRlcmlhcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3QgPSBzZWxlY3Rpb25Dcml0ZXJpYXNbaV07XG4gICAgICBpZiAoIShzdC5maWVsZE5hbWUgJiYgKHN0LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgc3QudmFsdWUgIT09IG51bGwpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1NlbGVjdGlvbiBDcml0ZXJpYSBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFxcW1tBLVphLXowLTldK10pLionLCAnZycpO1xuICAgICAgY29uc3QgcmFuZ2VPcHRpb246IENvbnRyYWN0LlJhbmdlVmFsdWUgPSBzdC52YWx1ZSBhcyBDb250cmFjdC5SYW5nZVZhbHVlO1xuICAgICAgaWYgKGNhdFJlZ2V4LnRlc3Qoc3QuZmllbGROYW1lKSkgeyAvLyBIaWVyYXJjaGljYWwgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGhpZXJNb2RlbDogSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgPVxuICAgICAgICAgIHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUgYXMgQ29udHJhY3QuQ2F0ZWdvcmljYWxWYWx1ZSkgYXMgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5wdXNoKGhpZXJNb2RlbCk7XG4gICAgICB9IGVsc2UgaWYgKChyYW5nZU9wdGlvbiBhcyBDb250cmFjdC5SYW5nZVZhbHVlKS5taW4gIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiAocmFuZ2VPcHRpb24gYXMgQ29udHJhY3QuUmFuZ2VWYWx1ZSkubWF4ICE9PSB1bmRlZmluZWQpIHsgLy8gUmFuZ2UgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IHF1YW50TW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUmFuZ2VQYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgcmFuZ2VPcHRpb24pO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyLnB1c2gocXVhbnRNb2RlbCk7XG4gICAgICB9IGVsc2UgeyAvLyBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGRpbU1vZGVsOiBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCA9XG4gICAgICAgICAgdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSBhcyBDb250cmFjdC5DYXRlZ29yaWNhbFZhbHVlKSBhcyBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbDtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIucHVzaChkaW1Nb2RlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gdmFsdWUgYmFzZWQgcHJlcyBtb2RlbCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUGFyYW1zTGlzdChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IENvbnRyYWN0LkNhdGVnb3JpY2FsVmFsdWUpOiBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCB2YWx1ZVNlbGVjdGlvbk1vZGVsOiBWYWx1ZVNlbGVjdGlvbk1vZGVsID0gbmV3IFZhbHVlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICBjb25zdCBtYXJrVmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgdmFsdWVBcnI6IEFycmF5PHN0cmluZz4gPSB2YWx1ZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlQXJyW2ldKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcmtWYWx1ZXMucHVzaChQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwuc2VsZWN0VmFsdWVzID0gbWFya1ZhbHVlcztcbiAgICByZXR1cm4gdmFsdWVTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHJhbmdlIGJhc2VkIHNlbGVjdGlvbiBwcmVzIG1vZGVsLlxuICAgKlxuICAgKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSB0aGUgcGFyc2luZyBvZiBkYXRlIHR5cGUgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1JhbmdlUGFyYW1zTGlzdChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IENvbnRyYWN0LlJhbmdlVmFsdWUpOiBSYW5nZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCByYW5nZVNlbGVjdGlvbk1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gbmV3IFJhbmdlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICByYW5nZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWF4ICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1heFZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWF4KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLm1pbiAhPT0gbnVsbCkge1xuICAgICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5taW5WYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlLm1pbik7XG4gICAgfVxuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwuaW5jbHVkZWQgPSB0aGlzLnZhbGlkYXRlTnVsbE9wdGlvblR5cGUodmFsdWUubnVsbE9wdGlvbik7XG4gICAgcmV0dXJuIHJhbmdlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBzZWxlY3Rpb24gdXBkYXRlIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gU2VsZWN0aW9uVXBkYXRlVHlwZS5SZXBsYWNlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlcGxhY2U7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBTZWxlY3Rpb25VcGRhdGVUeXBlLkFkZCkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5BZGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBTZWxlY3Rpb25VcGRhdGVUeXBlLlJlbW92ZSkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZW1vdmU7XG4gICAgfVxuICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIGluY2x1ZGUgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbnVsbE9wdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU51bGxPcHRpb25UeXBlKG51bGxPcHRpb246IEZpbHRlck51bGxPcHRpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmIChudWxsT3B0aW9uKSB7XG4gICAgICBpZiAobnVsbE9wdGlvbiA9PT0gRmlsdGVyTnVsbE9wdGlvbi5OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gRmlsdGVyTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTm9uTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gRmlsdGVyTnVsbE9wdGlvbi5BbGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIEludGVybmFsVGFibGVhdUVycm9yLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2hvdWxkVGhyb3cgfSBmcm9tICcuLi8uLi9VdGlscy9FbnVtQ29udmVydGVyJztcblxuLyoqXG4gKiBFYWNoIFNlcnZjZUltcGwgc2hvdWxkIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3MgZm9yIHRoZSBzYWtlIG9mXG4gKiBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICBUaGlzIGJhc2UgaGFuZGxlcyB0aGUgY29udmVyc2lvblxuICogZnJvbSBpbnRlcm5hbCBlcnJvcnMgdG8gZXh0ZXJuYWwgZXJyb3JzIHRoYXQgd2UgdGhyb3cgdG8gZGV2ZWxvcGVyc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUltcGxCYXNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcikgeyB9XG5cbiAgcHJvdGVjdGVkIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hlci5leGVjdXRlKHZlcmIsIHBhcmFtcykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAvLyBBbnkgaW50ZXJuYWwgZXJyb3IgdGhhdCBjb21lcyBmcm9tIHRoZSBkaXNwYXRjaGVyIHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAgICAgIC8vIHRvIGFuIGV4dGVybmFsIGVycm9yIHVzaW5nIHRoZSBlbnVtIG1hcHBlciBmb3IgZXJyb3IgY29kZXMuXG4gICAgICBjb25zdCBpbnRlcm5hbEVycm9yID0gZXJyb3IgYXMgSW50ZXJuYWxUYWJsZWF1RXJyb3I7XG4gICAgICBjb25zdCBleHRlcm5hbEVycm9yQ29kZTogRXJyb3JDb2RlcyA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5lcnJvckNvZGUuY29udmVydChpbnRlcm5hbEVycm9yLmVycm9yQ29kZSwgU2hvdWxkVGhyb3cuTm8pO1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihleHRlcm5hbEVycm9yQ29kZSwgaW50ZXJuYWxFcnJvci5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpelNlcnZpY2UgfSBmcm9tICcuLi9WaXpTZXJ2aWNlJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBQYXJhbWV0ZXJJZCxcbiAgVmVyYklkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYylcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVml6QVBJLCBwYXJhbWV0ZXJzKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL1pvbmVTZXJ2aWNlJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcblxuZXhwb3J0IGNsYXNzIFpvbmVTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFpvbmVTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuWm9uZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaXNpYmlsaXR5QXN5bmMoXG4gICAgZGFzaGJvYXJkOiBTdHJpbmcsXG4gICAgZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sXG4gICAgem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZXRWaXNpYmlsaXR5QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZF06IGRhc2hib2FyZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF06IHt9XG4gICAgfTtcblxuICAgIC8vIHpvbmVWaXNpYmlsaXR5TWFwIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgTWFwIC0gY29udmVydCBpdCB0byBhIE1hcFxuICAgIGNvbnN0IHBhcmFtZXRlckFzTWFwID0gUGFyYW0uY29udmVydFBhcmFtZXRlclRvTWFwKHpvbmVWaXNpYmlsaXR5TWFwLCAnem9uZVZpc2liaWxpdHlNYXAnKTtcblxuICAgIHBhcmFtZXRlckFzTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwLCBOdW1iZXIucGFyc2VJbnQoa2V5LCAxMCkpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZT4odmFsdWUsIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLCAnRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUnKTtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdW2tleV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0VmlzaWJpbGl0eVR5cGUuY29udmVydCh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRab25lVmlzaWJpbGl0eSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFuZFJlc2l6ZUFzeW5jKFxuICAgIGRhc2hib2FyZDogU3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlTGlzdF06IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5XG4gICAgfTtcblxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LmZvckVhY2goKGRhc2hib2FyZE9iamVjdDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKSA9PiB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5Wm9uZUlzVmFsaWRBbmRGbG9hdGluZyhkYXNoYm9hcmRab25lTWFwLCBkYXNoYm9hcmRPYmplY3QuZGFzaGJvYXJkT2JqZWN0SUQpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoZGFzaGJvYXJkT2JqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLk1vdmVBbmRSZXNpemVab25lcywgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaXplIGltcGxlbWVudHMgQ29udHJhY3QuU2l6ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oZWlnaHQ6IG51bWJlciwgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcikgeyB9XG5cbiAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICB9XG5cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSB0YWJsZSBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVTdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RhYmxlSW5mbzogVGFibGVJbmZvKSB7IH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jb25uZWN0aW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1c3RvbVNRTCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY3VzdG9tU1FMO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBFbWJlZGRpbmdFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBDdXN0b20gZXJyb3IgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgRXJyb3Igb2JqZWN0LlxuICogVGhpcyBhbGxvd3MgdXMgdG8gcHJvdmlkZSBhIGZpZWxkIHdpdGggYSBzcGVjaWZpYyBlcnJvciBjb2RlXG4gKiBzbyB0aGF0IGRldmVsb3BlcnMgY2FuIG1vcmUgZWFzaWx5IHByb2dyYW1tYXRpY2FsbHkgcmVzcG9uZFxuICogdG8gZXJyb3Igc2NlbmFyaW9zLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVhdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZXJyb3JDb2RlOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYCR7X2Vycm9yQ29kZX06ICR7bWVzc2FnZX1gKTtcblxuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAvLyBFcnJvciBpbmhlcml0YW5jZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSB3aGVuIGNvbXBpbGluZyB0byBFUzUsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlXG4gICAgLy8gdGhlIHByb3RvIGNoYWluIHRvIGJlIGJ1aWx0IGNvcnJlY3RseS4gIFNlZSB0aGUgZ2l0aHViIGxpbmsgYWJvdmUgZm9yIGRldGFpbHMuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRhYmxlYXVFcnJvci5wcm90b3R5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBlcnJvckNvZGUoKTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlRmlsdGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRmlsdGVycyBhbHJlYWR5IGhhdmUgbmF0aXZlIHR5cGUgaW4gdmFsdWUsIGp1c3QgdXNlIHRoYXQgZm9yIG5hdGl2ZVZhbHVlIGFsc29cbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZVRhYmxlRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIERhdGFUYWJsZXMgY29udGFpbiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgZGF0ZSBhcyBzdHJpbmcgfCAnJW51bGwlXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBjb252ZXJ0cyBkYXRlcyBhcyBzdHJpbmcgdG8gZGF0ZXMsIGFuZCBhbnkgc3BlY2lhbCB0byBudWxsXG4gICAgLy8gKGJvb2xlYW4sIG51bWJlcnMsIHN0cmluZ3MgYXJlIHBhc3NlZCB0aHJvdWdoKVxuICAgIC8vIEJlY2F1c2Ugb2YgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gLSB3ZSBjYW4gaGF2ZSB1bmRlZmluZWQgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IHRoYW4gYW55IHNwZWNpYWxcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBjb252ZXJ0cyBmcm9tIGEgc291cmNlIGVudW0gdmFsdWUgdG8gZGVzdGluYXRpb24gZW51bVxuICogdmFsdWUgZ2l2ZW4gYSBtYXBwaW5nIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdoZW4gY29uc3RydWN0ZWQuXG4gKlxuICogTm90ZTogVGhpcyBleGFjdCBzYW1lIGNsYXNzIGlzIGRlZmluZWQgaW4gYXBpLWNvcmUuICBHaXZlbiBpdHMgc21hbGxcbiAqIG5hdHVyZSwgaXQgaXMgbm90IHdvcnRoIGhhdmluZyBpbiBhIHNlcGFyYXRlIHByb2plY3QgdG8gc2hhcmUgdGhpcyBiZXR3ZWVuXG4gKiBhcGktY29yZSBhbmQgYXBpLXNoYXJlZC4gIElmIG1vcmUgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IGlzIGFkZGVkIHRoYXQgaXMgdXNlZCBieSBhcGktY29yZVxuICogYW5kIGFwaS1zaGFyZWQgYnV0IGhhcyBubyBvdGhlciBkZXBlbmRlY2llcywgYSB1dGlsdGl0eSBwcm9qZWN0IG1pZ2h0IGJlIG1lcml0ZWQsXG4gKiBhbmQgdGhpcyBjbGFzcyBjb3VsZCBiZSBtb3ZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudW1Db252ZXJ0ZXI8VFNvdXJjZVR5cGUgZXh0ZW5kcyBzdHJpbmcsIFREZXN0aW5hdGlvblR5cGU+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX21hcHBpbmdzOiB7IFtlbnVtVmFsOiBzdHJpbmddOiBURGVzdGluYXRpb25UeXBlOyB9LFxuICAgIHByaXZhdGUgX2RlZmF1bHRWYWw/OiBURGVzdGluYXRpb25UeXBlKSB7IH1cblxuICBwdWJsaWMgY29udmVydChlbnVtVmFsOiBUU291cmNlVHlwZSwgdGhyb3dJZk1pc3Npbmc6IFNob3VsZFRocm93ID0gU2hvdWxkVGhyb3cuWWVzKTogVERlc3RpbmF0aW9uVHlwZSB7XG4gICAgaWYgKHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGVudW1WYWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwcGluZ3NbZW51bVZhbCBhcyBzdHJpbmddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZhdWx0VmFsICE9PSB1bmRlZmluZWQgJiYgdGhyb3dJZk1pc3NpbmcgIT09IFNob3VsZFRocm93Llllcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWw7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBFbnVtIE1hcHBpbmcgbm90IGZvdW5kIGZvcjogJHtlbnVtVmFsfWApO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIFNob3VsZFRocm93IHtcbiAgWWVzID0gJ3llcycsXG4gIE5vID0gJ25vJyxcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMsIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi9QYXJhbSc7XG5cbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi4vSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBub3QgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAqIEZvciBvYmplY3RzLCBpdCBqdXN0IHRlc3RzIHRoYXQgaXQgaXMgYW4gb2JqZWN0XG4gICpcbiAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIGV4cGVjdGVkIHJlc3VsdCBvZiB0eXBlb2ZcbiAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyVHlwZShhcmd1bWVudFZhbHVlOiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgKGFyZ3VtZW50VmFsdWUpICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBoYXMgaW52YWxpZCB0eXBlIGZvciBwYXJhbWV0ZXI6ICR7YXJndW1lbnROYW1lfS5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgZW1wdHkgc3RyaW5nLCBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGFyZ3VtZW50VmFsdWU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQgfHwgYXJndW1lbnRWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBwYXJhbXRlcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBhIHZhbGlkIHZhbHVlIGZvciB0aGF0IGVudW0uXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIHRoZSBlbnVtIHZhbHVlIGlzIG5vdCB2YWxpZC5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqIEBwYXJhbSBlbnVtTmFtZSBlbnVtIG5hbWUgZm9yIGNsZWFyIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5RW51bVZhbHVlPEVudW1UeXBlIGV4dGVuZHMgRW51bUxpa2U+KGVudW1WYWx1ZTogRW51bVR5cGUsIGVudW1UeXBlOiBhbnksIGVudW1OYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIE9iamVjdC5rZXlzKGVudW1UeXBlKS5mb3JFYWNoKChlbnVtS2V5KSA9PiB7XG4gICAgICBpZiAoZW51bVR5cGVbZW51bUtleV0gPT09IGVudW1WYWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7ZW51bVZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBlbnVtOiAke2VudW1OYW1lfS5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHBhcmFtcyBtaW4gYW5kIG1heCBmb3IgYXBwbHlpbmcgcmFuZ2UgZmlsdGVyLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIG1pbiByYW5nZSBtaW5cbiAgICogQHBhcmFtIG1heCByYW5nZSBtYXhcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UmFuZ2VQYXJhbVR5cGUobWluOiBhbnksIG1heDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFtaW4gJiYgIW1heCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChtaW4gJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1pbi4nKTtcbiAgICB9XG5cbiAgICBpZiAobWF4ICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWF4KSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtYXguJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pbiAmJiBtYXggJiYgdHlwZW9mIChtaW4pICE9PSB0eXBlb2YgKG1heCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBwYXJhbWV0ZXJzIG1pbiBhbmQgbWF4IHNob3VsZCBiZSBvZiB0aGUgc2FtZSB0eXBlLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lSWQgaXMgcHJlc2VudCBpbiB0aGUgY3VycmVudCBkYXNoYm9hcmQuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiBlaXRoZXIgY29uZGl0aW9uIGlzIGZhbHNlLlxuICAgKlxuICAgKiBAcGFyYW0gZGFzaGJvYXJkWm9uZU1hcCBBIG1hcCBvZiB6b25lSWQncyB0byB0aGUgY29ycmVzcG9uZGluZyBkYXNoYm9hcmQgb2JqZWN0LlxuICAgKiBAcGFyYW0gem9uZUlEIFpvbmVJZCB0byBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5Wm9uZUlzVmFsaWQoZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sIHpvbmVJRDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGRhc2hib2FyZFpvbmVNYXAuaGFzKHpvbmVJRCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIERhc2hib2FyZCBPYmplY3QgSWQ6ICR7em9uZUlEfSBpcyBub3QgcHJlc2VudCBpbiBkYXNoYm9hcmQuYCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZSBpcyBwcmVzZW50IGFuZCBmbG9hdGluZyBpbiB0aGUgY3VycmVudCBkYXNoYm9hcmQuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiBlaXRoZXIgY29uZGl0aW9uIGlzIGZhbHNlLlxuICAgKlxuICAgKiBAcGFyYW0gZGFzaGJvYXJkWm9uZU1hcCBBIG1hcCBvZiB6b25lSWQncyB0byB0aGUgY29ycmVzcG9uZGluZyBkYXNoYm9hcmQgb2JqZWN0LlxuICAgKiBAcGFyYW0gem9uZUlEIFpvbmVJZCB0byBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5Wm9uZUlzVmFsaWRBbmRGbG9hdGluZyhkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSAmJiBkYXNoYm9hcmRab25lTWFwLmdldCh6b25lSUQpIS5pc0Zsb2F0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgb3IgaXMgYSBmaXhlZCB6b25lIGluIHRoZSBkYXNoYm9hcmQuYCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSA+IDAgZm9yIGVhY2ggRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlIG9iamVjdC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlIG9iamVjdCBmb3Igd2hpY2ggd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlXaWR0aEFuZEhlaWdodE9mRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZTpcbiAgICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpOiB2b2lkIHtcblxuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSBmb3IgZGFzaGJvYXJkIG9iamVjdCBJRCAke2Rhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5kYXNoYm9hcmRPYmplY3RJRH06YCArXG4gICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtIHtcbiAgLyoqXG4gICAqIHNlcmlhbGl6ZXMgdGhlIGRhdGUgaW50byB0aGUgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzLlxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZSB0byBzZXJpYWxpemVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXI6IG51bWJlciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aDogbnVtYmVyID0gZGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXk6IG51bWJlciA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgIGNvbnN0IGhoOiBudW1iZXIgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgY29uc3QgbW06IG51bWJlciA9IGRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYzogbnVtYmVyID0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVCb29sZWFuRm9yUGxhdGZvcm0oYm9vbDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJvb2wgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVOdW1iZXJGb3JQbGF0Zm9ybShudW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bS50b1N0cmluZygxMCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGlucHV0IGlzIGEgbnVtYmVyXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgKGlucHV0KSA9PT0gJ251bWJlcicgfHwgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXI7XG4gIH1cbiAgLyogdHNsaW50OmVuYWJsZTpuby1hbnkgKi9cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGlucHV0IGlzIGEgRGF0ZVxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlRGF0ZShpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcbiAgfVxuICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWFueSAqL1xuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVTdHJpbmcoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgKGlucHV0KSA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiAoaW5wdXQpID09PSAnYm9vbGVhbicgfHwgaW5wdXQgaW5zdGFuY2VvZiBCb29sZWFuO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplTnVtYmVyRm9yUGxhdGZvcm0odmFsdWUgYXMgbnVtYmVyKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZURhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKHZhbHVlIGFzIERhdGUpO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlQm9vbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBQYXJhbS5zZXJpYWxpemVCb29sZWFuRm9yUGxhdGZvcm0odmFsdWUgYXMgYm9vbGVhbik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVTdHJpbmcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVW5leHBlY3RlZCBpbnZhbGlkIHZhbHVlIGZvcjogJHt2YWx1ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIGFscmVhZHkgYSBNYXAsIG9yIGNvbnZlcnRzIGFuIG9iamVjdCB0byBhIE1hcC5cbiAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBhbiBvYmplY3QsIHdlIGNvbnZlcnQgaXQgdG8gYSBNYXAgdXNpbmcgT2JqZWN0LmVudHJpZXMuXG4gICAqIEB0aHJvd3MgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0IG9yIE1hcFxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRQYXJhbWV0ZXJUb01hcChwYXJhbTogb2JqZWN0LCBwYXJhbU5hbWU6IHN0cmluZyk6IE1hcDxhbnksIGFueT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXJUeXBlKHBhcmFtLCAnb2JqZWN0JywgcGFyYW1OYW1lKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgRXhwZWN0aW5nIG9iamVjdCBvciBNYXAgZm9yOiAke3BhcmFtTmFtZX0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtIGluc3RhbmNlb2YgTWFwID8gcGFyYW0gOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHBhcmFtKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlckNvbnRyYWN0IH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyQ29udHJhY3QnO1xuXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBleHRlbnNpb25zLCBlbWJlZGRpbmdcbiAqIGFuZCBleHRlbnNpb25zLWFwaS10eXBlcyBsaWJyYXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uTnVtYmVyIGltcGxlbWVudHMgVmVyc2lvbk51bWJlckNvbnRyYWN0IHtcblxuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKHAgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEludmFsaWQgdmVyc2lvbiBudW1iZXI6ICR7dmVyc2lvblN0cmluZ31gKTtcbiAgICB9XG5cbiAgICB0aGlzLm1ham9yID0gcGFydHNbMF07XG4gICAgdGhpcy5taW5vciA9IHBhcnRzWzFdO1xuICAgIHRoaXMuZml4ID0gcGFydHNbMl07XG4gICAgdGhpcy5pc0FscGhhID0gaXNBbHBoYTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGROdW1iZXIocHJlUmVsZWFzZVN0cmluZzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBub0J1aWxkTnVtYmVyOiBudW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciB3aGljaCBzdXBwb3J0cyB1cGdyYWRpbmcgYW5kIGRvd25ncmFkaW5nIHRoZSBpbnB1dFxuICogaW50ZXJuYWwgY29udHJhY3QgdG8gdGhlIHZlcnNpb24gdGhhdCB0aGlzIG1vZHVsZSBpcyBidWlsdCBhZ2FpbnN0XG4gKlxuICogQGNsYXNzIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlclxuICogQGltcGxlbWVudHMge0ludGVybmFsQXBpRGlzcGF0Y2hlcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEludGVybmFsQXBpRGlzcGF0Y2hlciB7XG4gIHByaXZhdGUgX3ZlcnNpb25Db252ZXJ0ZXI6IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlclxuICAgKiBXZSBoYXZlIG11bHRpcGxlIHZlcnNpb24gY29udmVydGluZyBkaXNwYXRjaGVycyB0aGF0IHdvcmsgdG9nZXRoZXIuXG4gICAqIElmIG5lZWRlZCwgdGhlIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciB3cmFwcyBlaXRoZXIgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciAoZGVza3RvcClcbiAgICogb3IgdGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIChzZXJ2ZXIpLlxuICAgKiBUaGUgSW50ZXJuYWwvQ3Jvc3NGcmFtZSBkaXNwYXRjaGVycyBoYW5kbGUgYW4gdXBkYXRlZCBwbGF0Zm9ybSB3aXRoIGFuIG9sZGVyIGV4dGVybmFsIGxpYnJhcnkuXG4gICAqIChUaGUgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgc2VuZHMgbWVzc2FnZXMgYWNyb3NzIHRoZSBmcmFtZSwgYW5kIGl0IGlzIGhhbmRsZWQgYnkgdGhlIFByZXNMYXllckhhbmRsZXIuKVxuICAgKiBNZWFud2hpbGUsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaGFuZGxlcyBhbiB1cGRhdGVkIGV4dGVybmFsIGxpYnJhcnkgd2l0aCBhbiBvbGRlciBwbGF0Zm9ybS5cblxuICAgKiBAcGFyYW0gX2FwaURlbGVnYXRlRGlzcGF0Y2hlciBUaGUgZGVsZWdhdGUgdGhhdCBkb2VzIHRoZSBhY3R1YWwgd29yay5cbiAgICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbk51bWJlciBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIHBsYXRmb3JtIG1vZHVsZSBpcyB1c2luZy5cbiAgICogVGhpcyBudW1iZXIgd2lsbCBiZSB1c2VkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRvd25ncmFkZSBpbmNvbWluZyBjb21tYW5kcyBhbmQgdXBncmFkZSB0aGUgcmVzdWx0c1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2FwaURlbGVnYXRlRGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICAgIHBsYXRmb3JtVmVyc2lvbk51bWJlcjogVmVyc2lvbk51bWJlcikge1xuXG4gICAgdGhpcy5fdmVyc2lvbkNvbnZlcnRlciA9IENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyKTtcblxuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gW107XG4gICAgX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZ3JhZGVkTm90aWZpY2F0aW9uID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICBoYW5kbGVyKHVwZ3JhZGVkTm90aWZpY2F0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBuZWVkc1ZlcnNpb25Db252ZXJ0ZXIocGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgb3VyIHBsYXRmb3JtIGlzIGxlc3MgdGhhbiBleHRlcm5hbCBsaWJyYXJ5IHZlcnNpb24sIHRoZW4gd2UgbmVlZCBhIGNvbnZlcnRlclxuICAgIHJldHVybiBWZXJzaW9uTGVzc1RoYW4ocGxhdGZvcm1WZXJzaW9uLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkb3duZ3JhZGVQYXJhbWV0ZXJzID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci5kb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgIHJldHVybiB0aGlzLl9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIuZXhlY3V0ZShkb3duZ3JhZGVQYXJhbWV0ZXJzLnZlcmIsIGRvd25ncmFkZVBhcmFtZXRlcnMucGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZ3JhZGVSZXNwb25zZSA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIudXBncmFkZUV4ZWN1dGVSZXR1cm4ocmVzcG9uc2UsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdXBncmFkZVJlc3BvbnNlO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKGggPT4gaCAhPT0gaGFuZGxlcik7XG4gIH1cbn1cbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuXG5pbXBvcnQgJ2NvcmUtanMvZXMvcHJvbWlzZSc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbWFwJztcbmltcG9ydCAnY29yZS1qcy9lcy9hcnJheS9maW5kJztcbmltcG9ydCAnY29yZS1qcy9lcy9hcnJheS9mcm9tJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvZW50cmllcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1uYW4nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50JztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtZmxvYXQnO1xuXG4vLyBEdWUgdG8gdGhlIHdheSB3ZSBjb25maWd1cmVkIHdlYnBhY2ssIHdlIHNob3VsZCBiZSBleHBvcnRpbmcgdGhpbmdzIHdoaWNoIHdpbGwgYmUgdW5kZXJcbi8vIGEgZ2xvYmFsIHZhcmlhYmxlIGNhbGxlZCBcInRhYmxlYXVcIi4gRXhwb3J0IGV2ZXJ5dGhpbmcgd2Ugd2FudCB0byBiZSB2aXNpYmxlIHVuZGVyIHRhYmxlYXVcbi8vIGZyb20gdGhpcyBmaWxlLlxuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcbmltcG9ydCB7IEFwaVZlcnNpb24gfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuZGVjbGFyZSB2YXIgRVhURU5TSU9OX1ZFUlNJT05fSVNfQUxQSEE6IGJvb2xlYW47XG5jb25zdCBpc0FscGhhOiBib29sZWFuID0gdHlwZW9mIEVYVEVOU0lPTl9WRVJTSU9OX0lTX0FMUEhBICE9PSAndW5kZWZpbmVkJyA/IEVYVEVOU0lPTl9WRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgdmFyIEVYVEVOU0lPTl9BUElfVkVSU0lPTl9OVU1CRVI6IHN0cmluZztcbkFwaVZlcnNpb24uU2V0VmVyc2lvbk51bWJlcih0eXBlb2YgRVhURU5TSU9OX0FQSV9WRVJTSU9OX05VTUJFUiAhPT0gJ3VuZGVmaW5lZCcgPyBFWFRFTlNJT05fQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRW5jb2RpbmdUeXBlLFxuICBFcnJvckNvZGVzLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIE1hcmtUeXBlLFxuICBQYXJhbWV0ZXJWYWx1ZVR5cGUsXG4gIFBlcmlvZFR5cGUsXG4gIFF1aWNrVGFibGVDYWxjVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZVxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXJDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQsIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oZmlsdGVycyA9PiB7XG4gICAgICAvLyBUT0RPOiBGaWx0ZXJpbmcgb2YgdGhlIGZpbHRlcnMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgZG9uZSBwbGF0Zm9ybSBzaWRlLlxuICAgICAgY29uc3QgZXZlbnRlZEZpbHRlciA9IGZpbHRlcnMuZmluZCgoZmlsdGVyKSA9PiAoZmlsdGVyLmZpZWxkTmFtZSA9PT0gdGhpcy5fZmllbGROYW1lKSk7XG5cbiAgICAgIGlmICghZXZlbnRlZEZpbHRlcikge1xuICAgICAgICAvLyBXZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBmaWx0ZXIgd2FzIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0XG4gICAgICAgIC8vIGFmdGVyIHRoZSBldmVudCB3YXMgcmFpc2VkLlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ0ZpbHRlciwgYGNhbm5vdCBmaW5kIGZpbHRlcjogJHt0aGlzLl9maWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudGVkRmlsdGVyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFRhYmxlYXVFcnJvciwgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuLi9Nb2RlbHMvUGFyYW1ldGVyJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQsIHNoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlcj4ge1xuICAgIC8vIENhbGwgZG93biB0byBvdXIgc2VydmljZSB0byBnZXQgdGhlIHBhcmFtZXRlciBiYWNrIHZpYSBpdHMgZmllbGQgbmFtZVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSkudGhlbihwYXJhbWV0ZXJJbXBsID0+IHtcbiAgICAgIGlmIChwYXJhbWV0ZXJJbXBsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLk1pc3NpbmdQYXJhbWV0ZXIsIGBDYW5ub3QgZmluZCBwYXJhbWV0ZXI6ICR7dGhpcy5fZ2xvYmFsRmllbGROYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzLnNoZWV0KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdUV2ZW50IHtcbiAgcHJpdmF0ZSBfdHlwZTogVGFibGVhdUV2ZW50VHlwZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4vVGFibGVhdUV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVTaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVNoZWV0RXZlbnQge1xuICBwcml2YXRlIF9zaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQ7XG5cbiAgcHVibGljIGdldCBzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25TaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgdGhpcy5fc2hlZXQgPSBzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfd29ya2Jvb2tJZD86IHN0cmluZykge1xuICB9XG5cbiAgcHVibGljIGdldCB1c2VySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcklkO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXRlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZUlkO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0lkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRhU2NoZW1hLFxuICBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFdvcmtib29rSW1wbCwgRGF0YVNvdXJjZUltcGwsIERhdGFTb3VyY2UsIERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbldvcmtib29rSW1wbCBleHRlbmRzIFdvcmtib29rSW1wbCB7XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PihyZXN1bHQgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgY29uc3QgZGF0YVNvdXJjZXM6IEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+ID0gW107XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIE9iamVjdC52YWx1ZXMoZGF0YVNjaGVtYS5kYXRhU291cmNlcykuZm9yRWFjaChkcyA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbyk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcywgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRGFzaGJvYXJkSW1wbCxcbiAgZG9Dcm9zc0ZyYW1lQm9vdHN0cmFwLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFNpemVcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7XG4gIERhc2hib2FyZFxufSBmcm9tICcuLi9Nb2RlbHMvRGFzaGJvYXJkJztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMsIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyc7XG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4uL05hbWVzcGFjZXMvU2V0dGluZ3MnO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuaW1wb3J0IHsgQXBpVmVyc2lvbiwgVml6U2VydmljZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7XG4gIENvbnRleHRNZW51RXZlbnQsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFNoZWV0UGF0aCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgVmVyYklkLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgUGFyYW1ldGVySWQsXG4gIEZvbnROYW1lQW5kSW5mbyxcbiAgRm9ybWF0dGluZ1NoZWV0LFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tICcuLi9Nb2RlbHMvV29ya2Jvb2snO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4ge30gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ6IERhc2hib2FyZENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSEudGhlbigoZGlzcGF0Y2hlckZhY3RvcnkpID0+XG4gICAgICAgICAgICB0aGlzLm9uRGlzcGF0Y2hlclJlY2VpdmVkKGRpc3BhdGNoZXJGYWN0b3J5LCBpc0V4dGVuc2lvbkRpYWxvZywgY29udGV4dE1lbnVDYWxsYmFja3MpKVxuICAgICAgICAgICAgLnRoZW4oKG9wZW5QYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUob3BlblBheWxvYWQpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKS50aGVuKChmYWN0b3J5OiBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb25EaXNwYXRjaGVyUmVjZWl2ZWRDYWxsYmFjayhmYWN0b3J5LCBpc0V4dGVuc2lvbkRpYWxvZywgY29udGV4dE1lbnVDYWxsYmFja3MpO1xuICAgICAgICAgIH0pLnRoZW4oKG9wZW5QYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoKS5nZXRTZXJ2aWNlPFZpelNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXopO1xuXG4gICAgcmV0dXJuIHZpelNlcnZpY2UuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHJldHVybiB1aVNlcnZpY2Uuc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZCwgdGhpcy5leHRlbnNpb25ab25lSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KCkuZ2V0U2VydmljZTxJbml0aWFsaXphdGlvblNlcnZpY2U+KFxuICAgICAgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2UpO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gKGNvbnRleHRNZW51RnVuY3Rpb25zKSA/IE9iamVjdC5rZXlzKGNvbnRleHRNZW51RnVuY3Rpb25zKSA6IFtdO1xuICAgIHJldHVybiBpbml0aWFsaXphdGlvblNlcnZpY2UuaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZywgY2FsbGJhY2tNYXBLZXlzKS50aGVuPHN0cmluZz4ocmVzdWx0ID0+IHtcbiAgICAgIGlmICghcmVzdWx0LmV4dGVuc2lvbkluc3RhbmNlLmxvY2F0b3IuZGFzaGJvYXJkUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSByZWNlaXZlIGFuIGludmFsaWQgcGxhZm9ybSB2ZXJzaW9uLCB0aGlzIG1lYW5zIHRoYXQgcGxhdGZvcm0gaXMgcnVubm5pbmcgMS40IG9yIDIuMSBhbmRcbiAgICAgIC8vIGRvZXNuJ3QgcGFzcyB0aGUgcGxhdGZvcm0gdmVyc2lvbiB0byBleHRlcm5hbC4gSW4gdGhpcyBjYXNlIHdlIGFzc3VtZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiB0byBiZSAxLjlcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbiA9IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgPyByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQucGxhdGZvcm1WZXJzaW9uXG4gICAgICAgIDogeyBtYWpvcjogMSwgbWlub3I6IDksIGZpeDogMCB9O1xuXG4gICAgICAvLyBXcmFwIG91ciBleGlzdGluZyBkaXNwYXRjaGVyIGluIGEgZGlzcGF0Y2hlciB0aGF0IGNhbiBkb3duZ3JhZGUvdXBncmFkZSBmb3IgYW4gb2xkZXIgcGxhdGZvcm0uXG4gICAgICBpZiAoVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLm5lZWRzVmVyc2lvbkNvbnZlcnRlcihwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICAgIGRpc3BhdGNoZXIgPSBuZXcgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyKGRpc3BhdGNoZXIsIHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICB9XG4gICAgICAvLyBSZWdpc3RyYXRpb24gb2Ygc2VydmljZXMgbXVzdCBoYXBwZW4gYmVmb3JlIGluaXRpYWxpemluZyBjb250ZW50IGFuZCBlbnZpcm9ubWVudFxuICAgICAgLy8gRXh0ZW5zaW9ucyBkb2Vzbid0IG5lZWQgdG8gcGFzcyBpbiBhIHJlZ2lzdHJ5SWQuIEJ5IGRlZmF1bHQsIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5IGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aCByZWdpc3RyeUlkPTAuXG4gICAgICByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXIsIHVuZGVmaW5lZCwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXIpO1xuXG4gICAgICB0aGlzLmRhc2hib2FyZENvbnRlbnQgPSB0aGlzLmluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KFxuICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgcmVzdWx0LmV4dGVuc2lvbkluc3RhbmNlLmxvY2F0b3IuZGFzaGJvYXJkUGF0aCk7XG5cbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50KTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhyZXN1bHQuZXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTtcbiAgICAgIHRoaXMudWkgPSBuZXcgVUkobmV3IFVJSW1wbCgpKTtcbiAgICAgIHRoaXMud29ya2Jvb2sgPSBuZXcgV29ya2Jvb2sobmV3IEV4dGVuc2lvbldvcmtib29rSW1wbCgpKTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uWm9uZUlkID0gcmVzdWx0LmV4dGVuc2lvbkRhc2hib2FyZEluZm8uZXh0ZW5zaW9uWm9uZUlkO1xuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBmb3JtYXR0aW5nIG9uIG5ldyBkaXNwYXRjaGVyIHJlY2lldmVkXG4gICAgICB0aGlzLmFwcGx5QWxsRm9ybWF0dGluZyhyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcblxuICAgICAgLy8gQWZ0ZXIgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZCwgc2V0dXAgbGlzdGVuZXJzIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXRcbiAgICAgIC8vIGFyZSBtZWFudCB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBjbGlja2VkLlxuICAgICAgdGhpcy5pbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnMpO1xuXG4gICAgICAvLyBBbHNvIHNldCB1cCBsaXN0ZW5lcnMgZm9yIEV4dGVuc2lvblN0eWxlc0NoYW5nZWRFdmVudFxuICAgICAgdGhpcy5pbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcik7XG5cbiAgICAgIC8vIEluIHRoZSBub3JtYWwgaW5pdGlhbGl6YXRpb24gY2FzZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4gIFdoZW4gcmV0dXJuaW5nIGZyb20gaW5pdGlhbGl6ZUFzeW5jIHRvIHRoZVxuICAgICAgLy8gZGV2ZWxvcGVyLCB3ZSBqdXN0IGluZ29yZSB0aGF0IHN0cmluZy4gIEluIHRoZSBjYXNlIG9mIGluaXRpYWxpemluZyBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2csIHRoaXMgc3RyaW5nXG4gICAgICAvLyBpcyBhbiBvcHRpb25hbCBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICAgIHJldHVybiByZXN1bHQuZXh0ZW5zaW9uRGlhbG9nUGF5bG9hZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUFsbEZvcm1hdHRpbmcoZm9ybWF0dGluZ01vZGVsOiBXb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudC5pZCA9ICdUYWJsZWF1LUV4dGVuc2lvbi1Gb3JtYXR0aW5nJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5fc3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCB8fCAhZm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCBhcyBDU1NTdHlsZVNoZWV0O1xuICAgIHdoaWxlIChzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoY3VycmVudEZvcm1hdHRpbmdTaGVldCA9PiB7XG4gICAgICB0aGlzLmFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1hdHRpbmdTaGVldFRvU3R5bGVTaGVldChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0OiBGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQpOiB2b2lkIHtcbiAgICBsZXQgc3R5bGVJbmZvOiBzdHJpbmcgPSAnJztcblxuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXM7XG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LWZhbWlseTogJyArIGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250U2l6ZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXNpemU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC13ZWlnaHQ6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtc3R5bGU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbikge1xuICAgICAgc3R5bGVJbmZvICs9ICd0ZXh0LWRlY29yYXRpb246ICcgKyBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmNvbG9yKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2NvbG9yOiAnICsgY3NzUHJvcGVydGllcy5jb2xvciArICc7ICc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9ICcuJyArIGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5O1xuICAgIGNvbnN0IHJ1bGU6IHN0cmluZyA9IHNlbGVjdG9yICsgJyB7ICcgKyBzdHlsZUluZm8gKyAnIH0nO1xuICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCgpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKE5vdGlmaWNhdGlvbklkLldvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQsIChtb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgKGV2ZW50Rm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nKSA9PiB7XG4gICAgICB0aGlzLmluaXRpYWxpemVUYWJsZWF1Rm9udHMoZGlzcGF0Y2hlciwgZXZlbnRGb3JtYXR0aW5nKTtcbiAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUYWJsZWF1Rm9udHMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCB3b3JrYm9va0Zvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZvbnROYW1lcyA9IG5ldyBBcnJheSgpO1xuICAgIHdvcmtib29rRm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZvckVhY2goKGZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgICAgZm9udE5hbWVzLnB1c2goZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZm9udE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuRm9udE5hbWVMaXN0SXRlbXNdOiBmb250TmFtZXMgfTtcbiAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuR2V0Rm9udHMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZEZvbnRzKHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxGb250TmFtZUFuZEluZm8+KTtcbiAgICAgIH0pLmNhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRm9udHMoZm9udHM6IEFycmF5PEZvbnROYW1lQW5kSW5mbz4pOiB2b2lkIHtcbiAgICBmb250cy5mb3JFYWNoKChmb250TmFtZUFuZEluZm8pID0+IHtcbiAgICAgIGNvbnN0IGZvbnRGYWNlID0gbmV3IEZvbnRGYWNlKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvKTtcbiAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChmb250RmFjZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKGluZm8ubmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgbmV3IFNpemUoaW5mby5zaXplLmgsIGluZm8uc2l6ZS53KSk7XG4gICAgY29uc3QgZGFzaGJvYXJkSW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKHNoZWV0SW5mb0ltcGwsIGluZm8uem9uZXMsIHNoZWV0UGF0aCk7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZChkYXNoYm9hcmRJbXBsKTtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZENvbnRlbnQoZGFzaGJvYXJkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTogU2V0dGluZ3Mge1xuICAgIGNvbnN0IHNldHRpbmdzSW1wbCA9IG5ldyBTZXR0aW5nc0ltcGwoc2V0dGluZ3NJbmZvKTtcbiAgICByZXR1cm4gbmV3IFNldHRpbmdzKHNldHRpbmdzSW1wbCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDb250ZXh0TWVudUNhbGxiYWNrcyhjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuXG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKE5vdGlmaWNhdGlvbklkLkNvbnRleHRNZW51Q2xpY2ssIChtb2RlbCkgPT4ge1xuICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGNvbnRleHQgbWVudSBldmVudCwgdGhlc2UgYXJlIGFscmVhZHkgZmlsdGVyZWQgb24gYXBpLWNvcmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gbG9jYXRvci5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIChldmVudDogQ29udGV4dE1lbnVFdmVudCkgPT4ge1xuICAgICAgLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtZW51IElEXG4gICAgICBpZiAoY29udGV4dE1lbnVGdW5jdGlvbnMpIHtcbiAgICAgICAgaWYgKCFjb250ZXh0TWVudUZ1bmN0aW9uc1tldmVudC5pZF0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlY2VpdmVkIHVuZXhwZWN0ZWQgY29udGV4dCBtZW51IElkIGZyb20gZXZlbnQ6ICR7ZXZlbnQuaWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0TWVudUZ1bmN0aW9uc1tldmVudC5pZF0oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIgaGFzIGJlZW4gbW92ZWQgKGFuZCByZW5hbWVkKSBmcm9tIGFwaS1pbnRlcm5hbC1jb250cmFjdC5cbiAqIEl0IHN1cHBvcnRzIHJ1bm5pbmcgYSBuZXdlciBleHRlcm5hbCBsaWJyYXJ5IGFnYWluc3QgYSBwcmUgMjAxOS4zIGRlc2t0b3AuXG4gKiBTdGFydGluZyBpbiAyMDE5LjMsIHdlIGhhdmUgYSBtZXJnZWQgYm9vdHN0cmFwIHN0eWxlIGZvciBib3RoIGRlc2t0b3AgYW5kIHNlcnZlci5cbiAqIEluIGFkZGl0aW9uLCB0aGUgYWxwaGEgY2hlY2tpbmcgdGhhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyBub3QgbmVjZXNzYXJ5IGluIGV4dGVybmFsLWFwaS1qc1xuICogIGFmdGVyIDIwMTkuMyBiZWNhdXNlIHRoYXQgY2hlY2tpbmcgaGFwcGVucyBpbiBhcGktcGxhdGZvcm0tanMgKEFwaURpc3BhdGNoZXJUZXN0LnRzKVxuICogVEZTSUQ6IDEwOTE1NjEgdHJhY2tzIGFuIGltcHJvdmVtZW50IHRvIHRoaXMgc3lzdGVtIHRvIG1ha2UgaXQgbGVzcyBjb21wbGV4IGFuZCB0aWUgaXQgZGlyZWN0bHkgdG9cbiAqICB0YWJsZWF1IGJldGEgcmVsZWFzZSB2ZXJzaW9ucy5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBQcm9taXNlPEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zLmlzQWxwaGEgPT09ICd1bmRlZmluZWQnKSAmJiAhd2luZG93Ll9fd2FybmluZ0lzc3VlZCkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybignVGhpcyBpcyBhIGJldGEgdmVyc2lvbiBvZiB0aGUgRXh0ZW5zaW9ucyBBUEkuIFBsZWFzZSB1cGdyYWRlIHRvIGFuIG9mZmljaWFsIHJlbGVhc2UuJyk7XG4gICAgICB3aW5kb3cuX193YXJuaW5nSXNzdWVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pc0FscGhhISAmJiB3aW5kb3cuX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlKSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXIudGhlbigoZGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICAgICAgICBkaXNwYXRjaGVyLmV4ZWN1dGUoVmVyYklkLkJsb2NrRXh0ZW5zaW9uLCB7fSkuY2F0Y2goKTtcbiAgICAgIH0pLmNhdGNoKCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB3aWxsIGJlIHVuZGVmaW5lZCBpZiBwcm9taXNlIGlzIHJlamVjdGVkIG9yIHRocm93c1xuICAgIHJldHVybiB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBoYXNEZXNrdG9wQXBpRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyOiBQcm9taXNlPEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+O1xuICAgIF9fcGxhdGZvcm1Jc09mZmljaWFsUmVsZWFzZTogYm9vbGVhbjtcbiAgICBfX3dhcm5pbmdJc3N1ZWQ6IGJvb2xlYW47XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25TZXR0aW5nc0luZm8sIE5vdGlmaWNhdGlvbklkLCBTZXR0aW5nc0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5cbmNsYXNzIFNldHRpbmdzQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU2V0dGluZ3NDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmV3U2V0dGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5ld1NldHRpbmdzKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX25ld1NldHRpbmdzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ltcGwge1xuICBwcml2YXRlIHN0YXRpYyBBU1lOQ19TQVZFX0lOX1BST0dSRVNTOiBzdHJpbmcgPSAnQXN5bmMgU2F2ZSBpcyBpbiBwcm9ncmVzcywgdXBkYXRpbmcgc2V0dGluZ3MgaXMgbm90IGFsbG93ZWQuJztcbiAgcHJpdmF0ZSBfaXNNb2RpZmllZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY3VycmVudFNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb247XG5cbiAgLy8gU2luY2UgcHJvbWlzZXMgY2FuJ3QgYmUgaW50cm9zcGVjdGVkIGZvciBzdGF0ZSwga2VlcCBhIHZhcmlhYmxlIHRoYXRcbiAgLy8gaW5kaWNhdGVzIGEgc2F2ZSBpcyBpbiBwcm9ncmVzcywgc28gdGhhdCBzZXQvZXJhc2UgY2FuJ3QgYmUgY2FsbGVkIGR1cmluZyBhIHNhdmUuXG4gIHByaXZhdGUgX3NhdmVJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKSB7XG4gICAgdGhpcy5pbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBlcmFzZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICAvLyBPbmx5IG1ha2UgYSBtb2RpZmljYXRpb24gaWYgd2UgaGF2ZSB0aGUga2V5IGFscmVhZHlcbiAgICBpZiAodGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0pIHtcbiAgICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgICBkZWxldGUgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gICAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIC8vIFJldHVybnMgYSBtdXRhYmxlIGNvcHkgb2YgdGhlIHNldHRpbmdzXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTW9kaWZpZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAvLyBKdXN0IHJlc29sdmUgaW1tZWRpYXRlbHkgaWYgc2V0dGluZ3MgYXJlIHVuY2hhbmdlZFxuICAgIGlmICghdGhpcy5faXNNb2RpZmllZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZTxTZXR0aW5nc0NvbGxlY3Rpb24+KHRoaXMuX2N1cnJlbnRTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgLy8gVXNlIHRoZSBzZXR0aW5ncyBzZXJ2aWNlIHRvIHNhdmUgc2V0dGluZ3MgdG8gdHdiXG4gICAgY29uc3Qgc2V0dGluZ3NTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCgpLmdldFNlcnZpY2U8U2V0dGluZ3NTZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlKTtcblxuICAgIHJldHVybiBzZXR0aW5nc1NlcnZpY2Uuc2F2ZVNldHRpbmdzQXN5bmModGhpcy5fY3VycmVudFNldHRpbmdzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4obmV3U2V0dGluZ3MgPT4ge1xuICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBuZXdTZXR0aW5ncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3U2V0dGluZ3M7XG4gICAgfSwgKHJlYXNvbikgPT4ge1xuICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7IC8vIEtleSBzaG91bGRuJ3QgYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIodmFsdWUsICd2YWx1ZScpOyAvLyBFbXB0eSBzdHJpbmcgdmFsdWUgaXMgYWxsb3dlZC5cbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldID0gdmFsdWU7XG4gICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYWxsIGV2ZW50cyByZWxldmFudCB0byBzZXR0aW5ncyBvYmplY3QuICBUaGlzIGlzIG9ubHkgYSBzZXR0aW5nc1VwZGF0ZSBldmVudCBjdXJyZW50bHkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCgpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U2V0dGluZ3NDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuU2V0dGluZ3NDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihOb3RpZmljYXRpb25JZC5TZXR0aW5nc0NoYW5nZWQsIChtb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgKGV2ZW50OiBTZXR0aW5nc0V2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBldmVudC5uZXdTZXR0aW5ncztcbiAgICAgIHNldHRpbmdzQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoZXZlbnQubmV3U2V0dGluZ3MpKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdHMucHVzaChzZXR0aW5nc0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8sICdzZXR0aW5nc0luZm8nKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcywgJ3NldHRpbmdzSW5mby5TZXR0aW5nc1ZhbHVlcycpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gc2V0dGluZ3NJbmZvLnNldHRpbmdzVmFsdWVzO1xuXG4gICAgLy8gUmVzZXQgdGhlIGlzTW9kaWZpZWQgZmxhZ1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGhlbHBlciBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbG9jYWwgdXBkYXRlIHRvIHRoaXMuY3VycmVudFNldHRpbmdzLlxuICAgKiBDaGVja3MgaWYgYSBjdXJyZW50IHNhdmUgY2FsbCBpcyBzdGlsbCBpbiBwcm9ncmVzcyBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHNvLlxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zYXZlSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLlNldHRpbmdTYXZlSW5Qcm9ncmVzcywgU2V0dGluZ3NJbXBsLkFTWU5DX1NBVkVfSU5fUFJPR1JFU1MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBEaWFsb2dVcGRhdGVFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFRhYmxlYXVFcnJvclxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVUlTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFVJSW1wbCB7XG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCgpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdWlTZXJ2aWNlLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQgfHwgJycsIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCB1bnJlZ2lzdGVyRm4gPSBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihOb3RpZmljYXRpb25JZC5FeHRlbnNpb25EaWFsb2dVcGRhdGUsIChtb2RlbCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBMZXQgdGhyb3VnaCBhbnkgZGlhbG9nIHVwZGF0ZSBldmVudFxuICAgICAgICB9LCAoZXZlbnQ6IERpYWxvZ1VwZGF0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmlzQ2xvc2VFdmVudCkge1xuICAgICAgICAgICAgcmVzb2x2ZShldmVudC5jbG9zZVBheWxvYWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QobmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkRpYWxvZ0Nsb3NlZEJ5VXNlciwgJ0V4dGVuc2lvbiBkaWFsb2cgY2xvc2VkIGJ5IHVzZXIuJykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVucmVnaXN0ZXJGbigpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICB1aVNlcnZpY2UuY2xvc2VEaWFsb2cocGF5bG9hZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dEV2ZW50LCBOb3RpZmljYXRpb25JZCwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3QgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCkge1xuICAgIHN1cGVyKF9kYXNoYm9hcmRJbXBsKTtcbiAgICBfZGFzaGJvYXJkSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKGUgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLndvcmtzaGVldHNJbXBsLm1hcCgod29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8Q29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwub2JqZWN0cy5tYXAoKGRhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgRGFzaGJvYXJkT2JqZWN0KGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldFpvbmVWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLl9kYXNoYm9hcmRJbXBsLmdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICAgIHJldHVybiB6b25lICYmIG5ldyBEYXNoYm9hcmRPYmplY3Qoem9uZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcblxuICAgIC8vIEluaXRpYWxpemluZyBldmVudHMgYW5kIHJlZ2lzdGVyaW5nIG5vdGlmaWNhdGlvbiBzZXJ2aWNlXG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuIChhbGxvd3MgdW5pdCB0ZXN0aW5nIHdpdGhvdXQgTm90aWZpY2F0aW9uU2VydmljZSBtb2NrKVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3QgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8RGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50PihUYWJsZWF1RXZlbnRUeXBlLkRhc2hib2FyZExheW91dENoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsIChtb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0Q2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyA9IHRoaXMuX2Rhc2hib2FyZEltcGwudXBkYXRlWm9uZXMoZXZlbnQuem9uZXMpO1xuICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFuZFJlc2l6ZURhc2hib2FyZE9iamVjdHNBc3luYyhkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTpcbiAgICBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkpO1xuICB9XG5cbiAgcHVibGljIHJlcGxheUFuaW1hdGlvbkFzeW5jKHJlcGxheVNwZWVkOiBDb250cmFjdC5SZXBsYXlTcGVlZFR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5yZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGxcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkKHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZGFzaGJvYXJkSW1wbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwudHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9zaXRpb24oKTogQ29udHJhY3QuUG9pbnQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnBvc2l0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpIHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwud29ya3NoZWV0SW1wbCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0Zsb2F0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlzRmxvYXRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLCBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsIFNpbmdsZUV2ZW50TWFuYWdlciwgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCwgUGFyYW1ldGVySW1wbCwgRXJyb3JIZWxwZXJzXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFBhcmFtZXRlciBjb250cmFjdC4gQ2FsbHMgZG93biB0byB0aGUgaW1wbFxuICogY2xhc3MgZm9yIGFsbW9zdCBhbGwgb2YgdGhlIHdvcmsgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcmFtZXRlciBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuUGFyYW1ldGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyYW1ldGVySW1wbDogUGFyYW1ldGVySW1wbCwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5pbml0aWFsaXplRXZlbnRzKHNoZWV0KS5mb3JFYWNoKGUgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gKiB3aXRoIHRoZSBOb3RpZmljYXRpb25TZXJ2aWNlLiBJdCByZXR1cm5zIGFuIGFycmF5IG9mIFNpbmdsZUV2ZW50TWFuYWdlciBvYmplY3RzIHdoaWNoXG4gKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gKlxuICogQHBhcmFtIHNoZWV0IFRoZSBzaGVldCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBldmVudCBub3RpZmljYXRpb25zXG4gKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoc2hlZXQsICdzaGVldCcpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGFsbCBvZiB0aGUgZXZlbnQgbWFuYWdlcnMgd2UnbGwgbmVlZCAob25lIGZvciBlYWNoIGV2ZW50IHR5cGUpXG4gICAgY29uc3QgcGFyYW1ldGVyRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuUGFyYW1ldGVyQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCwgKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gZmllbGROYW1lID09PSB0aGlzLnBhcmFtZXRlckltcGwuaWQ7XG4gICAgfSwgKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBwYXJhbWV0ZXJFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFBhcmFtZXRlckNoYW5nZWRFdmVudChmaWVsZE5hbWUsIHNoZWV0KSk7XG4gICAgfSk7XG5cbiAgICByZXN1bHRzLnB1c2gocGFyYW1ldGVyRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgU2l6ZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbXBsLnNpemUgaW5zdGFuY2VvZiBTaXplKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNpemU7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCAnU2l6ZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcChwYXJhbWV0ZXJJbXBsID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVySW1wbCwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbldvcmtib29rSW1wbCB9IGZyb20gJy4uL0ltcGwvRXh0ZW5zaW9uV29ya2Jvb2tJbXBsJztcblxuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge1xuICB9XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0ltcGwuZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGaWx0ZXJVcGRhdGVUeXBlLCBTZWxlY3Rpb25VcGRhdGVUeXBlLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBXb3Jrc2hlZXRJbXBsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IERhc2hib2FyZCB9IGZyb20gJy4vRGFzaGJvYXJkJztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKGUgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnREYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7V29ya3NoZWV0fSB3b3Jrc2hlZXQgVGhlIHdvcmtzaGVldCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkLCAobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IHZpc3VhbElkID0gbW9kZWwgYXMgVmlzdWFsSWQ7XG4gICAgICByZXR1cm4gdGhpcy52aXN1YWxJZHNBcmVFcXVhbCh2aXN1YWxJZCwgdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZCk7XG4gICAgfSwgKHZpejogVmlzdWFsSWQpID0+IHtcbiAgICAgIG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxGaWx0ZXJDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuRmlsdGVyQ2hhbmdlZCwgKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJFdmVudFJlc3BvbnNlID0gbW9kZWwgYXMgRmlsdGVyRXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgIH0sIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgIGZpbHRlckV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRmlsdGVyQ2hhbmdlZEV2ZW50KHRoaXMsIGV2ZW50LmZpZWxkTmFtZSkpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0cy5wdXNoKG1hcmtzRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChmaWx0ZXJFdmVudCk7XG5cbiAgICAvLyBUT0RPIC0gb3RoZXIgZXZlbnQgdHlwZXNcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogQXJyYXk8c3RyaW5nPiwgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSwgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXREYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29sdW1uPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnNvbGUud2FybignV29ya3NoZWV0LmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlEQXN5bmMobWFya3NJbmZvOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhtYXJrc0luZm8sIHVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsSWRzQXJlRXF1YWwoYTogVmlzdWFsSWQsIGI6IFZpc3VhbElkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGEgJiYgYiAmJlxuICAgICAgYS53b3Jrc2hlZXQgPT09IGIud29ya3NoZWV0ICYmXG4gICAgICBhLmRhc2hib2FyZCA9PT0gYi5kYXNoYm9hcmQgJiZcbiAgICAgIGEuc3Rvcnlib2FyZCA9PT0gYi5zdG9yeWJvYXJkICYmXG4gICAgICBhLnN0b3J5UG9pbnRJRCA9PT0gYi5zdG9yeVBvaW50SUQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIERhc2hib2FyZENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBEYXNoYm9hcmRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZDogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkKSB7IH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0ZWRTZXJ2ZXIgfSBmcm9tICcuLi9JbXBsL0Nvbm5lY3RlZFNlcnZlcic7XG5pbXBvcnQgeyBFeHRlbnNpb25FbnZpcm9ubWVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzLCBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIH0gZnJvbSAnLi9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQgbmFtZXNwYWNlLlxuICogRW52aXJvbm1lbnQgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXNcbiAqIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKiBGaXJzdCBjbGFzcyBleHRlbnNpb25zIGNhbiBnZXQgdG8gQ29ubmVjdGVkU2VydmVyIHdpdGg6IGVudmlyb25tZW50Wydjb25uZWN0ZWRTZXJ2ZXInXVxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQgaW1wbGVtZW50cyBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gIC8qKlRoZSBmb2xsb3dpbmcgaXMgYW4gaW5kZXggc2lnbmF0dXJlLiBJdCBhbGxvd3MgcHJvcGVydGllcyB0byBiZSBhY2Nlc3NlZCBieSBuYW1lLlxuICAgKiBUaGlzIGFsbG93cyB1cyB0byBhZGQgcHJvcGVydGllcyBkeW5hbWljYWxseSAoc2VlIHVzYWdlIG9mIHRoaXMuY29ubmVjdGVkU2VydmVyIGJlbG93KSB3aXRob3V0IFR5cGVzY3JpcHQgZXJyb3JzLlxuICAgKiBUaGUgcmVhc29uIHdlIGRvIHRoaXMgaXMgc28gdGhhdCAzcmQtcGFydHkgZXh0ZW5zaW9uIGRldmVsb3BlcnMgZG8gbm90IHNlZSB0aGUgY29ubmVjdGVkU2VydmVyIHByb3BlcnR5XG4gICAqIHRoYXQgaXMgb25seSBhdmFpbGFibGUgdG8gZmlyc3QgY2xhc3MgZXh0ZW5zaW9uIGRldmVsb3BlcnMuXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBpbmRleCBzaWdhdHVyZSBuZWVkcyB0byBiZSBhIHVuaW9uIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QsIHNpbmNlIHdlIGNvdWxkXG4gICAqIGFjY2VzcyBhbnkgcHJvcGVydHkgdXNpbmcgdGhlIHByb3BlcnR5IGluZGV4IG1ldGhvZC5cbiAgICovXG4gIFt4OiBzdHJpbmddOiBDb25uZWN0ZWRTZXJ2ZXIgfCBzdHJpbmcgfCBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2FwaVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dDtcbiAgcHJpdmF0ZSBfZm9ybWF0dGluZz86IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgX21vZGU6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGU7XG4gIHByaXZhdGUgX29wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuICBwcml2YXRlIF90YWJsZWF1VmVyc2lvbjogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9hcGlWZXJzaW9uID0gQXBpVmVyc2lvbi5JbnN0YW5jZSAmJiBBcGlWZXJzaW9uLkluc3RhbmNlLmZvcm1hdHRlZFZhbHVlOyAvLyBtYWoubWluLmZpeCAobm8gYnVpbGQpXG4gICAgdGhpcy5fY29udGV4dCA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Db250ZXh0LmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCk7XG4gICAgdGhpcy5fZm9ybWF0dGluZyA9IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25MYW5ndWFnZTtcbiAgICB0aGlzLl9sb2NhbGUgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Mb2NhbGU7XG4gICAgdGhpcy5fbW9kZSA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Nb2RlLmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTW9kZSk7XG4gICAgdGhpcy5fb3BlcmF0aW5nU3lzdGVtID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtO1xuICAgIHRoaXMuX3RhYmxlYXVWZXJzaW9uID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudGFibGVhdVZlcnNpb247XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgdXNlcklkLCB0aGVuIHdlIGFyZSBhIGZpcnN0IGNsYXNzIGV4dGVuc2lvblxuICAgIC8vIEFkZCBvdXIgaGlkZGVuIG1lbWJlciAnY29ubmVjdGVkU2VydmVyJ1xuICAgIGlmIChleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkU2VydmVyID0gbmV3IENvbm5lY3RlZFNlcnZlcihleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tJZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhcGlWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rRm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3BlcmF0aW5nU3lzdGVtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGluZ1N5c3RlbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFibGVhdVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVhdVZlcnNpb247XG4gIH1cbn1cblxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgQ2FsbGJhY2tNYXAsIEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIEV4dGVuc2lvbnMgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9ucyBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbnMge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBleHRlbnNpb25JbXBsOiBFeHRlbnNpb25zSW1wbCkge1xuICAgIHRoaXMuZXh0ZW5zaW9uSW1wbCA9IGV4dGVuc2lvbkltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZENvbnRlbnQoKTogQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5kYXNoYm9hcmRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBlbnZpcm9ubWVudCgpOiBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5lbnZpcm9ubWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogQ29udHJhY3QuU2V0dGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVpKCk6IENvbnRyYWN0LlVJIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnVpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9vaygpOiBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3JrYm9vaztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmV4dGVuc2lvblpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplQXN5bmMoY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKGZhbHNlLCBjb250ZXh0TWVudUNhbGxiYWNrcykudGhlbjx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEaWFsb2dBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXR0aW5ncyBhcyBTZXR0aW5nc0NvbnRyYWN0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4uL0ltcGwvU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNldHRpbmdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnRyYWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldHRpbmdzSW1wbDogU2V0dGluZ3NJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKGUgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmVyYXNlKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuc2F2ZUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBpbXBsZW1lbnRzIENvbnRyYWN0LlVJIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltcGw6IFVJSW1wbCkgeyB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9pbXBsLmNsb3NlRGlhbG9nKHBheWxvYWQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnLi4vLi4vLi4vLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwge1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyh3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbD86IFdvcmtib29rRm9ybWF0dGluZylcbiAgICA6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybWF0dGluZ01hcDogQXJyYXk8Q29udHJhY3QuRm9ybWF0dGluZ1NoZWV0PiA9IHdvcmtib29rRm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0aW5nU2hlZXQ6IENvbnRyYWN0LkZvcm1hdHRpbmdTaGVldCA9IHtcbiAgICAgICAgICBjbGFzc05hbWVLZXk6IEVudW1NYXBwaW5ncy5jbGFzc05hbWVLZXkuY29udmVydChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleSksXG4gICAgICAgICAgY3NzUHJvcGVydGllczoge1xuICAgICAgICAgICAgZm9udEZhbWlseTogY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHksXG4gICAgICAgICAgICBmb250U2l6ZTogY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRTaXplLFxuICAgICAgICAgICAgZm9udFdlaWdodDogY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQsXG4gICAgICAgICAgICBmb250U3R5bGU6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250U3R5bGUsXG4gICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLFxuICAgICAgICAgICAgY29sb3I6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5jb2xvclxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXBcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHRlbnNpb25Cb290c3RyYXBJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVmVyYklkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUlkczogc3RyaW5nW10pOiBQcm9taXNlPEV4dGVuc2lvbkJvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25Db250ZXh0TWVudUlkc106IGNvbnRleHRNZW51SWRzLFxuICAgICAgW1BhcmFtZXRlcklkLklzRXh0ZW5zaW9uRGlhbG9nXTogaXNFeHRlbnNpb25EaWFsb2dcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuSW5pdGlhbGl6ZUV4dGVuc2lvbiwgcGFyYW1zKS50aGVuPEV4dGVuc2lvbkJvb3RzdHJhcEluZm8+KHJlc3BvbnNlID0+IHtcbiAgICAgIC8vIFRPRE8gLSBWYWxpZGF0ZSByZXR1cm4gdmFsdWVcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuXG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVmVyYklkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuXG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3NcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZUV4dGVuc2lvblNldHRpbmdzLCBwYXJhbWV0ZXJzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4odmFsdWUgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChyZXN1bHQuc2V0dGluZ3NWYWx1ZXMpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaWFsb2dPcHRpb25zLCBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVDogbnVtYmVyID0gNDAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1dJRFRIOiBudW1iZXIgPSA2MDA7IC8vIGluIHBpeGVsc1xuXG5leHBvcnQgY2xhc3MgVUlTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFVJU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkOiBzdHJpbmcsIG9wdGlvbnM/OiBEaWFsb2dPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Rpc3BsYXlEaWFsb2dBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXTogdXJsLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdOiBwYXlsb2FkXG4gICAgfTtcblxuICAgIGNvbnN0IGg6IG51bWJlciA9ICgob3B0aW9ucykgJiYgKG9wdGlvbnMuaGVpZ2h0KSkgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSAoKG9wdGlvbnMpICYmIChvcHRpb25zLndpZHRoKSkgPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG5cbiAgICAvLyBPbiB0aGUgcGxhdGZvcm0gc2lkZSwgd2UgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgcmVnYXJkZXNzIG9mIHdoZXRoZXIgdGhlIHBhc3NlZFxuICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIHRvbyBsYXJnZSBvciB0b28gc21hbGwuICBCdXQgdGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgZGV2ZWxvcGVyIGVycm9yLFxuICAgIC8vIHNvIHdlIHRocm93IGFuIGVycm9yIGhlcmUgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAgICBpZiAoaCA8PSAwIHx8IHcgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTaXplIHBhcmFtZXRlcnMgZm9yIGRpc3BsYXlEaWFsb2dBc3luYyBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dIXSA9IGg7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dXXSA9IHc7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5EaXNwbGF5RGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWREb21haW5EaWFsb2csXG4gICAgICAgICAgICAnVGhlIHVybCBvZiBhbiBleHRlbnNpb24gZGlhbG9nIG11c3QgbWF0Y2ggdGhlIGRvbWFpbiBvZiB0aGUgcGFyZW50IGV4dGVuc2lvbi4nKTtcbiAgICAgICAgZGVmYXVsdDogLy8gU3VjY2VzcyBjYXNlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xvc2VEaWFsb2cnXG4gICAgfTtcblxuICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbiwgZXh0ZW5zaW9uWm9uZUlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShjbGlja1Rocm91Z2hFbmFibGVkLCAnYm9vbGVhbicsICdjbGlja1Rocm91Z2hFbmFibGVkJyk7XG5cbiAgICBpZiAoZXh0ZW5zaW9uWm9uZUlkID09PSB1bmRlZmluZWQgfHwgZXh0ZW5zaW9uWm9uZUlkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnRXh0ZW5zaW9uIElkIGlzIGludmFsaWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uWm9uZUlkXTogZXh0ZW5zaW9uWm9uZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkNsaWNrVGhyb3VnaEVuYWJsZWRdOiBjbGlja1Rocm91Z2hFbmFibGVkXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldENsaWNrVGhyb3VnaCwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuXG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFVJU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvVUlTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldCgpLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoKS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldCgpLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/lib/tableau.extensions.1.latest.min.js b/lib/tableau.extensions.1.latest.min.js
index 4beeaf88..cfb19b44 100644
--- a/lib/tableau.extensions.1.latest.min.js
+++ b/lib/tableau.extensions.1.latest.min.js
@@ -1,2 +1,2 @@
-window.tableau=function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/dist-extensions/",r(r.s=124)}([function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(184)),n(r(187))},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),r(94),r(96),r(95),n(r(103)),n(r(191)),n(r(104)),n(r(192)),n(r(193)),n(r(105)),n(r(197)),n(r(106)),n(r(200)),n(r(63));var i,o=r(203);try{i=o.version.split(".").map((function(e){return parseInt(e,10)}))}catch(e){throw console.error(e),new Error("Unable to parse internal contract version "+o.version)}t.INTERNAL_CONTRACT_VERSION={major:i[0],minor:i[1],fix:i[2]},t.MESSAGING_VERSION={major:1,minor:0,fix:0}},function(e,t,r){(function(t){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,r(127))},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(189);t.EventListenerManager=i.EventListenerManager;var o=r(6);t.TableauError=o.TableauError;var a=r(190);t.ApiVersion=a.ApiVersion;var s=r(100);t.VersionNumber=s.VersionNumber;var u=r(101);t.Size=u.Size;var c=r(102);t.Point=c.Point;var l=r(23);t.InternalToExternalEnumMappings=l.InternalToExternalEnumMappings;var p=r(108);t.ParameterImpl=p.ParameterImpl;var f=r(66);t.SheetImpl=f.SheetImpl;var d=r(110);t.SheetInfoImpl=d.SheetInfoImpl;var y=r(111);t.WorksheetImpl=y.WorksheetImpl;var g=r(206);t.SingleEventManagerImpl=g.SingleEventManagerImpl;var m=r(207);t.DashboardImpl=m.DashboardImpl;var h=r(116);t.DashboardObjectImpl=h.DashboardObjectImpl;var v=r(17);t.ServiceImplBase=v.ServiceImplBase;var b=r(14);t.ErrorHelpers=b.ErrorHelpers,n(r(208));var I=r(117);t.CrossFrameDispatcher=I.CrossFrameDispatcher,n(r(209)),n(r(16));var T=r(220);t.VersionedExternalApiDispatcher=T.VersionedExternalApiDispatcher;var _=r(221);t.WorkbookImpl=_.WorkbookImpl;var S=r(67);t.DataSource=S.DataSource;var P=r(68);t.DataSourceImpl=P.DataSourceImpl},function(e,t,r){var n=r(2),i=r(40).f,o=r(15),a=r(18),s=r(45),u=r(129),c=r(52);e.exports=function(e,t){var r,l,p,f,d,y=e.target,g=e.global,m=e.stat;if(r=g?n:m?n[y]||s(y,{}):(n[y]||{}).prototype)for(l in t){if(f=t[l],p=e.noTargetGet?(d=i(r,l))&&d.value:r[l],!c(g?l:y+(m?".":"#")+l,e.forced)&&void 0!==p){if(typeof f==typeof p)continue;u(f,p)}(e.sham||p&&p.sham)&&o(f,"sham",!0),a(r,l,f,e)}}},function(e,t,r){var n=r(2),i=r(72),o=r(10),a=r(49),s=r(77),u=r(137),c=i("wks"),l=n.Symbol,p=u?l:l&&l.withoutSetter||a;e.exports=function(e){return o(c,e)&&(s||"string"==typeof c[e])||(s&&o(l,e)?c[e]=l[e]:c[e]=p("Symbol."+e)),c[e]}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(r,n){var i=e.call(this,r+": "+n)||this;return i._errorCode=r,Object.setPrototypeOf(i,t.prototype),i}return i(t,e),Object.defineProperty(t.prototype,"errorCode",{get:function(){return this._errorCode},enumerable:!0,configurable:!0}),t}(Error);t.TableauError=o},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,r){var n=r(2);e.exports=n},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){var n=r(8);e.exports=function(e){if(!n(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t,r){var n=r(7);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,r){var n=r(12),i=r(71),o=r(11),a=r(43),s=Object.defineProperty;t.f=n?s:function(e,t,r){if(o(e),t=a(t,!0),o(r),i)try{return s(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),i=r(29),o=r(6),a=function(){function e(){}return e.apiNotImplemented=function(e){return new o.TableauError(n.ErrorCodes.InternalError,e+" API not yet implemented.")},e.verifyInternalValue=function(e,t){if(null==e)throw new o.TableauError(n.ErrorCodes.InternalError,e+" is invalid value for: "+t)},e.verifyParameter=function(e,t){if(null==e)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" is invalid value for parameter: "+t)},e.verifyParameterType=function(e,t,r){if(typeof e!==t)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" has invalid type for parameter: "+r+".")},e.verifyStringParameter=function(e,t){if(null==e||""===e)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" is invalid value for paramter: "+t)},e.verifyEnumValue=function(e,t,r){var i=!1;if(Object.keys(t).forEach((function(r){t[r]===e.toString()&&(i=!0)})),!i)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" is invalid value for enum: "+r+".")},e.verifyRangeParamType=function(e,t){if(!e&&!t)throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, at least one of min or max is required.");if(e&&!i.Param.isTypeNumber(e)&&!i.Param.isTypeDate(e))throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, only Date and number are allowed for parameter min.");if(t&&!i.Param.isTypeNumber(t)&&!i.Param.isTypeDate(t))throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, only Date and number are allowed for parameter max.");if(e&&t&&typeof e!=typeof t)throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, parameters min and max should be of the same type.")},e.verifyZoneIsValid=function(e,t){if(!e.some((function(e){return e.id===t})))throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, Zone Id: "+t+" is not present in dashboard.")},e}();t.ErrorHelpers=a},function(e,t,r){var n=r(12),i=r(13),o=r(24);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),i=r(6),o=function(){function e(){this._services={}}return e.prototype.registerService=function(e){this._services[e.serviceName]=e},e.prototype.getService=function(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.InternalError,"Service not registered: "+e);return this._services[e]},e}(),a=function(){function e(){}return Object.defineProperty(e,"instance",{get:function(){if(window.__tableauApiServiceRegistry||e.setInstance(new o),!window.__tableauApiServiceRegistry)throw new i.TableauError(n.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry},enumerable:!0,configurable:!0}),e.setInstance=function(e){window.__tableauApiServiceRegistry=e},e}();t.ApiServiceRegistry=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(23),i=r(6),o=r(64),a=function(){function e(e){this._dispatcher=e}return e.prototype.execute=function(e,t){return this._dispatcher.execute(e,t).catch((function(e){var t=e,r=n.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,o.ShouldThrow.No);throw new i.TableauError(r,t.message)}))},e}();t.ServiceImplBase=a},function(e,t,r){var n=r(2),i=r(15),o=r(10),a=r(45),s=r(46),u=r(26),c=u.get,l=u.enforce,p=String(String).split("String");(e.exports=function(e,t,r,s){var u,c=!!s&&!!s.unsafe,f=!!s&&!!s.enumerable,d=!!s&&!!s.noTargetGet;"function"==typeof r&&("string"!=typeof t||o(r,"name")||i(r,"name",t),(u=l(r)).source||(u.source=p.join("string"==typeof t?t:""))),e!==n?(c?!d&&e[t]&&(f=!0):delete e[t],f?e[t]=r:i(e,t,r)):f?e[t]=r:a(t,r)})(Function.prototype,"toString",(function(){return"function"==typeof this&&c(this).source||s(this)}))},function(e,t,r){var n=r(9),i=r(2),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(n[e])||o(i[e]):n[e]&&n[e][t]||i[e]&&i[e][t]}},function(e,t,r){var n=r(11),i=r(76),o=r(33),a=r(21),s=r(79),u=r(81),c=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,r){var l,p,f,d,y,g,m,h=r&&r.that,v=!(!r||!r.AS_ENTRIES),b=!(!r||!r.IS_ITERATOR),I=!(!r||!r.INTERRUPTED),T=a(t,h,1+v+I),_=function(e){return l&&u(l),new c(!0,e)},S=function(e){return v?(n(e),I?T(e[0],e[1],_):T(e[0],e[1])):I?T(e,_):T(e)};if(b)l=e;else{if("function"!=typeof(p=s(e)))throw TypeError("Target is not iterable");if(i(p)){for(f=0,d=o(e.length);d>f;f++)if((y=S(e[f]))&&y instanceof c)return y;return new c(!1)}l=p.call(e)}for(g=l.next;!(m=g.call(l)).done;){try{y=S(m.value)}catch(e){throw u(l),e}if("object"==typeof y&&y&&y instanceof c)return y}return new c(!1)}},function(e,t,r){var n=r(22);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 0:return function(){return e.call(t)};case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,r){"use strict";var n,i,o,a,s,u,c,l,p,f,d,y,g,m;Object.defineProperty(t,"__esModule",{value:!0});var h=r(0),v=r(1),b=r(64),I=function(){function e(){}return e.extensionContext=new b.EnumConverter(((n={})[v.ExtensionContext.Desktop]=h.ExtensionContext.Desktop,n[v.ExtensionContext.Server]=h.ExtensionContext.Server,n)),e.extensionMode=new b.EnumConverter(((i={})[v.ExtensionMode.Authoring]=h.ExtensionMode.Authoring,i[v.ExtensionMode.Viewing]=h.ExtensionMode.Viewing,i)),e.columnType=new b.EnumConverter(((o={})[v.ColumnType.Continuous]=h.ColumnType.Continuous,o[v.ColumnType.Discrete]=h.ColumnType.Discrete,o)),e.fieldAggregationType=new b.EnumConverter(((a={})[v.FieldAggregationType.Attr]=h.FieldAggregationType.Attr,a[v.FieldAggregationType.Avg]=h.FieldAggregationType.Avg,a[v.FieldAggregationType.Count]=h.FieldAggregationType.Count,a[v.FieldAggregationType.Countd]=h.FieldAggregationType.Countd,a[v.FieldAggregationType.Day]=h.FieldAggregationType.Day,a[v.FieldAggregationType.End]=h.FieldAggregationType.End,a[v.FieldAggregationType.Hour]=h.FieldAggregationType.Hour,a[v.FieldAggregationType.InOut]=h.FieldAggregationType.InOut,a[v.FieldAggregationType.Kurtosis]=h.FieldAggregationType.Kurtosis,a[v.FieldAggregationType.Max]=h.FieldAggregationType.Max,a[v.FieldAggregationType.Mdy]=h.FieldAggregationType.Mdy,a[v.FieldAggregationType.Median]=h.FieldAggregationType.Median,a[v.FieldAggregationType.Min]=h.FieldAggregationType.Min,a[v.FieldAggregationType.Minute]=h.FieldAggregationType.Minute,a[v.FieldAggregationType.MonthYear]=h.FieldAggregationType.MonthYear,a[v.FieldAggregationType.None]=h.FieldAggregationType.None,a[v.FieldAggregationType.Qtr]=h.FieldAggregationType.Qtr,a[v.FieldAggregationType.Quart1]=h.FieldAggregationType.Quart1,a[v.FieldAggregationType.Quart3]=h.FieldAggregationType.Quart3,a[v.FieldAggregationType.Second]=h.FieldAggregationType.Second,a[v.FieldAggregationType.Skewness]=h.FieldAggregationType.Skewness,a[v.FieldAggregationType.Stdev]=h.FieldAggregationType.Stdev,a[v.FieldAggregationType.Stdevp]=h.FieldAggregationType.Stdevp,a[v.FieldAggregationType.Sum]=h.FieldAggregationType.Sum,a[v.FieldAggregationType.TruncDay]=h.FieldAggregationType.TruncDay,a[v.FieldAggregationType.TruncHour]=h.FieldAggregationType.TruncHour,a[v.FieldAggregationType.TruncMinute]=h.FieldAggregationType.TruncMinute,a[v.FieldAggregationType.TruncMonth]=h.FieldAggregationType.TruncMonth,a[v.FieldAggregationType.TruncQtr]=h.FieldAggregationType.TruncQtr,a[v.FieldAggregationType.TruncSecond]=h.FieldAggregationType.TruncSecond,a[v.FieldAggregationType.TruncWeek]=h.FieldAggregationType.TruncWeek,a[v.FieldAggregationType.TruncYear]=h.FieldAggregationType.TruncYear,a[v.FieldAggregationType.User]=h.FieldAggregationType.User,a[v.FieldAggregationType.Var]=h.FieldAggregationType.Var,a[v.FieldAggregationType.Varp]=h.FieldAggregationType.Varp,a[v.FieldAggregationType.Week]=h.FieldAggregationType.Week,a[v.FieldAggregationType.Weekday]=h.FieldAggregationType.Weekday,a[v.FieldAggregationType.Year]=h.FieldAggregationType.Year,a)),e.fieldRoleType=new b.EnumConverter(((s={})[v.FieldRoleType.Dimension]=h.FieldRoleType.Dimension,s[v.FieldRoleType.Measure]=h.FieldRoleType.Measure,s[v.FieldRoleType.Unknown]=h.FieldRoleType.Unknown,s)),e.sheetType=new b.EnumConverter(((u={})[v.SheetType.Dashboard]=h.SheetType.Dashboard,u[v.SheetType.Story]=h.SheetType.Story,u[v.SheetType.Worksheet]=h.SheetType.Worksheet,u)),e.dashboardObjectType=new b.EnumConverter(((c={})[v.DashboardObjectType.Extension]=h.DashboardObjectType.Extension,c[v.DashboardObjectType.Blank]=h.DashboardObjectType.Blank,c[v.DashboardObjectType.Image]=h.DashboardObjectType.Image,c[v.DashboardObjectType.Legend]=h.DashboardObjectType.Legend,c[v.DashboardObjectType.PageFilter]=h.DashboardObjectType.PageFilter,c[v.DashboardObjectType.ParameterControl]=h.DashboardObjectType.ParameterControl,c[v.DashboardObjectType.QuickFilter]=h.DashboardObjectType.QuickFilter,c[v.DashboardObjectType.Text]=h.DashboardObjectType.Text,c[v.DashboardObjectType.Title]=h.DashboardObjectType.Title,c[v.DashboardObjectType.WebPage]=h.DashboardObjectType.WebPage,c[v.DashboardObjectType.Worksheet]=h.DashboardObjectType.Worksheet,c)),e.dataType=new b.EnumConverter(((l={})[v.DataType.Bool]=h.DataType.Bool,l[v.DataType.Date]=h.DataType.Date,l[v.DataType.DateTime]=h.DataType.DateTime,l[v.DataType.Float]=h.DataType.Float,l[v.DataType.Int]=h.DataType.Int,l[v.DataType.String]=h.DataType.String,l)),e.filterUpdateType=new b.EnumConverter(((p={})[v.FilterUpdateType.Add]=h.FilterUpdateType.Add,p[v.FilterUpdateType.All]=h.FilterUpdateType.All,p[v.FilterUpdateType.Remove]=h.FilterUpdateType.Remove,p[v.FilterUpdateType.Replace]=h.FilterUpdateType.Replace,p)),e.allowableValues=new b.EnumConverter(((f={})[v.DomainRestrictionType.All]=h.ParameterValueType.All,f[v.DomainRestrictionType.List]=h.ParameterValueType.List,f[v.DomainRestrictionType.Range]=h.ParameterValueType.Range,f)),e.dateStepPeriod=new b.EnumConverter(((d={})[v.DateStepPeriod.Years]=h.PeriodType.Years,d[v.DateStepPeriod.Quarters]=h.PeriodType.Quarters,d[v.DateStepPeriod.Months]=h.PeriodType.Months,d[v.DateStepPeriod.Weeks]=h.PeriodType.Weeks,d[v.DateStepPeriod.Days]=h.PeriodType.Days,d[v.DateStepPeriod.Hours]=h.PeriodType.Hours,d[v.DateStepPeriod.Minutes]=h.PeriodType.Minutes,d[v.DateStepPeriod.Seconds]=h.PeriodType.Seconds,d)),e.dateRangeType=new b.EnumConverter(((y={})[v.DateRangeType.Current]=h.DateRangeType.Current,y[v.DateRangeType.Last]=h.DateRangeType.Last,y[v.DateRangeType.LastN]=h.DateRangeType.LastN,y[v.DateRangeType.Next]=h.DateRangeType.Next,y[v.DateRangeType.NextN]=h.DateRangeType.NextN,y[v.DateRangeType.ToDate]=h.DateRangeType.ToDate,y)),e.errorCode=new b.EnumConverter(((g={})[v.ErrorCodes.INITIALIZATION_ERROR]=h.ErrorCodes.InternalError,g[v.ErrorCodes.INTERNAL_ERROR]=h.ErrorCodes.InternalError,g[v.ErrorCodes.MISSING_ENUM_MAPPING]=h.ErrorCodes.InternalError,g[v.ErrorCodes.MISSING_PARAMETER]=h.ErrorCodes.InternalError,g[v.ErrorCodes.PERMISSION_DENIED]=h.ErrorCodes.InternalError,g[v.ErrorCodes.PRES_MODEL_PARSING_ERROR]=h.ErrorCodes.InternalError,g[v.ErrorCodes.UNKNOWN_VERB_ID]=h.ErrorCodes.InternalError,g[v.ErrorCodes.VERSION_NOT_CONFIGURED]=h.ErrorCodes.APINotInitialized,g[v.ErrorCodes.VISIBILITY_ERROR]=h.ErrorCodes.VisibilityError,g),h.ErrorCodes.InternalError),e.filterType=new b.EnumConverter(((m={})[v.FilterType.Categorical]=h.FilterType.Categorical,m[v.FilterType.Range]=h.FilterType.Range,m[v.FilterType.RelativeDate]=h.FilterType.RelativeDate,m[v.FilterType.Hierarchical]=h.FilterType.Hierarchical,m)),e}();t.InternalToExternalEnumMappings=I},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,r){var n=r(42),i=r(31);e.exports=function(e){return n(i(e))}},function(e,t,r){var n,i,o,a=r(128),s=r(2),u=r(8),c=r(15),l=r(10),p=r(47),f=r(48),d=r(32),y=s.WeakMap;if(a){var g=p.state||(p.state=new y),m=g.get,h=g.has,v=g.set;n=function(e,t){return t.facade=e,v.call(g,e,t),t},i=function(e){return m.call(g,e)||{}},o=function(e){return h.call(g,e)}}else{var b=f("state");d[b]=!0,n=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return l(e,b)?e[b]:{}},o=function(e){return l(e,b)}}e.exports={set:n,get:i,has:o,enforce:function(e){return o(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!u(t)||(r=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return r}}}},function(e,t){e.exports=!1},function(e,t){e.exports={}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),i=r(6),o=r(14),a=function(){function e(){}return e.serializeDateForPlatform=function(e){return e.getUTCFullYear()+"-"+(e.getUTCMonth()+1)+"-"+e.getUTCDate()+" "+e.getUTCHours()+":"+e.getUTCMinutes()+":"+e.getUTCSeconds()},e.serializeBooleanForPlatform=function(e){return e?"true":"false"},e.serializeNumberForPlatform=function(e){return e.toString(10)},e.isTypeNumber=function(e){return"number"==typeof e||e instanceof Number},e.isTypeDate=function(e){return e instanceof Date},e.isTypeString=function(e){return"string"==typeof e||e instanceof String},e.isTypeBool=function(e){return"boolean"==typeof e||e instanceof Boolean},e.serializeParameterValue=function(t){if(e.isTypeNumber(t))return e.serializeNumberForPlatform(t);if(e.isTypeDate(t))return e.serializeDateForPlatform(t);if(e.isTypeBool(t))return e.serializeBooleanForPlatform(t);if(e.isTypeString(t))return t;throw new i.TableauError(n.ErrorCodes.InternalError,"Unexpected invalid value for: "+t)},e.convertParameterToMap=function(e,t){if(o.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(n.ErrorCodes.InvalidParameter,"Expecting object or Map for: "+t+".");return e instanceof Map?e:new Map(Object.entries(e))},e}();t.Param=a},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){e.exports={}},function(e,t,r){var n=r(50),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},function(e,t,r){var n=r(31);e.exports=function(e){return Object(n(e))}},function(e,t,r){var n=r(11),i=r(135);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,r={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(r,[]),t=r instanceof Array}catch(e){}return function(r,o){return n(r),i(o),t?e.call(r,o):r.__proto__=o,r}}():void 0)},function(e,t,r){var n,i=r(11),o=r(136),a=r(51),s=r(32),u=r(75),c=r(44),l=r(48),p=l("IE_PROTO"),f=function(){},d=function(e){return"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dashboard Layout Sample
+
+
+
Dashboard Changes
+
+
+
+
+