@myop/sdk 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundled-declarations.d.ts +49 -2
- package/dist/cjs/{_IframeSDK.66415fd2.min.js → _IframeSDK.012474c1.min.js} +1 -1
- package/dist/cjs/{_IframeSDK.561df75d.js → _IframeSDK.c7f71dba.js} +3 -3
- package/dist/cjs/_IframeSDK.c7f71dba.js.map +7 -0
- package/dist/cjs/{_MyopHelpers.70503082.js → _MyopHelpers.75e0fd8d.js} +3 -3
- package/dist/cjs/{_MyopHelpers.70503082.js.map → _MyopHelpers.75e0fd8d.js.map} +3 -3
- package/dist/cjs/{_MyopHelpers.7c81005e.min.js → _MyopHelpers.ecfd80d9.min.js} +1 -1
- package/dist/cjs/{_WebComponentSDK.dabe5cd1.min.js → _WebComponentSDK.15ffefb6.min.js} +1 -1
- package/dist/cjs/{_WebComponentSDK.fd6435d3.js → _WebComponentSDK.93d3959a.js} +3 -3
- package/dist/cjs/_WebComponentSDK.93d3959a.js.map +7 -0
- package/dist/cjs/{_hostSDK.9b7c3010.min.js → _hostSDK.a852b7b7.min.js} +1 -1
- package/dist/cjs/{_hostSDK.b1330e44.js → _hostSDK.eeb98d7f.js} +3 -3
- package/dist/cjs/_hostSDK.eeb98d7f.js.map +7 -0
- package/dist/cjs/myop_sdk.js +14 -14
- package/dist/cjs/myop_sdk.js.map +1 -1
- package/dist/cjs/myop_sdk.min.js +1 -1
- package/dist/module/Iframe/index.js +4 -3
- package/dist/module/Iframe/index.js.map +3 -3
- package/dist/module/SDK.js +7 -6
- package/dist/module/SDK.js.map +3 -3
- package/dist/module/common/index.d.ts +47 -0
- package/dist/module/common/index.js +1 -1
- package/dist/module/common/index.js.map +2 -2
- package/dist/module/helpers/index.d.ts +1 -1
- package/dist/module/helpers/index.js +4 -3
- package/dist/module/helpers/index.js.map +3 -3
- package/dist/module/host/index.js +4 -3
- package/dist/module/host/index.js.map +3 -3
- package/dist/module/webcomponent/index.js +4 -3
- package/dist/module/webcomponent/index.js.map +3 -3
- package/package.json +1 -1
- package/dist/cjs/_IframeSDK.561df75d.js.map +0 -7
- package/dist/cjs/_WebComponentSDK.fd6435d3.js.map +0 -7
- package/dist/cjs/_hostSDK.b1330e44.js.map +0 -7
- /package/dist/module/helpers/{EnableV2.d.ts → enableV2.d.ts} +0 -0
|
@@ -1827,7 +1827,7 @@ var WebcomponentLoader = class extends BaseMyopLoader {
|
|
|
1827
1827
|
};
|
|
1828
1828
|
|
|
1829
1829
|
// version:myop-sdk-version
|
|
1830
|
-
var myop_sdk_version_default = "0.2.
|
|
1830
|
+
var myop_sdk_version_default = "0.2.3";
|
|
1831
1831
|
|
|
1832
1832
|
// src/host/loaders/HTMLComponentLoader.ts
|
|
1833
1833
|
var seen2 = [];
|
|
@@ -1882,6 +1882,7 @@ var HTMLComponentLoader = class extends BaseMyopLoader {
|
|
|
1882
1882
|
IframeElement = this.appendChild(container, IframeElement, options);
|
|
1883
1883
|
IframeElement.id = domId2;
|
|
1884
1884
|
IframeElement.setAttribute("style", `
|
|
1885
|
+
display: block;
|
|
1885
1886
|
padding: 0;
|
|
1886
1887
|
margin: 0;
|
|
1887
1888
|
overflow: hidden;
|
|
@@ -2032,7 +2033,7 @@ var _CloudRepository = class _CloudRepository {
|
|
|
2032
2033
|
__publicField(_CloudRepository, "Main", new _CloudRepository());
|
|
2033
2034
|
var CloudRepository = _CloudRepository;
|
|
2034
2035
|
|
|
2035
|
-
// src/helpers/
|
|
2036
|
+
// src/helpers/enableV2.ts
|
|
2036
2037
|
var _v2_CloudRepository = class _v2_CloudRepository {
|
|
2037
2038
|
constructor(_baseUrl = "https://cloud.myop.dev") {
|
|
2038
2039
|
this._baseUrl = _baseUrl;
|
|
@@ -2642,4 +2643,4 @@ defineDynamicImport("WebComponentSDK", WebComponentSDK);
|
|
|
2642
2643
|
export {
|
|
2643
2644
|
WebComponentSDK
|
|
2644
2645
|
};
|
|
2645
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnQudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9JTXlvcENvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2dNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAidmVyc2lvbjpteW9wLXNkay12ZXJzaW9uIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvRW5hYmxlVjIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgaW50ZXJmYWNlIElFbGVtZW50UmVmIHtcbiAgICBteW9wSWQ/OiBzdHJpbmdcbiAgICBodG1sVGFnTmFtZTogc3RyaW5nXG4gICAgQm91bmRpbmdSZWN0PzogRE9NUmVjdFxuICAgIG9mZnNldFRvcD86IG51bWJlclxuICAgIG9mZnNldExlZnQ/OiBudW1iZXJcblxuICAgIHR5cGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgWFBhdGhFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB4UGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ1hQYXRoRWxlbWVudFJlZidcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBteW9wSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ015b3BFbGVtZW50UmVmJ1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXJ9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5cbmV4cG9ydCB0eXBlIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwID0gQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPiB8IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgY29uc3QgcnVuRXhlY3V0b3JDbGVhbnVwID0gYXN5bmMgKHRhc2s6IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICB0YXNrKCk7XG4gICAgfSBlbHNlIGlmICh0YXNrIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBJdCdzIGEgUHJvbWlzZSwgYXdhaXQgaXRcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFzaztcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgICAgICByZXN1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0YXNrIGlzIHZvaWQsIGRvIG5vdGhpbmdcbn1cblxudHlwZSBJTWVzc2FnZUV4ZWN1dG9yPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+ID0gKG1lc3NhZ2U6IFQpID0+IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwO1xuXG5pbnRlcmZhY2UgSU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcblxuICAgIGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gaW1wbGVtZW50cyBJTWVzc2FnZUhhbmRsZXI8VD4ge1xuXG4gICAgLy9UT0RPIDogYWRkIGRpc3Bvc2UgbWV0aG9kXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQpIHtcblxuICAgIH1cblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuICAgIGFic3RyYWN0IGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55LCBFID0gYW55PiBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkLCBwdWJsaWMgY29udGV4dD86IEUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxufVxuIiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9CYXNlTWVzc2FnZSc7XG5cbi8vdXNlcidzIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0JpbmRDbGlja01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VUZXh0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3VzdG9tUmVmTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRJbm5lckh0bWwnO1xuXG4vL3N5c3RlbSBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9Jbml0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FbnZlbG9wZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICAnLi9HZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DbGVhbnVwTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0Rpc3Bvc2VNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzsiLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBydW5FeGVjdXRvckNsZWFudXB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vYmFzZU1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSwgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLCBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBFbnZlbG9wZWRNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb21wb25lbnQ8VCA9IGFueT4ge1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgfVxuXG4gICAgLy9vbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogSU15b3BNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBjb250ZXh0PzogVCkge1xuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wU0RLIHtcbiAgICBpbml0OiAoKSA9PiB2b2lkO1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzOiAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+O1xufVxuXG4vLyBjb25zdCBsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMgPSBbXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0LFxuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UsXG4vLyAgICAgLy9NeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSxcbi8vIF1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wU0RLIGltcGxlbWVudHMgSU15b3BTREsge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBtZXNzYWdlVG9IYW5kbGVBZnRlckluaXQ6IEJhc2VNeW9wTWVzc2FnZVtdID0gW107XG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+ID0ge307XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG1lc3NhZ2VDbGVhbnVwQ2FjaGU6IFJlY29yZDxzdHJpbmcsIENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4+IHwgUHJvbWlzZTx2b2lkPiA9IHt9O1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBldmVudC5kYXRhID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRldGFpbDtcblxuICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIG5vdCBteW9wIG1hcmtlZCBldmVudCBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gYmFzZVNESywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIChsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgICAvL1RPRE8gOiBmaXggZGlyZWN0aW9uID8gbWVzc2FnZSB3aWxsIG5vdCBwcm9jY2VzcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRGlzcG9zZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2hvdWxkIG5vdCBiZSBvcHRpb25hbCwgZml4IGFuZCByZW1vdmUgJ2lmJ1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb25dXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBnb3Qgb3VyIGlkIGZyb20gb3VyIGhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBTREsgbWF5IHNlcnZlIG1vcmUgdGhhbiAxIGNvbXBvbmVudCAuLiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInJlY2hpdmVkIGluaXQgbWVzc2FnZSBmb3IgYW4gZXhzaXNpbmcgY29tcG9uZW50LlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSA9IG5ldyBIb3N0ZWRDb21wb25lbnQobmV3Q29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVzcG9uc2UobmV3Q29tcG9uZW50SWQpKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBzYW1lIEhvc3RTREsgY2FzZXNcbiAgICAgICAgICAgIC8vIHdoZW4gYm90aCBSZWZDb21wb25lbnQgYW5kIHJlYWxDb21wb25lbnQgaG9zdGVkIGluIHRoZSBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSBlbnZlbG9wZWRNZXNzYWdlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlubmVyTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgfHwgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb24hXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGlubmVyTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBlbnZlbG9wZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZihtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdHlwZWRNZXNzYWdlIDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcbiAgICAgICAgICAgIC8vIC8vICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ2xlYW51cE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbWVzc2FnZSBhcyBDbGVhbnVwTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cE1lc3NhZ2UgPSBuZXcgQ2xlYW51cFJlcGxheU1lc3NhZ2UoISFjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cE1lc3NhZ2UuZGVzdGluYXRpb24gPSBtZXNzYWdlLmRlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0b3JDbGVhbnVwKGNsZWFudXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kZWwgZXJyb3I/XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uSGFuZGxlckZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VUeXBlID09PSBtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IGhhbmRsZXIuZXhlY3V0b3IobWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSAmJiBjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW21lc3NhZ2UuaWRdID0gY2xlYW51cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFudXAgJiYgIW1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBub24tY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsZWFudXAgJiYgbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIGEgY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghYWN0aW9uSGFuZGxlckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHByaW50IHdpdGggZGVidWcgY29uZmlnIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gbWVzc2FnZSBoYW5kbGVyIHdhcyBmb3VuZCBmb3IgJywgbWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5pdDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xufVxuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8vXG4gICAgLy8gdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgLy8gdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcblxuICAgIC8vXG4gICAgdmFyaWFudHNfbmFtZXM6IHN0cmluZ1tdLFxuICAgIHZhcmlhbnRzX2RhdGE6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbiAgICAgICAgaGFzX3JlbGVhc2VzPzogYm9vbGVhblxuICAgIH1bXSxcblxuICAgIHByZXZpZXdfdmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7XG4gICAgZXh0cmE/OiB7XG4gICAgICAgIGZpcnN0VmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7IC8vd2hlbiBuZXcgY29tcG9uZW50IGNyZWF0ZXMgYXQgdGhlIGNsaWVudFxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JRFRPIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGRhdGE6IG9iamVjdFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBJQnJhbmNoYWJsZSB7XG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdDxJVXNlckZsb3dEZWZpbml0aW9uLCAnY29tcG9uZW50cyc+LCBJQnJhbmNoYWJsZSB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wV2ViY29tcG9uZW50Q29uc3RzID0ge1xuICAgIHdlYmNvbXBvbmVudF9tZXNzYWdlX2tleTogJ215b3Bfd2ViY29tcG9uZW50X21lc3NhZ2UnXG59XG4iLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdClcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPE15b3BFbGVtZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNoYWRvd1Jvb3RSZWYgZXh0ZW5kcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCBzaGFkb3dSb290KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcblxuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogTXlvcEVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogdGFrZSB0aGF0IGJhY2sgdG8gdGhlIGRhc2hib2FyZD9cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaXRlbSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcblxuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3djIHJlY3QnLCAgaXRlbS5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5vZmZzZXRUb3AsIGl0ZW0ub2Zmc2V0TGVmdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9O1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG5cbn1cbiIsICJleHBvcnQgY29uc3QgX19mZWRlcmF0aW9uX18gPSBcIl9fZmVkZXJhdGlvbl9fXCJcbmV4cG9ydCBjb25zdCBvbkxvYWRLZXkgPSBcIm9uTG9hZFwiXG5leHBvcnQgY29uc3QgbW9kdWxlSW5zdGFuY2VLZXkgPSBcIm1vZHVsZUluc3RhbmNlXCJcblxuZXhwb3J0IGNvbnN0IGRlZmluZUR5bmFtaWNJbXBvcnQgPSAoZ2xvYmFsTmFtZTogc3RyaW5nLCBtb2R1bGU6IGFueSkgPT4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAod2luZG93W19fZmVkZXJhdGlvbl9fXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV1bb25Mb2FkS2V5XSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV1bb25Mb2FkS2V5XSh7W2dsb2JhbE5hbWVdOiBtb2R1bGV9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ19fZmVkZXJhdGlvbl9fIGxvYWRlciBub3QgZGVmaW5lZCBmb3IgbW9kdWxlJywgbW9kdWxlKTtcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZTxUPiA9XG4gICAgVCBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiAvLyBFeGNsdWRlIGZ1bmN0aW9uc1xuICAgICAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBTZXJpYWxpemFibGU8VT5bXSA6IC8vIEhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3QgPyB7XG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEtdOiBTZXJpYWxpemFibGU8VFtLXT5cbiAgICAgICAgICAgIH0gOiBUOyAvLyBIYW5kbGUgb2JqZWN0c1xuXG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1ByaW1pdGl2ZXNPbmx5ID0gKG9iaikgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgaWYgaXQncyBhIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSXQncyBhIHByaW1pdGl2ZSwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm91bmQgYSBub24tcHJpbWl0aXZlIHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsIHZhbHVlcyBhcmUgcHJpbWl0aXZlcyBvciBuZXN0ZWQgb2JqZWN0cyB3aXRoIHByaW1pdGl2ZXNcbn1cblxuLy8gY3VycmVudGx5IHN1cHBvcnQgcm9vdCBsZXZlbCBvbmx5XG4vLyB7eDogMSwgeSA6ICdhJywgeiA6ICgpPT57Li4ufSwgaW5uZXIgOiB7IHg6IDEgLCB5IDogJ2EnfSB9XG4vLyB7eDogMSwgeSA6ICdhJ31cbi8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9GYWxzeVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBib29sZWFuIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+PiB8IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXphYmxlID0gPFQ+KFxuICAgIG9iajogVCxcbiAgICBza2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSB7fSxcbiAgICBpbmNsdWRlRmFsc3lLZXlzOiBib29sZWFuID0gdHJ1ZSwgLy8gVE9ETyA6IHVzZSB0aGF0IGFyZ1xuICAgIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBTZXJpYWxpemFibGU8YW55Pj4gPSBuZXcgV2Vha01hcCgpXG4pOiBTZXJpYWxpemFibGU8VD4gPT4ge1xuXG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBTZXJpYWxpemFibGU8VD47IC8vIERpcmVjdGx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQXJyYXk6IFNlcmlhbGl6YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVBcnJheSk7IC8vIFN0b3JlIHRoZSBhcnJheSBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iai5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQXJyYXlbaW5kZXhdID0gbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LCBza2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZUFycmF5IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZU9iamVjdDogUGFydGlhbDxTZXJpYWxpemFibGU8VD4+ID0ge307XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlT2JqZWN0KTsgLy8gU3RvcmUgdGhlIG9iamVjdCBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGluIHRoZSBza2VsZXRvbiBhbmQgaWYgaXQncyBhIHZhbGlkIGtleSB0byBzZXJpYWxpemVcblxuICAgICAgICAgICAgY29uc3Qga2V5SW5Ta2VsZXRvbiA9IHR5cGVvZiBza2VsZXRvbiA9PSBcImJvb2xlYW5cIiA/IHNrZWxldG9uIDogc2tlbGV0b25ba2V5XTtcblxuICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24pIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIHRvIHNlcmlhbGl6ZSB0aGlzIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZhbHN5S2V5cyA/IG9ialtrZXldICE9PSB1bmRlZmluZWQgOiBvYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCB0cnVlLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUluU2tlbGV0b24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgbmVzdGVkIGtleXMgdG8gc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCBrZXlJblNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZU9iamVjdCBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9IGFzIGFueTsgLy8gUmV0dXJuIGFuIGVtcHR5IG9iamVjdCBmb3Igb3RoZXIgY2FzZXNcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsXG4gICAgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSxcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaW4gZmFjdCB3aGVuIHJ1bm5pbmcgaW4gV2ViQ29tcG9uZW50IHdlIGNhbiB0cmFuc2ZlciB0aGUgb3JpZ2luYWwgZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2luZyBtYWtlU2VyaWFsaXphYmxlIGZvciBuZXN0ZWQgY2FzZXMsIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgIG1ha2VTZXJpYWxpemFibGUoZSwgZXZlbnQuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleSwgTXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRGlzcG9zZU1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZlxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREssIGxvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbi8vVE9ETyA6IGNoYW5nZSBJTXlvcENvbXBvbmVudCB0byByZWYgc3BlY2lmaWMgaW1wbFxudHlwZSBSZWZUeXBlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBJTXlvcENvbXBvbmVudCB8IFJlZlxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcENvbXBvbmVudDxQID0gYW55LCBSID0gYW55PiB7XG5cbiAgICBpZDogc3RyaW5nO1xuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW47XG5cbiAgICBtYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbjtcblxuICAgIHNldEluaXRpYXRlZDogKCkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcblxuICAgIC8vcmVmIGNvbXBvbmVudHMgY2FuIGJlIGVsZW1lbnQtbGVzc1xuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgc2VuZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBDbGVhbnVwSGFuZGxlclxuXG4gICAgYmluZChtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgYmluZDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIC8vIGJvb2xlYW4gcmV0dXJuZWQgdmFsdWUgPSBoYW5kbGVkIG9yIG5vdFxuICAgIG9uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IGJvb2xlYW5cblxuICAgIGluaXRpYXRlZDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZGlzcG9zZTogKCkgPT4gdm9pZFxuXG4gICAgaGlkZSgpOiB2b2lkO1xuXG4gICAgc2hvdygpOiB2b2lkO1xuXG4gICAgaW5zcGVjdCgpOiB2b2lkO1xuXG4gICAgcGFyZW50PzogSU15b3BDb21wb25lbnQ7XG5cbiAgICBwcm9wczogUFxuXG4gICAgcmVmczogUlxufVxuXG5mdW5jdGlvbiBpc0luaGVyaXRGcm9tKG9iajogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXG4gICAgaWYgKCFwcm90bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IGJhc2VDbGFzcy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbmhlcml0RnJvbShwcm90bywgYmFzZUNsYXNzKTtcbn1cblxuLy8gVE9ETyA6IG1vdmUgOiBcbnR5cGUgbWVzc2FnZUhhbmRsZXI8VD4gPSAobWVzc2FnZTogVCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgZXh0ZW5kcyBSZWZUeXBlcyA9IFJlZlR5cGVzPiBpbXBsZW1lbnRzIElNeW9wQ29tcG9uZW50PFA+IHtcbiAgICBpZDogc3RyaW5nID0gJydcblxuICAgIG1lc3NhZ2VIYW5kbGVyczogUmVjb3JkPHN0cmluZywgbWVzc2FnZUhhbmRsZXI8YW55PltdPiA9IHt9O1xuXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkIHx8IEhvc3RTREsuSW5zdGFuY2UoKS5hc3NpZ25JZChjb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPyBvcHRpb25zPy50aW1lb3V0IDogNSAqIDEwMDA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkICYmIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgJiYgIXRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgdGltZW91dF8ke3RpbWVvdXR9ICR7dGhpcy5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGF1dG8gaW5zcGVjdCwgY29udHJvbCBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLmhvc3RTREsuaW5zcGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBnZXQgbWFya2VkRm9yRGlzcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZDtcbiAgICB9XG5cbiAgICBzZXQgbWFya2VkRm9yRGlzcG9zZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWRPcGVyYXRpb25FeGNlcHRpb246IFRoZSBjb21wb25lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkaXNwb3NlZC4gRGlzcG9zZSBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBhZ2FpbiB1bnRpbCB0aGUgY3VycmVudCBkaXNwb3NhbCBwcm9jZXNzIGlzIGNvbXBsZXRlLicpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBoaWRlKCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzaG93KCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBpbnNwZWN0KCk6IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLy9UT0RPOiB1c2UgYmluZFdoZW4gd2l0aCByZXR1cm4gdHJ1ZSBwcmVkaWNhdGUgLi4uXG4gICAgYmluZCA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLmluY2x1ZGVzKGhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRXaGVuID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIHByZWRpY2F0ZTogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4sIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiB2b2lkKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCB1c2UgY29tcG9uZW50LmJpbmRXaGVuIHdpdGhvdXQgYW4gaGFuZGxlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXTtcblxuICAgICAgICBjb25zdCBwcmVkaWNhdGVXcmFwcGVkSGFuZGxlciA9IChlOiBUKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbiA/XG4gICAgICAgIGhhbmRsZXJzLnB1c2gocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ29uTWVzc2FnZVJlY2VpdmVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgaW5jb21lTWVzc2FnZSwgdGhpcyk7XG4gICAgICAgIC8vVE9ETyA6IGhhbmRlbCBzcGVjaWFsIGV2ZXRzID8gbGlrZSBpbml0UmVzID9cbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAoaW5jb21lTWVzc2FnZSBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKTtcblxuICAgICAgICAgICAgLy9rZWVwaW5nIHRoaXMubWV0aG9kKCkgc28gdGhhdCBjb250ZXh0IHdpbGwgc2F2ZWRcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSh0eXBlZE1lc3NhZ2UuY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBtZXRob2Qgbm90IGZvdW5kICR7dHlwZWRNZXNzYWdlLm1ldGhvZH0gb24gY29tcG9uZW50YCwgdGhpcylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW2luY29tZU1lc3NhZ2UubWVzc2FnZVR5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBoYW5kbGVkIHx8IGhhbmRsZXIoaW5jb21lTWVzc2FnZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGNvbnNvbGUgb25seSB3aGVuIGRlYnVnIGNvbmZpZ1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gaGFuZGxlcnMgZm91bmQgZm9yICcsIGluY29tZU1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNldEluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKVxuICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgX3doZW5Jbml0aWF0ZWRSZXNvbHZlPzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG4gICAgX3doZW5Jbml0aWF0ZWRSZWplY3Q/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcblxuICAgIF93aGVuSW5pdGlhdGVkOiBQcm9taXNlPGFueT4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5Jbml0aWF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZW5kQ2xlYW51cE1lc3NhZ2UobWVzc2FnZTogQ2xlYW51cE1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKG1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSBtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICB9LCAobTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2UuaGFuZGxlcihtKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXI7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIHRoaXMuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHNlbmQobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIge1xuICAgICAgICAvL21lc3NhZ2VzIHRoYXQgZXhldHJhY3RlZCBmcm9tIGVudmVsb3BlIGFscmVhZHkgaGF2ZSBzb3VyY2UgaW4gdGhlbVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGxldCBjbGVhbnVwSGFuZGxlcjtcbiAgICAgICAgLy8gVE9ETyA6IGZpeCBoZWF2eSBvcC4uXG4gICAgICAgIC8vICBpZiAoaXNJbmhlcml0RnJvbShtZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgTXlvcEJpbmRNZXNzYWdlKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbih0eXBlZE1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gdHlwZWRNZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICAgICAgfSwgdHlwZWRNZXNzYWdlLmhhbmRsZXIpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgaWYgKG1lc3NhZ2UucmVmKSB7XG4gICAgICAgICAgICAvLyBzZXJpYWxpemFibGVcbiAgICAgICAgICAgIG1lc3NhZ2UucmVmID0gbWVzc2FnZS5yZWYuX19ub25Qcm94aWVkIHx8IG1lc3NhZ2UucmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZENsZWFudXBNZXNzYWdlKG5ldyBDbGVhbnVwTWVzc2FnZShtZXNzYWdlLmlkLCAocmVwbGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZyByZXBsYXk/XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNsZWFudXBIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHNkay5sb2dnZXJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBiZWZvcmUgaXNJbml0aWF0ZWQnLCB0aGlzLmlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnZGlzcG9zaW5nIGNvbXBvbmVudCcsIHRoaXMuaWQpO1xuXG4gICAgICAgIC8vIC8vVE9ETyA6IGltcGxlbWVudCBkaXNwb3NlIGZsb3dcbiAgICAgICAgLy8gT2JqZWN0LmtleXModGhpcy5yZWZzKS5mb3JFYWNoKHJlZktleT0+e1xuICAgICAgICAvLyAgICAgdGhpcy5yZWZzW3JlZktleV0uZGlzcG9zZSgpO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgdGltZSBmb3IgdGhlIG9cbiAgICAgICAgLy8gdGhlciBzaWRlIHRvIHByb2NjZXNzIHRvIG1lc3NhZ2UgYmVmb3JlIGRpZSA/XG4gICAgICAgIC8vbm90aWZ5IHRoZSBvdGhlciBzaWRlIFNES1xuICAgICAgICB0aGlzLnNlbmQobmV3IERpc3Bvc2VNZXNzYWdlKCkpXG5cbiAgICAgICAgY29uc3Qgb25EaXNwb3NlSGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1snb25EaXNwb3NlJ11cbiAgICAgICAgaWYgKG9uRGlzcG9zZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICBvbkRpc3Bvc2VIYW5kbGVycy5mb3JFYWNoKGRpc3Bvc2VIYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIG51bGwgb3IgZml4IHRoZSB0eXBlID9cbiAgICAgICAgICAgICAgICBkaXNwb3NlSGFuZGxlcihudWxsKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMgPSB7fVxuICAgICAgICB0aGlzLmlkICs9ICdfZGlzcG9zZWQnO1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvcHM6IFAgPSB7fSBhcyB1bmtub3duIGFzIFA7XG4gICAgcmVmczogUiA9IHt9IGFzIHVua25vd24gYXMgUjtcbn1cbiIsICJleHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAgIG5vdFNlcmlhbGl6YWJsZVJlZkNhbGw6IChwcm9wLCBhcmcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblRoZSBpbnB1dCBwcm92aWRlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBpcyBub3Qgc2VyaWFsaXphYmxlLiBTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIHNraW4gaW1wbGVtZW50YXRpb24uIFxuVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkYXRhIGFyZSBjb25zaWRlcmVkIG5vbi1zZXJpYWxpemFibGUgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQ6XG5cbi0gRnVuY3Rpb25zXG4tIERPTSBlbGVtZW50c1xuLSBDbGFzcyBpbnN0YW5jZXNcbi0gQ2lyY3VsYXIgcmVmZXJlbmNlc1xuLSBTeW1ib2xzXG4tIEJpZ0ludCB2YWx1ZXNcblxuSW4gdGhlIGZvbGxvd2luZyBleGVjdXRpb24gd2UgZGV0ZWN0ZWQgOlxufn5+fn5+fn5cbiR7YXJnfSBcbn5+fn5+fn5+XG5hcyBub3Qgc2VyaWFsaXphYmxlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgaW5wdXRzIHBhc3NlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBhcmUgaW4gYSBzZXJpYWxpemFibGUgZm9ybWF0LlxuVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyksIGFycmF5cywgYW5kIHBsYWluIG9iamVjdHMuIFxuSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBjb21wbGV4IGRhdGEgdHlwZXMsIGNvbnNpZGVyIGNvbnZlcnRpbmcgdGhlbSB0byBhIHNlcmlhbGl6YWJsZSBzdHJ1Y3R1cmUgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZnVuY3Rpb24uXG5PciB1c2UgTXlvcCBtZXNzYWdlIHRoYXQgc3VwcG9ydCBpdDogQ3VzdG9tUmVmTWVzc2FnZSwgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2Ugb3IgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UuXG5cblN1Z2dlc3RlZCBGaXg6XG4xLiBSZW1vdmUgb3IgcmVwbGFjZSBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBmcm9tIHlvdXIgaW5wdXQuXG4yLiBJZiB1c2luZyBvYmplY3RzLCBlbnN1cmUgdGhleSBkbyBub3QgY29udGFpbiBhbnkgZnVuY3Rpb25zIG9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4zLiBDb252ZXJ0IGFueSBjbGFzcyBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0cyBvciBKU09OLWNvbXBhdGlibGUgZm9ybWF0cy5cbjQuIFVzZSBkZWRpY2F0ZWQgTXlvcCBtZXNzYWdlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzIG9uIHNlcmlhbGl6YXRpb24gYW5kIE15b3AgbWVzc2FnZSBleGFtcGxlcywgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm15b3AuZGV2XFwuXG5cbmApO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnQsIElNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2R9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbnZlbG9wZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFJlZkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIHBhcmVudDogSU15b3BDb21wb25lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIHBhcmVudENvbXBvbmVudC5jb250YWluZXIuLi5cbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgcGFyZW50LmNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy90aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoYXJndW1lbnRzLmNhbGxlZS5uYW1lKSk7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaGlkZScpKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWFsIGNsZWFudXBcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIGluc3BlY3QgY2FsbGVkLCBjcmVhdGluZyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGluc3BlY3QnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaW5zcGVjdCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCcpKTtcbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScpIHtcbiAgICAgICAgLy8gIGRlYnVnZ2VyO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgbWVzc2FnZSBzZW5kaW5nICcsIG1lc3NhZ2UpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIHRoaXMuaWQgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIG5lc3RlZCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChuZXcgRW52ZWxvcGVkTWVzc2FnZSh0aGlzLmlkLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2Rpc3Bvc2UnKSk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE1lc3NhZ2VEaXJlY3Rpb25cbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlcy50c1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIGlmICgoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICAvLyB0aGlzLklmcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdClcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGBJZnJhbWVFbGVtZW50IGVycm9yYCk7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHRoaXMuSWZyYW1lRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlclR5cGV9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcExvYWRlciB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BMb2FkZXIgaW1wbGVtZW50cyBJTXlvcExvYWRlciB7XG4gICAgYWJzdHJhY3QgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgYWJzdHJhY3QgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xuXG4gICAgYXBwZW5kQ2hpbGQgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLnJlbGF0aXZlLmNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBvcHRpb25zLnJlbGF0aXZlLmNoaWxkPy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBhZGRRdWVyeVBhcmFtID0gKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgVVJMIG9iamVjdFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIC8vIEFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQocGFyYW0sIHZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBVUkxcbiAgICByZXR1cm4gdXJsT2JqLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lTG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuICAgIHR5cGUgPSBTa2luTG9hZGVycy5JZnJhbWVMb2FkZXJcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVOYW1lID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmVlZHMgdG8gbG9hZCBpbnRvIGFuIGV4c2lzdGluZyBJZnJhbWUuLi4nLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ25lZWRzIHRvIGNyZWF0ZSBuZXcgSWZyYW1lLi4uJywgZG9tSWQsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0IDpcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGlzc3VlIHRvIGxvYWQgaWZyYW1lIGluc2lkZSBhbiBpZnJhbWUgd2l0aCB0aGUgc2FtZSB1cmxcbiAgICAgICAgICAgIGxldCB1cmwybG9hZCA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS51cmw7XG4gICAgICAgICAgICAvL2NvbnN0IHVuaXFVcmwgPSB1cmwybG9hZCA9PT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZiA/IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX21cIiwgZG9tSWQpIDogdXJsMmxvYWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSAnc3R5bGUnIGF0dHIgbWVyZ2UgaGVyZVxuICAgICAgICAgICAgbGV0IGVsZW1lbnRBdHRyaWJ1dGVzU3RyaW5nID0gJyc7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmcgPSBPYmplY3QuZW50cmllcyhvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7a2V5fT1cIiR7U3RyaW5nKHZhbHVlKX1cImA7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcgJyk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQub3V0ZXJIVE1MID0gYDxpZnJhbWUgXG4gICAgICAgICAgICAgICBpZD1cIiR7ZG9tSWR9XCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTsgICAgXG4gICAgICAgICAgICAgICAgICAgd2lkdGggOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJHtvcHRpb25zPy5oaWRkZW4gPyAnYWJzb2x1dGUnIDogJ3N0YXRpYyd9O1xuICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBzcmM9XCIke3VybDJsb2FkfVwiXG4gICAgICAgICAgICAke2VsZW1lbnRBdHRyaWJ1dGVzU3RyaW5nfVxuICAgICAgICAgICAgPjwvaWZyYW1lPmA7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgIyR7ZG9tSWR9YCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50L2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgLy9UT0RPIDogY2FuIGJlIGRvbmUgd2l0aG91dCBjbG9uaW5nP1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2VfLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBuZXcgQ3VzdG9tRXZlbnQ8QmFzZU15b3BNZXNzYWdlPihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXyxcbiAgICAgICAgICAgIC8vIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1zZylcblxuICAgICAgICAvL3NlbmRpbmcgZGF0YSBmcm9tIGhvc3QgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkaXNwYXRjaEV2ZW50JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NCwgd2FpdH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3Qgc2VlbjogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuZXhwb3J0IGNsYXNzIFdlYmNvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5XZWJDb21wb25lbnRMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoIXNlZW5bbG9hZGVyQ29uZmlnLnVybF0pIHtcbiAgICAgICAgICAgIC8vIGF3YWl0IGltcG9ydCggLyogQHZpdGUtaWdub3JlICovIHdlYkNvbXBvbmVudExvYWRVcmwpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ21vZHVsZSBsb2FkZWQnKTtcbiAgICAgICAgICAgIHNlZW5bbG9hZGVyQ29uZmlnLnVybF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViQ29tcG9uZW50TG9hZFVybCA9IGxvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB3ZWJDb21wb25lbnRMb2FkVXJsO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kdWxlIGFscmVkYXkgbG9hZGVkIG9yIGluIGxvYWRpbmcgcHJvY2VzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2Vlbltsb2FkZXJDb25maWcudXJsXTtcblxuICAgICAgICAvL1RPRE8gOiBhZGQgcmV0cnkgbWVjaGFuaXNtIGluIGZhaWwgY2FzZS5cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLCBzaG91bGQgZml4IHRoZSByYWNlIGNvbmRpdGlvbiBmb3IgbG9hZGVkIG1vZHVsZXNcbiAgICAgICAgYXdhaXQgd2FpdCgxKTtcblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2FkZXJDb25maWcudGFnKTtcblxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmKG9wdGlvbnM/Ll9lbnZpcm9ubWVudCl7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbGVtZW50Ll9teW9wRW52aXJvbm1lbnQgPSBvcHRpb25zPy5fZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7bG9hZGVyQ29uZmlnLnRhZ30gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAnMC4yLjEnOyIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElIVE1MTG9hZGVyQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLCBTaGFkb3dSb290TW9kZVR5cGUsXG4gICAgU2tpbkxvYWRlcnNcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuLy9pbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSBcIi4uLy4uL1NESy50c1wiO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZyk7XG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGxldCBlbGVtZW50O1xuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCduZWVkcyB0byBjcmVhdGUgbmV3IElmcmFtZS4uLicsIGRvbUlkLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIGBcbiAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAke29wdGlvbnM/LmhpZGRlbiA/ICdhYnNvbHV0ZScgOiAnc3RhdGljJ307XG4gICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgICAgYCk7XG4gICAgICAgICAgICAvLyAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcblxuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKElmcmFtZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICBkb2Mub3BlbigpO1xuXG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gY29uc3QgeCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGlmKHgpe1xuICAgICAgICAgICAgLy8gICAgIHgucmVtb3ZlKCk7XG4gICAgICAgICAgICAvLyAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fID0gIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8L3NjcmlwdD5gKTtcblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lVc2VyRmxvd30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG4vKipcbiAqXG4gKiAjIyBPdmVydmlld1xuICpcbiAqIFRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBjbGFzcyBzZXJ2ZXMgYXMgYSBjZW50cmFsaXplZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgcmV0cmlldmluZyB1c2VyIGZsb3dzIGFuZCBjb21wb25lbnRzIGZyb20gdGhlIE15b3AuZGV2IGNsb3VkIHNlcnZpY2UuIEl0IGltcGxlbWVudHMgYSBzaW5nbGV0b24gcGF0dGVybiBhbmQgcHJvdmlkZXMgY2FjaGluZyBtZWNoYW5pc21zIHRvIG9wdGltaXplIEFQSSBjYWxscyBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqXG4gKiAjIyBDbGFzcyBTdHJ1Y3R1cmVcbiAqXG4gKiAjIyMgQ29uc3RydWN0b3JcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKVxuICogYGBgXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBfYmFzZVVybGAgKG9wdGlvbmFsKTogVGhlIGJhc2UgVVJMIGZvciB0aGUgTXlvcC5kZXYgY2xvdWQgQVBJLiBEZWZhdWx0cyB0byBgJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnYFxuICpcbiAqICMjIyBTdGF0aWMgUHJvcGVydGllc1xuICpcbiAqICMjIyMgTWFpblxuICogYGBgdHlwZXNjcmlwdFxuICogc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gKiBgYGBcbiAqXG4gKiBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgYENsb3VkUmVwb3NpdG9yeWAgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IGNyZWF0aW5nIG11bHRpcGxlIGluc3RhbmNlcy5cbiAqXG4gKiAjIyMgUHJpdmF0ZSBQcm9wZXJ0aWVzXG4gKlxuICogIyMjIyB1c2VyRmxvd3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG4gKiBgYGBcbiAqXG4gKiBBIGNhY2hlIG9iamVjdCB0aGF0IHN0b3JlcyBwcm9taXNlcyBmb3IgdXNlciBmbG93cywgaW5kZXhlZCBieSBmbG93IElELiBUaGlzIHByZXZlbnRzIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgYW5kIGVuc3VyZXMgY29uc2lzdGVudCBkYXRhIHJldHJpZXZhbC5cbiAqXG4gKiAjIyMjIF9iYXNlVXJsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBwcml2YXRlIF9iYXNlVXJsOiBzdHJpbmdcbiAqIGBgYFxuICpcbiAqIFRoZSBiYXNlIFVSTCBmb3IgdGhlIGNsb3VkIEFQSSBlbmRwb2ludHMsIHNldCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICpcbiAqICMjIE1ldGhvZHNcbiAqXG4gKiAjIyMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKVxuICpcbiAqIFJldHJpZXZlcyBhIGNvbXBsZXRlIHVzZXIgZmxvdyBmcm9tIHRoZSBjbG91ZCByZXBvc2l0b3J5LCBpbmNsdWRpbmcgYWxsIHJlc29sdmVkIGNvbXBvbmVudHMuXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBmbG93SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGZsb3cgdG8gcmV0cmlldmVcbiAqXG4gKiAqKlJldHVybnM6KipcbiAqIC0gYFByb21pc2U8SVVzZXJGbG93PmA6IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21wbGV0ZSB1c2VyIGZsb3cgb2JqZWN0XG4gKlxuICogKipCZWhhdmlvcjoqKlxuICogLSBJbXBsZW1lbnRzIHJlcXVlc3QgY2FjaGluZyB0byBhdm9pZCBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IElEXG4gKiAtIE1ha2VzIGEgR0VUIHJlcXVlc3QgdG8gYC9mbG93P2lkPXtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAqIC0gQXV0b21hdGljYWxseSByZXNvbHZlcyBjb21wb25lbnQgcmVmZXJlbmNlcyB3aXRoaW4gdGhlIGZsb3dcbiAqIC0gU3RvcmVzIHRoZSBwcm9taXNlIGluIHRoZSBjYWNoZSBmb3IgZnV0dXJlIHVzZVxuICpcbiAqICoqRXhhbXBsZSBVc2FnZToqKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdygnbXktZmxvdy1pZCcpO1xuICogY29uc29sZS5sb2coZmxvdy5jb21wb25lbnRzKTtcbiAqIGBgYFxuICpcbiAqICMjIyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ6IHN0cmluZylcbiAqXG4gKiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyBjb21wb25lbnQgZnJvbSB3aXRoaW4gYSB1c2VyIGZsb3cuXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBjb21wb25lbnRJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudCB0byByZXRyaWV2ZVxuICogLSBgZmxvd0lkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBmbG93IGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudFxuICpcbiAqICoqUmV0dXJuczoqKlxuICogLSBgUHJvbWlzZTxDb21wb25lbnQgfCB1bmRlZmluZWQ+YDogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBvbmVudCBvYmplY3QgaWYgZm91bmQsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAqXG4gKiAqKkJlaGF2aW9yOioqXG4gKiAtIEZpcnN0IGZldGNoZXMgdGhlIGNvbXBsZXRlIGZsb3cgdXNpbmcgYGZldGNoRmxvdygpYFxuICogLSBTZWFyY2hlcyB0aHJvdWdoIHRoZSBmbG93J3MgY29tcG9uZW50cyBhcnJheSB0byBmaW5kIHRoZSBtYXRjaGluZyBjb21wb25lbnRcbiAqIC0gVXNlcyB0aGUgY29tcG9uZW50J3MgYHR5cGUuaWRgIHByb3BlcnR5IGZvciBtYXRjaGluZ1xuICpcbiAqICoqRXhhbXBsZSBVc2FnZToqKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcG9uZW50ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoJ2J1dHRvbi1jb21wb25lbnQnLCAnbXktZmxvdy1pZCcpO1xuICogaWYgKGNvbXBvbmVudCkge1xuICogICAgIGNvbnNvbGUubG9nKCdDb21wb25lbnQgZm91bmQ6JywgY29tcG9uZW50KTtcbiAqIH0gZWxzZSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0NvbXBvbmVudCBub3QgZm91bmQgaW4gZmxvdycpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMgQVBJIEludGVncmF0aW9uXG4gKlxuICogIyMjIEVuZHBvaW50IFN0cnVjdHVyZVxuICpcbiAqIFRoZSBjbGFzcyBpbnRlZ3JhdGVzIHdpdGggdGhlIGZvbGxvd2luZyBNeW9wLmRldiBjbG91ZCBBUEkgZW5kcG9pbnQ6XG4gKlxuICogYGBgXG4gKiBHRVQge2Jhc2VVcmx9L2Zsb3c/aWQ9e2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzXG4gKiBgYGBcbiAqXG4gKiAqKlF1ZXJ5IFBhcmFtZXRlcnM6KipcbiAqIC0gYGlkYDogVGhlIGZsb3cgaWRlbnRpZmllclxuICogLSBgcmVzb2x2ZT1jb21wb25lbnRzYDogSW5zdHJ1Y3RzIHRoZSBBUEkgdG8gaW5jbHVkZSByZXNvbHZlZCBjb21wb25lbnQgZGF0YSBpbiB0aGUgcmVzcG9uc2VcbiAqXG4gKiAjIyMgUmVzcG9uc2UgRm9ybWF0XG4gKlxuICogVGhlIEFQSSBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBKU09OIHJlc3BvbnNlIHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKlxuICogYGBganNvblxuICoge1xuICogICAgIFwiaXRlbVwiOiB7XG4gKiAgICAgICAgIC8vIElVc2VyRmxvdyBvYmplY3Qgd2l0aCByZXNvbHZlZCBjb21wb25lbnRzXG4gKiAgICAgICAgIFwiY29tcG9uZW50c1wiOiBbXG4gKiAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiBcImNvbXBvbmVudC1pZFwiXG4gKiAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgIC8vIC4uLiBvdGhlciBjb21wb25lbnQgcHJvcGVydGllc1xuICogICAgICAgICAgICAgfVxuICogICAgICAgICBdXG4gKiAgICAgICAgIC8vIC4uLiBvdGhlciBmbG93IHByb3BlcnRpZXNcbiAqICAgICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBDYWNoaW5nIFN0cmF0ZWd5XG4gKlxuICogVGhlIGBDbG91ZFJlcG9zaXRvcnlgIGltcGxlbWVudHMgYSBwcm9taXNlLWJhc2VkIGNhY2hpbmcgbWVjaGFuaXNtOlxuICpcbiAqIDEuICoqQ2FjaGUgS2V5Kio6IEZsb3cgSUQgaXMgdXNlZCBhcyB0aGUgY2FjaGUga2V5XG4gKiAyLiAqKkNhY2hlIFZhbHVlKio6IFByb21pc2VzIGFyZSBjYWNoZWQgcmF0aGVyIHRoYW4gcmVzb2x2ZWQgdmFsdWVzIHRvIGhhbmRsZSBjb25jdXJyZW50IHJlcXVlc3RzXG4gKiAzLiAqKkNhY2hlIER1cmF0aW9uKio6IENhY2hlIHBlcnNpc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIDQuICoqQ2FjaGUgSW52YWxpZGF0aW9uKio6IE5vIGF1dG9tYXRpYyBjYWNoZSBpbnZhbGlkYXRpb24gaXMgaW1wbGVtZW50ZWRcbiAqXG4gKiAjIyBFcnJvciBIYW5kbGluZ1xuICpcbiAqIC0gTmV0d29yayBlcnJvcnMgYW5kIEFQSSBmYWlsdXJlcyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdoIHByb21pc2UgcmVqZWN0aW9uXG4gKiAtIE5vIHNwZWNpZmljIGVycm9yIGhhbmRsaW5nIG9yIHJldHJ5IGxvZ2ljIGlzIGltcGxlbWVudGVkIGF0IHRoZSByZXBvc2l0b3J5IGxldmVsXG4gKiAtIENvbnN1bWVycyBzaG91bGQgaW1wbGVtZW50IGFwcHJvcHJpYXRlIGVycm9yIGhhbmRsaW5nIHdoZW4gY2FsbGluZyByZXBvc2l0b3J5IG1ldGhvZHNcbiAqXG4gKiAjIyBVc2FnZSBQYXR0ZXJuc1xuICpcbiAqICMjIyBTaW5nbGV0b24gQWNjZXNzXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tICcuL3BhdGgvdG8vQ2xvdWRSZXBvc2l0b3J5JztcbiAqXG4gKiAvLyBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdygnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMjIEN1c3RvbSBJbnN0YW5jZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgY3VzdG9tIGluc3RhbmNlIHdpdGggZGlmZmVyZW50IGJhc2UgVVJMXG4gKiBjb25zdCBjdXN0b21SZXBvID0gbmV3IENsb3VkUmVwb3NpdG9yeSgnaHR0cHM6Ly9jdXN0b20tYXBpLmV4YW1wbGUuY29tJyk7XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgY3VzdG9tUmVwby5mZXRjaEZsb3coJ2Zsb3ctaWQnKTtcbiAqIGBgYFxuICpcbiAqICMjIyBDb21wb25lbnQgUmV0cmlldmFsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgYSBzcGVjaWZpYyBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAqIGNvbnN0IGNvbXBvbmVudCA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KCdjb21wb25lbnQtaWQnLCAnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMgRGVwZW5kZW5jaWVzXG4gKlxuICogLSAqKklVc2VyRmxvdyoqOiBJbnRlcmZhY2UgaW1wb3J0ZWQgZnJvbSBgLi4vY29tbW9uYCB0aGF0IGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB1c2VyIGZsb3cgb2JqZWN0c1xuICogLSAqKkZldGNoIEFQSSoqOiBVc2VzIHRoZSBuYXRpdmUgYGZldGNoYCBmdW5jdGlvbiBmb3IgSFRUUCByZXF1ZXN0c1xuICpcbiAqICMjIFBlcmZvcm1hbmNlIENvbnNpZGVyYXRpb25zXG4gKlxuICogLSAqKkNhY2hpbmcqKjogUHJldmVudHMgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBJRFxuICogLSAqKlByb21pc2UgQ2FjaGluZyoqOiBIYW5kbGVzIGNvbmN1cnJlbnQgcmVxdWVzdHMgZWZmaWNpZW50bHkgYnkgY2FjaGluZyBwcm9taXNlc1xuICogLSAqKkNvbXBvbmVudCBSZXNvbHV0aW9uKio6IFRoZSBgcmVzb2x2ZT1jb21wb25lbnRzYCBwYXJhbWV0ZXIgZW5zdXJlcyBjb21wb25lbnRzIGFyZSBmdWxseSByZXNvbHZlZCBpbiBhIHNpbmdsZSBBUEkgY2FsbFxuICpcbiAqICMjIEZ1dHVyZSBFbmhhbmNlbWVudHNcbiAqXG4gKiBUaGUgY2xhc3Mgc3RydWN0dXJlIHN1Z2dlc3RzIHBsYW5uZWQgZnVuY3Rpb25hbGl0eSB0aGF0IGNvdWxkIGJlIGltcGxlbWVudGVkOlxuICpcbiAqIC0gKipDb21wb25lbnQgQ2FjaGluZyoqOiBUaGUgY29tbWVudGVkIGBjb21wb25lbnRzYCBwcm9wZXJ0eSBpbmRpY2F0ZXMgcG90ZW50aWFsIGluZGl2aWR1YWwgY29tcG9uZW50IGNhY2hpbmdcbiAqIC0gKipDYWNoZSBJbnZhbGlkYXRpb24qKjogTWV0aG9kcyB0byBjbGVhciBvciByZWZyZXNoIGNhY2hlZCBkYXRhXG4gKiAtICoqRXJyb3IgUmV0cnkgTG9naWMqKjogQXV0b21hdGljIHJldHJ5IG1lY2hhbmlzbXMgZm9yIGZhaWxlZCByZXF1ZXN0c1xuICogLSAqKkJhdGNoIE9wZXJhdGlvbnMqKjogTWV0aG9kcyB0byBmZXRjaCBtdWx0aXBsZSBmbG93cyBvciBjb21wb25lbnRzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHN0YXRpYyBNYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIC8vIHByaXZhdGUgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtjb21wb25lbnRJZH0mYXV0bz10cnVlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxufVxuIiwgImltcG9ydCB7aG9zdFNES30gZnJvbSAnLi4vaG9zdCc7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIHYyX0Nsb3VkUmVwb3NpdG9yeSB7XG4gICAgc3RhdGljIE1haW4gPSBuZXcgdjJfQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHYyX0lWYXJpYW50Q29uZmlnPj4gPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZpcm9ubWVudElkZW50aWZpZXJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxufVxuXG5leHBvcnQgY29uc3QgZW5hYmxlVjIgPSAoZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmcsIGNsb3VkUmVwb3NpdG9yeT86IHYyX0Nsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGNvbnN0IF9jbG91ZFJlcG9zaXRvcnkgPSBjbG91ZFJlcG9zaXRvcnkgPyBjbG91ZFJlcG9zaXRvcnkgOiBuZXcgdjJfQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsb2FkQ29tcG9uZW50OiBhc3luYyAoY29tcG9uZW50SWQ6IHN0cmluZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IF9jbG91ZFJlcG9zaXRvcnkuZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQsIGVudmlyb25tZW50SWRlbnRpZmllcilcblxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5jb25zdW1lX3ZhcmlhbnQgfHwgIWNvbmZpZy5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBgW015b3AgV2FybmluZ10gQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZpcm9ubWVudElkZW50aWZpZXJ9XCIuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgICAgICAgICBza2luU2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ291dF9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBza2luczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICAgICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWVcbiAgICAgICAgICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcblxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtJTXlvcExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFbnZlbG9wZWRNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSwgTWVzc2FnZURpcmVjdGlvbiwgUmVmXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wSWZyYW1lTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL2lmcmFtZUxvYWRlclwiO1xuaW1wb3J0IHtXZWJjb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY29taW5nTWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2luY29taW5nTWVzc2FnZUhhbmRsZXIgR09UICcsIGV2ZW50KVxuICAgICAgICAvL1RPRE8gOiAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gXCJodHRwOi8vZXhhbXBsZS5vcmc6ODA4MFwiKSByZXR1cm47XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSSBLbm93IHRoYXQgISEhJyk7XG4gICAgICAgICAgICAvLyAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdFNESyBhbHJlYWR5IGluaXRpYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21Mb2FkZXIgPSBuZXcgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcih0aGlzLmNvbXBvbmVudHNMb2FkZXJzKTtcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycy5mb3JFYWNoKGxvYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY29tbWluZyBtZXNzYWdlcyBmcm9tIElGcmFtZXNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdteW9wIGhvc3RTREsgaW5pdGlhdGVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG5cbiAgICAgICAgY29tcG9uZW50LmJpbmQoJ29uRGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NvbXBvbmVudCBkaXNwb3NlJywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbn1cblxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9O1xufVxuXG5pZiAoIXdpbmRvdy5teW9wLmhvc3RTREspIHtcbiAgICBjb25zdCBfaG9zdFNESyA9IG5ldyBIb3N0U0RLKCk7XG4gICAgLy9UT0RPOiBlbmFibGUgbGF6eSBpbml0P1xuICAgIF9ob3N0U0RLLmluaXQoKTtcblxuICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5teW9wLmhvc3RTREsgPSBfaG9zdFNESztcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IGhvc3RTREs6IEhvc3RTREsgPSB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdob3N0U0RLJywgaG9zdFNESyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgbXlvcDoge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX186IHN0cmluZyxcbiAgICAgICAgICAgIGhvc3RTREs6IEhvc3RTREssXG4gICAgICAgICAgICBJZnJhbWVTREs6IEluc3RhbmNlVHlwZTx0eXBlb2YgSWZyYW1lU0RLPlxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZVwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZj8ucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuXG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZXZlbnQub3B0aW9ucy5pZCkhO1xuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8vLz4+Pj5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKGBmYWlsZWQgdG8gZmluZCAke2V2ZW50Lm9wdGlvbnMuaWR9IGluIG1lbSBzY29wZWAsIGhvc3RTREspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdGhlIHJlZiBjb21wb25lbnQgaW4gb3VyIEhvc3RTREsgKHNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vICByZWZDb21wb25lbnQucGFyZW50ID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIHJlZiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGhvc3RTREsuY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBob3N0U0RLLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCByZW1vdmVkIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgdXNpbmcgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm8gbmVlZCB0aGlzLCBwYXNzIG9wdGlvbnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvL2ltcGxlbWVudGF0aW9uQ29tcG9uZW50LmlkID0gZXZlbnQucHJlZGVmaW5lZElkO1xuICAgICAgICAgICAgICAgIC8vcmVmQ29tcG9uZW50LmlkICs9ICcuJztcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vdCByZWFsbHkgbmVlZGVkID9cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKClcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCTyxJQUFNLGlCQUFOLE1BQTRDO0FBQUEsRUFDL0MsWUFBbUIsUUFDQSxhQUNBLGNBQ0EsV0FDQSxZQUFxQjtBQUpyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSW5CLHdCQUFnQixRQUFlO0FBQUEsRUFGL0I7QUFHSjs7O0FDekJPLElBQU0scUJBQXFCLENBQU8sU0FBa0M7QUFDdkUsTUFBSSxPQUFPLFNBQVMsWUFBWTtBQUU1QixTQUFLO0FBQUEsRUFDVCxXQUFXLGdCQUFnQixTQUFTO0FBRWhDLFVBQU0sU0FBUyxNQUFNO0FBRXJCLFFBQUksT0FBTyxXQUFXLFlBQVk7QUFFOUIsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBRUo7QUFZTyxJQUFlLHFCQUFmLE1BQWlHO0FBQUE7QUFBQSxFQUlwRyxZQUFtQixlQUFxRjtBQUFyRjtBQUFBLEVBRW5CO0FBSUo7QUFFTyxJQUFlLDRCQUFmLGNBQTJGLG1CQUFzQjtBQUFBLEVBQ3BILFlBQW1CLGVBQTRGLFNBQWE7QUFDeEgsVUFBTSxhQUFhO0FBREo7QUFBNEY7QUFB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LFFBQVEsb0JBQW1CLHFDQUFVO0FBQ3RDLGdCQUFRLGtCQUFrQixTQUFTO0FBRXZDLGFBQU8sS0FBSyxRQUFRLEtBQUssT0FBTztBQUFBLElBQ3BDO0FBRUEsNkNBQXNEO0FBQUEsTUFDbEQsSUFBSSxrQkFBa0IsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQ3pELElBQUksb0JBQW9CLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUMzRCxJQUFJLG1CQUFtQixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDMUQsSUFBSSw2QkFBNkIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQ3BFLElBQUksb0JBQW9CLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUMzRCxJQUFJLHdCQUF3QixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDL0QsSUFBSSxxQkFBcUIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQzVELElBQUksdUJBQXVCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQTtBQUFBLE1BRTlELElBQUksaUNBQWlDLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxJQUM1RTtBQUVBLHdCQUFPLFFBQU8sTUFBTTtBQUFBLElBR3BCO0FBQUE7QUFDSjtBQUVBLG9CQUFvQixtQkFBbUIsZUFBZTsiLAogICJuYW1lcyI6IFsiUmVwbGF5TWVzc2FnZUtleSIsICJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgInNlZW4iLCAidGFyZ2V0IiwgIm1ha2VTZXJpYWxpemFibGUiLCAiaGVpZ2h0IiwgIndpZHRoIiwgInNlZW4iLCAic2RrIiwgImRvbUlkIiwgInNkayIsICJzZWVuIiwgInNraW4iLCAiY29tcG9uZW50IiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiaG9zdFNESyIsICJlbGVtZW50Il0KfQo=
|
|
2646
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnQudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9JTXlvcENvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2dNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAidmVyc2lvbjpteW9wLXNkay12ZXJzaW9uIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvZW5hYmxlVjIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgaW50ZXJmYWNlIElFbGVtZW50UmVmIHtcbiAgICBteW9wSWQ/OiBzdHJpbmdcbiAgICBodG1sVGFnTmFtZTogc3RyaW5nXG4gICAgQm91bmRpbmdSZWN0PzogRE9NUmVjdFxuICAgIG9mZnNldFRvcD86IG51bWJlclxuICAgIG9mZnNldExlZnQ/OiBudW1iZXJcblxuICAgIHR5cGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgWFBhdGhFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB4UGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ1hQYXRoRWxlbWVudFJlZidcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBteW9wSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ015b3BFbGVtZW50UmVmJ1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXJ9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5cbmV4cG9ydCB0eXBlIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwID0gQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPiB8IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgY29uc3QgcnVuRXhlY3V0b3JDbGVhbnVwID0gYXN5bmMgKHRhc2s6IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICB0YXNrKCk7XG4gICAgfSBlbHNlIGlmICh0YXNrIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBJdCdzIGEgUHJvbWlzZSwgYXdhaXQgaXRcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFzaztcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgICAgICByZXN1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0YXNrIGlzIHZvaWQsIGRvIG5vdGhpbmdcbn1cblxudHlwZSBJTWVzc2FnZUV4ZWN1dG9yPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+ID0gKG1lc3NhZ2U6IFQpID0+IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwO1xuXG5pbnRlcmZhY2UgSU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcblxuICAgIGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gaW1wbGVtZW50cyBJTWVzc2FnZUhhbmRsZXI8VD4ge1xuXG4gICAgLy9UT0RPIDogYWRkIGRpc3Bvc2UgbWV0aG9kXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQpIHtcblxuICAgIH1cblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuICAgIGFic3RyYWN0IGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55LCBFID0gYW55PiBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkLCBwdWJsaWMgY29udGV4dD86IEUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxufVxuIiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9CYXNlTWVzc2FnZSc7XG5cbi8vdXNlcidzIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0JpbmRDbGlja01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VUZXh0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3VzdG9tUmVmTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRJbm5lckh0bWwnO1xuXG4vL3N5c3RlbSBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9Jbml0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FbnZlbG9wZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICAnLi9HZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DbGVhbnVwTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0Rpc3Bvc2VNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzsiLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBydW5FeGVjdXRvckNsZWFudXB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vYmFzZU1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSwgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLCBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBFbnZlbG9wZWRNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb21wb25lbnQ8VCA9IGFueT4ge1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgfVxuXG4gICAgLy9vbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogSU15b3BNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBjb250ZXh0PzogVCkge1xuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wU0RLIHtcbiAgICBpbml0OiAoKSA9PiB2b2lkO1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzOiAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+O1xufVxuXG4vLyBjb25zdCBsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMgPSBbXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0LFxuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UsXG4vLyAgICAgLy9NeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSxcbi8vIF1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wU0RLIGltcGxlbWVudHMgSU15b3BTREsge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBtZXNzYWdlVG9IYW5kbGVBZnRlckluaXQ6IEJhc2VNeW9wTWVzc2FnZVtdID0gW107XG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+ID0ge307XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG1lc3NhZ2VDbGVhbnVwQ2FjaGU6IFJlY29yZDxzdHJpbmcsIENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4+IHwgUHJvbWlzZTx2b2lkPiA9IHt9O1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBldmVudC5kYXRhID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRldGFpbDtcblxuICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIG5vdCBteW9wIG1hcmtlZCBldmVudCBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gYmFzZVNESywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIChsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgICAvL1RPRE8gOiBmaXggZGlyZWN0aW9uID8gbWVzc2FnZSB3aWxsIG5vdCBwcm9jY2VzcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRGlzcG9zZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2hvdWxkIG5vdCBiZSBvcHRpb25hbCwgZml4IGFuZCByZW1vdmUgJ2lmJ1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb25dXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBnb3Qgb3VyIGlkIGZyb20gb3VyIGhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBTREsgbWF5IHNlcnZlIG1vcmUgdGhhbiAxIGNvbXBvbmVudCAuLiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInJlY2hpdmVkIGluaXQgbWVzc2FnZSBmb3IgYW4gZXhzaXNpbmcgY29tcG9uZW50LlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSA9IG5ldyBIb3N0ZWRDb21wb25lbnQobmV3Q29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVzcG9uc2UobmV3Q29tcG9uZW50SWQpKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBzYW1lIEhvc3RTREsgY2FzZXNcbiAgICAgICAgICAgIC8vIHdoZW4gYm90aCBSZWZDb21wb25lbnQgYW5kIHJlYWxDb21wb25lbnQgaG9zdGVkIGluIHRoZSBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSBlbnZlbG9wZWRNZXNzYWdlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlubmVyTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgfHwgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb24hXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGlubmVyTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBlbnZlbG9wZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZihtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdHlwZWRNZXNzYWdlIDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcbiAgICAgICAgICAgIC8vIC8vICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ2xlYW51cE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbWVzc2FnZSBhcyBDbGVhbnVwTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cE1lc3NhZ2UgPSBuZXcgQ2xlYW51cFJlcGxheU1lc3NhZ2UoISFjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cE1lc3NhZ2UuZGVzdGluYXRpb24gPSBtZXNzYWdlLmRlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0b3JDbGVhbnVwKGNsZWFudXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kZWwgZXJyb3I/XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uSGFuZGxlckZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VUeXBlID09PSBtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IGhhbmRsZXIuZXhlY3V0b3IobWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSAmJiBjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW21lc3NhZ2UuaWRdID0gY2xlYW51cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFudXAgJiYgIW1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBub24tY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsZWFudXAgJiYgbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIGEgY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghYWN0aW9uSGFuZGxlckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHByaW50IHdpdGggZGVidWcgY29uZmlnIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gbWVzc2FnZSBoYW5kbGVyIHdhcyBmb3VuZCBmb3IgJywgbWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5pdDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xufVxuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8vXG4gICAgLy8gdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgLy8gdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIHZhcmlhbnRzX2lkczogc3RyaW5nW10sXG4gICAgRFRPczogdjJfSURUT1tdLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BXZWJjb21wb25lbnRDb25zdHMgPSB7XG4gICAgd2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5OiAnbXlvcF93ZWJjb21wb25lbnRfbWVzc2FnZSdcbn1cbiIsICJpbXBvcnQge0Jhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXIsIEhvc3RlZENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQsIFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4+IHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VUb0hvc3Q6IGFueSwgcHVibGljIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5uZXJFeGVjdXRvcjogKGV2ZW50OiBULCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB2b2lkO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgaWYgKGV2ZW50LmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGV2ZW50LmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcGF0Y2ggdGhlIHNvdXJjZSBpZCwgdGhpbmsgYWJvdXQgdGhhdCA/XG4gICAgICAgICAgICAgICAgY29uc3QgX21lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuZGVzdGluYXRpb24gPyBldmVudC5kZXN0aW5hdGlvbiA6IGV2ZW50LnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBldmVudC5zb3VyY2UgPyBldmVudC5zb3VyY2UgOiBldmVudC5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICB9IGFzIEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeGVjdXRvcihldmVudCwgdGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0LCBfbWVzc2FnZVRvSG9zdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi9ob3N0U0RLXCI7XG5cbnR5cGUgY29tcG9uZW50RGVmaW5pdGlvblByb3BzID0gSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbJ3Byb3BzJ11cblxuY29uc3QgY3JlYXRlRGVidWdUaXRsZSA9ICh0ZXh0OiBzdHJpbmcsIHRvcDogbnVtYmVyLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgdGl0bGVFbC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgdGl0bGVFbC5zdHlsZS5wYWRkaW5nID0gJzAgNXB4JztcbiAgICB0aXRsZUVsLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xuICAgIHRpdGxlRWwuc3R5bGVbJ3RvcCddID0gJzAnO1xuICAgIHRpdGxlRWwuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAvL3RpdGxlRWwuc3R5bGUubGVmdCA9ICc1MCUnO1xuICAgIHRpdGxlRWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIHRpdGxlRWwudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgdGl0bGVFbC5ocmVmID0gYGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkfWBcblxuICAgIHJldHVybiB0aXRsZUVsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldERlYnVnU3R5bGUgPSAoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcbik6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAvLyMwMDdCRkYgKGJsdWUpIG9yICNGRjU3MjIgKG9yYW5nZSlcbiAgICAvLyM0Q0FGNTAgKGdyZWVuKSBvciAjRkZDMTA3IChhbWJlcilcbiAgICAvLyBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtpZH0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLm5hbWV9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZSh0b3BUZXh0LCBjb21wb25lbnRFbGVtZW50KTtcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgIzAwN0JGRic7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJ3Vuc2V0JztcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRvcFRleHQpO1xuICAgIH1cbn1cblxuY29uc3QgcmVwb3J0RXJyb3IgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgaWYgKCFwcm9wQ29uZmlnKSB7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvcjogVW5kZWZpbmVkIFByb3BcXG5cXG5gICtcbiAgICAgICAgICAgIGBJdCBsb29rcyBsaWtlIHlvdSd2ZSB0cmllZCB0byB1c2UgYSBwcm9wIHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZC5cXG5gICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIHByb3AgbmFtZSBmb3IgYW55IHR5cG9zIG9yIGVuc3VyZSB0aGF0IGl0IGlzIHByb3Blcmx5IGRlZmluZWQgaW4gdGhlIGNvbXBvbmVudCdzIHByb3AgbGlzdC5cXG5cXG5gICtcbiAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IHJlcG9ydFVuc3VwcG9ydGVkID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvcjogQ29kZSBQcm9wIE5vdCBTdXBwb3J0ZWRcXG5cXG5gICtcbiAgICAgICAgYEN1cnJlbnRseSwgY29kZSBwcm9wcyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gbG9jYWwgZnJhbWUgY29tcG9uZW50cy5cXG5gICtcbiAgICAgICAgYFx1MjZBMFx1RkUwRiBUaGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcyBmZWF0dXJlIFx1MjAxNCBjb2RlIHByb3BzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHVwY29taW5nIHZlcnNpb25zLlxcblxcbmAgK1xuICAgICAgICBgSW4gdGhlIG1lYW50aW1lLCB5b3UgY2FuIHVzZSBtZXNzYWdlIHByb3BzLlxcblxcbmAgK1xuICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UHJvcHMgPSA8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgcHJvcHNDb25maWc6IElQcm9wQ29uZmlnW10sIHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcblxuICAgIGNvbnN0IHByb3BzTWFwID0gcHJvcHNDb25maWcucmVkdWNlKChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICBbY3VycmVudFZhbHVlLm5hbWVdOiB7Li4uY3VycmVudFZhbHVlfVxuICAgICAgICB9XG4gICAgfSwge30pO1xuXG4gICAgY29uc3QgcHJvcHNIYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxvY2FsIGZyYW1lIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdvdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxvY2FsIGZyYW1lIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgcmVmIGNvbXBvbmVudHMgZGVmaW5lIGluIHRoZSBjb21wb25lbnQgY29uZmlnXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJvb3QgY29tcG9uZW50IHRoZSBiZSBpbml0aWF0ZWQgYmVmb3JlIGludGVyYWN0aW5nIHdpdGggaXRcbiAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG5cbiAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy9yZWplY3QoJ3RpbWVvdXQ/Jyk7XG4gICAgICAgICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgfSwgNTAwMCk7XG5cbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UocmVmLnJlZkNvbmZpZyxcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zID8gb3B0aW9ucyA6IHt9LFxuICAgICAgICAgICAgICAgIGlkOiByZWZDb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgX2hhc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIChtZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aW1lb3V0IGFscmVhZHkgcGFzc2VkXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PSByZWZDb21wb25lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy9zYW1lIG1lbW9yeSBlbnYsIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAhPT0gcmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBoZXJlID5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB3aGF0IGFib3V0IHJlYXB0ZXJzID8hIGR5bmFtaWMgPyFcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBleHNpc3RpbmdSZWZDb21wb25lbnQgPSBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdIGFzIE15b3BSZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGV4c2lzdGluZ1JlZkNvbXBvbmVudC5pZCAmJiBleHNpc3RpbmdSZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBbY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSwgcmVmQ29tcG9uZW50XTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXS5wdXNoKHJlZkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDsgLy9ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IHJlZkNvbXBvbmVudC5pZCkhO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGluIHdlYmNvbXBvbmVudCBjYXNlIHRoZSBzYW1lIGlkIHdpbGwgYWxyZWRheSBiZSBoZXJlLCB3aGljaCBpcyBnb29kICFcbiAgICAgICAgICAgICAgICAvLyBuYW1lOlxuICAgICAgICAgICAgICAgIC8vICAgICBpZFxuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnREZWZpbml0aW9uSWRcblxuICAgICAgICAgICAgICAgIC8vIGZvciBpbm5lciBjb21wb25lbnRzIGluc2lkZSByZWYgY29tcG9uZW50IDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlLm5lc3RlZFJlZnMuZm9yRWFjaChuZXN0ZWRSZWZDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cyEuZmluZChjID0+IGMudHlwZS5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM/LmZpbmQoZGVmID0+IGRlZi5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZWZDb25maWcgPSBjb21wb25lbnRDb25maWcudHlwZS5yZWZzLmZpbmQociA9PiByLm5hbWUgPT09IG5lc3RlZFJlZkNvbmZpZy5yZWZOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFyZWZDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignbm8gcmVmQ29uZmlnIGZvdW5kIGZvciBuZXN0ZWQgcmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KG5lc3RlZENvbXBvbmVudERlZmluaXRpb24sIHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudC5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnJlZnNbbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobmVzdGVkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMocmVmQ29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIGNvbXBvbmVudHMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6dXNlIGNvbmZpZyBjaGVjayBmb3IgYXV0by1oaWdodCBhbmQgY29udmVydCB0eXBlIHByb3Blcmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlZkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSZWZzID0gYXN5bmMgKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgd2l0aG91dFJlZkNvbXBvbmVudHM6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVmcylcbiAgICAgICAgY29tcG9uZW50LnJlZnMgPSB7fTtcblxuICAgIGNvbnN0IHdhaXRGb3IgPSBPYmplY3QudmFsdWVzKGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlZnMpLm1hcChyZWYgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZi5iZWhhdmlvci50eXBlID09IFJlZkJlaGF2aW9yVHlwZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPVxuXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRSZWZDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGFuZ2UgdG8gZ2V0IGl0IGZyb20gdGhlIGZsb3dcbiAgICAgICAgICAgICAgICBsZXQgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuY29tcG9uZW50SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuaW5zdGFuY2UuY29tcG9uZW50SWRcblxuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvL3Rocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucyEuZmluZChjb21wZGVmID0+IGNvbXBkZWYuaWQgPT09IHJlZkNvbXBvbmVudElkKSE7XG4gICAgICAgICAgICAgICAgLy8gLy9jb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXdhaXQgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyhjb21wb25lbnRJbnN0YW5jZUNvbmZpZy5jb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaWYgd2UgaGF2ZSB0aGUgc2FtZSBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2Ugd2Ugd2lsbCBuZWVkIGluc3RhbmNlIGlkIGhlcmUgLi4uXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz8uZmluZChuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LnR5cGUuaWQgPT09IHJlZkNvbXBvbmVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmVzdGVkQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgbmVzdGVkQ29tcG9uZW50Q29uZmlnIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2NvbnN0IGNvbXBvbmVudEluc3RhbmNlQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLm5lc3RlZENvbXBvbmVudHM/LmZpbmQoY29tcG9uZW50SW5zdGFjZSA9PiBjb21wb25lbnRJbnN0YWNlLmNvbXBvbmVudElkID09PSBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZighY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignVE9ETyBUT0RPIFRPRE8gJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOnRoaW5rIGFib3V0IHRoYXQgOlxuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5yZXNvbHZlZERlZmluaXRpb25zID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucztcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLmluc3RhbmNlISxcbiAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlOiBuZXN0ZWRDb21wb25lbnRDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBuYW1lOiBuZXN0ZWRDb21wb25lbnRDb25maWcubmFtZVxuICAgICAgICAgICAgICAgIC8vICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgX3JlZiA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25lc3RlZCAhISBjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudChfcmVmLCBuZXN0ZWRDb21wb25lbnRDb25maWchLCBjb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAvL1RET08gOiBwdXQgdGhhdCByZWYgY29tcG9uZW50IHNvbWV3aGVyZT9cblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbm9uUHJveGllZCA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gY3JlYXRlUmVmUHJveHkoX19ub25Qcm94aWVkLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCc/JylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IHR5cGUgcHJvcFR5cGVzPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+ID0ge1xuICAgIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTpcbiAgICBUW1Byb3BlcnR5XSBleHRlbmRzIHsgbW9kZTogJ2lucHV0JyB9ID9cbiAgICAgICAgVFtQcm9wZXJ0eV1bJ3R5cGUnXSA6XG4gICAgICAgIFByb21pc2U8VFtQcm9wZXJ0eV1bJ3R5cGUnXT5cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cblxuZXhwb3J0IGNvbnN0IGFjdEFzID0gPFQ+KHJlZjogUmVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uaWZ5UmVmPFQ+XG59XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uaWZ5UmVmPFQgPSBhbnk+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgLy8gSWYgaXQncyBhIGZ1bmN0aW9uXG4gICAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4gLy8gQ29udmVydCBpdCB0byBhIHByb21pc2VkIGZ1bmN0aW9uXG4gICAgICAgIDogVFtLXVxufTtcbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vIFRPRE8gOiB1c2UgYmV0dGVyIGNoZWNrIGZvciBpbnNwZWN0IG1vZGVcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2luc3BlY3QgY2FsbCBtb3JlIHRoYW4gb25jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcElmcmFtZUNvbXBvbmVudCcsIDEwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5JZnJhbWVFbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCEoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtzZW5kfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHNlbmQoe2hlaWdodCwgd2lkdGh9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgOlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIC8vY29uc3QgdW5pcVVybCA9IHVybDJsb2FkID09PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID8gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbVwiLCBkb21JZCkgOiB1cmwybG9hZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlICdzdHlsZScgYXR0ciBtZXJnZSBoZXJlXG4gICAgICAgICAgICBsZXQgZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmcgPSAnJztcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBlbGVtZW50QXR0cmlidXRlc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PVwiJHtTdHJpbmcodmFsdWUpfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyAnKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vdXRlckhUTUwgPSBgPGlmcmFtZSBcbiAgICAgICAgICAgICAgIGlkPVwiJHtkb21JZH1cIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJycgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9OyAgICBcbiAgICAgICAgICAgICAgICAgICB3aWR0aCA6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAke29wdGlvbnM/LmhpZGRlbiA/ICdhYnNvbHV0ZScgOiAnc3RhdGljJ307XG4gICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHNyYz1cIiR7dXJsMmxvYWR9XCJcbiAgICAgICAgICAgICR7ZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmd9XG4gICAgICAgICAgICA+PC9pZnJhbWU+YDtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjJHtkb21JZH1gKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnQvY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyICwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAvL1RPRE8gOiBjYW4gYmUgZG9uZSB3aXRob3V0IGNsb25pbmc/XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZV8uaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuXG4gICAgICAgIGNvbnN0IG1zZyA9IG5ldyBDdXN0b21FdmVudDxCYXNlTXlvcE1lc3NhZ2U+KG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VfLFxuICAgICAgICAgICAgLy8gYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgLy8gY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQobXNnKVxuXG4gICAgICAgIC8vc2VuZGluZyBkYXRhIGZyb20gaG9zdCB0byB0aGUgY29tcG9uZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuWzBdLmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGRpc3BhdGNoRXZlbnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0LCB3YWl0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBzZWVuOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IHt9O1xuXG5leHBvcnQgY2xhc3MgV2ViY29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLldlYkNvbXBvbmVudExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmICghc2Vlbltsb2FkZXJDb25maWcudXJsXSkge1xuICAgICAgICAgICAgLy8gYXdhaXQgaW1wb3J0KCAvKiBAdml0ZS1pZ25vcmUgKi8gd2ViQ29tcG9uZW50TG9hZFVybCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW9kdWxlIGxvYWRlZCcpO1xuICAgICAgICAgICAgc2Vlbltsb2FkZXJDb25maWcudXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJDb21wb25lbnRMb2FkVXJsID0gbG9hZGVyQ29uZmlnLnVybFxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHdlYkNvbXBvbmVudExvYWRVcmw7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2R1bGUgYWxyZWRheSBsb2FkZWQgb3IgaW4gbG9hZGluZyBwcm9jZXNzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZWVuW2xvYWRlckNvbmZpZy51cmxdO1xuXG4gICAgICAgIC8vVE9ETyA6IGFkZCByZXRyeSBtZWNoYW5pc20gaW4gZmFpbCBjYXNlLlxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2ssIHNob3VsZCBmaXggdGhlIHJhY2UgY29uZGl0aW9uIGZvciBsb2FkZWQgbW9kdWxlc1xuICAgICAgICBhd2FpdCB3YWl0KDEpO1xuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvYWRlckNvbmZpZy50YWcpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYob3B0aW9ucz8uX2Vudmlyb25tZW50KXtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsZW1lbnQuX215b3BFbnZpcm9ubWVudCA9IG9wdGlvbnM/Ll9lbnZpcm9ubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtsb2FkZXJDb25maWcudGFnfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICcwLjIuMyc7IiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVyc1xufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5sZXQgc2RrO1xuY29uc3QgZ2V0SW5pdGlhdGVkU2RrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2RrKSB7XG4gICAgICAgIC8vY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSBhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKVxuICAgICAgICBzZGsgPSBuZXcgV2ViQ29tcG9uZW50U0RLKCk7XG4gICAgICAgIHNkay5pbml0KCk7XG4gICAgfVxuICAgIHJldHVybiBzZGs7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbFN0cmluZzogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpOiBuZXcgKCkgPT4gSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBTaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJztcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuYXR0YWNoU2hhZG93KHttb2RlfSk7XG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2sodGhpcywgc2hhZG93KTtcbiAgICAgICAgICAgICAgICBzaGFkb3cuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudCA9IChjb21wb25lbnROYW1lOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKSA9PiB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbCwgU2hhZG93Um9vdE1vZGUpKTtcbiAgICBjb25zb2xlLmxvZyhgZGVmaW5lKCcke2NvbXBvbmVudE5hbWV9Jykgd2FzIGNhbGxlZCwgd2ViIGNvbXBvbmVudCByZWFkeSB0byB1c2VgKTtcbn1cblxuY29uc3QgdG9XZWJDb21wb25lbnROYW1lID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIHVwcGVyY2FzZSBsZXR0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8oXFxkKykvZywgJy0kMScpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIGRpZ2l0c1xuICAgICAgICAudG9Mb3dlckNhc2UoKTsgLy8gQ29udmVydCB0byBsb3dlcmNhc2Vcbn1cblxuY29uc3QgdG9DdXN0b21FbGVtZW50TmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBuYW1lID0gdG9XZWJDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZywgJy0nKTtcbn1cblxubGV0IHBhcnNlcjogRE9NUGFyc2VyOyAvLyA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IGNsYXNzIEhUTUxDb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSFRNTExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgbGV0IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ25lZWRzIHRvIGNyZWF0ZSBuZXcgSWZyYW1lLi4uJywgZG9tSWQsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcbiAgICAgICAgICAgIGxldCBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYFxuICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICR7b3B0aW9ucz8uaGlkZGVuID8gJ2Fic29sdXRlJyA6ICdzdGF0aWMnfTtcbiAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICAgIC8vICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJycgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9O1xuXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoSWZyYW1lRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgIGRvYy5vcGVuKCk7XG5cblxuICAgICAgICAgICAgbGV0IEhUTUwyUmVuZGVyID0gbG9hZGVyQ29uZmlnLkhUTUw7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faW5zcGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vaW5qZWN0IGluc3BlY3Rpb24gc2NyaXB0IGZvciBwcm9wcyBkZXRlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBwYXJ0IG9mIEFJIGNvbXBvbmVudHMsIHRoaW5rIGFib3V0IHRoYXQsIGRvY3VtZW50IGl0LlxuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcbiAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0Py5yZW1vdmVBdHRyaWJ1dGUoJ3R5cGUnKTtcblxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBpbmplY3RlZCBIVE1MIHN0cmluZyBpbnRvIGEgbm9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBfZG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICAgICAgICAgICAgICAgIHRlbXAuYm9keS5pbm5lckhUTUwgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZUtleXNXaW5kb3cgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVLZXlzV2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXAuYm9keS5maXJzdENoaWxkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgX2RvYy5oZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kb2MuaGVhZC5pbnNlcnRCZWZvcmUoX2RvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpLCBfZG9jLmhlYWQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBjb25zdCB4ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gaWYoeCl7XG4gICAgICAgICAgICAvLyAgICAgeC5yZW1vdmUoKTtcbiAgICAgICAgICAgIC8vICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG5cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuXG4gICAgICAgICAgICAvLyB3aW5kb3cuX19mZWRlcmF0aW9uX18gPVxuICAgICAgICAgICAgLy8gICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgLy8gICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gaW5qZWN0IHZhbHVlIHRvIG1vZHVsZSBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIHRvZGF5IHdlIGRvaW5nIHNvIGp1c3QgZm9yIHRoZSBDSlMgdmVyc2lvblxuICAgICAgICAgICAgLy8gICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCdcbiAgICAgICAgICAgIC8vICAgICAgICAgLC4uLiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfTtcblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX18gPSAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXztcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwvc2NyaXB0PmApO1xuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAobG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gY29tcC5wcm9wcy5fZ2xvYmFsID0gY29tcC5lbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgICAgICAgICByZXR1cm4gY29tcDtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm5vbmUpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlciA9IHBhcnNlciA/IHBhcnNlciA6IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBkb2MuYm9keS5maXJzdENoaWxkO1xuICAgICAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBkb21JZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MOy8vLnRyaW0oKTtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IHogPSBmaXJzdEVsZW1lbnQgPyBmaXJzdEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgICAgIC8vICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHRlbXBsYXRlLCBmaXJzdEVsZW1lbnQsIHopXG4gICAgICAgICAgICAvLyAgIGVsZW1lbnQgPSBmaXJzdEVsZW1lbnRcblxuICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gY29udGFpbmVyLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKGVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnROYW1lID0gdG9DdXN0b21FbGVtZW50TmFtZShjb21wb25lbnREZWZpbml0aW9uLm5hbWUgKyBza2luLmlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWRlZmluZSAhXG4gICAgICAgICAgICBpZiAoIXNlZW4uaW5jbHVkZXMoY3VzdG9tRWxlbWVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50KGN1c3RvbUVsZW1lbnROYW1lLCBsb2FkZXJDb25maWcuSFRNTCwgbG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlKTtcbiAgICAgICAgICAgICAgICBzZWVuLnB1c2goY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7Y3VzdG9tRWxlbWVudE5hbWV9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SVVzZXJGbG93fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbi8qKlxuICpcbiAqICMjIE92ZXJ2aWV3XG4gKlxuICogVGhlIGBDbG91ZFJlcG9zaXRvcnlgIGNsYXNzIHNlcnZlcyBhcyBhIGNlbnRyYWxpemVkIGRhdGEgYWNjZXNzIGxheWVyIGZvciByZXRyaWV2aW5nIHVzZXIgZmxvd3MgYW5kIGNvbXBvbmVudHMgZnJvbSB0aGUgTXlvcC5kZXYgY2xvdWQgc2VydmljZS4gSXQgaW1wbGVtZW50cyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBwcm92aWRlcyBjYWNoaW5nIG1lY2hhbmlzbXMgdG8gb3B0aW1pemUgQVBJIGNhbGxzIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICpcbiAqICMjIENsYXNzIFN0cnVjdHVyZVxuICpcbiAqICMjIyBDb25zdHJ1Y3RvclxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpXG4gKiBgYGBcbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYF9iYXNlVXJsYCAob3B0aW9uYWwpOiBUaGUgYmFzZSBVUkwgZm9yIHRoZSBNeW9wLmRldiBjbG91ZCBBUEkuIERlZmF1bHRzIHRvIGAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldidgXG4gKlxuICogIyMjIFN0YXRpYyBQcm9wZXJ0aWVzXG4gKlxuICogIyMjIyBNYWluXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBzdGF0aWMgTWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAqIGBgYFxuICpcbiAqIEEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uIHdpdGhvdXQgY3JlYXRpbmcgbXVsdGlwbGUgaW5zdGFuY2VzLlxuICpcbiAqICMjIyBQcml2YXRlIFByb3BlcnRpZXNcbiAqXG4gKiAjIyMjIHVzZXJGbG93c1xuICogYGBgdHlwZXNjcmlwdFxuICogcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcbiAqIGBgYFxuICpcbiAqIEEgY2FjaGUgb2JqZWN0IHRoYXQgc3RvcmVzIHByb21pc2VzIGZvciB1c2VyIGZsb3dzLCBpbmRleGVkIGJ5IGZsb3cgSUQuIFRoaXMgcHJldmVudHMgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBhbmQgZW5zdXJlcyBjb25zaXN0ZW50IGRhdGEgcmV0cmlldmFsLlxuICpcbiAqICMjIyMgX2Jhc2VVcmxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgX2Jhc2VVcmw6IHN0cmluZ1xuICogYGBgXG4gKlxuICogVGhlIGJhc2UgVVJMIGZvciB0aGUgY2xvdWQgQVBJIGVuZHBvaW50cywgc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gKlxuICogIyMgTWV0aG9kc1xuICpcbiAqICMjIyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpXG4gKlxuICogUmV0cmlldmVzIGEgY29tcGxldGUgdXNlciBmbG93IGZyb20gdGhlIGNsb3VkIHJlcG9zaXRvcnksIGluY2x1ZGluZyBhbGwgcmVzb2x2ZWQgY29tcG9uZW50cy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGZsb3dJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZmxvdyB0byByZXRyaWV2ZVxuICpcbiAqICoqUmV0dXJuczoqKlxuICogLSBgUHJvbWlzZTxJVXNlckZsb3c+YDogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBsZXRlIHVzZXIgZmxvdyBvYmplY3RcbiAqXG4gKiAqKkJlaGF2aW9yOioqXG4gKiAtIEltcGxlbWVudHMgcmVxdWVzdCBjYWNoaW5nIHRvIGF2b2lkIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgSURcbiAqIC0gTWFrZXMgYSBHRVQgcmVxdWVzdCB0byBgL2Zsb3c/aWQ9e2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICogLSBBdXRvbWF0aWNhbGx5IHJlc29sdmVzIGNvbXBvbmVudCByZWZlcmVuY2VzIHdpdGhpbiB0aGUgZmxvd1xuICogLSBTdG9yZXMgdGhlIHByb21pc2UgaW4gdGhlIGNhY2hlIGZvciBmdXR1cmUgdXNlXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdteS1mbG93LWlkJyk7XG4gKiBjb25zb2xlLmxvZyhmbG93LmNvbXBvbmVudHMpO1xuICogYGBgXG4gKlxuICogIyMjIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZDogc3RyaW5nKVxuICpcbiAqIFJldHJpZXZlcyBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIHdpdGhpbiBhIHVzZXIgZmxvdy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGNvbXBvbmVudElkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50IHRvIHJldHJpZXZlXG4gKiAtIGBmbG93SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGZsb3cgY29udGFpbmluZyB0aGUgY29tcG9uZW50XG4gKlxuICogKipSZXR1cm5zOioqXG4gKiAtIGBQcm9taXNlPENvbXBvbmVudCB8IHVuZGVmaW5lZD5gOiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9uZW50IG9iamVjdCBpZiBmb3VuZCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICpcbiAqICoqQmVoYXZpb3I6KipcbiAqIC0gRmlyc3QgZmV0Y2hlcyB0aGUgY29tcGxldGUgZmxvdyB1c2luZyBgZmV0Y2hGbG93KClgXG4gKiAtIFNlYXJjaGVzIHRocm91Z2ggdGhlIGZsb3cncyBjb21wb25lbnRzIGFycmF5IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbXBvbmVudFxuICogLSBVc2VzIHRoZSBjb21wb25lbnQncyBgdHlwZS5pZGAgcHJvcGVydHkgZm9yIG1hdGNoaW5nXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21wb25lbnQgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudCgnYnV0dG9uLWNvbXBvbmVudCcsICdteS1mbG93LWlkJyk7XG4gKiBpZiAoY29tcG9uZW50KSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0NvbXBvbmVudCBmb3VuZDonLCBjb21wb25lbnQpO1xuICogfSBlbHNlIHtcbiAqICAgICBjb25zb2xlLmxvZygnQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBmbG93Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBBUEkgSW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgRW5kcG9pbnQgU3RydWN0dXJlXG4gKlxuICogVGhlIGNsYXNzIGludGVncmF0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIE15b3AuZGV2IGNsb3VkIEFQSSBlbmRwb2ludDpcbiAqXG4gKiBgYGBcbiAqIEdFVCB7YmFzZVVybH0vZmxvdz9pZD17Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNcbiAqIGBgYFxuICpcbiAqICoqUXVlcnkgUGFyYW1ldGVyczoqKlxuICogLSBgaWRgOiBUaGUgZmxvdyBpZGVudGlmaWVyXG4gKiAtIGByZXNvbHZlPWNvbXBvbmVudHNgOiBJbnN0cnVjdHMgdGhlIEFQSSB0byBpbmNsdWRlIHJlc29sdmVkIGNvbXBvbmVudCBkYXRhIGluIHRoZSByZXNwb25zZVxuICpcbiAqICMjIyBSZXNwb25zZSBGb3JtYXRcbiAqXG4gKiBUaGUgQVBJIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIEpTT04gcmVzcG9uc2Ugd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgICAgXCJpdGVtXCI6IHtcbiAqICAgICAgICAgLy8gSVVzZXJGbG93IG9iamVjdCB3aXRoIHJlc29sdmVkIGNvbXBvbmVudHNcbiAqICAgICAgICAgXCJjb21wb25lbnRzXCI6IFtcbiAqICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICBcInR5cGVcIjoge1xuICogICAgICAgICAgICAgICAgICAgICBcImlkXCI6IFwiY29tcG9uZW50LWlkXCJcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgLy8gLi4uIG90aGVyIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgICAgLy8gLi4uIG90aGVyIGZsb3cgcHJvcGVydGllc1xuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIENhY2hpbmcgU3RyYXRlZ3lcbiAqXG4gKiBUaGUgYENsb3VkUmVwb3NpdG9yeWAgaW1wbGVtZW50cyBhIHByb21pc2UtYmFzZWQgY2FjaGluZyBtZWNoYW5pc206XG4gKlxuICogMS4gKipDYWNoZSBLZXkqKjogRmxvdyBJRCBpcyB1c2VkIGFzIHRoZSBjYWNoZSBrZXlcbiAqIDIuICoqQ2FjaGUgVmFsdWUqKjogUHJvbWlzZXMgYXJlIGNhY2hlZCByYXRoZXIgdGhhbiByZXNvbHZlZCB2YWx1ZXMgdG8gaGFuZGxlIGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAqIDMuICoqQ2FjaGUgRHVyYXRpb24qKjogQ2FjaGUgcGVyc2lzdHMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogNC4gKipDYWNoZSBJbnZhbGlkYXRpb24qKjogTm8gYXV0b21hdGljIGNhY2hlIGludmFsaWRhdGlvbiBpcyBpbXBsZW1lbnRlZFxuICpcbiAqICMjIEVycm9yIEhhbmRsaW5nXG4gKlxuICogLSBOZXR3b3JrIGVycm9ycyBhbmQgQVBJIGZhaWx1cmVzIGFyZSBwcm9wYWdhdGVkIHRocm91Z2ggcHJvbWlzZSByZWplY3Rpb25cbiAqIC0gTm8gc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcgb3IgcmV0cnkgbG9naWMgaXMgaW1wbGVtZW50ZWQgYXQgdGhlIHJlcG9zaXRvcnkgbGV2ZWxcbiAqIC0gQ29uc3VtZXJzIHNob3VsZCBpbXBsZW1lbnQgYXBwcm9wcmlhdGUgZXJyb3IgaGFuZGxpbmcgd2hlbiBjYWxsaW5nIHJlcG9zaXRvcnkgbWV0aG9kc1xuICpcbiAqICMjIFVzYWdlIFBhdHRlcm5zXG4gKlxuICogIyMjIFNpbmdsZXRvbiBBY2Nlc3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gJy4vcGF0aC90by9DbG91ZFJlcG9zaXRvcnknO1xuICpcbiAqIC8vIFVzZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ3VzdG9tIEluc3RhbmNlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBjdXN0b20gaW5zdGFuY2Ugd2l0aCBkaWZmZXJlbnQgYmFzZSBVUkxcbiAqIGNvbnN0IGN1c3RvbVJlcG8gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCdodHRwczovL2N1c3RvbS1hcGkuZXhhbXBsZS5jb20nKTtcbiAqIGNvbnN0IGZsb3cgPSBhd2FpdCBjdXN0b21SZXBvLmZldGNoRmxvdygnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMjIENvbXBvbmVudCBSZXRyaWV2YWxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEdldCBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICogY29uc3QgY29tcG9uZW50ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoJ2NvbXBvbmVudC1pZCcsICdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXNcbiAqXG4gKiAtICoqSVVzZXJGbG93Kio6IEludGVyZmFjZSBpbXBvcnRlZCBmcm9tIGAuLi9jb21tb25gIHRoYXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHVzZXIgZmxvdyBvYmplY3RzXG4gKiAtICoqRmV0Y2ggQVBJKio6IFVzZXMgdGhlIG5hdGl2ZSBgZmV0Y2hgIGZ1bmN0aW9uIGZvciBIVFRQIHJlcXVlc3RzXG4gKlxuICogIyMgUGVyZm9ybWFuY2UgQ29uc2lkZXJhdGlvbnNcbiAqXG4gKiAtICoqQ2FjaGluZyoqOiBQcmV2ZW50cyBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IElEXG4gKiAtICoqUHJvbWlzZSBDYWNoaW5nKio6IEhhbmRsZXMgY29uY3VycmVudCByZXF1ZXN0cyBlZmZpY2llbnRseSBieSBjYWNoaW5nIHByb21pc2VzXG4gKiAtICoqQ29tcG9uZW50IFJlc29sdXRpb24qKjogVGhlIGByZXNvbHZlPWNvbXBvbmVudHNgIHBhcmFtZXRlciBlbnN1cmVzIGNvbXBvbmVudHMgYXJlIGZ1bGx5IHJlc29sdmVkIGluIGEgc2luZ2xlIEFQSSBjYWxsXG4gKlxuICogIyMgRnV0dXJlIEVuaGFuY2VtZW50c1xuICpcbiAqIFRoZSBjbGFzcyBzdHJ1Y3R1cmUgc3VnZ2VzdHMgcGxhbm5lZCBmdW5jdGlvbmFsaXR5IHRoYXQgY291bGQgYmUgaW1wbGVtZW50ZWQ6XG4gKlxuICogLSAqKkNvbXBvbmVudCBDYWNoaW5nKio6IFRoZSBjb21tZW50ZWQgYGNvbXBvbmVudHNgIHByb3BlcnR5IGluZGljYXRlcyBwb3RlbnRpYWwgaW5kaXZpZHVhbCBjb21wb25lbnQgY2FjaGluZ1xuICogLSAqKkNhY2hlIEludmFsaWRhdGlvbioqOiBNZXRob2RzIHRvIGNsZWFyIG9yIHJlZnJlc2ggY2FjaGVkIGRhdGFcbiAqIC0gKipFcnJvciBSZXRyeSBMb2dpYyoqOiBBdXRvbWF0aWMgcmV0cnkgbWVjaGFuaXNtcyBmb3IgZmFpbGVkIHJlcXVlc3RzXG4gKiAtICoqQmF0Y2ggT3BlcmF0aW9ucyoqOiBNZXRob2RzIHRvIGZldGNoIG11bHRpcGxlIGZsb3dzIG9yIGNvbXBvbmVudHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgLy8gcHJpdmF0ZSBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtob3N0U0RLfSBmcm9tICcuLi9ob3N0JztcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIHYyX0lWYXJpYW50Q29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3QvaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgdjJfQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBzdGF0aWMgTWFpbiA9IG5ldyB2Ml9DbG91ZFJlcG9zaXRvcnkoKTtcblxuICAgIHByaXZhdGUgdmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8djJfSVZhcmlhbnRDb25maWc+PiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudmlyb25tZW50SWRlbnRpZmllcn1gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjb25zdCBlbmFibGVWMiA9IChlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZywgY2xvdWRSZXBvc2l0b3J5PzogdjJfQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgY29uc3QgX2Nsb3VkUmVwb3NpdG9yeSA9IGNsb3VkUmVwb3NpdG9yeSA/IGNsb3VkUmVwb3NpdG9yeSA6IG5ldyB2Ml9DbG91ZFJlcG9zaXRvcnkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGxvYWRDb21wb25lbnQ6IGFzeW5jIChjb21wb25lbnRJZDogc3RyaW5nLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCwgZW52aXJvbm1lbnRJZGVudGlmaWVyKVxuXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICghY29uZmlnLmNvbnN1bWVfdmFyaWFudCB8fCAhY29uZmlnLmNvbnN1bWVfdmFyaWFudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgIGBbTXlvcCBXYXJuaW5nXSBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIGhhcyBubyBpbXBsZW1lbnRhdGlvbiBmb3IgZW52aXJvbm1lbnQgXCIke2Vudmlyb25tZW50SWRlbnRpZmllcn1cIi5gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbmZpZy5uYW1lLFxuXG4gICAgICAgICAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2luaXRfaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgcmVmczogW10sXG4gICAgICAgICAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZW1wdHkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgICAgICAgICAgICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgICAgICAgICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge2RlY29tcHJlc3NVVUlEc30gZnJvbSBcIi4uL3V0aWxzL3V1aWQudHNcIjtcbmltcG9ydCB7Q2xvdWRSZXBvc2l0b3J5fSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZywgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRFeHBlcmllbmNlLCBJU2tpbkluc3RhbmNlQ29uZmlnLFxuICAgIFNraW5TZWxlY3RvclR5cGVzXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTXlvcE92ZXJyaWRlID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyk6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZyB8IG51bGw+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgZGlzYWJsaW5nIHRoZSBtZWNoYW5pc21cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IG15b3BPdmVycmlkZSA9IHBhcmFtcy5nZXQoJ215b3BPdmVycmlkZScpO1xuICAgICAgICBpZiAobXlvcE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjb25zdCBbc291cmNlLCAuLi51dWlkc10gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnRJZCwgc2tpbklkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgZmV0Y2hBdXRvRmxvdy4gTG9va3MgbGlrZSBvbmx5IG9uZSBza2luIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2luID0gY29tcG9uZW50VG9PdmVycmlkZS50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBmb3Igbm93IGp1c3Qgc2V0IHNraW4gaWQuIENoZWNrIHRoZSBjbG91ZCBpbXBsZW1lbnRhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNraW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luSW5zdGFuY2VDb25maWdcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vICAgIGNhc2UgJ2Zsb3cnOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudENvbmZpZy50eXBlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlID09PSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBlcmllbmNlID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLmZpbmQoZSA9PiBlLmlkID09PSBleHBlcmltZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEV4cGVyaWVuY2U/LnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlID0gcmVzb2x2ZWRFeHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMuZmluZChzID0+IHMuc2VnbWVudElkID09PSB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZS5zZWdtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSBzZWdtZW50Py5za2luU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0lNeW9wTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEVudmVsb3BlZE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLCBNZXNzYWdlRGlyZWN0aW9uLCBSZWZcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BJZnJhbWVMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvaWZyYW1lTG9hZGVyXCI7XG5pbXBvcnQge1dlYmNvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgcHVibGljIGluaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgdHlwZTJJbnN0YW5jZUNvdW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHVibGljIGFzc2lnbklkID0gKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0pIHtcbiAgICAgICAgICAgIHRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1fJHsrK3RoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdfWA7XG4gICAgfVxuXG4gICAgLy9UT0RPIDogZml4IHRoZSBpbnNwZWN0IGltcGxlbWVudGF0aW9uIGluc2lkZSByZWZDb21wb25lbnRcbiAgICAvL3RoZW4gaW5zcGVjdGVkIG1heWJlIGNhbiBiZSBkcm9wcGVkXG4gICAgcHJpdmF0ZSBpbnNwZWN0ZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaW5zcGVjdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5zcGVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaW5zcGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pbnNwZWN0KSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Lmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4pID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnaW5jb21pbmdNZXNzYWdlSGFuZGxlciBHT1QgJywgZXZlbnQpXG4gICAgICAgIC8vVE9ETyA6ICBpZiAoZXZlbnQub3JpZ2luICE9PSBcImh0dHA6Ly9leGFtcGxlLm9yZzo4MDgwXCIpIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdJIEtub3cgdGhhdCAhISEnKTtcbiAgICAgICAgICAgIC8vICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBjb21wb25lbnRzIDIgaW5pdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjb21wb25lbnQgPT4gY29tcG9uZW50LmlkICE9PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50LmlkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhdGVkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudD8uaWQpO1xuICAgICAgICAgICAgICAgIGluaXRpYXRlZENvbXBvbmVudD8uc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAvL2luaXRpYXRlZENvbXBvbmVudD8ucGFyZW50Py5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBteW9wTWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5kaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5tZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRNZXNzYWdlLm1lc3NhZ2Uucm91dGUgPSB0eXBlZE1lc3NhZ2Uucm91dGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UubWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBsb2cgP1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL2NvbXBvbmVudC5yZWZzLmJvZHkub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UubWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IG15b3BNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvL25vIGluIG1lbSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vbm90IHByb2Nlc3NlZCBpbiBvbk1lc3NhZ2VSZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESylcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBldmVudC5zb3VyY2UucG9zdE1lc3NhZ2UoXG4gICAgICAgIC8vICAgICBcImhpIHRoZXJlIHlvdXJzZWxmISAgdGhlIHNlY3JldCByZXNwb25zZSBcIiArIFwiaXM6IHJoZWVlZWV0IVwiLFxuICAgICAgICAvLyAgICAgZXZlbnQub3JpZ2luLFxuICAgICAgICAvLyAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50ID0gbmV3IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KCcnLFxuICAgICAgICAgICAge2RhdGE6IG1lc3NhZ2V9XG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIoc3ludGhldGljRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0ID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzPzogY29tcG9uZW50TG9hZGVyQ3JlYXRvcltdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdob3N0U0RLIGFscmVhZHkgaW5pdGlhdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJCeVR5cGU6IFJlY29yZDxzdHJpbmcsIElNeW9wTG9hZGVyPiA9IHt9O1xuXG4gICAgICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvYWRlciA9IG5ldyBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yKHRoaXMuY29tcG9uZW50c0xvYWRlcnMpO1xuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtjdXN0b21Mb2FkZXIudHlwZV0gPSBjdXN0b21Mb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZvckVhY2gobG9hZGVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0pXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gT2JqZWN0LnZhbHVlcyhsb2FkZXJCeVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jb21taW5nIG1lc3NhZ2VzIGZyb20gSUZyYW1lc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ215b3AgaG9zdFNESyBpbml0aWF0ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yID0gYXN5bmMgKHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZywgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW10gPSBbXSwgaG9va3M/OiBsb2FkZXJIb29rcyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmluZDxUPihcbiAgICAgICAgICAgIGFycmF5OiBUW10sXG4gICAgICAgICAgICBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBQcm9taXNlPGJvb2xlYW4+XG4gICAgICAgICk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBSZXR1cm4gdW5kZWZpbmVkIGlmIG5vIG1hdGNoIGlzIGZvdW5kXG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHNraW5TZWxlY3Rvci50eXBlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjYXNlIFwiRGVkaWNhdGVkU2tpblwiIDogLy9iYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZDoge1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW5JZCA9IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW4/LmlkXG4gICAgICAgICAgICAgICAgICAgIHx8IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW5zIVswXS5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFNraW5JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSAoc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBhd2FpdCBhc3luY0ZpbmQodHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMsIGFzeW5jIHNlZ21lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5zZWdtZW50SWQgPT09ICdEZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlcmllbmNlID0gZXhwZXJpZW5jZXMuZmluZChleHBlcmllbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlcmllbmNlLnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZSkuc2VnbWVudC5pZCA9PT0gc2VnbWVudC5zZWdtZW50SWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlcmllbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlcmllbmNlIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkRXhwZXJpZW5jZSA9IGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNlZ21lbnQgPSAodHlwZWRFeHBlcmllbmNlLnNlZ21lbnQgYXMgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudEZ1bmN0aW9uID0gKGhvb2tzID8gaG9va3MgOiB7fSlbdHlwZWRTZWdtZW50LmZ1bmN0aW9uXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHNlZ21lbnRGdW5jdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYHNlZ21lbnRJZDoke3NlZ21lbnQuc2VnbWVudElkfSwgJHt0eXBlZFNlZ21lbnQuZnVuY3Rpb259IGZ1bmN0aW9uIG5vdCBwcm92aWRlZCAhYClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3Ioc2VnbWVudC5za2luU2VsZWN0b3IsIGV4cGVyaWVuY2VzKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJyAvL1RPRE9cbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blNraW5TZWxlY3RvciA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGhvb2tzPzogbG9hZGVySG9va3MpID0+IHtcbiAgICAgICAgY29uc3Qgc2tpbklkID0gYXdhaXQgdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciwgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMsIGhvb2tzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudENvbmZpZy50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkZXJIb29rcz86IGxvYWRlckhvb2tzO1xuXG4gICAgcHVibGljIGxvYWRDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQgfCBSZWYsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTpcbiAgICAgICAgUHJvbWlzZTxUPiA9PiB7XG5cbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjb250YWluZXIgd2FzIGZvdW5kIGZvciB0aGlzIGNvbXBvbmVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGRlbkNvbmZpZyA9IGF3YWl0IGNoZWNrTXlvcE92ZXJyaWRlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgIGlmIChvdmVycmlkZGVuQ29uZmlnKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBsb2dcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IG92ZXJyaWRkZW5Db25maWc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIGlmICghY29udGFpbmVyLl9fbm9uUHJveGllZCkge1xuICAgICAgICAvLyAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIE15b3BSZWZDb21wb25lbnQpO1xuICAgICAgICAvLyAgICAgLy9pZiB3ZSBnb3QgbG9hZENvbXBvbmVudCBvdmVyIE15b3BSZWZDb21wb25lbnRcbiAgICAgICAgLy8gICAgIGlmIChyZWZDb21wb25lbnQuaWQgJiYgcmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLCByZWZDb21wb25lbnQucmVmLCBvcHRpb25zKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyBsZXQgcm9vdENvbXBvbmVudDogSU15b3BDb21wb25lbnQgPSByZWZDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICAgICAgLy8gd2hpbGUoIXJvb3RDb21wb25lbnQuZWxlbWVudCAmJiByb290Q29tcG9uZW50LnBhcmVudCl7XG4gICAgICAgIC8vICAgICAgICAgLy8gICAgIHJvb3RDb21wb25lbnQgPSByb290Q29tcG9uZW50LnBhcmVudFxuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICAvLyAgICAgICAgIC8vIC8vd2hhdCBub3cgP1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgY29uc3QgaG9va3MgPSB7Li4uKHRoaXMubG9hZGVySG9va3MgPz8ge30pLCAuLi4ob3B0aW9ucz8uaG9va3MgPz8ge30pfTtcblxuICAgICAgICBjb25zdCByZWYgPSBjb250YWluZXIgYXMgUmVmO1xuICAgICAgICBpZiAocmVmLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChyZWYuY29tcG9uZW50KSB7XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSB7Li4uY29tcG9uZW50Q29uZmlnfTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudENvbmZpZy5pbnN0YW5jZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICBza2luOiBzZWxlY3RlZFNraW5cbiAgICAgICAgICAgICAgICAgICAgLy8gIHNraW5zOiBbc2VsZWN0ZWRTa2luXVxuICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7Li4ub3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuaG9va3NcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQ8VD4ocmVmLCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cywgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjb25uZWN0IHJlZnMgYW5kIHByb3BzIGluc29kZSBjcmVhdGVSZWZDb21wb25lbnQsIGVsc2V3aGVyZSBpdHMgbm90IHJlYWxseSA8VD5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvYWQgY29tcG9uZW50IGdvdCBhIGRldGFjaGVkIHJlZi4nKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBjaG9vc2Ugc2tpbiBvbiBydW50aW1lIC4uLlxuICAgICAgICAgKiAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlXG4gICAgICAgICAqL1xuXG4gICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcblxuICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudExvYWRlciA9IHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZmluZChsb2FkZXIgPT4gbG9hZGVyLnR5cGUgPT09IHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSk7XG5cbiAgICAgICAgaWYgKCFjb21wb25lbnRMb2FkZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBsb2FkZXIgXCIke3NlbGVjdGVkU2tpbi5sb2FkZXIudHlwZX1cIiB3YXMgZm91bmQgZm9yIGNvbXBvbmVudGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9mb3IgbG9hZGVkIHdlYmNvbXBvbmVudCBtb2R1bGVzIHRvIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHRoZSBpbml0IG1lc3NhZ2UgZmxvd1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gYXdhaXQgY29tcG9uZW50TG9hZGVyLmxvYWQoY29tcG9uZW50Q29uZmlnLnR5cGUsIHNlbGVjdGVkU2tpbiwgY29udGFpbmVyLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBUT0RPIDogd2hlbiB0aGlzIGlzIG5vdCB0cnVlID9cbiAgICAgICAgaWYgKCFjb21wb25lbnQuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcblxuICAgICAgICBjb21wb25lbnQuYmluZCgnb25EaXNwb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY29tcG9uZW50IGRpc3Bvc2UnLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3QgaG9zdFNESzogSG9zdFNESyA9IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ2hvc3RTREsnLCBob3N0U0RLKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBteW9wOiB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXzogc3RyaW5nLFxuICAgICAgICAgICAgaG9zdFNESzogSG9zdFNESyxcbiAgICAgICAgICAgIElmcmFtZVNESzogSW5zdGFuY2VUeXBlPHR5cGVvZiBJZnJhbWVTREs+XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmPy5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG5cbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBldmVudC5vcHRpb25zLmlkKSE7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLy8vPj4+PlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coYGZhaWxlZCB0byBmaW5kICR7ZXZlbnQub3B0aW9ucy5pZH0gaW4gbWVtIHNjb3BlYCwgaG9zdFNESyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGUgcmVmIGNvbXBvbmVudCBpbiBvdXIgSG9zdFNESyAoc2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gIHJlZkNvbXBvbmVudC5wYXJlbnQgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgcmVmIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaG9zdFNESy5jb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTREsuY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHJlbW92ZWQgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCB1c2luZyB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBubyBuZWVkIHRoaXMsIHBhc3Mgb3B0aW9ucyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vaW1wbGVtZW50YXRpb25Db21wb25lbnQuaWQgPSBldmVudC5wcmVkZWZpbmVkSWQ7XG4gICAgICAgICAgICAgICAgLy9yZWZDb21wb25lbnQuaWQgKz0gJy4nO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm90IHJlYWxseSBuZWVkZWQgP1xuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKVxuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJPLElBQU0saUJBQU4sTUFBNEM7QUFBQSxFQUMvQyxZQUFtQixRQUNBLGFBQ0EsY0FDQSxXQUNBLFlBQXFCO0FBSnJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJbkIsd0JBQWdCLFFBQWU7QUFBQSxFQUYvQjtBQUdKOzs7QUN6Qk8sSUFBTSxxQkFBcUIsQ0FBTyxTQUFrQztBQUN2RSxNQUFJLE9BQU8sU0FBUyxZQUFZO0FBRTVCLFNBQUs7QUFBQSxFQUNULFdBQVcsZ0JBQWdCLFNBQVM7QUFFaEMsVUFBTSxTQUFTLE1BQU07QUFFckIsUUFBSSxPQUFPLFdBQVcsWUFBWTtBQUU5QixhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFFSjtBQVlPLElBQWUscUJBQWYsTUFBaUc7QUFBQTtBQUFBLEVBSXBHLFlBQW1CLGVBQXFGO0FBQXJGO0FBQUEsRUFFbkI7QUFJSjtBQUVPLElBQWUsNEJBQWYsY0FBMkYsbUJBQXNCO0FBQUEsRUFDcEgsWUFBbUIsZUFBNEYsU0FBYTtBQUN4SCxVQUFNLGFBQWE7QUFESjtBQUE0RjtBQUFBLEVBRS9HO0FBQ0o7OztBQzVDTyxJQUFNLGVBQWU7QUFBQTtBQUFBLEVBRXhCLGVBQWU7QUFBQSxFQUNmLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQSxFQUNmLGtCQUFrQjtBQUFBLEVBRWxCLHFCQUFxQjtBQUFBLEVBQ3JCLG9CQUFvQjtBQUFBLEVBQ3BCLHlCQUF5QjtBQUFBLEVBRXpCLHdCQUF3QjtBQUFBLEVBRXhCLDJCQUEyQjtBQUFBLEVBQzNCLHVCQUF1QjtBQUFBLEVBRXZCLDZCQUE2QjtBQUFBLEVBQzdCLG9CQUFvQjtBQUFBLEVBRXBCLDBCQUEwQjtBQUFBLEVBQzFCLHVCQUF1QjtBQUFBLEVBRXZCLGdCQUFnQjtBQUFBO0FBQUEsRUFHaEIsMEJBQTBCO0FBQUEsRUFDMUIsOEJBQThCO0FBQUEsRUFDOUIsNEJBQTRCO0FBQUEsRUFFNUIsa0JBQWtCO0FBQUE7QUFBQSxFQUdsQixJQUFJO0FBQUEsSUFDQSwyQkFBMkI7QUFBQSxJQUMzQixzQkFBc0I7QUFBQSxJQUN0Qiw2QkFBNkI7QUFBQSxJQUU3QixnQ0FBZ0M7QUFBQSxJQUNoQyw2QkFBNkI7QUFBQSxJQUU3Qiw2QkFBNkI7QUFBQSxJQUM3Qiw4QkFBOEI7QUFBQSxJQUM5QixvQkFBb0I7QUFBQSxJQUVwQiwyQkFBMkI7QUFBQSxJQUMzQix3QkFBd0I7QUFBQSxJQUN4Qix5QkFBeUI7QUFBQSxFQUM3QjtBQUNKOzs7QUNwREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0dPLElBQU0sU0FBUyxNQUFNO0FBQ3hCLFNBQU8sdUNBQXVDO0FBQUEsSUFBUTtBQUFBLElBQVUsUUFDM0QsQ0FBQyxJQUFJLE9BQU8sZ0JBQWdCLElBQUksV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLEVBQUU7QUFBQSxFQUNsRjtBQUNKO0FBVU8sSUFBTSxjQUFjLENBQUMsVUFBOEI7QUFDdEQsUUFBTSxNQUFNLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxPQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsU0FBUyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN4RSxTQUFPO0FBQUEsSUFDSCxJQUFJLE1BQU0sR0FBRyxDQUFDO0FBQUEsSUFDZCxJQUFJLE1BQU0sR0FBRyxFQUFFO0FBQUEsSUFDZixJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQUEsSUFDaEIsSUFBSSxNQUFNLElBQUksRUFBRTtBQUFBLElBQ2hCLElBQUksTUFBTSxFQUFFO0FBQUEsRUFDaEIsRUFBRSxLQUFLLEdBQUc7QUFDZDtBQVNPLElBQU0sa0JBQWtCLENBQUMsUUFBNEI7QUFDeEQsTUFBSSxTQUFTLElBQUksUUFBUSxNQUFNLEdBQUcsRUFBRSxRQUFRLE1BQU0sR0FBRztBQUNyRCxTQUFPLE9BQU8sU0FBUyxFQUFHLFdBQVU7QUFDcEMsUUFBTSxTQUFTLEtBQUssTUFBTTtBQUMxQixTQUFPLFdBQVcsS0FBSyxRQUFRLFVBQVEsS0FBSyxXQUFXLENBQUMsQ0FBQztBQUM3RDtBQVNPLElBQU0sa0JBQWtCLENBQUMsWUFBOEI7QUFDMUQsUUFBTSxRQUFRLGdCQUFnQixPQUFPO0FBQ3JDLE1BQUksTUFBTSxTQUFTLE9BQU8sRUFBRyxPQUFNLElBQUksTUFBTSxzQkFBc0I7QUFFbkUsUUFBTSxRQUFrQixDQUFDO0FBQ3pCLFdBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUssSUFBSTtBQUN2QyxVQUFNLEtBQUssWUFBWSxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQUEsRUFDbEQ7QUFDQSxTQUFPO0FBQ1g7OztBQ3hETyxJQUFNLE9BQU8sQ0FBQyxPQUFlO0FBQ2hDLFNBQU8sSUFBSSxRQUFRLGFBQVcsV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUN6RDs7O0FDQ08sSUFBTSxtQkFBTixNQUF1QjtBQUc5QjtBQUZJLGNBRFMsa0JBQ0YsUUFBTztBQUNkLGNBRlMsa0JBRUYsTUFBSztBQUtULElBQWUsa0JBQWYsTUFBd0M7QUFBQSxFQVczQyxjQUFjO0FBVmQsOEJBQUssT0FBTztBQWNaLGdDQUFPO0FBSVA7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQSxxQ0FBcUI7QUFBQSxFQWxCckI7QUFBQSxFQVZBLE9BQU8sVUFFQSxNQUNzQjtBQUV6QixXQUFPLElBQUksS0FBSyxHQUFHLElBQUk7QUFBQSxFQUMzQjtBQUFBLEVBd0JBLFNBQVMsS0FBK0I7QUFDcEMsV0FBTyxJQUFJLGdCQUFnQixLQUFLO0FBQUEsRUFDcEM7QUFDSjtBQUVPLElBQWUscUJBQWYsY0FBbUQsZ0JBQW1CO0FBQUEsRUFDekUsWUFBbUIsS0FBVTtBQUN6QixVQUFNO0FBRFM7QUFBQSxFQUVuQjtBQUNKO0FBRU8sSUFBZSx3QkFBZixjQUFzRCxnQkFBbUI7QUFBQSxFQUM1RSxZQUFtQixpQkFBMEI7QUFDekMsVUFBTTtBQURTO0FBQUEsRUFFbkI7QUFDSjtBQUVPLElBQWUsa0JBQWYsY0FBdUYsZ0JBQW1CO0FBQUEsRUFNN0csWUFBbUIsU0FBK0I7QUFDOUMsVUFBTTtBQURTO0FBRm5CLHdCQUFPLG1CQUFrQixPQUFPO0FBQUEsRUFJaEM7QUFDSjtBQUVPLElBQU0sTUFBTixNQUFNLEtBQUk7QUFBQSxFQXNCYixZQUFtQixXQUE4QixXQUE0QjtBQUExRDtBQUE4QjtBQXJCakQsd0JBQU8sUUFBTztBQUVkLHdCQUFPO0FBb0JILFNBQUssZUFBZSxpQ0FDYixPQURhO0FBQUEsTUFFaEIsV0FBVztBQUFBO0FBQUEsSUFDZjtBQUFBLEVBQ0o7QUFBQSxFQXRCQSxPQUFPLE9BQU8sVUFBa0IsV0FBd0IsV0FBNEI7QUFDaEYsUUFBSSxhQUFhO0FBQ2pCLFFBQUksQ0FBQyxZQUFZO0FBQ2IsbUJBQWE7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLE1BQU07QUFBQSxRQUNOLGFBQWE7QUFBQSxRQUNiLGNBQWM7QUFBQSxRQUNkO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDVjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsV0FBTyxJQUFJLEtBQUksWUFBWSxTQUFTO0FBQUEsRUFDeEM7QUFRSjs7O0FDbEdBLElBQU0sbUJBQW1CO0FBRWxCLElBQU0sbUJBQU4sY0FBK0IsZ0JBQTBDO0FBQUEsRUFLNUUsWUFBbUIsS0FBVSxTQUFnRDtBQUN6RSxVQUFNLE9BQU87QUFERTtBQUpuQiwyQ0FBa0M7QUFDbEMsdUNBQWM7QUFDZCxxQ0FBWTtBQUFBLEVBSVo7QUFDSjtBQUVPLElBQU0scUJBQU4sY0FBaUMsc0JBQXNCO0FBQUEsRUFBdkQ7QUFBQTtBQUNILHVDQUFjO0FBQUE7QUFDbEI7OztBQ2ZPLElBQU0sb0JBQU4sY0FBZ0MsZ0JBQXdCO0FBQUEsRUFJM0QsWUFBbUIsS0FBVSxNQUFjO0FBQ3ZDLFVBQU07QUFEUztBQUZuQix1Q0FBYztBQUlWLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQ0o7OztBQ0xBLElBQU1BLG9CQUFtQjtBQUV6QixJQUFNLG9CQUFvQjtBQUMxQixJQUFNLHNCQUFzQjtBQUVyQixJQUFNLGdCQUFnQixDQUFDLFlBQW9CO0FBQzlDLE1BQUksUUFBUSxRQUFRLE1BQU0saUJBQWlCO0FBQzNDLE1BQUksT0FBTztBQUNQLFdBQU8sTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDO0FBQUEsRUFDOUIsT0FBTztBQUNILFFBQUlDLFNBQVEsUUFBUSxNQUFNLG1CQUFtQjtBQUM3QyxRQUFJQTtBQUNBLGFBQU9BLE9BQU0sQ0FBQyxFQUFFLEtBQUs7QUFBQSxFQUM3QjtBQUNKO0FBaUJPLElBQU0sdUJBQU4sY0FBMEUsZ0JBQXNEO0FBQUEsRUFTbkksWUFBWSxRQUErQyxVQUEyRCxNQUFNO0FBQUEsRUFDNUgsR0FBVUMsZUFBa0I7QUFDeEIsVUFBTSxPQUFPO0FBRFAsd0JBQUFBO0FBUlYsMkNBQWtDRjtBQUNsQyx1Q0FBYztBQUNkLGtDQUFpQjtBQVFiLFNBQUssU0FBUyxPQUFPLFNBQVM7QUFHOUIsU0FBSyxVQUFVLE9BQU8sU0FBUztBQUMvQixTQUFLLFVBQVUsY0FBYyxLQUFLLE9BQU87QUFBQSxFQUM3QztBQUNKO0FBWkksY0FOUyxzQkFNRixjQUFhO0FBQ3BCLGNBUFMsc0JBT0YscUJBQW9CO0FBYXhCLElBQU0sNEJBQU4sY0FBaUQsc0JBQXlCO0FBQUEsRUFJN0UsWUFBbUIsaUJBQWdDLFNBQVk7QUFDM0QsVUFBTSxlQUFlO0FBRE47QUFBZ0M7QUFGbkQsdUNBQWNBO0FBQUEsRUFJZDtBQUNKOzs7QUNqRE8sSUFBTSxtQkFBTixjQUF3RixxQkFBbUQ7QUFBQSxFQUU5SSxZQUFZLFFBQ09HLGVBQ1AsVUFBMkQsTUFBTTtBQUFBLEVBQ2pFLEdBQUc7QUFJWCxVQUFNLENBQUMsRUFBQyxTQUFTLFdBQVcsU0FBUyxlQUFjLE1BQU07QUFDckQsWUFBTSxRQUFRLFFBQVEsY0FBYyxRQUFRLFdBQVcsaUJBQWlCLElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSTtBQUN2RyxVQUFJLEtBQUssUUFBUTtBQU9iLHVCQUFlLE1BQU0sS0FBSyxDQUFDO0FBRTNCLGNBQU0sa0JBQWtCLElBQUksU0FBUyxXQUFXLE9BQU8saUJBQWlCO0FBQ3hFLGVBQU8sZ0JBQWdCLGNBQWM7QUFBQSxNQUl6QztBQUNBLGFBQU87QUFBQSxJQUNYLEdBQUcsT0FBTztBQXhCSyx3QkFBQUE7QUEwQmYsU0FBSyxlQUFlLGlDQUNiQSxnQkFEYTtBQUFBO0FBQUEsTUFHaEIsU0FBUyxPQUFPLFNBQVM7QUFBQSxJQUM3QjtBQUFBLEVBQ0o7QUFDSjs7O0FDN0NBLElBQU1DLG9CQUFtQjtBQUVsQixJQUFNLDBCQUFOLGNBQXVHLGdCQUFnQjtBQUFBO0FBQUEsRUFPMUgsWUFBbUIsS0FBaUIsTUFBZ0IsU0FBMEQ7QUFDMUcsVUFBTSxPQUFPO0FBREU7QUFBaUI7QUFBZ0I7QUFMcEQsMkNBQWtDQTtBQUNsQyx1Q0FBYztBQUNkLHFDQUFZO0FBQ1osZ0RBQXFFO0FBQUEsRUFJckU7QUFBQSxFQUVBLHlCQUF5QixzQkFBb0U7QUFDekYsU0FBSyx1QkFBdUI7QUFDNUIsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUVPLElBQU0sK0JBQU4sY0FBMkMsc0JBQXNCO0FBQUEsRUFHcEUsWUFBbUIsaUJBQWdDLEdBQXdCO0FBQ3ZFLFVBQU0sZUFBZTtBQUROO0FBQWdDO0FBRm5ELHVDQUFjQTtBQUlWLFNBQUssVUFBVTtBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNKOzs7QUM3Qk8sSUFBTSxzQkFBTixjQUFrQyxnQkFBZ0I7QUFBQSxFQUlyRCxZQUFtQixLQUFpQixNQUFxQixPQUFlO0FBQ3BFLFVBQU07QUFEUztBQUFpQjtBQUFxQjtBQUZ6RCx1Q0FBYztBQUFBLEVBSWQ7QUFDSjs7O0FDTkEsSUFBTUMsb0JBQW1CO0FBRWxCLElBQU0seUJBQU4sY0FBcUMsZ0JBQWlEO0FBQUEsRUFJekYsWUFBbUIsS0FBVSxTQUF1RDtBQUNoRixVQUFNLE9BQU87QUFERTtBQUhuQiwyQ0FBa0NBO0FBQ2xDLHVDQUFjO0FBQUEsRUFJZDtBQUNKO0FBa0JPLElBQU0sNEJBQU4sY0FBd0Msc0JBQXNCO0FBQUEsRUFHakUsWUFBbUIsU0FBNEI7QUFDM0MsVUFBTTtBQURTO0FBRm5CLHVDQUFjQTtBQUFBLEVBSWQ7QUFDSjs7O0FDbkNPLElBQU0sZUFBTixjQUEyQixnQkFBd0I7QUFBQSxFQUl0RCxZQUFtQixLQUFVLFdBQW1CO0FBQzVDLFVBQU07QUFEUztBQUZuQix1Q0FBYztBQUlWLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQ0o7OztBQ1BPLElBQU0sY0FBTixjQUEwQixnQkFBZ0M7QUFBQSxFQUc3RCxZQUFZLElBQVk7QUFDcEIsVUFBTTtBQUhWLHVDQUFjO0FBSVYsU0FBSyxVQUFVLEVBQUUsR0FBRztBQUFBLEVBQ3hCO0FBQUEsRUFFQSxTQUFTLEtBQStCO0FBQ3BDLFdBQU8sSUFBSSxnQkFBZ0IsS0FBSztBQUFBLEVBQ3BDO0FBQ0o7QUFHTyxJQUFNLGVBQU4sY0FBMkIsWUFBWTtBQUFBLEVBQXZDO0FBQUE7QUFDSCx1Q0FBYztBQUFBO0FBQ2xCO0FBR08sSUFBTSxjQUFOLGNBQTBCLGdCQUFnQjtBQUFBLEVBQTFDO0FBQUE7QUFDSCx1Q0FBYztBQUFBO0FBQ2xCOzs7QUNuQkEsSUFBTUMsb0JBQW1CO0FBRWxCLElBQU0sNEJBQU4sY0FBd0MsZ0JBQWtEO0FBQUEsRUFJN0YsWUFBbUIsV0FDQSx1QkFDQSxTQUNQLFNBQ1Y7QUFDRSxVQUFNLE9BQU87QUFMRTtBQUNBO0FBQ0E7QUFMbkIsMkNBQWtDQTtBQUNsQyx1Q0FBYztBQUFBLEVBU2Q7QUFDSjtBQU9PLElBQU0sNkJBQU4sY0FBeUMsc0JBQXNCO0FBQUEsRUFHbEUsWUFBbUIsaUJBQWdDLFlBQWdDLFFBQWtCO0FBQ2pHLFVBQU0sZUFBZTtBQUROO0FBQWdDO0FBQWdDO0FBRm5GLHVDQUFjQTtBQUFBLEVBSWQ7QUFDSjs7O0FDOUJPLElBQU0sbUJBQU4sY0FBK0IsZ0JBQWdCO0FBQUEsRUFHbEQsWUFBbUIsYUFBNEIsU0FBMEI7QUFDckUsVUFBTTtBQURTO0FBQTRCO0FBRi9DLHVDQUFjO0FBS1YsVUFBTSx3QkFBeUI7QUFDL0IsU0FBSyxRQUFRLENBQUMsYUFBYSxHQUFHLHNCQUFzQixRQUFRLHNCQUFzQixRQUFRLENBQUMsQ0FBQztBQUFBLEVBQ2hHO0FBQ0o7OztBQ1JBLElBQU1DLG9CQUFtQjtBQUVsQixJQUFNLHdCQUFOLGNBQW9DLGdCQUE4QztBQUFBLEVBQWxGO0FBQUE7QUFDSCx1Q0FBYztBQUNkLDJDQUFrQkE7QUFBQTtBQUN0QjtBQUVPLElBQU0sMEJBQU4sY0FBc0Msc0JBQXFDO0FBQUEsRUFJOUUsWUFBbUIsaUJBQXlCLGlCQUFnQztBQUN4RSxVQUFNLGVBQWU7QUFETjtBQUZuQix1Q0FBY0E7QUFJVixTQUFLLFVBQVU7QUFBQSxFQUNuQjtBQUFBLEVBRUEsU0FBUyxLQUFvQztBQUN6QyxXQUFPLElBQUksZ0JBQWdCLEtBQUs7QUFBQSxFQUNwQztBQUNKOzs7QUNuQkEsSUFBTUMsb0JBQW1CO0FBRWxCLElBQU0sc0JBQU4sY0FBa0MsZ0JBQWlEO0FBQUEsRUFJdEYsWUFBbUIsS0FBaUIsTUFBYyxTQUF1RDtBQUNyRyxVQUFNLE9BQU87QUFERTtBQUFpQjtBQUhwQywyQ0FBa0NBO0FBQ2xDLHVDQUFjO0FBQUEsRUFJZDtBQUNKO0FBRU8sSUFBTSw0QkFBTixjQUF3QyxzQkFBc0I7QUFBQSxFQUdqRSxZQUFtQixTQUF3QjtBQUN2QyxVQUFNO0FBRFM7QUFGbkIsdUNBQWNBO0FBQUEsRUFJZDtBQUNKOzs7QUNSTyxJQUFNLHlCQUFOLGNBQXFDLGdCQUFnQjtBQUFBLEVBR3hELFlBQW1CLFFBQXNDO0FBQ3JELFVBQU07QUFEUztBQUZuQix1Q0FBYztBQUFBLEVBSWQ7QUFDSjs7O0FDaEJPLElBQU0sNkJBQU4sY0FBeUMsZ0JBQWdCO0FBQUEsRUFBekQ7QUFBQTtBQUNILHVDQUFjO0FBQUE7QUFDbEI7QUFFTyxJQUFNLDBCQUFOLGNBQXNDLGdCQUFnQjtBQUFBLEVBQXREO0FBQUE7QUFDSCx1Q0FBYztBQUFBO0FBQ2xCOzs7QUNMQSxJQUFNQyxvQkFBbUI7QUFFbEIsSUFBTSxpQkFBTixjQUE2QixnQkFBNEM7QUFBQSxFQUk1RSxZQUFtQixxQkFBNkIsU0FBa0Q7QUFDOUYsVUFBTSxPQUFPO0FBREU7QUFIbkIsMkNBQWtDQTtBQUNsQyx1Q0FBYztBQUFBLEVBSWQ7QUFDSjtBQUVPLElBQU0sdUJBQU4sY0FBbUMsc0JBQXNCO0FBQUEsRUFHNUQsWUFBbUIsZUFBd0I7QUFDdkMsVUFBTTtBQURTO0FBRm5CLHVDQUFjQTtBQUFBLEVBSWQ7QUFDSjs7O0FDbEJPLElBQU0saUJBQU4sY0FBNkIsZ0JBQWdCO0FBQUEsRUFBN0M7QUFBQTtBQUNILHVDQUFjO0FBQUE7QUFDbEI7OztBQ0ZPLElBQU0sMkJBQU4sY0FBdUMsZ0JBQWdCO0FBQUEsRUFBdkQ7QUFBQTtBQUNILHFDQUFZO0FBQ1osdUNBQWM7QUFBQTtBQUNsQjtBQUVPLElBQU0sd0JBQU4sY0FBb0MsZ0JBQWdCO0FBQUEsRUFBcEQ7QUFBQTtBQUNILHVDQUFjO0FBQUE7QUFDbEI7OztBQ0dPLElBQU0sa0JBQU4sTUFBK0I7QUFBQTtBQUFBLEVBT2xDLFlBQW1CLElBQW1CLFNBQWE7QUFBaEM7QUFBbUI7QUFOdEMsZ0NBQU8sQ0FBQyxZQUE2QjtBQUFBLElBRXJDO0FBQUEsRUFNQTtBQUNKO0FBb0JPLElBQWUsY0FBZixNQUErQztBQUFBLEVBQS9DO0FBTUgsb0RBQThDLENBQUM7QUFFL0Msc0NBQThDLENBQUM7QUFFL0MscURBQXFDO0FBRXJDLCtDQUFnRyxDQUFDO0FBQUE7QUFBQSxFQUVqRyxxQkFBcUIsT0FBWTtBQUM3QixVQUFNLGVBQWUsTUFBTSxPQUFPLE1BQU0sT0FBTyxNQUFNO0FBRXJELFFBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLE1BQU07QUFFckM7QUFBQSxJQUNKLE9BQU87QUFDSCxVQUFJLFVBQVU7QUFFZCxVQUFJLFFBQVEsY0FBYyxpQkFBaUIsTUFBTTtBQUU3QztBQUFBLE1BQ0o7QUFTQSxVQUFJLFFBQVEsZ0JBQWdCLGFBQWEsZ0JBQWdCO0FBSXJELFlBQUksUUFBUTtBQUNSLGlCQUFPLEtBQUssV0FBVyxRQUFRLFdBQVc7QUFDOUM7QUFBQSxNQUNKO0FBR0EsVUFBSSxRQUFRLGdCQUFnQixhQUFhLGFBQWE7QUFHbEQsY0FBTSxpQkFBa0IsUUFBd0IsUUFBUTtBQUV4RCxZQUFJLEtBQUssV0FBVyxjQUFjLEdBQUc7QUFHakM7QUFBQSxRQUNKO0FBRUEsYUFBSyxXQUFXLGNBQWMsSUFBSSxJQUFJLGdCQUFnQixjQUFjO0FBQ3BFLGFBQUssY0FBYyxJQUFJLGFBQWEsY0FBYyxDQUFDO0FBR25EO0FBQUEsTUFDSjtBQUlBLFVBQUksUUFBUSxnQkFBZ0IsYUFBYSxrQkFBa0I7QUFDdkQsY0FBTSxtQkFBb0I7QUFDMUIsY0FBTSxlQUFlLGlCQUFpQjtBQUN0QyxrQkFBVTtBQUVWLFlBQUksS0FBSyw2QkFBNkIsS0FBSyxXQUFXLFFBQVEsV0FBWSxHQUFHO0FBRXpFLGdCQUFNLHVCQUF1QixLQUFLLFFBQVEsV0FBVyxLQUFLLE9BQUssRUFBRSxPQUFPLGFBQWEsV0FBVztBQUNoRyxjQUFJLHNCQUFzQjtBQUN0QixpQ0FBcUIsS0FBSyxZQUFZO0FBQ3RDO0FBQUEsVUFDSjtBQUdBLGdCQUFNLGdDQUFnQyxLQUFLLFFBQVEsV0FBVyxLQUFLLE9BQUssRUFBRSxPQUFPLGlCQUFpQixXQUFXO0FBQzdHLGNBQUksK0JBQStCO0FBQy9CLDBDQUE4QixLQUFLLFlBQVk7QUFDL0M7QUFBQSxVQUNKO0FBQUEsUUFDSixPQUFPO0FBQ0g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQU1BLFVBQUksUUFBUSxhQUFhO0FBRXJCLFlBQUksUUFBUSxnQkFBZ0IsYUFBYSxnQkFBZ0I7QUFDckQsZ0JBQU0sZUFBZTtBQUNyQixnQkFBTSxVQUFVLEtBQUssb0JBQW9CLGFBQWEsbUJBQW1CO0FBRXpFLGdCQUFNLGlCQUFpQixJQUFJLHFCQUFxQixDQUFDLENBQUMsT0FBTztBQUN6RCx5QkFBZSxjQUFjLFFBQVE7QUFFckMsY0FBSSxDQUFDLENBQUMsU0FBUztBQUNYLG1CQUFPLEtBQUssb0JBQW9CLGFBQWEsbUJBQW1CO0FBQ2hFLCtCQUFtQixPQUFPLEVBQUUsS0FBSyxNQUFNO0FBQ25DLG1CQUFLLGNBQWMsZ0JBQWdCLFlBQVk7QUFBQSxZQUNuRCxDQUFDLEVBQUUsTUFBTSxNQUFNO0FBQUEsWUFFZixDQUFDO0FBQUEsVUFDTCxPQUFPO0FBQ0gsaUJBQUssY0FBYyxnQkFBZ0IsWUFBWTtBQUFBLFVBQ25EO0FBQ0E7QUFBQSxRQUNKO0FBRUEsWUFBSSxxQkFBcUI7QUFFekIsYUFBSyxrQkFBa0IsUUFBUSxhQUFXO0FBQ3RDLGNBQUksUUFBUSxnQkFBZ0IsUUFBUSxhQUFhO0FBQzdDLGlDQUFxQjtBQUNyQixrQkFBTSxVQUFVLFFBQVEsU0FBUyxPQUFPO0FBRXhDLGdCQUFJLFFBQVEsYUFBYSxTQUFTO0FBQzlCLG1CQUFLLG9CQUFvQixRQUFRLEVBQUUsSUFBSTtBQUFBLFlBQzNDO0FBRUEsZ0JBQUksV0FBVyxDQUFDLFFBQVEsV0FBVztBQUMvQixvQkFBTSxJQUFJLE1BQU07QUFBQSxnQkFDNUIsUUFBUSxXQUFXLDRCQUE0QixRQUFRLFFBQVE7QUFBQTtBQUFBO0FBQUEsNkhBRzhDO0FBQUEsWUFDckc7QUFFQSxnQkFBSSxDQUFDLFdBQVcsUUFBUSxXQUFXO0FBQy9CLG9CQUFNLElBQUksTUFBTTtBQUFBLGdCQUM1QixRQUFRLFdBQVcsNEJBQTRCLFFBQVEsUUFBUTtBQUFBO0FBQUE7QUFBQSw2SEFHOEM7QUFBQSxZQUNyRztBQUFBLFVBQ0o7QUFBQSxRQUNKLENBQUM7QUFFRCxZQUFJLENBQUMsb0JBQW9CO0FBQUEsUUFHekI7QUFBQSxNQUNKLE9BQU87QUFDSCxnQkFBUSxJQUFJLDBCQUEwQjtBQUFBLE1BQzFDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFHSjs7O0FDekxPLElBQU0sY0FBYztBQUFBLEVBQ3ZCLGdCQUFnQjtBQUFBLEVBQ2hCLHNCQUFzQjtBQUFBLEVBQ3RCLGNBQWM7QUFBQSxFQUNkLG1CQUFtQjtBQUN2QjtBQTRCTyxJQUFNLHFCQUFxQjtBQUFBLEVBQzlCLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLGNBQWM7QUFDbEI7QUFtRk8sSUFBTSwwQkFBMEI7QUFBQSxFQUNuQyxXQUFXO0FBQUEsRUFDWCxRQUFRO0FBQ1o7QUFnQ08sSUFBTSxrQkFBTixNQUFzQjtBQUc3QjtBQUZJLGNBRFMsaUJBQ0YsUUFBTztBQUNkLGNBRlMsaUJBRUYsYUFBWTtBQStLaEIsSUFBTSxvQkFBb0I7QUFBQSxFQUM3QixhQUFhO0FBQUEsRUFDYixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRYixXQUFXO0FBQ2Y7QUFzRE8sSUFBTSxrQkFBa0I7QUFBQSxFQUMzQixXQUFXO0FBQUEsRUFDWCxTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQ1Y7QUFnRU8sSUFBTSxVQUFOLE1BQWM7QUFBQSxFQUNqQixZQUFtQixXQUErQixZQUF5QjtBQUF4RDtBQUErQjtBQUlsRCxzQ0FBYSxNQUFNO0FBQ2YsY0FBUSxLQUFLLGNBQWMsS0FBSyxXQUFXLGNBQWMsS0FBSztBQUFBLElBQ2xFO0FBRUEsbUNBQVUsTUFBTTtBQUNaLGFBQVEsS0FBSyxjQUFjLEtBQUs7QUFBQSxJQUNwQztBQUFBLEVBUkE7QUFTSjs7O0FDMWVPLElBQU0seUJBQXlCO0FBQUEsRUFDbEMsMEJBQTBCO0FBQzlCOzs7QUNJTyxJQUFlLGlDQUFmLGNBQXVGLDBCQUE2RTtBQUFBLEVBSXZLLFlBQVksZUFBMkIsU0FBeUQ7QUFDNUYsVUFBTSxhQUFhO0FBRGdCO0FBTXZDLG9DQUFXLENBQUMsVUFBYTtBQUVyQixVQUFJLE1BQU0sYUFBYTtBQUNuQixjQUFNLGNBQWMsTUFBTTtBQUMxQixZQUFJLEtBQUssUUFBUSxXQUFXLEVBQUUsU0FBUztBQUduQyxnQkFBTSxpQkFBaUIsQ0FBQyxTQUEwQixhQUErQjtBQUM3RSxpQkFBSyxjQUFjLGlDQUNaLFVBRFk7QUFBQSxjQUVmLFFBQVEsTUFBTSxjQUFjLE1BQU0sY0FBYyxNQUFNO0FBQUEsY0FDdEQsYUFBYSxNQUFNLFNBQVMsTUFBTSxTQUFTLE1BQU07QUFBQSxZQUNyRCxJQUFzQixRQUFRO0FBQUEsVUFDbEM7QUFFQSxpQkFBTyxLQUFLLGNBQWMsT0FBTyxLQUFLLFFBQVEsV0FBVyxFQUFFLFNBQVMsY0FBYztBQUFBLFFBQ3RGLE9BQU87QUFDSDtBQUFBLFFBQ0o7QUFBQSxNQUNKLE9BQU87QUFDSDtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUExQkE7QUEyQko7OztBQ3ZDTyxJQUFNLGlCQUFpQjtBQUFBLEVBQzFCLElBQUk7QUFDUjs7O0FDQ08sSUFBTSxtQkFBbUIsQ0FBQyxLQUFVLE9BQW1CO0FBQzFELFNBQU8sR0FBRyxpQkFBaUIsSUFBSSxlQUFlLEVBQUUsS0FBSyxJQUFJLFVBQVUsUUFBUSxJQUFJO0FBQ25GOzs7QUNDTyxJQUFNLHFCQUFOLGNBQWlDLCtCQUFpRDtBQUFBLEVBQWxGO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLHlDQUFnQixDQUFDLE9BQXlCLGVBQThCLGtCQUFpQztBQUNyRyxZQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxjQUFjLFVBQVU7QUFDbEUsWUFBTSxlQUFzQixDQUFDO0FBRTdCLFlBQU0sUUFBUSxVQUFRO0FBQ2xCLGNBQU0sVUFBVSxNQUFNO0FBQ2xCLHdCQUFjLElBQUksbUJBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQUEsUUFDL0Q7QUFFQSxhQUFLLGlCQUFpQixTQUFTLE9BQU87QUFDdEMscUJBQWEsS0FBSyxNQUFNO0FBQ3BCLGVBQUssb0JBQW9CLFNBQVMsT0FBTztBQUFBLFFBQzdDLENBQUM7QUFBQSxNQUNMLENBQUM7QUFFRCxhQUFPLE1BQU07QUFDVCxxQkFBYSxRQUFRLFVBQVEsS0FBSyxDQUFDO0FBQUEsTUFDdkM7QUFBQSxJQUNKO0FBQUE7QUFDSjs7O0FDdkJPLElBQU0sb0JBQU4sY0FBZ0MsK0JBQW1EO0FBQUEsRUFBbkY7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0IseUNBQWdCLENBQUMsT0FBMkIsa0JBQWlDO0FBQ3pFLFlBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLGNBQWMsVUFBVTtBQUNsRSxZQUFNLFFBQVEsVUFBUTtBQUNsQixhQUFLLGNBQWMsTUFBTTtBQUFBLE1BQzdCLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFDSjs7O0FDZE8sSUFBTSxnQkFBTixjQUE0QixRQUFRO0FBQUEsRUFDdkMsWUFBbUIsV0FBK0IsWUFBd0I7QUFDdEUsVUFBTSxXQUFXLFVBQVU7QUFEWjtBQUErQjtBQUFBLEVBRWxEO0FBQ0o7OztBQ0NPLElBQU0sK0JBQU4sY0FBMkMsK0JBQXNEO0FBQUEsRUFBakc7QUFBQTtBQUNILHlDQUFnQixDQUFDLE9BQThCLGtCQUFpQztBQUc1RSxZQUFNLGVBQWUsY0FBYyxXQUFXLGlCQUFpQixJQUFJLGVBQWUsRUFBRSxHQUFHO0FBRXZGLFVBQUksV0FBNkIsQ0FBQztBQUVsQyxtQkFBYSxRQUFRLFVBQVE7QUFLekIsY0FBTSxTQUFTLEtBQUssYUFBYSxlQUFlLEVBQUU7QUFFbEQsWUFBSSxRQUFRO0FBR1IsbUJBQVMsS0FBSyxJQUFJLGVBQWUsUUFBUSxLQUFLLFNBQVMsS0FBSyxzQkFBc0IsR0FBRyxLQUFLLFdBQVcsS0FBSyxVQUFVLENBQUM7QUFBQSxRQUN6SDtBQUFBLE1BQ0osQ0FBQztBQUVELFdBQUssY0FBYyxJQUFJLHdCQUF3QixNQUFNLGlCQUFpQixRQUFRLENBQUM7QUFBQSxJQUNuRjtBQUVBLHVDQUFjLGFBQWE7QUFBQTtBQUcvQjs7O0FDbkNPLElBQU0saUJBQWlCO0FBQ3ZCLElBQU0sWUFBWTtBQUdsQixJQUFNLHNCQUFzQixDQUFDLFlBQW9CLFdBQWdCO0FBRXBFLE1BQUksT0FBTyxjQUFjLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxLQUFLLE9BQU8sY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUc7QUFFL0csV0FBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLENBQUMsVUFBVSxHQUFHLE9BQU0sQ0FBQztBQUFBLEVBQ3hFLE9BQU87QUFBQSxFQUVQO0FBQ0o7OztBQ05PLElBQU0sc0JBQU4sY0FBa0MsK0JBQW9EO0FBQUEsRUFBdEY7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0IseUNBQWdCLENBQUMsT0FBNEIsa0JBQWlDO0FBQzFFLFlBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLGNBQWMsVUFBVTtBQUNsRSxZQUFNLFFBQVEsVUFBUTtBQUNsQixhQUFLLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSztBQUFBLE1BQzdDLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFDSjs7O0FDVEEsSUFBTSxjQUFjLENBQUMsVUFBVTtBQUMzQixTQUFPLFVBQVUsT0FBTyxLQUFLO0FBQ2pDO0FBRUEsSUFBTSxhQUFhLENBQUMsVUFBVTtBQUMxQixTQUFPLE9BQU8sVUFBVTtBQUM1QjtBQUVPLElBQU0seUJBQXlCLENBQUMsUUFBUTtBQUMzQyxNQUFJLFlBQVksR0FBRyxHQUFHO0FBQ2xCLFdBQU87QUFBQSxFQUNYO0FBRUEsTUFBSSxXQUFXLEdBQUcsR0FBRztBQUNqQixXQUFPO0FBQUEsRUFDWDtBQUVBLE1BQUksT0FBTyxlQUFlLEdBQUcsR0FBRztBQUM1QixXQUFPO0FBQUEsRUFDWDtBQUVBLGFBQVcsT0FBTyxLQUFLO0FBQ25CLFVBQU0sUUFBUSxJQUFJLEdBQUc7QUFDckIsUUFBSSxPQUFPLFVBQVUsVUFBVTtBQUUzQixVQUFJLENBQUMsdUJBQXVCLEtBQUssR0FBRztBQUNoQyxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0osV0FBVyxZQUFZLEtBQUssR0FBRztBQUMzQjtBQUFBLElBQ0osT0FBTztBQUNILGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUVBLFNBQU87QUFDWDtBQVFPLElBQU0sbUJBQW1CLENBQzVCLEtBQ0EsV0FBb0MsQ0FBQyxHQUNyQyxtQkFBNEIsTUFDNUJDLFFBQTJDLG9CQUFJLFFBQVEsTUFDckM7QUFFbEIsTUFBSSxZQUFZLEdBQUcsR0FBRztBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUVBLE1BQUksTUFBTSxRQUFRLEdBQUcsR0FBRztBQUNwQixRQUFJQSxNQUFLLElBQUksR0FBRyxHQUFHO0FBQ2YsYUFBT0EsTUFBSyxJQUFJLEdBQUc7QUFBQSxJQUN2QjtBQUdBLFVBQU0sb0JBQXlDLENBQUM7QUFDaEQsSUFBQUEsTUFBSyxJQUFJLEtBQUssaUJBQWlCO0FBRS9CLGFBQVMsUUFBUSxHQUFHLFFBQVEsSUFBSSxRQUFRLFNBQVM7QUFDN0MsWUFBTSxVQUFVLElBQUksS0FBSztBQUN6Qix3QkFBa0IsS0FBSyxJQUFJLGlCQUFpQixTQUFTLFVBQVUsa0JBQWtCQSxLQUFJO0FBQUEsSUFDekY7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVBLE1BQUksUUFBUSxRQUFRLE9BQU8sUUFBUSxVQUFVO0FBRXpDLFFBQUlBLE1BQUssSUFBSSxHQUFHLEdBQUc7QUFDZixhQUFPQSxNQUFLLElBQUksR0FBRztBQUFBLElBQ3ZCO0FBQ0EsVUFBTSxxQkFBK0MsQ0FBQztBQUN0RCxJQUFBQSxNQUFLLElBQUksS0FBSyxrQkFBa0I7QUFFaEMsZUFBVyxPQUFPLEtBQUs7QUFHbkIsWUFBTSxnQkFBZ0IsT0FBTyxZQUFZLFlBQVksV0FBVyxTQUFTLEdBQUc7QUFFNUUsVUFBSSxlQUFlO0FBQ2YsWUFBSSxrQkFBa0IsTUFBTTtBQUV4QixjQUFJLG1CQUFtQixJQUFJLEdBQUcsTUFBTSxTQUFZLElBQUksR0FBRyxHQUFHO0FBRXRELCtCQUFtQixHQUFHLElBQUksaUJBQWlCLElBQUksR0FBRyxHQUFHLE1BQU0sa0JBQWtCQSxLQUFJO0FBQUEsVUFDckY7QUFBQSxRQUNKLFdBQVcsT0FBTyxrQkFBa0IsVUFBVTtBQUcxQyw2QkFBbUIsR0FBRyxJQUFJLGlCQUFpQixJQUFJLEdBQUcsR0FBRyxlQUFlLGtCQUFrQkEsS0FBSTtBQUFBLFFBQzlGO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVBLFNBQU8sQ0FBQztBQUNaOzs7QUNuR08sSUFBTSwwQkFBTixjQUFzQywrQkFBd0Q7QUFBQSxFQUE5RjtBQUFBO0FBRUgsdUNBQWMsYUFBYTtBQUUzQix5Q0FBZ0IsQ0FBQyxPQUFnQyxlQUE4QixrQkFBaUM7QUFFNUcsWUFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssY0FBYyxVQUFVO0FBQ2xFLFlBQU0sZUFBK0IsQ0FBQztBQUV0QyxZQUFNLFFBQVEsVUFBUTtBQUNsQixjQUFNLFVBQVUsQ0FBQyxNQUFNO0FBR25CLHdCQUFjLElBQUksNkJBQTZCLE1BQU0saUJBQWtCLGlCQUFpQixHQUFHLE1BQU0sb0JBQW9CLENBQUMsQ0FBQztBQUFBLFFBQzNIO0FBRUEsYUFBSyxpQkFBaUIsTUFBTSxNQUFNLE9BQU87QUFFekMscUJBQWEsS0FBSyxNQUFNO0FBQ3BCLGVBQUssb0JBQW9CLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDaEQsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUVELGFBQU8sTUFBTTtBQUNULHFCQUFhLFFBQVEsVUFBUSxLQUFLLENBQUM7QUFBQSxNQUN2QztBQUFBLElBQ0o7QUFBQTtBQUNKOzs7QUMwQ08sSUFBZSxvQkFBZixNQUFzRztBQUFBLEVBTy9GLFlBQW1CLHFCQUF3RCxXQUF3QixTQUF5QjtBQUF6RztBQUF3RDtBQU5yRiw4QkFBYTtBQUViLDJDQUF5RCxDQUFDO0FBRTFEO0FBb0JBLDhDQUE4QjtBQW9COUI7QUFBQSxnQ0FBTyxDQUE0QixhQUFxQixZQUFxQztBQUN6RixVQUFJLENBQUMsS0FBSyxnQkFBZ0IsV0FBVyxHQUFHO0FBQ3BDLGFBQUssZ0JBQWdCLFdBQVcsSUFBSSxDQUFDO0FBQUEsTUFDekM7QUFHQSxVQUFJLENBQUMsS0FBSyxnQkFBZ0IsV0FBVyxFQUFFLFNBQVMsT0FBTyxHQUFHO0FBQ3RELGFBQUssZ0JBQWdCLFdBQVcsRUFBRSxLQUFLLE9BQU87QUFBQSxNQUNsRDtBQUFBLElBQ0o7QUFFQSxvQ0FBVyxDQUE0QixhQUFxQixXQUFvQyxZQUFrRDtBQUM5SSxVQUFJLENBQUMsU0FBUztBQUNWLGNBQU0sSUFBSSxNQUFNLGlEQUFrRDtBQUFBLE1BQ3RFO0FBRUEsVUFBSSxDQUFDLEtBQUssZ0JBQWdCLFdBQVcsR0FBRztBQUNwQyxhQUFLLGdCQUFnQixXQUFXLElBQUksQ0FBQztBQUFBLE1BQ3pDO0FBRUEsWUFBTSxXQUFXLEtBQUssZ0JBQWdCLFdBQVc7QUFFakQsWUFBTSwwQkFBMEIsQ0FBQyxNQUFTO0FBQ3RDLFlBQUksVUFBVSxDQUFDLEdBQUc7QUFDZCxrQkFBUSxDQUFDO0FBQ1QsaUJBQU87QUFBQSxRQUNYO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFHQSxlQUFTLEtBQUssdUJBQXVCO0FBRXJDLGFBQU8sTUFBTTtBQUNULGNBQU0sUUFBUSxTQUFTLFFBQVEsdUJBQXVCO0FBQ3RELFlBQUksUUFBUSxJQUFJO0FBQ1osbUJBQVMsT0FBTyxPQUFPLENBQUM7QUFBQSxRQUM1QjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBaUNBLHdDQUFlLE1BQU07QUFDakIsV0FBSyxjQUFjO0FBRW5CLFVBQUksS0FBSztBQUNMLGFBQUssc0JBQXNCO0FBQUEsSUFDbkM7QUFFQSx1Q0FBdUI7QUFFdkI7QUFDQTtBQUVBLDBDQUErQixJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUQsV0FBSyx3QkFBd0I7QUFDN0IsV0FBSyx1QkFBdUI7QUFBQSxJQUNoQyxDQUFDO0FBRUQscUNBQVksTUFBTTtBQUNkLGFBQU8sS0FBSztBQUFBLElBQ2hCO0FBd0dBLGlDQUFXLENBQUM7QUFDWixnQ0FBVSxDQUFDO0FBek9QLFNBQUssTUFBSyxtQ0FBUyxPQUFNLFFBQVEsU0FBUyxFQUFFLFNBQVMsbUJBQW1CO0FBQ3hFLFVBQU0sV0FBVSxtQ0FBUyxXQUFVLG1DQUFTLFVBQVUsSUFBSTtBQUMxRCxlQUFXLE1BQU07QUFDYixVQUFJLENBQUMsS0FBSyxlQUFlLEtBQUssd0JBQXdCLENBQUMsS0FBSyxvQkFBb0I7QUFDNUUsYUFBSyxxQkFBcUIsV0FBVyxPQUFPLElBQUksS0FBSyxFQUFFLEVBQUU7QUFBQSxNQUM3RDtBQUFBLElBQ0osR0FBRyxPQUFPO0FBR1YsU0FBSyxVQUFVLEVBQUUsS0FBSyxNQUFNO0FBRXhCLFVBQUksT0FBTyxLQUFLLFFBQVEsV0FBVztBQUMvQixhQUFLLFFBQVE7QUFBQSxNQUNqQjtBQUFBLElBQ0osQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUlBLElBQUksb0JBQTZCO0FBQzdCLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxJQUFJLGtCQUFrQixPQUFnQjtBQUNsQyxRQUFJLEtBQUssb0JBQW9CO0FBQ3pCLFlBQU0sSUFBSSxNQUFNLG1MQUFtTDtBQUFBLElBQ3ZNO0FBQ0EsU0FBSyxxQkFBcUI7QUFBQSxFQUM5QjtBQUFBLEVBa0RBLGtCQUFrQixlQUF5QztBQUd2RCxRQUFJLGNBQWMsZ0JBQWdCLGFBQWEsd0JBQXdCO0FBQ25FLFlBQU0sZUFBZ0I7QUFHdEIsVUFBSyxLQUFhLGFBQWEsTUFBTSxHQUFHO0FBQ3BDLFFBQUMsS0FBYSxhQUFhLE1BQU0sRUFBRSxhQUFhLE9BQU87QUFBQSxNQUMzRCxPQUFPO0FBQ0gsZ0JBQVEsSUFBSSxvQkFBb0IsYUFBYSxNQUFNLGlCQUFpQixJQUFJO0FBQUEsTUFDNUU7QUFFQSxhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sV0FBVyxLQUFLLGdCQUFnQixjQUFjLFdBQVc7QUFDL0QsUUFBSSxZQUFZLFNBQVMsUUFBUTtBQUM3QixVQUFJLFVBQVU7QUFFZCxlQUFTLFFBQVEsYUFBVztBQUN4QixrQkFBVSxXQUFXLFFBQVEsYUFBYTtBQUFBLE1BQzlDLENBQUM7QUFDRCxhQUFPO0FBQUEsSUFDWCxPQUFPO0FBQUEsSUFHUDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUF1QlEsbUJBQW1CLFNBQStCO0FBQ3RELFlBQVEsU0FBUyxLQUFLO0FBQ3RCLFlBQVEsY0FBYyxLQUFLO0FBQzNCLFlBQVEsWUFBWSxpQkFBaUI7QUFFckMsVUFBTSxpQkFBaUIsS0FBSyxTQUFTLFFBQVEsaUJBQWlCLENBQUMsUUFBK0I7QUFDMUYsYUFBTyxJQUFJLG9CQUFvQixRQUFRO0FBQUEsSUFDM0MsR0FBRyxDQUFDLE1BQTRCO0FBQzVCLGNBQVEsUUFBUSxDQUFDO0FBQ2pCLHFCQUFlO0FBQUEsSUFDbkIsQ0FBQztBQUVELFVBQU0sVUFBVSxRQUFRO0FBRXhCLFdBQU8sUUFBUTtBQUVmLFNBQUssS0FBSyxPQUFPO0FBRWpCLFlBQVEsVUFBVTtBQUFBLEVBQ3RCO0FBQUEsRUFFQSxLQUFLLFNBQTBDO0FBRTNDLFFBQUksQ0FBQyxRQUFRO0FBQ1QsY0FBUSxTQUFTLEtBQUs7QUFFMUIsUUFBSSxDQUFDLFFBQVE7QUFDVCxjQUFRLGNBQWMsS0FBSztBQUUvQixZQUFRLFlBQVksaUJBQWlCO0FBRXJDLFFBQUk7QUFJSixRQUFJLFFBQVEsU0FBUztBQUNqQixZQUFNLGVBQWdCO0FBQ3RCLHVCQUFpQixLQUFLLFNBQVMsYUFBYSxpQkFBaUIsQ0FBQyxRQUErQjtBQUN6RixlQUFPLElBQUksb0JBQW9CLGFBQWE7QUFBQSxNQUNoRCxHQUFHLGFBQWEsT0FBTztBQUd2QixhQUFPLFFBQVE7QUFBQSxJQUNuQjtBQUdBLFFBQUksUUFBUSxLQUFLO0FBRWIsY0FBUSxNQUFNLFFBQVEsSUFBSSxnQkFBZ0IsUUFBUTtBQUFBLElBQ3REO0FBRUEsUUFBSSxRQUFRLFdBQVc7QUFDbkIsYUFBTyxNQUFNO0FBQ1QsYUFBSyxtQkFBbUIsSUFBSSxlQUFlLFFBQVEsSUFBSSxDQUFDLFdBQVc7QUFBQSxRQUVuRSxDQUFDLENBQUM7QUFFRixZQUFJLGdCQUFnQjtBQUNoQix5QkFBZTtBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUFBLElBQ0osT0FBTztBQUNILGFBQU8sTUFBTTtBQUFBLE1BQ2I7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBLEVBRUEsVUFBZ0I7QUFDWixTQUFLLG9CQUFvQjtBQUV6QixRQUFJLENBQUMsS0FBSyxhQUFhO0FBR25CO0FBQUEsSUFDSjtBQUNBLFlBQVEsSUFBSSx1QkFBdUIsS0FBSyxFQUFFO0FBVTFDLFNBQUssS0FBSyxJQUFJLGVBQWUsQ0FBQztBQUU5QixVQUFNLG9CQUFvQixLQUFLLGdCQUFnQixXQUFXO0FBQzFELFFBQUksbUJBQW1CO0FBQ25CLHdCQUFrQixRQUFRLG9CQUFrQjtBQUV4Qyx1QkFBZSxJQUFJO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0w7QUFJQSxTQUFLLGtCQUFrQixDQUFDO0FBQ3hCLFNBQUssTUFBTTtBQUNYLFNBQUssY0FBYztBQUFBLEVBQ3ZCO0FBSUo7OztBQ2pVTyxJQUFNLFNBQVM7QUFBQSxFQUNsQix3QkFBd0IsQ0FBQyxNQUFNLFFBQVE7QUFDbkMsVUFBTSxJQUFJLE1BQU07QUFBQSx5QkFDQyxLQUFLLFNBQVMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVl0QyxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0VBSTZELEtBQUssU0FBUyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FhaEY7QUFBQSxFQUNHO0FBQ0o7OztBQzVCTyxJQUFNLG1CQUFOLGNBQStCLGtCQUFrQjtBQUFBLEVBRXBELFlBQW1CLHFCQUF3RCxRQUF3QixTQUF5QjtBQUV4SCxVQUFNLHFCQUFxQixPQUFPLFdBQVcsT0FBTztBQUZyQztBQUF3RDtBQXdDM0UsZ0NBQU8sQ0FBQyxZQUE2QjtBQUdqQyxZQUFNLFVBQVUsUUFBUTtBQUN4QixZQUFNLGlCQUFpQixNQUFNLEtBQUssT0FBTztBQUd6QyxXQUFLLE9BQU8sS0FBSyxJQUFJLGlCQUFpQixLQUFLLElBQUksT0FBTyxDQUFDO0FBR3ZELGNBQVEsVUFBVTtBQUNsQixhQUFPO0FBQUEsSUFDWDtBQUVBLG1DQUFVLE1BQU07QUFDWixVQUFJLEtBQUs7QUFDTCxhQUFLLEtBQUssSUFBSSx1QkFBdUIsU0FBUyxDQUFDO0FBQ25ELFlBQU0sUUFBUTtBQUFBLElBQ2xCO0FBQUEsRUF2REE7QUFBQSxFQUVBLE9BQU87QUFFSCxTQUFLLEtBQUssSUFBSSx1QkFBdUIsTUFBTSxDQUFDO0FBQUEsRUFDaEQ7QUFBQSxFQUVBLE9BQU87QUFDSCxTQUFLLEtBQUssSUFBSSx1QkFBdUIsTUFBTSxDQUFDO0FBQUEsRUFDaEQ7QUFBQSxFQUVBLFVBQVU7QUFHTixXQUFPLEtBQUssS0FBSyxJQUFJLHVCQUF1QixTQUFTLENBQUM7QUFBQSxFQUMxRDtBQUFBLEVBRUEsa0NBQWtDO0FBRTlCLFNBQUssS0FBSyxJQUFJLHVCQUF1QixpQ0FBaUMsQ0FBQztBQUFBLEVBQzNFO0FBQUEsRUFFQSwrQkFBK0I7QUFFM0IsU0FBSyxLQUFLLElBQUksdUJBQXVCLDhCQUE4QixDQUFDO0FBQUEsRUFDeEU7QUFBQSxFQUVBLGtCQUFrQixlQUF5QztBQU12RCxXQUFPLE1BQU0sa0JBQWtCLGFBQWE7QUFBQSxFQUNoRDtBQXNCSjs7O0FDakRBLElBQU0sbUJBQW1CLENBQUMsTUFBYyxLQUFhLDhCQUEwRDtBQUMzRyxRQUFNLFVBQVUsU0FBUyxjQUFjLEdBQUc7QUFDMUMsVUFBUSxjQUFjO0FBQ3RCLFVBQVEsTUFBTSxXQUFXO0FBQ3pCLFVBQVEsTUFBTSxVQUFVO0FBQ3hCLFVBQVEsTUFBTSxXQUFXO0FBQ3pCLFVBQVEsTUFBTSxLQUFLLElBQUk7QUFDdkIsVUFBUSxNQUFNLE1BQU0sR0FBRyxHQUFHO0FBRTFCLFVBQVEsTUFBTSxZQUFZO0FBQzFCLFVBQVEsU0FBUztBQUNqQixVQUFRLE9BQU8sa0RBQWtELDBCQUEwQixFQUFFO0FBRTdGLFNBQU87QUFDWDtBQUVPLElBQU0sZ0JBQWdCLENBQUMsSUFDQSxNQUNBLEtBQ0EsV0FDQSxrQkFDQSw4QkFDVDtBQUlqQixRQUFNLFVBQVUsaUJBQWlCLEdBQUcsMEJBQTBCLElBQUksTUFBTSxJQUFJLElBQUksS0FBSyx5QkFBeUI7QUFDOUcsWUFBVSxhQUFhLFNBQVMsZ0JBQWdCO0FBQ2hELG1CQUFpQixNQUFNLFNBQVM7QUFDaEMsbUJBQWlCLE1BQU0sVUFBVTtBQUVqQyxTQUFPLE1BQU07QUFDVCxxQkFBaUIsTUFBTSxTQUFTO0FBQ2hDLGNBQVUsWUFBWSxPQUFPO0FBQUEsRUFDakM7QUFDSjtBQUVBLElBQU0sY0FBYyxDQUFDLFlBQXlCLFVBQWtCLGNBQXdDO0FBQ3BHLE1BQUksQ0FBQyxZQUFZO0FBRWIsWUFBUTtBQUFBO0FBQUEsTUFFSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFHYyxRQUFRO0FBQUEsYUFDUixVQUFVLG9CQUFvQixJQUFJLFNBQVMsVUFBVSxvQkFBb0IsRUFBRTtBQUFBO0FBQUEsbUdBQ1csVUFBVSxvQkFBb0IsRUFBRTtBQUFBLElBQ3hJO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDQSxTQUFPO0FBQ1g7QUFFQSxJQUFNLG9CQUFvQixDQUFDLFlBQXlCLFVBQWtCLGNBQXdDO0FBQzFHLFVBQVE7QUFBQSxJQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFJYyxRQUFRO0FBQUEsYUFDUixVQUFVLG9CQUFvQixJQUFJLFNBQVMsVUFBVSxvQkFBb0IsRUFBRTtBQUFBO0FBQUEsbUdBQ1csVUFBVSxvQkFBb0IsRUFBRTtBQUFBLEVBQ3hJO0FBQ0o7QUFFTyxJQUFNLGVBQWUsQ0FBcUMsV0FBMkIsYUFBNEIsaUJBQThCO0FBRWxKLFFBQU0sV0FBVyxZQUFZLE9BQU8sQ0FBQyxlQUFlLGlCQUFpQjtBQUNqRSxXQUFPLGlDQUNBLGdCQURBO0FBQUEsTUFFSCxDQUFDLGFBQWEsSUFBSSxHQUFHLG1CQUFJO0FBQUEsSUFDN0I7QUFBQSxFQUNKLEdBQUcsQ0FBQyxDQUFDO0FBRUwsUUFBTSxlQUFlO0FBQUEsSUFDakIsS0FBSyxDQUFDLEdBQW1CLFNBQWlCO0FBRXRDLFlBQU0sYUFBYSxTQUFTLElBQUk7QUFFaEMsVUFBSSxZQUFZLFlBQVksTUFBTSxTQUFTLEdBQUc7QUFDMUMsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLFdBQVcsU0FBUyxTQUFTLHdCQUF3QixNQUFNO0FBRTNELFlBQUksYUFBYSxPQUFPLFNBQVMsWUFBWSxZQUFZO0FBQ3JELGdCQUFNLGNBQWMsYUFBYTtBQUVqQyxjQUFJLFlBQVksbUJBQW1CLG1CQUFtQixZQUFZO0FBQzlELGtCQUFNLG9CQUFvQixXQUFXO0FBRXJDLG1CQUFPLFVBQVUsUUFBUSxjQUFjLGtCQUFrQixTQUFTLElBQUk7QUFBQSxVQUMxRTtBQUFBLFFBQ0o7QUFFQSwwQkFBa0IsWUFBWSxNQUFNLFNBQVM7QUFDN0MsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLFdBQVcsU0FBUyxVQUFVO0FBQzlCLGVBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM1QixnQkFBTSxnQkFBdUIsQ0FBQztBQUU5QixjQUFJLFdBQVcsU0FBUyxLQUFLO0FBQ3pCLDBCQUFjLEtBQUssSUFBSSxPQUFPLFdBQVcsU0FBUyxHQUFHLENBQUM7QUFBQSxVQUMxRDtBQUVBLHdCQUFjLEtBQUssQ0FBQyxTQUFjO0FBQzlCLG9CQUFRLElBQUk7QUFBQSxVQUNoQixDQUFDO0FBRUQsY0FBSSxXQUFXLFNBQVMsUUFBUTtBQUM1QiwwQkFBYyxLQUFLLEdBQUcsV0FBVyxTQUFTLE1BQU07QUFBQSxVQUNwRDtBQUdBLGdCQUFNLGNBQWMsaUJBQVMsV0FBVyxTQUFTLE9BQU87QUFFeEQsb0JBQVUsS0FBSyxJQUFJLFlBQVksR0FBRyxhQUFhLENBQUM7QUFBQSxRQUNwRCxDQUFDO0FBQUEsTUFDTDtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxLQUFLLENBQUMsR0FBbUIsTUFBYyxVQUFlO0FBRWxELFlBQU0sYUFBYSxTQUFTLElBQUk7QUFFaEMsVUFBSSxZQUFZLFlBQVksTUFBTSxTQUFTLEdBQUc7QUFDMUMsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLFdBQVcsU0FBUyxTQUFTLHdCQUF3QixNQUFNO0FBQzNELFlBQUksYUFBYSxPQUFPLFNBQVMsWUFBWSxZQUFZO0FBQ3JELGdCQUFNLGNBQWMsYUFBYTtBQUVqQyxjQUFJLFlBQVksbUJBQW1CLG1CQUFtQixZQUFZO0FBQzlELGtCQUFNLG9CQUFvQixXQUFXO0FBRXJDLHNCQUFVLFFBQVEsY0FBYyxrQkFBa0IsU0FBUyxJQUFJLElBQUk7QUFFbkUsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSjtBQUVBLDBCQUFrQixZQUFZLE1BQU0sU0FBUztBQUM3QyxlQUFPO0FBQUEsTUFDWCxPQUFPO0FBRUgsWUFBSSxXQUFXLFNBQVMsU0FBUztBQUc3QixjQUFJLFdBQVcsU0FBUyxTQUFTLFdBQVc7QUFDeEMsa0JBQU0sZ0JBQXVCLENBQUM7QUFFOUIsZ0JBQUksV0FBVyxTQUFTLEtBQUs7QUFDekIsNEJBQWMsS0FBSyxJQUFJLE9BQU8sV0FBVyxTQUFTLEdBQUcsQ0FBQztBQUFBLFlBQzFEO0FBQ0EsMEJBQWMsS0FBSyxLQUFLO0FBQ3hCLGdCQUFJLFdBQVcsU0FBUyxRQUFRO0FBQzVCLDRCQUFjLEtBQUssR0FBRyxXQUFXLFNBQVMsTUFBTTtBQUFBLFlBQ3BEO0FBR0Esa0JBQU0sY0FBYyxpQkFBUyxXQUFXLFNBQVMsT0FBTztBQUN4RCxzQkFBVSxLQUFLLElBQUksWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUNoRCxtQkFBTztBQUFBLFVBQ1gsT0FBTztBQUNILGtCQUFNLElBQUk7QUFBQSxjQUNOO0FBQUE7QUFBQTtBQUFBLGFBRWMsVUFBVSxvQkFBb0IsSUFBSSxTQUFTLFVBQVUsb0JBQW9CLEVBQUU7QUFBQTtBQUFBLGFBQzNFLElBQUk7QUFBQSxrQkFDQyxXQUFXLFNBQVMsSUFBSTtBQUFBO0FBQUE7QUFBQSxZQUUvQztBQUVBLG1CQUFPO0FBQUEsVUFDWDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBRUEsWUFBVSxRQUFRLENBQUM7QUFDbkIsWUFBVSxRQUFRLElBQUksTUFBTSxVQUFVLE9BQU8sWUFBWTtBQUV6RCxTQUFPO0FBR1g7QUFFTyxJQUFNLGlCQUFpQixDQUFDLFFBQWEsY0FBOEI7QUFDdEUsU0FBTyxJQUFJLE1BQU0sUUFBUTtBQUFBLElBQ3JCLElBQUlDLFNBQVEsTUFBTTtBQU9kLFVBQUlBLFFBQU8sSUFBSSxHQUFHO0FBRWQsZUFBT0EsUUFBTyxJQUFJO0FBQUEsTUFDdEI7QUFHQSxZQUFNLGlCQUFpQixJQUFJLFNBQVM7QUFDaEMsZUFBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzVCLGVBQUssUUFBUSxTQUFPO0FBQ2hCLGdCQUFJLENBQUMsdUJBQXVCLEdBQUcsR0FBRztBQUM5QixxQkFBTyx1QkFBdUIsTUFBTSxHQUFHO0FBQUEsWUFDM0M7QUFBQSxVQUNKLENBQUM7QUFDRCxvQkFBVSxLQUFLLElBQUk7QUFBQSxZQUFpQixDQUFDLEVBQUMsS0FBSyxVQUFVLGNBQWMsa0JBQUFDLGtCQUFnQixNQUFNO0FBQ2pGLGtCQUFJLEtBQUs7QUFFTCxzQkFBTSxRQUFRLElBQUksUUFBUTtBQUMxQixvQkFBSSxPQUFPLFVBQVUsWUFBWTtBQUU3Qix5QkFBT0Esa0JBQWlCLElBQUksUUFBUSxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUk7QUFBQSxnQkFDaEUsT0FBTztBQUVILHlCQUFPQSxrQkFBaUIsT0FBTyxJQUFJO0FBQUEsZ0JBQ3ZDO0FBQUEsY0FDSjtBQUNBLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFlBQ0E7QUFBQTtBQUFBLGNBRUksV0FBV0QsUUFBTyxVQUFVO0FBQUEsY0FDNUIsVUFBVTtBQUFBLGNBQ1YsY0FBYztBQUFBLFlBQ2xCO0FBQUEsWUFDQSxDQUFDLFFBQVE7QUFDTCxzQkFBUSxJQUFJLE9BQU87QUFBQSxZQUN2QjtBQUFBLFVBQUMsQ0FBQztBQUFBLFFBQ1YsQ0FBQztBQUFBLE1BQ0w7QUFLQSxhQUFPO0FBQUEsSUFHWDtBQUFBLElBQ0EsSUFBSUEsU0FBUSxNQUFjLE9BQU87QUFDN0IsZ0JBQVUsS0FBSyxJQUFJO0FBQUEsUUFBaUIsQ0FBQyxFQUFDLEtBQUssVUFBVSxVQUFTLE1BQU07QUFDNUQsY0FBSTtBQUVBLGdCQUFJLFFBQVEsSUFBSTtBQUFBLFFBQ3hCO0FBQUEsUUFDQTtBQUFBO0FBQUEsVUFFSSxXQUFXQSxRQUFPLFVBQVU7QUFBQSxVQUM1QixXQUFXO0FBQUEsVUFDWCxVQUFVO0FBQUEsUUFDZDtBQUFBLFFBQ0EsQ0FBQyxRQUFRO0FBQUEsUUFFVDtBQUFBLE1BQUMsQ0FBQztBQUNOLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSixDQUFDO0FBQ0w7QUFFTyxJQUFNLHFCQUFxQixDQUFrRCxLQUFVLGlCQUFtQyxZQUE4QixZQUF3QztBQUNuTSxRQUFNLFlBQVksSUFBSTtBQUN0QixNQUFJLENBQUM7QUFDRCxVQUFNLElBQUksTUFBTSwyQ0FBMkM7QUFJL0QsU0FBTyxJQUFJLFFBQVEsQ0FBTyxTQUFTLFdBQVc7QUFDMUMsVUFBTSxlQUFlLElBQUksaUJBQWlCLGdCQUFnQixNQUFNLFdBQVcsT0FBTztBQUNsRixlQUFXLEtBQUssWUFBWTtBQUk1QixVQUFNLFVBQVUsVUFBVTtBQUkxQixVQUFNLFVBQVUsV0FBVyxNQUFNO0FBRTdCLGFBQU8sU0FBUztBQUFBLElBQ3BCLEdBQUcsR0FBSTtBQUVQLGNBQVUsS0FBSyxJQUFJO0FBQUEsTUFBMEIsSUFBSTtBQUFBLE1BQzdDO0FBQUEsTUFDQSxpQ0FDTyxVQUFVLFVBQVUsQ0FBQyxJQUQ1QjtBQUFBLFFBRUksSUFBSSxhQUFhO0FBQUEsUUFDakIsWUFBWTtBQUFBLE1BQ2hCO0FBQUEsTUFDQSxDQUFPLFlBQVk7QUFHZixxQkFBYSxPQUFPO0FBRXBCLFlBQUksUUFBUSxRQUFRO0FBRWhCLGlCQUFPLGtDQUFrQztBQUN6QztBQUFBLFFBQ0o7QUFFQSxjQUFNLDBCQUEwQixXQUFXLEtBQUssT0FBSyxFQUFFLE1BQU0sYUFBYSxFQUFFO0FBRzVFLFlBQUksNEJBQTRCLGNBQWM7QUFHMUMsb0JBQVUsS0FBSyxJQUFJLFVBQVUsSUFBSSxJQUFJO0FBQ3JDLGtCQUFRLHVCQUF1QztBQUMvQztBQUFBLFFBQ0osT0FBTztBQUNILHVCQUFhLGFBQWE7QUFDMUIsb0JBQVUsS0FBSyxJQUFJLFVBQVUsSUFBSSxJQUFJO0FBQUEsUUFDekM7QUFtQkEsZ0JBQVEsV0FBVyxRQUFRLHFCQUFtQjtBQUMxQyxnQkFBTSw0QkFBNEIsZ0JBQWdCLFNBQVMseUJBQTBCLEtBQUssT0FBSyxFQUFFLEtBQUssT0FBTyxnQkFBZ0IscUJBQXFCLEVBQUc7QUFTckosZ0JBQU0sa0JBQWtCLElBQUksaUJBQWlCLDJCQUEyQixZQUFZO0FBQ3BGLDBCQUFnQixhQUFhO0FBQzdCLHVCQUFhLEtBQUssZ0JBQWdCLE9BQU8sSUFBSTtBQUM3QyxxQkFBVyxLQUFLLGVBQWU7QUFBQSxRQUNuQyxDQUFDO0FBR0QsWUFBSTtBQUNBLGdCQUFNLFlBQVksY0FBYyxpQkFBaUIsWUFBWSxJQUFJO0FBSWpFLGNBQUksVUFBVTtBQUVWLHNCQUFVLDZCQUE2QjtBQUUzQyxrQkFBUSxZQUE0QjtBQUFBLFFBQ3hDLFNBQVMsR0FBRztBQUVSLGlCQUFPLENBQUM7QUFBQSxRQUVaO0FBQUEsTUFDSjtBQUFBLElBQUMsQ0FBQztBQUFBLEVBQ1YsRUFBQztBQUNMO0FBRU8sSUFBTSxjQUFjLENBQU8sV0FBMkIsaUJBQW1DLFlBQThCLHVCQUFnQyxVQUFVO0FBRXBLLE1BQUksQ0FBQyxVQUFVO0FBQ1gsY0FBVSxPQUFPLENBQUM7QUFFdEIsUUFBTSxVQUFVLE9BQU8sT0FBTyxVQUFVLG9CQUFvQixJQUFJLEVBQUUsSUFBSSxTQUFPO0FBQ3pFLFdBQU8sSUFBSSxRQUFjLENBQU8sU0FBUyxXQUFXO0FBL1k1RDtBQWdaWSxVQUFJLElBQUksU0FBUyxRQUFRLGdCQUFnQixXQUFXO0FBR2hELFlBQUksc0JBQXNCO0FBQ3RCLGtCQUFRO0FBQ1I7QUFBQSxRQUNKO0FBSUEsWUFBSSxpQkFBa0IsSUFBSSxTQUFtQztBQUM3RCxZQUFJLENBQUM7QUFDRCwyQkFBa0IsSUFBSSxTQUFtQyxTQUFTO0FBZXRFLGNBQU0seUJBQXdCLHFCQUFnQixTQUFTLDZCQUF6QixtQkFBbUQsS0FBSyxxQkFBbUIsZ0JBQWdCLEtBQUssT0FBTztBQUVySSxZQUFJLENBQUMsdUJBQXVCO0FBQ3hCLGdCQUFNLElBQUksTUFBTSxnRkFBZ0Y7QUFDaEc7QUFBQSxRQUNKO0FBZ0JBLGNBQU0sT0FBTyxJQUFJLE9BQU8sSUFBSSxLQUFLLFNBQVM7QUFFMUMsWUFBSTtBQUVBLGdCQUFNLGtCQUFrQixNQUFNLG1CQUFtQixNQUFNLHVCQUF3QixVQUFVO0FBSXpGLG9CQUFVLEtBQUssSUFBSSxJQUFJLElBQUk7QUFFM0Isa0JBQVE7QUFBQSxRQUNaLFNBQVMsR0FBRztBQUNSLGlCQUFPLENBQUM7QUFBQSxRQUNaO0FBQUEsTUFDSixPQUFPO0FBQ0gsWUFBSTtBQUNBLGdCQUFNLGVBQWUsSUFBSSxPQUFPLElBQUksS0FBSyxTQUFTO0FBQ2xELG9CQUFVLEtBQUssSUFBSSxJQUFJLElBQUksZUFBZSxjQUFjLFNBQVM7QUFDakUsa0JBQVE7QUFBQSxRQUNaLFNBQVMsR0FBRztBQUFBLFFBRVo7QUFBQSxNQUNKO0FBQUEsSUFDSixFQUFDO0FBQUEsRUFDTCxDQUFDO0FBQ0QsTUFBSTtBQUNBLFVBQU0sUUFBUSxJQUFJLE9BQU87QUFBQSxFQUM3QixTQUFTLEdBQUc7QUFFUixVQUFNO0FBQUEsRUFDVjtBQUVKOzs7QUNyZE8sSUFBTSxzQkFBTixjQUFrQyxrQkFBa0I7QUFBQSxFQUV2RCxZQUFtQixpQkFBNkMsTUFBMEIsV0FBZ0MsZUFBa0MsU0FBeUI7QUFDakwsVUFBTSxpQkFBaUIsV0FBVyxPQUFPO0FBRDFCO0FBQXVFO0FBQWdDO0FBZTFIO0FBNkJBLDJEQUFrQyxNQUFNO0FBQ3BDLFlBQU0saUJBQWlCLEtBQUssS0FBSyxJQUFJLHFCQUFxQixNQUFNO0FBQzVELGVBQU8sT0FBTyxTQUFTLGdCQUFnQjtBQUFBLE1BQzNDLEdBQUcsQ0FBQyxRQUFRO0FBQ1IsYUFBSyxjQUFjLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTztBQUNoRCx1QkFBZTtBQUFBLE1BQ25CLENBQUMsQ0FBQztBQUFBLElBQ047QUFFQSw2REFBb0MsTUFBTTtBQUN0QyxZQUFNLGlCQUFpQixLQUFLLEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxFQUFDLEtBQUksTUFBTTtBQUNsRSxjQUFNLEVBQUMsUUFBUSxNQUFLLElBQUksU0FBUyxnQkFBZ0Isc0JBQXNCO0FBRXZFLGNBQU0sV0FBVyxJQUFJLGVBQWUsTUFBTTtBQUN0QyxnQkFBTSxFQUFDLFFBQUFFLFNBQVEsT0FBQUMsT0FBSyxJQUFJLFNBQVMsZ0JBQWdCLHNCQUFzQjtBQUN2RSxlQUFLLEVBQUMsUUFBQUQsU0FBUSxPQUFBQyxPQUFLLENBQUM7QUFBQSxRQUN4QixDQUFDO0FBQ0QsaUJBQVMsUUFBUSxTQUFTLGVBQWU7QUFDekMsaUJBQVMsUUFBUSxTQUFTLElBQUk7QUFFOUIsZUFBTyxFQUFDLFFBQVEsTUFBSztBQUFBLE1BQ3pCLEdBQUcsQ0FBQyxRQUFRO0FBQ1IsYUFBSyxjQUFjLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxLQUFLO0FBQ3JELGFBQUssY0FBYyxNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsTUFBTTtBQUFBLE1BQzNELENBQUMsQ0FBQztBQUVGLGFBQU87QUFBQSxJQUNYO0FBRUEseURBQWdDLE1BQU07QUFDbEMsWUFBTSxpQkFBaUIsS0FBSyxLQUFLLElBQUkscUJBQXFCLE1BQU07QUFDNUQsY0FBTSxFQUFDLFFBQVEsTUFBSyxJQUFJLFNBQVMsZ0JBQWdCLHNCQUFzQjtBQUN2RSxlQUFPLEVBQUMsUUFBUSxNQUFLO0FBQUEsTUFDekIsR0FBRyxDQUFDLFFBQVE7QUFDUixhQUFLLGNBQWMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDckQsYUFBSyxjQUFjLE1BQU0sU0FBUyxHQUFHLElBQUksUUFBUSxNQUFNO0FBQ3ZELHVCQUFlO0FBQUEsTUFDbkIsQ0FBQyxDQUFDO0FBQUEsSUFDTjtBQUVBLHdEQUErQixNQUFNO0FBQ2pDLFlBQU0saUJBQWlCLEtBQUssS0FBSyxJQUFJLHFCQUFxQixNQUFNO0FBTTVELGNBQU0sT0FBTyxNQUFNO0FBRWYsaUJBQU87QUFBQSxRQUNYO0FBRUEsWUFBSSxJQUFJLEtBQUs7QUFDYjtBQUNBO0FBS0EsZUFBTyxLQUFLO0FBQUEsVUFBSSxLQUFLO0FBQUEsWUFDYixPQUFPLFNBQVMsS0FBSztBQUFBLFlBQ3JCLE9BQU8sU0FBUyxLQUFLO0FBQUEsVUFBWTtBQUFBLFVBQ25DLE9BQU8sU0FBUyxLQUFLO0FBQUEsUUFBWSxJQUFJLElBQUk7QUFBQSxNQUVuRCxHQUFHLENBQUMsUUFBUTtBQUNSLGFBQUssY0FBYyxNQUFNLFNBQVMsSUFBSTtBQUN0Qyx1QkFBZTtBQUFBLE1BQ25CLENBQUMsQ0FBQztBQUFBLElBQ047QUFFQSxnQ0FBTyxDQUFDLFlBQTZDO0FBL0h6RDtBQWdJUSxVQUFJLFdBQVcsbUJBQUk7QUFFbkIsVUFBSSxTQUFTLGdCQUFnQixhQUFhLHdCQUF3QjtBQUM5RCxjQUFNLGVBQWdCO0FBQ3RCLGFBQUssYUFBYSxNQUFNLEVBQUU7QUFDMUIsZUFBTyxNQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0o7QUFNQSxlQUFTLFlBQVksaUJBQWlCO0FBQ3RDLFlBQU0saUJBQWlCLE1BQU0sS0FBSyxRQUFRO0FBQzFDLHVCQUFLLGtCQUFMLG1CQUFvQixrQkFBcEIsbUJBQW1DLFlBQVksVUFBVTtBQUt6RCxhQUFPO0FBQUEsSUFDWDtBQWNBLG1DQUFVLE1BQU07QUFDWixVQUFJLEtBQUs7QUFDTCxhQUFLLGVBQWU7QUFFeEIsWUFBTSxRQUFRO0FBQ2QsV0FBSyxjQUFjLFdBQVksWUFBWSxLQUFLLGFBQWE7QUFBQSxJQUNqRTtBQXpKSSxRQUFLLEtBQUssT0FBK0IsWUFBWTtBQUNqRCxXQUFLLFVBQVUsRUFBRSxLQUFLLE1BQU07QUFDeEIsYUFBSyw2QkFBNkI7QUFBQSxNQUN0QyxDQUFDO0FBQUEsSUFDTDtBQUNBLFNBQUssVUFBVSxLQUFLO0FBQUEsRUFLeEI7QUFBQSxFQUlBLFVBQVU7QUFFTixRQUFJLEtBQUssZ0JBQWdCO0FBRXJCLGFBQU8sS0FBSztBQUFBLElBQ2hCO0FBQ0EsU0FBSyxpQkFBaUIsY0FBYyxLQUFLLElBQUksdUJBQXVCLElBQUksS0FBSyxXQUFXLEtBQUssZUFBZSxLQUFLLG1CQUFtQjtBQUNwSSxXQUFPLE1BQU07QUFDVCxXQUFLLGVBQWdCO0FBQ3JCLFdBQUssaUJBQWlCO0FBQUEsSUFDMUI7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFPO0FBQ0gsU0FBSyxjQUFjLE1BQU0sVUFBVTtBQUNuQyxTQUFLLGNBQWMsTUFBTSxXQUFXO0FBQ3BDLFNBQUssY0FBYyxNQUFNLGdCQUFnQjtBQUN6QyxTQUFLLGNBQWMsTUFBTSxhQUFhO0FBQUEsRUFDMUM7QUFBQSxFQUVBLE9BQU87QUFDSCxTQUFLLGNBQWMsTUFBTSxVQUFVO0FBQ25DLFNBQUssY0FBYyxNQUFNLFdBQVc7QUFDcEMsU0FBSyxjQUFjLE1BQU0sZ0JBQWdCO0FBQ3pDLFNBQUssY0FBYyxNQUFNLGFBQWE7QUFBQSxFQUMxQztBQUFBLEVBZ0dBLGtCQUFrQixlQUF5QztBQUN2RCxRQUFJLGNBQWMsZ0JBQWdCLGFBQWEsR0FBRywyQkFDM0MsY0FBYyxnQkFBZ0IsYUFBYSxHQUFHLHVCQUF1QjtBQUN4RSxXQUFLLDZCQUE2QjtBQUdsQyxhQUFPO0FBQUEsSUFDWDtBQUVBLFdBQU8sTUFBTSxrQkFBa0IsYUFBYTtBQUFBLEVBQ2hEO0FBU0o7OztBQ2pLTyxJQUFlLGlCQUFmLE1BQXFEO0FBQUEsRUFBckQ7QUFJSCx1Q0FBYyxDQUFDLFdBQXdCLFNBQXNCLFlBQTZCO0FBYjlGO0FBY1EsVUFBSSxtQ0FBUyxVQUFVO0FBQ25CLFlBQUksUUFBUSxTQUFTLGNBQWMsVUFBVTtBQUN6QyxpQkFBTyxVQUFVLGFBQWEsU0FBUyxRQUFRLFNBQVMsS0FBSztBQUFBLFFBQ2pFO0FBRUEsWUFBSSxRQUFRLFNBQVMsY0FBYyxTQUFTO0FBQ3hDLGdCQUFNLGVBQWMsYUFBUSxTQUFTLFVBQWpCLG1CQUF3QjtBQUM1QyxpQkFBTyxVQUFVLGFBQWEsU0FBUyxjQUFjLGNBQWMsSUFBSTtBQUFBLFFBQzNFO0FBQUEsTUFDSixPQUFPO0FBQ0gsZUFBTyxVQUFVLFlBQVksT0FBTztBQUFBLE1BQ3hDO0FBQUEsSUFDSjtBQUFBO0FBQ0o7OztBQ3JCQSxJQUFNLGdCQUFnQixDQUFDLEtBQWEsT0FBZSxVQUFrQjtBQUVqRSxRQUFNLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFHMUIsU0FBTyxhQUFhLE9BQU8sT0FBTyxLQUFLO0FBR3ZDLFNBQU8sT0FBTyxTQUFTO0FBQzNCO0FBRU8sSUFBTSxtQkFBTixjQUErQixlQUFlO0FBQUEsRUFBOUM7QUFBQTtBQUNILGdDQUFPLFlBQVk7QUFHbkI7QUFBQSxnQ0FBTyxDQUFPLHFCQUFpRCxNQUFtQixXQUF3QixZQUE0QjtBQUNsSSxVQUFJO0FBRUosWUFBTSxvQkFBcUIsS0FBSztBQUVoQyxXQUFJLHVDQUFXLGNBQWEsVUFBVTtBQUNsQyxnQkFBUSxJQUFJLDZDQUE2QyxrQkFBa0IsS0FBSyxTQUFTO0FBRXpGLHdCQUFpQjtBQUNqQixzQkFBYyxNQUFNLGtCQUFrQjtBQUFBLE1BQzFDLE9BQU87QUFDSCxjQUFNLFNBQVMsT0FBTztBQUN0QixjQUFNLFFBQVEsYUFBYSxNQUFNO0FBR2pDLHdCQUFnQixTQUFTLGNBQWMsUUFBUTtBQUcvQyxZQUFJLENBQUMsVUFBVSxjQUFjLG9CQUFvQjtBQUM3QyxvQkFBVSxZQUFZO0FBRzFCLFlBQUksbUNBQVMsUUFBUTtBQUNqQix3QkFBYyxNQUFNLGFBQWE7QUFBQSxRQUNyQztBQUVBLHdCQUFnQixLQUFLLFlBQVksV0FBVyxlQUFlLE9BQU87QUFHbEUsWUFBSSxXQUFZLEtBQUssT0FBK0I7QUFFcEQsWUFBSSxtQ0FBUztBQUNULHFCQUFXLGNBQWMsVUFBVSxjQUFjLE1BQU07QUFHM0QsWUFBSSwwQkFBMEI7QUFDOUIsWUFBSSxtQ0FBUztBQUNULG9DQUEwQixPQUFPLFFBQVEsbUNBQVMsaUJBQWlCLEVBQzlELElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNO0FBQ3BCLGdCQUFJLFVBQVUsTUFBTSxVQUFVLFFBQVEsVUFBVSxRQUFXO0FBQ3RELHFCQUFPO0FBQUEsWUFDWDtBQUNBLG1CQUFPLEdBQUcsR0FBRyxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQUEsVUFDbkMsQ0FBQyxFQUNBLEtBQUssR0FBRztBQUVqQixzQkFBYyxZQUFZO0FBQUEscUJBQ2pCLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSw2QkFJRyxrQkFBa0IsY0FBYyxDQUFDLGtCQUFrQixTQUFTLEtBQUssa0JBQWtCLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSwrQkFJeEYsbUNBQVMsVUFBUyxNQUFNLEdBQUc7QUFBQSxnQ0FDMUIsbUNBQVMsVUFBUyxhQUFhLFFBQVE7QUFBQSxzQ0FDakMsbUNBQVMsVUFBUyxTQUFTLEtBQUs7QUFBQTtBQUFBLG1CQUVsRCxRQUFRO0FBQUEsY0FDYix1QkFBdUI7QUFBQTtBQUd6Qix3QkFBZ0IsVUFBVSxjQUFjLElBQUksS0FBSyxFQUFFO0FBQUEsTUFJdkQ7QUFFQSxhQUFPLElBQUksb0JBQW9CLHFCQUFxQixNQUFNLFdBQVcsZUFBZSxPQUFPO0FBQUEsSUFDL0Y7QUFBQTtBQUNKOzs7QUNyRk8sSUFBTSxtQkFBTixjQUErQixrQkFBa0I7QUFBQSxFQUVwRCxZQUFZLHFCQUFpRCxNQUEwQixXQUFnQyxlQUE0QixTQUF5QjtBQUN4SyxVQUFNLHFCQUFxQixXQUFZLE9BQU87QUFEcUM7QUFBZ0M7QUFLdkgsMENBQWlDLE1BQU07QUFBQSxJQUN2QztBQXlCQSxnQ0FBTyxDQUFDLFlBQWtDO0FBQ3RDLFVBQUksV0FBVyxtQkFBSTtBQUtuQixZQUFNLGlCQUFpQixNQUFNLEtBQUssUUFBUTtBQUUxQyxZQUFNLE1BQU0sSUFBSSxZQUE2Qix1QkFBdUIsMEJBQTBCO0FBQUE7QUFBQSxRQUUxRixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJWixDQUFDO0FBS0QsVUFBSTtBQUNBLGFBQUssY0FBYyxjQUFjLEdBQUc7QUFBQSxNQUt4QyxTQUFTLEdBQUc7QUFDUixnQkFBUSxJQUFJLHVDQUF1QyxDQUFDO0FBQUEsTUFDeEQ7QUFLQSxhQUFPO0FBQUEsSUFDWDtBQUVBLG1DQUFVLE1BQU07QUEzRXBCO0FBNEVRLFlBQU0sUUFBUTtBQUNkLGlCQUFLLGNBQWMsZUFBbkIsbUJBQStCLFlBQVksS0FBSztBQUFBLElBQ3BEO0FBbkVJLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFLQSxVQUFVO0FBQ04sU0FBSyxpQkFBaUIsY0FBYyxLQUFLLElBQUksb0JBQW9CLEdBQUcsS0FBSyxXQUFXLEtBQUssZUFBZSxLQUFLLG1CQUFtQjtBQUNoSSxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRUEsT0FBTztBQUNILFNBQUssY0FBYyxNQUFNLFVBQVU7QUFDbkMsU0FBSyxjQUFjLE1BQU0sV0FBVztBQUNwQyxTQUFLLGNBQWMsTUFBTSxnQkFBZ0I7QUFDekMsU0FBSyxjQUFjLE1BQU0sYUFBYTtBQUN0QyxTQUFLLGNBQWMsTUFBTSxTQUFTO0FBQ2xDLFNBQUssY0FBYyxNQUFNLFFBQVE7QUFBQSxFQUNyQztBQUFBLEVBRUEsT0FBTztBQUNILFNBQUssY0FBYyxNQUFNLFVBQVU7QUFDbkMsU0FBSyxjQUFjLE1BQU0sV0FBVztBQUNwQyxTQUFLLGNBQWMsTUFBTSxnQkFBZ0I7QUFDekMsU0FBSyxjQUFjLE1BQU0sYUFBYTtBQUN0QyxTQUFLLGNBQWMsTUFBTSxTQUFTO0FBQ2xDLFNBQUssY0FBYyxNQUFNLFFBQVE7QUFBQSxFQUNyQztBQXlDSjs7O0FDekVBLElBQU0sT0FBc0MsQ0FBQztBQUV0QyxJQUFNLHFCQUFOLGNBQWlDLGVBQWU7QUFBQSxFQUFoRDtBQUFBO0FBRUgsZ0NBQU8sWUFBWTtBQUVuQixnQ0FBTyxDQUFPLHFCQUFpRCxNQUFtQixXQUF3QixZQUE0QjtBQUVsSSxZQUFNLGVBQWdCLEtBQUs7QUFFM0IsVUFBSSxDQUFDLEtBQUssYUFBYSxHQUFHLEdBQUc7QUFHekIsYUFBSyxhQUFhLEdBQUcsSUFBSSxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEQsZ0JBQU0sc0JBQXNCLGFBQWE7QUFDekMsZ0JBQU0sU0FBUyxTQUFTLGNBQWMsUUFBUTtBQUM5QyxpQkFBTyxPQUFPO0FBQ2QsaUJBQU8sTUFBTTtBQUNiLGlCQUFPLFNBQVMsTUFBTTtBQUNsQixvQkFBUTtBQUFBLFVBQ1o7QUFFQSxpQkFBTyxVQUFVLE1BQU07QUFDbkIsbUJBQU87QUFBQSxVQUNYO0FBQ0EsbUJBQVMsS0FBSyxZQUFZLE1BQU07QUFBQSxRQUNwQyxDQUFDO0FBQUEsTUFDTCxPQUFPO0FBQ0gsZ0JBQVEsSUFBSSw2Q0FBNkM7QUFBQSxNQUM3RDtBQUVBLFlBQU0sS0FBSyxhQUFhLEdBQUc7QUFLM0IsWUFBTSxLQUFLLENBQUM7QUFFWixVQUFJLFFBQVEsYUFBYSxPQUFPLENBQUM7QUFDakMsWUFBTSxVQUFVLFNBQVMsY0FBYyxhQUFhLEdBQUc7QUFHdkQsVUFBSSxDQUFDLFVBQVUsY0FBYyxvQkFBb0I7QUFDN0Msa0JBQVUsWUFBWTtBQUcxQixjQUFRLEtBQUs7QUFFYixVQUFJLG1DQUFTLFFBQVE7QUFDakIsZ0JBQVEsTUFBTSxVQUFVO0FBQ3hCLGdCQUFRLE1BQU0sV0FBVztBQUN6QixnQkFBUSxNQUFNLFNBQVM7QUFDdkIsZ0JBQVEsTUFBTSxRQUFRO0FBQ3RCLGdCQUFRLE1BQU0sZ0JBQWdCO0FBQzlCLGdCQUFRLE1BQU0sYUFBYTtBQUFBLE1BQy9CO0FBVUEsVUFBRyxtQ0FBUyxjQUFhO0FBRXJCLGdCQUFRLG1CQUFtQixtQ0FBUztBQUFBLE1BQ3hDO0FBRUEsV0FBSyxZQUFZLFdBQVcsU0FBUyxPQUFPO0FBRTVDLGFBQU8sSUFBSSxpQkFBaUIscUJBQXFCLE1BQU0sV0FBVyxTQUFTLE9BQU87QUFBQSxJQUN0RjtBQUFBO0FBRUo7OztBQ2pGQSxJQUFPLDJCQUFROzs7QUNjZixJQUFNQyxRQUFpQixDQUFDO0FBQ3hCLElBQUk7QUFDSixJQUFNLGtCQUFrQixNQUFZO0FBQ2hDLE1BQUksQ0FBQyxLQUFLO0FBRU4sVUFBTSxJQUFJLGdCQUFnQjtBQUMxQixRQUFJLEtBQUs7QUFBQSxFQUNiO0FBQ0EsU0FBTztBQUNYO0FBRUEsU0FBUyw2QkFBNkIsWUFBb0IsZ0JBQXlFO0FBQy9ILFNBQU8sY0FBYyxZQUFZO0FBQUEsSUFFN0Isb0JBQW9CO0FBQ2hCLFlBQU0sT0FBTyxtQkFBbUIsbUJBQW1CLE9BQU8sU0FBUztBQUNuRSxZQUFNLFNBQVMsS0FBSyxhQUFhLEVBQUMsS0FBSSxDQUFDO0FBQ3ZDLHNCQUFnQixFQUFFLEtBQUssQ0FBQ0MsU0FBUTtBQUM1QixRQUFBQSxLQUFJLGtCQUFrQixNQUFNLE1BQU07QUFDbEMsZUFBTyxZQUFZO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0o7QUFFQSxJQUFNLDJCQUEyQixDQUFDLGVBQXVCLE1BQWMsbUJBQXFEO0FBQ3hILGlCQUFlLE9BQU8sZUFBZSw2QkFBNkIsTUFBTSxjQUFjLENBQUM7QUFDdkYsVUFBUSxJQUFJLFdBQVcsYUFBYSwyQ0FBMkM7QUFDbkY7QUFFQSxJQUFNLHFCQUFxQixDQUFDLFFBQVE7QUFDaEMsU0FBTyxJQUNGLFFBQVEsbUJBQW1CLE9BQU8sRUFDbEMsUUFBUSxVQUFVLEtBQUssRUFDdkIsWUFBWTtBQUNyQjtBQUVBLElBQU0sc0JBQXNCLENBQUMsU0FBaUI7QUFDMUMsU0FBTyxtQkFBbUIsSUFBSTtBQUM5QixTQUFPLEtBQUssUUFBUSxNQUFNLEdBQUc7QUFDakM7QUFJTyxJQUFNLHNCQUFOLGNBQWtDLGVBQWU7QUFBQSxFQUFqRDtBQUFBO0FBRUgsZ0NBQU8sWUFBWTtBQUVuQixnQ0FBTyxDQUFPLHFCQUFpRCxNQUFtQixXQUF3QixZQUE0QjtBQUVsSSxZQUFNLGVBQWdCLEtBQUs7QUFDM0IsVUFBSSxRQUFRLGFBQWEsT0FBTyxDQUFDO0FBQ2pDLFVBQUk7QUFFSixVQUFJLGFBQWEsbUJBQW1CLG1CQUFtQixZQUFZO0FBQy9ELGNBQU0sU0FBUyxPQUFPO0FBQ3RCLGNBQU1DLFNBQVEsYUFBYSxNQUFNO0FBR2pDLFlBQUksZ0JBQWdCLFNBQVMsY0FBYyxRQUFRO0FBR25ELFlBQUksQ0FBQyxVQUFVLGNBQWMsb0JBQW9CO0FBQzdDLG9CQUFVLFlBQVk7QUFFMUIsWUFBSSxtQ0FBUyxRQUFRO0FBQ2pCLHdCQUFjLE1BQU0sYUFBYTtBQUFBLFFBQ3JDO0FBRUEsd0JBQWdCLEtBQUssWUFBWSxXQUFXLGVBQWUsT0FBTztBQUNsRSxzQkFBYyxLQUFLQTtBQUNuQixzQkFBYyxhQUFhLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBTWxCLG1DQUFTLFVBQVMsTUFBTSxHQUFHO0FBQUE7QUFBQTtBQUFBLGdDQUcxQixtQ0FBUyxVQUFTLGFBQWEsUUFBUTtBQUFBLHNDQUNqQyxtQ0FBUyxVQUFTLFNBQVMsS0FBSztBQUFBLGdCQUNyRDtBQUdKLGtCQUFVLFlBQVksYUFBYTtBQUluQyxjQUFNLE1BQU0sY0FBYyxtQkFBbUIsY0FBYyxjQUFjO0FBQ3pFLFlBQUksS0FBSztBQUdULFlBQUksY0FBYyxhQUFhO0FBRS9CLFlBQUksbUNBQVMsYUFBYTtBQUV0QixnQkFBTSxTQUFTLElBQUksVUFBVTtBQUM3QixnQkFBTSxPQUFPLE9BQU8sZ0JBQWdCLGFBQWEsTUFBTSxXQUFXO0FBR2xFLGdCQUFNLHNCQUFzQixLQUFLLGVBQWUsY0FBYztBQUM5RCxxRUFBcUIsZ0JBQWdCO0FBR3JDLGdCQUFNLE9BQU8sS0FBSyxlQUFlLG1CQUFtQjtBQUNwRCxlQUFLLEtBQUssWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPdEIsZ0JBQU0sT0FBTyxLQUFLLEtBQUs7QUFFdkIsY0FBSSxRQUFRLEtBQUssTUFBTTtBQUNuQixpQkFBSyxLQUFLLGFBQWEsS0FBSyxXQUFXLE1BQU0sSUFBSSxHQUFHLEtBQUssS0FBSyxVQUFVO0FBQUEsVUFDNUU7QUFFQSx3QkFBYyxLQUFLLGdCQUFnQjtBQUFBLFFBQ3ZDO0FBZ0JBLFlBQUksUUFBUSxXQUFXO0FBY3ZCLFlBQUksUUFBUSxnQkFBZ0IsT0FBTyxLQUFLLHVCQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHlCQWFuRDtBQUVaLFlBQUksTUFBTTtBQUtWLGNBQU0sT0FBTyxJQUFJLG9CQUFvQixxQkFBcUIsTUFBTSxXQUFXLGVBQWUsT0FBTztBQUVqRyxZQUFJLGFBQWEsWUFBWTtBQUN6Qix3QkFBYyxTQUFTLE1BQU07QUFDekIsaUJBQUssa0NBQWtDO0FBQUEsVUFDM0M7QUFBQSxRQUNKO0FBR0EsZUFBTztBQUFBLE1BRVg7QUFFQSxVQUFJLGFBQWEsbUJBQW1CLG1CQUFtQixNQUFNO0FBTXpELGNBQU0sV0FBVyxTQUFTLGNBQWMsVUFBVTtBQUNsRCxpQkFBUyxZQUFZLGFBQWE7QUFDbEMsa0JBQVUsU0FBUyxRQUFRO0FBYTNCLHdCQUFnQixFQUFFLEtBQUssQ0FBQ0MsU0FBUTtBQUM1QixVQUFBQSxLQUFJLGtCQUFrQixTQUFTLE9BQU87QUFBQSxRQUMxQyxDQUFDO0FBQUEsTUFDTCxPQUFPO0FBQ0gsY0FBTSxvQkFBb0Isb0JBQW9CLG9CQUFvQixPQUFPLEtBQUssRUFBRTtBQUdoRixZQUFJLENBQUNDLE1BQUssU0FBUyxpQkFBaUIsR0FBRztBQUNuQyxtQ0FBeUIsbUJBQW1CLGFBQWEsTUFBTSxhQUFhLGNBQWM7QUFDMUYsVUFBQUEsTUFBSyxLQUFLLGlCQUFpQjtBQUFBLFFBQy9CO0FBQ0Esa0JBQVUsU0FBUyxjQUFjLGlCQUFpQjtBQUFBLE1BQ3REO0FBRUEsVUFBSSxDQUFDLFVBQVUsY0FBYyxvQkFBb0I7QUFDN0Msa0JBQVUsWUFBWTtBQUcxQixjQUFRLEtBQUs7QUFFYixVQUFJLG1DQUFTLFFBQVE7QUFDakIsZ0JBQVEsTUFBTSxVQUFVO0FBQ3hCLGdCQUFRLE1BQU0sV0FBVztBQUN6QixnQkFBUSxNQUFNLFNBQVM7QUFDdkIsZ0JBQVEsTUFBTSxRQUFRO0FBQ3RCLGdCQUFRLE1BQU0sZ0JBQWdCO0FBQzlCLGdCQUFRLE1BQU0sYUFBYTtBQUFBLE1BQy9CO0FBVUEsV0FBSyxZQUFZLFdBQVcsU0FBUyxPQUFPO0FBRzVDLGFBQU8sSUFBSSxpQkFBaUIscUJBQXFCLE1BQU0sV0FBVyxTQUFTLE9BQU87QUFBQSxJQUN0RjtBQUFBO0FBQ0o7OztBQ3hFTyxJQUFNLG1CQUFOLE1BQU0saUJBQWdCO0FBQUE7QUFBQSxFQU96QixZQUFvQixXQUFXLDBCQUEwQjtBQUFyQztBQUpwQix3QkFBUSxhQUFnRCxDQUFDO0FBQUEsRUFLekQ7QUFBQSxFQUVNLGVBQWUsYUFBcUIsUUFBaUI7QUFBQTtBQUN2RCxVQUFJLFFBQVE7QUFDUixjQUFNLE9BQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUN4QyxlQUFPLEtBQUssV0FBVyxLQUFLLE9BQUssRUFBRSxLQUFLLE9BQU8sV0FBVztBQUFBLE1BQzlELE9BQUs7QUFDRCxjQUFNLE9BQU8sTUFBTSxLQUFLLGNBQWMsV0FBVztBQUNqRCxlQUFPLEtBQUssV0FBVyxDQUFDO0FBQUEsTUFDNUI7QUFBQSxJQUNKO0FBQUE7QUFBQSxFQUVNLGNBQWMsYUFBcUI7QUFBQTtBQUNyQyxVQUFJLENBQUMsS0FBSyxVQUFVLFdBQVcsR0FBRztBQUU5QixhQUFLLFVBQVUsV0FBVyxJQUFJLElBQUk7QUFBQSxVQUM5QixDQUFPLFNBQVMsV0FBVztBQUN2QixnQkFBSTtBQUNBLG9CQUFNLE1BQU0sTUFBTTtBQUFBLGdCQUNkLEdBQUcsS0FBSyxRQUFRLFlBQVksV0FBVztBQUFBLGNBQzNDO0FBQ0Esb0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixzQkFBUSxLQUFLLElBQUk7QUFBQSxZQUNyQixTQUFTLEdBQUc7QUFDUixxQkFBTyxDQUFDO0FBQUEsWUFDWjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGFBQU8sTUFBTSxLQUFLLFVBQVUsV0FBVztBQUFBLElBQzNDO0FBQUE7QUFBQSxFQUdNLFVBQVUsUUFBZ0I7QUFBQTtBQUM1QixVQUFJLENBQUMsS0FBSyxVQUFVLE1BQU0sR0FBRztBQUV6QixhQUFLLFVBQVUsTUFBTSxJQUFJLElBQUk7QUFBQSxVQUN6QixDQUFPLFNBQVMsV0FBVztBQUN2QixnQkFBSTtBQUNBLG9CQUFNLE1BQU0sTUFBTTtBQUFBLGdCQUNkLEdBQUcsS0FBSyxRQUFRLFlBQVksTUFBTTtBQUFBLGNBQ3RDO0FBQ0Esb0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixzQkFBUSxLQUFLLElBQUk7QUFBQSxZQUNyQixTQUFTLEdBQUc7QUFDUixxQkFBTyxDQUFDO0FBQUEsWUFDWjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGFBQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ3RDO0FBQUE7QUFDSjtBQTdESSxjQURTLGtCQUNGLFFBQU8sSUFBSSxpQkFBZ0I7QUFEL0IsSUFBTSxrQkFBTjs7O0FDaExBLElBQU0sc0JBQU4sTUFBTSxvQkFBbUI7QUFBQSxFQUs1QixZQUFvQixXQUFXLDBCQUEwQjtBQUFyQztBQUZwQix3QkFBUSxZQUF1RCxDQUFDO0FBQUEsRUFHaEU7QUFBQSxFQUVNLGVBQWUsYUFBcUIsdUJBQWdDO0FBQUE7QUFDdEUsVUFBSSxDQUFDLEtBQUssU0FBUyxXQUFXLEdBQUc7QUFFN0IsYUFBSyxTQUFTLFdBQVcsSUFBSSxJQUFJO0FBQUEsVUFDN0IsQ0FBTyxTQUFTLFdBQVc7QUFDdkIsZ0JBQUk7QUFDQSxvQkFBTSxNQUFNLE1BQU07QUFBQSxnQkFDZCxHQUFHLEtBQUssUUFBUSxlQUFlLFdBQVcsUUFBUSxxQkFBcUI7QUFBQSxjQUMzRTtBQUNBLG9CQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsc0JBQVEsS0FBSyxJQUFJO0FBQUEsWUFDckIsU0FBUyxHQUFHO0FBQ1IscUJBQU8sQ0FBQztBQUFBLFlBQ1o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFFQSxhQUFPLE1BQU0sS0FBSyxTQUFTLFdBQVc7QUFBQSxJQUMxQztBQUFBO0FBRUo7QUE1QkksY0FEUyxxQkFDRixRQUFPLElBQUksb0JBQW1CO0FBRGxDLElBQU0scUJBQU47OztBQ0ZBLElBQU0sb0JBQW9CLENBQU8sb0JBQXdFO0FBQzVHLE1BQUk7QUFFQSxVQUFNLE1BQU0sSUFBSSxJQUFJLE9BQU8sU0FBUyxJQUFJO0FBQ3hDLFVBQU0sU0FBUyxJQUFJLGdCQUFnQixJQUFJLE1BQU07QUFDN0MsVUFBTSxlQUFlLE9BQU8sSUFBSSxjQUFjO0FBQzlDLFFBQUksY0FBYztBQUNkLFlBQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxJQUFJLGdCQUFnQixZQUFZO0FBRXZELGNBQVEsUUFBUTtBQUFBLFFBQ1osS0FBSztBQUFhO0FBQ2Qsa0JBQU0sQ0FBQyxhQUFhLE1BQU0sSUFBSTtBQUM5QixrQkFBTSxzQkFBc0IsTUFBTSxnQkFBZ0IsS0FBSyxlQUFlLFdBQVc7QUFDakYsZ0JBQUkscUJBQXFCO0FBRXJCLG9CQUFNLE9BQU8sb0JBQW9CLEtBQUssTUFBTSxLQUFLLENBQUFDLFVBQVFBLE1BQUssT0FBTyxNQUFNO0FBQzNFLGtCQUFJLE1BQU07QUFHTixvQ0FBb0IsU0FBUyxlQUFlO0FBQUEsa0JBQ3hDLE1BQU0sa0JBQWtCO0FBQUEsa0JBQ3hCLE1BQU07QUFBQSxvQkFDRixJQUFJO0FBQUEsa0JBQ1I7QUFBQSxnQkFFSjtBQUVBLHVCQUFPO0FBQUEsY0FDWDtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0k7QUFBQTtBQUFBLFFBRUo7QUFBVTtBQUVOLGtCQUFNLENBQUMsUUFBUSxZQUFZLElBQUksZ0JBQWdCLFlBQVk7QUFDM0Qsa0JBQU0sT0FBTyxNQUFNLGdCQUFnQixLQUFLLFVBQVUsTUFBTTtBQUN4RCxrQkFBTSxzQkFBc0IsS0FBSyxXQUFXLEtBQUssT0FBSyxFQUFFLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxFQUFFO0FBQzNGLGdCQUFJLHFCQUFxQjtBQUNyQixrQkFBSSxvQkFBb0IsU0FBUyxhQUFhLFNBQVMsa0JBQWtCLFdBQVc7QUFFaEYsb0JBQUksb0JBQW9CLFNBQVMscUJBQXFCO0FBQ2xELHdCQUFNLHFCQUFxQixvQkFBb0IsU0FBUyxvQkFBb0IsS0FBSyxPQUFLLEVBQUUsT0FBTyxZQUFZO0FBRTNHLHVCQUFJLHlEQUFvQixVQUFTLGdCQUFnQixTQUFTO0FBRXRELDBCQUFNLDBCQUEwQjtBQUVoQywwQkFBTSxvQkFBb0Isb0JBQW9CLFNBQVM7QUFDdkQsMEJBQU0sVUFBVSxrQkFBa0IsU0FBUyxLQUFLLE9BQUssRUFBRSxjQUFjLHdCQUF3QixRQUFRLEVBQUU7QUFDdkcsd0JBQUksU0FBUztBQUNULDBDQUFvQixTQUFTLGVBQWUsbUNBQVM7QUFDckQsNkJBQU87QUFBQSxvQkFDWDtBQUFBLGtCQUNKO0FBQUEsZ0JBQ0o7QUFBQSxjQUNKO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFDSTtBQUFBLE1BQ1I7QUFBQSxJQUNKO0FBQUEsRUFDSixVQUFFO0FBQ0UsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDOUJBLElBQU0sMEJBQTBCO0FBT3pCLElBQU0sVUFBTixNQUFjO0FBQUEsRUFBZDtBQUdILDJDQUFvQyxDQUFDO0FBQ3JDLHNDQUErQixDQUFDO0FBQ2hDLDZDQUFtQyxDQUFDO0FBRXBDLHdCQUFPLGFBQXFCO0FBRTVCLHdCQUFPLFdBQVU7QUFFakIsOENBQTZDLENBQUM7QUFDOUMsd0JBQU8sWUFBVyxDQUFDLHdCQUFvRDtBQUNuRSxVQUFJLENBQUMsS0FBSyxtQkFBbUIsb0JBQW9CLEVBQUUsR0FBRztBQUNsRCxhQUFLLG1CQUFtQixvQkFBb0IsRUFBRSxJQUFJO0FBQUEsTUFDdEQ7QUFDQSxhQUFPLEdBQUcsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssbUJBQW1CLG9CQUFvQixFQUFFLENBQUM7QUFBQSxJQUN6RjtBQUlBO0FBQUE7QUFBQSx3QkFBUSxhQUFZO0FBQ3BCLHdCQUFPLFdBQVUsTUFBTTtBQUNuQixVQUFJLEtBQUs7QUFDTDtBQUVKLFdBQUssWUFBWTtBQUVqQixXQUFLLFdBQVcsUUFBUSxlQUFhO0FBQ2pDLFlBQUksVUFBVSxTQUFTO0FBQ25CLG9CQUFVLFFBQVE7QUFBQSxRQUN0QjtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFFQSx3QkFBUSwwQkFBeUIsQ0FBQyxVQUF5QztBQUd2RSxVQUFJLE1BQU0sV0FBVyxTQUFTLFNBQVMsUUFBUTtBQUFBLE1BRy9DO0FBR0EsVUFBSSxNQUFNLEtBQUssTUFBTTtBQUNqQixZQUFJLE1BQU0sS0FBSyxjQUFjLGlCQUFpQixNQUFNLE1BQU0sS0FBSyxnQkFBZ0IsYUFBYSxrQkFBa0I7QUFFMUc7QUFBQSxRQUNKO0FBR0EsY0FBTSxjQUErQixNQUFNO0FBRTNDLFlBQUksWUFBWSxnQkFBZ0IsYUFBYSxhQUFhO0FBQ3RELGVBQUssZ0JBQWdCLFFBQVEsQ0FBQUMsZUFBYTtBQUN0QyxZQUFBQSxXQUFVLEtBQUssSUFBSSxZQUFZQSxXQUFVLEVBQUUsQ0FBQztBQUFBLFVBQ2hELENBQUM7QUFDRDtBQUFBLFFBQ0o7QUFFQSxZQUFJLFlBQVksZ0JBQWdCLGFBQWEsY0FBYztBQUd2RCxlQUFLLGtCQUFrQixLQUFLLGdCQUFnQixPQUFPLENBQUFBLGVBQWFBLFdBQVUsT0FBUSxZQUE2QixRQUFRLEVBQUU7QUFFekgsZ0JBQU0scUJBQXFCLEtBQUssV0FBVyxLQUFLLENBQUFBLGVBQVU7QUFySDFFO0FBcUg2RSxtQkFBQUEsV0FBVSxTQUFRLGlCQUE2QixZQUE3QixtQkFBc0M7QUFBQSxXQUFFO0FBQ3ZILG1FQUFvQjtBQUdwQjtBQUFBLFFBQ0o7QUFFQSxZQUFJLFlBQVksZ0JBQWdCLGFBQWEsa0JBQWtCO0FBRTNELGdCQUFNLGVBQWU7QUFDckIsZ0JBQU0sZUFBZSxLQUFLLFdBQVcsS0FBSyxDQUFBQSxlQUFhQSxXQUFVLE9BQU8sYUFBYSxXQUFXO0FBRWhHLGNBQUksY0FBYztBQUNkLGdCQUFJLGFBQWEsY0FBYyxpQkFBaUIsTUFBTTtBQUNsRCxrQkFBSSxhQUFhLFFBQVEsZ0JBQWdCLHVCQUF1QixNQUFNO0FBQ2xFLDZCQUFhLGtCQUFrQixhQUFhLE9BQU87QUFBQSxjQUN2RCxPQUFPO0FBRUgsNkJBQWEsUUFBUSxRQUFRLGFBQWE7QUFDMUMsNkJBQWEsS0FBSyxhQUFhLE9BQU87QUFBQSxjQUMxQztBQUNBO0FBQUEsWUFDSjtBQUFBLFVBQ0osT0FBTztBQUNILGtCQUFNLGlCQUFpQixLQUFLLFdBQVcsS0FBSyxDQUFBQSxlQUFhQSxXQUFVLE9BQU8sYUFBYSxRQUFRLFdBQVc7QUFDMUcsZ0JBQUksZ0JBQWdCO0FBQ2hCLDZCQUFlLEtBQUssYUFBYSxPQUFPO0FBQUEsWUFDNUMsT0FBTztBQUFBLFlBRVA7QUFBQSxVQUNKO0FBSUE7QUFBQSxRQUNKO0FBRUEsY0FBTSxZQUFZLEtBQUssV0FBVyxLQUFLLENBQUFBLGVBQWFBLFdBQVUsT0FBTyxZQUFZLFdBQVc7QUFFNUYsWUFBSSxDQUFDLFdBQVc7QUFHWixjQUFJLE9BQU8sS0FBSyxXQUFXO0FBQ3ZCLG1CQUFPLEtBQUssVUFBVSxjQUFjLFdBQVc7QUFBQSxVQUNuRDtBQUNBO0FBQUEsUUFDSjtBQUVBLFlBQUksV0FBVztBQUNYLGNBQUksVUFBVSxrQkFBa0IsV0FBVyxHQUFHO0FBQzFDO0FBQUEsVUFDSixPQUFPO0FBR0gsZ0JBQUksT0FBTyxLQUFLO0FBQ1oscUJBQU8sS0FBSyxVQUFVLGNBQWMsV0FBVztBQUFBLFVBQ3ZEO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQU1KO0FBRUEsd0JBQU8sUUFBTyxDQUFDLFlBQTZCO0FBQ3hDLFlBQU0saUJBQWlCLElBQUk7QUFBQSxRQUE4QjtBQUFBLFFBQ3JELEVBQUMsTUFBTSxRQUFPO0FBQUEsTUFDbEI7QUFFQSxXQUFLLHVCQUF1QixjQUFjO0FBQUEsSUFDOUM7QUFFQSx3QkFBTyxRQUFPLENBQUMsa0NBQTZEO0FBQ3hFLFVBQUksS0FBSyxXQUFXO0FBQ2hCLGNBQU0sSUFBSSxNQUFNLDJCQUEyQjtBQUFBLE1BQy9DO0FBRUEsWUFBTSxlQUFlO0FBQUEsUUFDakIsSUFBSSxpQkFBaUI7QUFBQSxRQUNyQixJQUFJLG1CQUFtQjtBQUFBLFFBQ3ZCLElBQUksb0JBQW9CO0FBQUEsTUFDNUI7QUFFQSxXQUFLLG9CQUFvQjtBQUFBLFFBQ3JCLEdBQUc7QUFBQSxNQUNQO0FBRUEsVUFBSSwrQkFBK0I7QUFFL0IsY0FBTSxlQUE0QyxDQUFDO0FBRW5ELHNDQUE4QixRQUFRLGtDQUFnQztBQUNsRSxnQkFBTSxlQUFlLElBQUksNkJBQTZCLEtBQUssaUJBQWlCO0FBQzVFLHVCQUFhLGFBQWEsSUFBSSxJQUFJO0FBQUEsUUFDdEMsQ0FBQztBQUVELGFBQUssa0JBQWtCLFFBQVEsWUFBVTtBQUNyQyxjQUFJLENBQUMsYUFBYSxPQUFPLElBQUk7QUFDekIseUJBQWEsT0FBTyxJQUFJLElBQUk7QUFBQSxRQUNwQyxDQUFDO0FBRUQsYUFBSyxvQkFBb0IsT0FBTyxPQUFPLFlBQVk7QUFBQSxNQUN2RDtBQUdBLGFBQU87QUFBQSxRQUNIO0FBQUEsUUFDQSxLQUFLO0FBQUEsUUFDTDtBQUFBLE1BQ0o7QUFFQSxjQUFRLElBQUksMEJBQTBCLFNBQVMsU0FBUyxJQUFJO0FBQzVELFdBQUssWUFBWTtBQUFBLElBQ3JCO0FBRUEsd0JBQVEsNEJBQTJCLENBQU8sT0FBNkcsc0JBQTdHLElBQTZHLG1CQUE3RyxjQUFtQyxjQUE2QixDQUFDLEdBQUcsT0FBeUM7QUExTzNKO0FBMk9RLGVBQWUsVUFDWCxPQUNBLFdBQ3NCO0FBQUE7QUFDdEIscUJBQVcsUUFBUSxPQUFPO0FBQ3RCLGdCQUFJLE1BQU0sVUFBVSxJQUFJLEdBQUc7QUFDdkIscUJBQU87QUFBQSxZQUNYO0FBQUEsVUFDSjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBO0FBRUEsY0FBUSxhQUFhLE1BQU07QUFBQTtBQUFBLFFBRXZCLEtBQUs7QUFBQTtBQUFBLFFBQ0wsS0FBSyxrQkFBa0I7QUFBVztBQUM5QixnQkFBSSxtQkFBa0Isa0JBQXNDLFNBQXRDLG1CQUE0QyxPQUMxRCxhQUFzQyxNQUFPLENBQUMsRUFBRTtBQUV4RCxtQkFBTztBQUFBLFVBQ1g7QUFDSTtBQUFBLFFBQ0osS0FBSyxrQkFBa0I7QUFBVztBQUM5QixrQkFBTSxvQkFBcUI7QUFDM0Isa0JBQU0sVUFBVSxNQUFNLFVBQVUsa0JBQWtCLFVBQVUsQ0FBTUMsYUFBVztBQUN6RSxrQkFBSUEsU0FBUSxjQUFjLFdBQVc7QUFDakMsdUJBQU87QUFBQSxjQUNYO0FBRUEsb0JBQU0sYUFBYSxZQUFZLEtBQUssQ0FBQUMsZ0JBQWM7QUFDOUMsb0JBQUlBLFlBQVcsU0FBUyxnQkFBZ0IsU0FBUztBQUM3Qyx5QkFBUUEsWUFBa0MsUUFBUSxPQUFPRCxTQUFRO0FBQUEsZ0JBQ3JFO0FBQ0EsdUJBQU87QUFBQSxjQUNYLENBQUM7QUFFRCxrQkFBSSxDQUFDLFlBQVk7QUFDYixzQkFBTSxJQUFJLE1BQU0sc0JBQXNCO0FBQUEsY0FDMUM7QUFFQSxvQkFBTSxrQkFBa0I7QUFDeEIsb0JBQU0sZUFBZ0IsZ0JBQWdCO0FBRXRDLG9CQUFNLG1CQUFtQixRQUFRLFFBQVEsQ0FBQyxHQUFHLGFBQWEsUUFBUTtBQUNsRSxrQkFBSSxpQkFBaUI7QUFDakIsc0JBQU0sVUFBVSxNQUFNLGdCQUFnQjtBQUN0Qyx1QkFBTztBQUFBLGNBQ1gsT0FBTztBQUNILHdCQUFRLEtBQUssYUFBYUEsU0FBUSxTQUFTLEtBQUssYUFBYSxRQUFRLDBCQUEwQjtBQUFBLGNBQ25HO0FBRUEscUJBQU87QUFBQSxZQUNYLEVBQUM7QUFFRCxnQkFBSTtBQUNBLHFCQUFPLEtBQUsseUJBQXlCLFFBQVEsY0FBYyxXQUFXO0FBQUEsaUJBQ3JFO0FBQ0Q7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNJO0FBQUEsUUFDSixTQUFTO0FBQ0w7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBRUEsd0JBQVEsbUJBQWtCLENBQU8saUJBQW1DLFVBQXdCO0FBQ3hGLFlBQU0sU0FBUyxNQUFNLEtBQUsseUJBQXlCLGdCQUFnQixTQUFTLGNBQWMsZ0JBQWdCLFNBQVMscUJBQXFCLEtBQUs7QUFDN0ksYUFBTyxnQkFBZ0IsS0FBSyxNQUFNLEtBQUssVUFBUSxLQUFLLE9BQU8sTUFBTTtBQUFBLElBQ3JFO0FBRUEsd0JBQU87QUFFUCx3QkFBTyxpQkFBZ0IsQ0FBa0QsaUJBQW1DLFdBQStCLFlBQ3pIO0FBdlR0QjtBQXlUUSxVQUFJLENBQUMsV0FBVztBQUNaO0FBQ0EsY0FBTSxJQUFJLE1BQU0sMkNBQTJDO0FBQUEsTUFDL0Q7QUFFQSxZQUFNLG1CQUFtQixNQUFNLGtCQUFrQixlQUFlO0FBQ2hFLFVBQUksa0JBQWtCO0FBRWxCLDBCQUFrQjtBQUFBLE1BQ3RCO0FBbUJBLFlBQU0sUUFBUSxtQ0FBSyxVQUFLLGdCQUFMLFlBQW9CLENBQUMsS0FBUSx3Q0FBUyxVQUFULFlBQWtCLENBQUM7QUFFbkUsWUFBTSxNQUFNO0FBQ1osVUFBSSxJQUFJLE1BQU07QUFDVixZQUFJLElBQUksV0FBVztBQUVmLDRCQUFrQixtQkFBSTtBQUN0QiwwQkFBZ0IsV0FBVyxtQkFDcEIsZ0JBQWdCO0FBR3ZCLGNBQUlFLGdCQUFlLE1BQU0sS0FBSyxnQkFBZ0IsaUJBQWlCLEtBQUs7QUFDcEUsY0FBSSxDQUFDQSxlQUFjO0FBQ2Ysa0JBQU0sSUFBSSxNQUFNLGtFQUFrRTtBQUFBLFVBQ3RGO0FBRUEsZUFBSSx3Q0FBUyxVQUFULG1CQUFnQixtQkFBbUI7QUFDbkMsWUFBQUEsZ0JBQWUsTUFBTSxRQUFRLE1BQU0sa0JBQWtCLG1CQUFJQSxjQUFhO0FBQUEsVUFDMUU7QUFFQSwwQkFBZ0IsU0FBUyxlQUFlO0FBQUEsWUFDcEMsTUFBTSxrQkFBa0I7QUFBQSxZQUN4QixNQUFNQTtBQUFBO0FBQUEsVUFFVjtBQUVBLGNBQUksU0FBUztBQUNULHNCQUFVLG1CQUFJO0FBQ2QsbUJBQU8sUUFBUTtBQUFBLFVBQ25CO0FBRUEsZ0JBQU0sZUFBZSxNQUFNLG1CQUFzQixLQUFLLGlCQUFpQixLQUFLLFlBQVksT0FBTztBQUcvRixpQkFBTztBQUFBLFFBQ1gsT0FBTztBQUNILGdCQUFNLElBQUksTUFBTSxvQ0FBb0M7QUFBQSxRQUN4RDtBQUFBLE1BQ0o7QUFFQSxrQkFBWTtBQVFaLFVBQUksZUFBZSxNQUFNLEtBQUssZ0JBQWdCLGlCQUFpQixLQUFLO0FBRXBFLFVBQUksQ0FBQyxjQUFjO0FBQ2YsY0FBTSxJQUFJLE1BQU0sa0VBQWtFO0FBQUEsTUFDdEY7QUFFQSxXQUFJLHdDQUFTLFVBQVQsbUJBQWdCLG1CQUFtQjtBQUNuQyx1QkFBZSxNQUFNLFFBQVEsTUFBTSxrQkFBa0IsbUJBQUksYUFBYTtBQUFBLE1BQzFFO0FBQ0EsWUFBTSxrQkFBa0IsS0FBSyxrQkFBa0IsS0FBSyxZQUFVLE9BQU8sU0FBUyxhQUFhLE9BQU8sSUFBSTtBQUV0RyxVQUFJLENBQUMsaUJBQWlCO0FBQ2xCO0FBQ0EsY0FBTSxJQUFJLE1BQU0sY0FBYyxhQUFhLE9BQU8sSUFBSSwyQkFBMkI7QUFBQSxNQUNyRjtBQUdBLFVBQUksWUFBWSxNQUFNLGdCQUFnQixLQUFLLGdCQUFnQixNQUFNLGNBQWMsV0FBVyxPQUFPO0FBR2pHLFVBQUksQ0FBQyxVQUFVO0FBQ1gsYUFBSyxnQkFBZ0IsS0FBSyxTQUFTO0FBRXZDLGdCQUFVLEtBQUssYUFBYSxNQUFNO0FBRTlCLGFBQUssYUFBYSxLQUFLLFdBQVcsT0FBTyxPQUFLLE1BQU0sU0FBUztBQUM3RCxhQUFLLGtCQUFrQixLQUFLLGdCQUFnQixPQUFPLE9BQUssTUFBTSxTQUFTO0FBQ3ZFLGVBQU87QUFBQSxNQUNYLENBQUM7QUFFRCxXQUFLLFdBQVcsS0FBSyxTQUFTO0FBRzlCLFVBQUksQ0FBQyxXQUFXLFFBQVEsaUJBQWlCLE9BQU87QUFFNUMsb0JBQVksYUFBYSxXQUFXLGdCQUFnQixLQUFLLE9BQU8sWUFBWTtBQUFBLE1BQ2hGO0FBRUEsVUFBSTtBQUdBLGNBQU0sWUFBWSxXQUFXLGlCQUFpQixLQUFLLFVBQVU7QUFBQSxNQUNqRSxTQUFTLEdBQUc7QUFDUixjQUFNO0FBQUEsTUFHVjtBQUNBLFVBQUksRUFBQyxtQ0FBUztBQUNWLGNBQU0sVUFBVSxVQUFVO0FBRTlCLGFBQU87QUFBQSxJQUNYO0FBRUEsd0JBQU8sWUFBVyxDQUFrRCxXQUEyQixvQkFBc0MsWUFBZ0M7QUFDakssVUFBSSxVQUFVLFFBQVE7QUFDbEIsY0FBTSxJQUFJLE1BQU0sNERBQTREO0FBQUEsTUFDaEY7QUFrQkEsVUFBSSxtQ0FBUyxRQUFRO0FBRWpCLFlBQUksZUFBZSxNQUFNLEtBQUssY0FBaUIsb0JBQW9CLFVBQVUsV0FBVztBQUFBLFVBQ3BGLFFBQVE7QUFBQSxVQUNSLFVBQVUsRUFBQyxXQUFXLFNBQVMsT0FBTyxVQUFVLFFBQVE7QUFBQSxXQUNyRCxRQUNOO0FBRUQsWUFBSSxRQUFRO0FBQ1IsZ0JBQU0sUUFBUSxLQUFLLFlBQVk7QUFFbkMscUJBQWEsS0FBSztBQUNsQixrQkFBVSxRQUFRO0FBQ2xCLGVBQU87QUFBQSxNQUNYLE9BQU87QUFDSCxjQUFNLGNBQWMsVUFBVSxRQUFTO0FBRXZDLGtCQUFVLFFBQVE7QUFDbEIsZUFBTyxLQUFLLGNBQWlCLG9CQUFvQixVQUFVLFdBQVc7QUFBQSxVQUNsRSxVQUFVO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxPQUFPO0FBQUEsVUFDWDtBQUFBLFdBQ0csUUFDTjtBQUFBLE1BQ0w7QUFBQSxJQUNKO0FBQUE7QUFDSjtBQXJiSSxjQURTLFNBQ0YsWUFBVyxNQUFNLE9BQU8sS0FBSztBQXFleEMsSUFBSSxDQUFDLE9BQU8sTUFBTTtBQUVkLFNBQU8sT0FBTztBQUFBLElBQ1Y7QUFBQSxFQUNKO0FBQ0o7QUFFQSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVM7QUFDdEIsUUFBTSxXQUFXLElBQUksUUFBUTtBQUU3QixXQUFTLEtBQUs7QUFFZCxNQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsV0FBTyxPQUFPO0FBQUEsTUFDVjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsU0FBTyxLQUFLLFVBQVU7QUFDMUI7QUFHTyxJQUFNLFVBQW1CLE9BQU8sS0FBSztBQUU1QyxvQkFBb0IsV0FBVyxPQUFPOzs7QUMxaUIvQixJQUFNLG1DQUFOLGNBQStDLCtCQUEwRDtBQUFBLEVBQXpHO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLHlDQUFnQixDQUFDLE9BQWtDLGVBQThCLGtCQUFpQztBQUU5RyxZQUFNLFlBQVksTUFBWTtBQUUxQixjQUFNLFdBQVcsY0FBYyxXQUFXLGlCQUE4QixJQUFJLGVBQWUsRUFBRSxLQUFLLE1BQU0sVUFBVSxRQUFRLElBQUk7QUFFOUgsWUFBSSxTQUFTLFdBQVcsR0FBRztBQUN2QixnQkFBTUMsV0FBVSxRQUFRLFNBQVM7QUFFakMsZ0JBQU0sZUFBZUEsU0FBUSxXQUFXLEtBQUssT0FBSyxFQUFFLE9BQU8sTUFBTSxRQUFRLEVBQUU7QUFDM0UsY0FBSSxjQUFjO0FBRWQseUJBQWEsUUFBUTtBQUFBLFVBQ3pCLE9BQU87QUFBQSxVQUVQO0FBSUEsZ0JBQU0sUUFBUUEsU0FBUSxXQUFXLFFBQVEsWUFBWTtBQUNyRCxjQUFJLFVBQVUsSUFBSTtBQUNkLFlBQUFBLFNBQVEsV0FBVyxPQUFPLE9BQU8sQ0FBQztBQUFBLFVBRXRDLE9BQU87QUFBQSxVQUVQO0FBRUEsZ0JBQU0sMEJBQTBCLE1BQU1BLFNBQVE7QUFBQSxZQUFjLE1BQU07QUFBQSxZQUM5RCxTQUFTLEtBQUssQ0FBQztBQUFBLFlBQ2YsTUFBTTtBQUFBLFVBQU87QUFTakIsZ0JBQU0sa0JBQXlCLENBQUM7QUFFaEMsaUJBQU8sS0FBSyx3QkFBd0IsSUFBSSxFQUFFLFFBQVEsYUFBVztBQUN6RCxnQkFBSSxNQUFNLHdCQUF3QixLQUFLLE9BQU87QUFDOUMsa0JBQU0sSUFBSSxnQkFBZ0I7QUFFMUIsZ0JBQUssSUFBdUIscUJBQXFCO0FBQzdDLDhCQUFnQixLQUFLO0FBQUEsZ0JBQ2pCO0FBQUEsZ0JBQ0EsdUJBQXdCLElBQXVCLG9CQUFvQjtBQUFBLGNBQ3ZFLENBQUM7QUFBQSxZQUNMO0FBQUEsVUFDSixDQUFDO0FBRUQsd0JBQWMsSUFBSSwyQkFBMkIsTUFBTSxpQkFBaUIsZUFBZSxDQUFDO0FBQUEsUUFDeEYsT0FBTztBQUNILGtCQUFRLE1BQU0sMERBQTBEO0FBQ3hFLGVBQUssY0FBYyxJQUFJLDJCQUEyQixNQUFNLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBRWxGO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFFQSxnQkFBVSxFQUFFLEtBQUs7QUFBQSxJQUVyQjtBQUFBO0FBQ0o7OztBQ3hFTyxJQUFNLCtCQUErQixDQUFDLE9BQTZCLFNBQThCLFlBQXFCO0FBQ3pILFFBQU0saUJBQWlCLE1BQU0sZUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxpQkFBZSxtQkFBbUI7QUFFbEMsaUJBQWUsT0FBTztBQUN0QixpQkFBZSxVQUFVO0FBQ3pCLGlCQUFlLGlCQUFpQjtBQUVoQyxRQUFNLGtCQUFrQixJQUFJLFNBQVMsV0FBVyxNQUFNLE1BQU0saUJBQWlCO0FBQzdFLFFBQU0sTUFBTSxnQkFBZ0IsY0FBYztBQUkxQyxVQUFRLEdBQUc7QUFDZjs7O0FDWk8sSUFBTSx1QkFBTixjQUFtQywrQkFBcUQ7QUFBQSxFQUF4RjtBQUFBO0FBQ0gsdUNBQWMsYUFBYTtBQUUzQix5Q0FBZ0IsQ0FBQyxPQUE2QixlQUE4QixrQkFBaUM7QUFDekcsWUFBTSxVQUFVLENBQUMsU0FBYztBQUMzQixzQkFBYyxJQUFJLDBCQUEwQixNQUFNLGlCQUFpQixJQUFJLENBQUM7QUFBQSxNQUM1RTtBQUVBLG1DQUE2QixPQUFPLFNBQVMsYUFBYTtBQUFBLElBQzlEO0FBQUE7QUFDSjs7O0FDUkEsSUFBTSxnQkFBZ0IsQ0FBQyxZQUErQjtBQUNsRCxNQUFJLENBQUMsUUFBUyxRQUFPO0FBR3JCLE1BQUksUUFBUSxZQUFZLFFBQVE7QUFDNUIsVUFBTSxXQUFXLElBQUksU0FBUyxPQUFPO0FBQ3JDLFVBQU0sYUFBZ0M7QUFBQSxNQUNsQyxVQUFVLENBQUM7QUFBQSxNQUNYLGNBQWMsQ0FBQztBQUFBLElBQ25CO0FBR0EsVUFBTSxXQUFXLFFBQVEsaUJBQWlCLHlCQUF5QjtBQUNuRSxRQUFJLGtCQUFrQjtBQUV0QixhQUFTLFFBQVEsQ0FBQUMsYUFBVztBQUN4QixVQUFJLE9BQU9BLFNBQVEsVUFBVSxVQUFVO0FBQ25DLGNBQU0sU0FBU0EsU0FBUSxhQUFhLGVBQWUsRUFBRTtBQUNyRCxZQUFJLE1BQU1BLFNBQVEsYUFBYSxNQUFNO0FBSXJDLGNBQU0sV0FBMEI7QUFBQSxVQUM1QixJQUFJQSxTQUFRO0FBQUEsVUFDWixNQUFNO0FBQUEsVUFDTixPQUFPLGNBQWNBLFFBQU87QUFBQSxVQUM1QixVQUFVQSxTQUFRO0FBQUEsVUFDbEIsVUFBVSxpQkFBaUJBLFNBQVEsVUFBVSxJQUFJO0FBQUEsVUFDakQ7QUFBQSxRQUNKO0FBRUEsWUFBSSxDQUFDLEtBQUs7QUFDTixxQkFBVyxhQUFjLEtBQUssUUFBUTtBQUFBLFFBQzFDLE9BQU87QUFDSCxjQUFJLFdBQVcsU0FBVSxHQUFHLEdBQUc7QUFDM0IsZ0JBQUksV0FBVyxTQUFVLEdBQUcsRUFBRSxPQUFPO0FBQ2pDLHlCQUFXLGFBQWMsS0FBSyxRQUFRO0FBQUEsWUFDMUMsT0FBTztBQUNILHlCQUFXLGFBQWMsS0FBSyxXQUFXLFNBQVUsR0FBRyxDQUFDO0FBQ3ZELHlCQUFXLFNBQVUsR0FBRyxJQUFJO0FBQUEsWUFDaEM7QUFBQSxVQUNKLE9BQU87QUFDSCx1QkFBVyxTQUFVLEdBQUcsSUFBSTtBQUFBLFVBQ2hDO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDWDtBQUdBLE1BQUksUUFBUSxTQUFTLGNBQWMsUUFBUSxTQUFTLFNBQVM7QUFDekQsV0FBTyxRQUFRLFVBQVUsUUFBUSxRQUFRO0FBQUEsRUFDN0M7QUFHQSxNQUFJLFFBQVEsWUFBWSxXQUFXLFFBQVEsWUFBWSxZQUFZO0FBQy9ELFdBQU8sUUFBUTtBQUFBLEVBQ25CO0FBR0EsTUFBSSxRQUFRLFlBQVksVUFBVTtBQUM5QixXQUFPLFFBQVE7QUFBQSxFQUNuQjtBQUdBLE1BQUksUUFBUSxtQkFBbUI7QUFDM0IsV0FBTyxRQUFRLGFBQWEsUUFBUTtBQUFBLEVBQ3hDO0FBR0EsU0FBTztBQUNYO0FBRU8sSUFBTSx5QkFBTixjQUFxQywrQkFBdUQ7QUFBQSxFQUE1RjtBQUFBO0FBRUgsdUNBQWMsYUFBYTtBQUUzQix5Q0FBZ0IsQ0FBQyxPQUErQixlQUE4QixrQkFBaUM7QUFDM0csWUFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssY0FBYyxVQUFVO0FBQ2xFLFlBQU0sUUFBUSxVQUFRO0FBRWxCLHNCQUFjLElBQUksMEJBQTBCLGNBQWMsSUFBSSxDQUFDLEdBQUcsS0FBSztBQUFBLE1BQzNFLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFDSjs7O0FDdkZPLElBQU0sc0JBQU4sY0FBa0MsK0JBQTZDO0FBQUEsRUFBL0U7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0IseUNBQWdCLENBQUMsT0FBMkIsa0JBQWlDO0FBQ3pFLFlBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLGNBQWMsVUFBVTtBQUNsRSxZQUFNLFFBQVEsVUFBUTtBQUNsQixhQUFLLFlBQVksTUFBTTtBQUFBLE1BQzNCLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFDSjs7O0FDOENPLElBQU0sa0JBQU4sY0FBOEIsWUFBWTtBQUFBLEVBQTFDO0FBQUE7QUFFSCxxREFBNEI7QUFHNUI7QUFBQSw2Q0FBb0IsQ0FBQyxXQUF3QixXQUF1QjtBQUNoRSxnQkFBVSxpQkFBaUIsdUJBQXVCLDBCQUEwQixDQUFDLE1BQVc7QUFFcEYsY0FBTSxlQUFlLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTtBQUN6QyxZQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxNQUFNO0FBQ3JDO0FBQ0EsZ0JBQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBLFFBQ2xFLE9BQU87QUFDSCxnQkFBTSxVQUFVO0FBR2hCLGVBQUsscUJBQXFCLENBQUM7QUFFM0IsY0FBSSxRQUFRLGdCQUFnQixhQUFhLGFBQWE7QUFFbEQsa0JBQU0saUJBQWtCLFFBQXdCLFFBQVE7QUFDeEQsaUJBQUssV0FBVyxjQUFjLEVBQUUsVUFBVSxJQUFJLGNBQWMsV0FBVyxNQUFNO0FBQUEsVUFLakY7QUFBQSxRQUNKO0FBQUEsTUFDSixDQUFDO0FBR0QsaUJBQVcsTUFBTTtBQUNiLGFBQUssY0FBYyxJQUFJLFlBQVksQ0FBQztBQUFBLE1BQ3hDLEdBQUcsQ0FBQztBQUFBLElBQ1I7QUFFQSx5Q0FBZ0IsQ0FBQyxTQUFnQyxhQUErQjtBQUM1RSxjQUFRLFlBQVksaUJBQWlCO0FBR3JDLFVBQUksQ0FBQyxRQUFRLG9CQUFtQixxQ0FBVTtBQUN0QyxnQkFBUSxrQkFBa0IsU0FBUztBQUV2QyxhQUFPLEtBQUssUUFBUSxLQUFLLE9BQU87QUFBQSxJQUNwQztBQUVBLDZDQUFzRDtBQUFBLE1BQ2xELElBQUksa0JBQWtCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUN6RCxJQUFJLG9CQUFvQixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDM0QsSUFBSSxtQkFBbUIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQzFELElBQUksNkJBQTZCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUNwRSxJQUFJLG9CQUFvQixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDM0QsSUFBSSx3QkFBd0IsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQy9ELElBQUkscUJBQXFCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUM1RCxJQUFJLHVCQUF1QixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUE7QUFBQSxNQUU5RCxJQUFJLGlDQUFpQyxLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsSUFDNUU7QUFFQSx3QkFBTyxRQUFPLE1BQU07QUFBQSxJQUdwQjtBQUFBO0FBQ0o7QUFFQSxvQkFBb0IsbUJBQW1CLGVBQWU7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgImhlaWdodCIsICJ3aWR0aCIsICJzZWVuIiwgInNkayIsICJkb21JZCIsICJzZGsiLCAic2VlbiIsICJza2luIiwgImNvbXBvbmVudCIsICJzZWdtZW50IiwgImV4cGVyaWVuY2UiLCAic2VsZWN0ZWRTa2luIiwgImhvc3RTREsiLCAiZWxlbWVudCJdCn0K
|