@myop/sdk 0.1.44 → 0.1.45

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.
@@ -1829,7 +1829,7 @@ var WebcomponentLoader = class extends BaseMyopLoader {
1829
1829
  };
1830
1830
 
1831
1831
  // version:myop-sdk-version
1832
- var myop_sdk_version_default = "0.1.44";
1832
+ var myop_sdk_version_default = "0.1.45";
1833
1833
 
1834
1834
  // src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
1835
1835
  var BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
@@ -2250,12 +2250,12 @@ var HTMLComponentLoader = class extends BaseMyopLoader {
2250
2250
  // @ts-ignore
2251
2251
  window.__federation__
2252
2252
  )}};
2253
- const init = async () => {
2253
+ const __myop_init = async () => {
2254
2254
  const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());
2255
2255
  const sdk = new IframeSDK()
2256
2256
  sdk.init();
2257
2257
  }
2258
- init().then();
2258
+ __myop_init().then();
2259
2259
  <\/script>`);
2260
2260
  doc.close();
2261
2261
  const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
@@ -2966,4 +2966,4 @@ defineDynamicImport("IframeSDK", IframeSDK);
2966
2966
  export {
2967
2967
  IframeSDK
2968
2968
  };
2969
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudENvcmUudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSU15b3BMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9pZnJhbWVMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyLnRzIiwgInZlcnNpb246bXlvcC1zZGstdmVyc2lvbiIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIHJ1bkV4ZWN1dG9yQ2xlYW51cH0gZnJvbSBcIi4vaW5kZXgudHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9iYXNlTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLCBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEVudmVsb3BlZE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIEhvc3RlZENvbXBvbmVudDxUID0gYW55PiB7XG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAvL29uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBJTXlvcE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWQ6IHN0cmluZywgcHVibGljIGNvbnRleHQ/OiBUKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BTREsge1xuICAgIGluaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXM6IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD47XG59XG5cbi8vIGNvbnN0IGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcyA9IFtcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QsXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSxcbi8vICAgICAvL015b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlLFxuLy8gXVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BTREsgaW1wbGVtZW50cyBJTXlvcFNESyB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGFic3RyYWN0IHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIG1lc3NhZ2VUb0hhbmRsZUFmdGVySW5pdDogQmFzZU15b3BNZXNzYWdlW10gPSBbXTtcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD4gPSB7fTtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3Q6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgbWVzc2FnZUNsZWFudXBDYWNoZTogUmVjb3JkPHN0cmluZywgQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPj4gfCBQcm9taXNlPHZvaWQ+ID0ge307XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGV2ZW50LmRhdGEgPyBldmVudC5kYXRhIDogZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgLy8gbm90IG15b3AgbWFya2VkIGV2ZW50IFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBiYXNlU0RLLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgKGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICAgIC8vVE9ETyA6IGZpeCBkaXJlY3Rpb24gPyBtZXNzYWdlIHdpbGwgbm90IHByb2NjZXNzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5EaXNwb3NlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzaG91bGQgbm90IGJlIG9wdGlvbmFsLCBmaXggYW5kIHJlbW92ZSAnaWYnXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbl1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGdvdCBvdXIgaWQgZnJvbSBvdXIgaG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IFNESyBtYXkgc2VydmUgbW9yZSB0aGFuIDEgY29tcG9uZW50IC4uIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicmVjaGl2ZWQgaW5pdCBtZXNzYWdlIGZvciBhbiBleHNpc2luZyBjb21wb25lbnQuXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdID0gbmV3IEhvc3RlZENvbXBvbmVudChuZXdDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXNwb25zZShuZXdDb21wb25lbnRJZCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHNhbWUgSG9zdFNESyBjYXNlc1xuICAgICAgICAgICAgLy8gd2hlbiBib3RoIFJlZkNvbXBvbmVudCBhbmQgcmVhbENvbXBvbmVudCBob3N0ZWQgaW4gdGhlIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9IGVudmVsb3BlZE1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gaW5uZXJNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCB8fCB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbiFdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gaW5uZXJNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGVudmVsb3BlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgOiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlID0gbWVzc2FnZSBhcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuICAgICAgICAgICAgLy8gLy8gICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DbGVhbnVwTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENsZWFudXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwTWVzc2FnZSA9IG5ldyBDbGVhbnVwUmVwbGF5TWVzc2FnZSghIWNsZWFudXApO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwTWVzc2FnZS5kZXN0aW5hdGlvbiA9IG1lc3NhZ2UuZGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRvckNsZWFudXAoY2xlYW51cCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRlbCBlcnJvcj9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25IYW5kbGVyRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIubWVzc2FnZVR5cGUgPT09IG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gaGFuZGxlci5leGVjdXRvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlICYmIGNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbbWVzc2FnZS5pZF0gPSBjbGVhbnVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCAmJiAhbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIG5vbi1jbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xlYW51cCAmJiBtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3IgYSBjbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25IYW5kbGVyRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogcHJpbnQgd2l0aCBkZWJ1ZyBjb25maWcgb25seVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBtZXNzYWdlIGhhbmRsZXIgd2FzIGZvdW5kIGZvciAnLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbml0OiAoKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL015b3BFbGVtZW50UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZU1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQmFzZU15b3BTREsnO1xuXG5leHBvcnQgdHlwZSBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgRGljdGlvbmFyeTxUPiA9IHsgW2tleTogc3RyaW5nXTogVDsgfTtcblxuLy9leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9ICdJZnJhbWVMb2FkZXInIHwgJ1dlYkNvbXBvbmVudExvYWRlcicgfCAnSFRNTExvYWRlcicgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBTa2luTG9hZGVycyA9IHtcbiAgICBcIklmcmFtZUxvYWRlclwiOiBcIklmcmFtZUxvYWRlclwiLFxuICAgIFwiV2ViQ29tcG9uZW50TG9hZGVyXCI6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCIsXG4gICAgXCJIVE1MTG9hZGVyXCI6IFwiSFRNTExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Db25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIC8vIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBJUHJvcENvbmZpZz4gLy9pZCAtIHR5cGVcbiAgICAvLyByZWZzOiBSZWNvcmQ8c3RyaW5nLCBJUmVmQ29uZmlnPixcbiAgICAvLyBza2luczogUmVjb3JkPHN0cmluZywgSVNraW5Db25maWc+XG4gICAgcHJvcHM6IElQcm9wQ29uZmlnW10sXG4gICAgcmVmczogSVJlZkNvbmZpZ1tdLFxuICAgIHNraW5zOiBJU2tpbkNvbmZpZ1tdLFxuICAgIGRlZmF1bHRTa2luOiBudW1iZXI7XG5cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgLy9yZXNvbHZlZERlZmluaXRpb25zPzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbXVxuICAgIC8vVE9ETyA6IG1vdmUgdG8gYmFzZSBjbGFzcyAoIElTdG9yYWJsZUl0ZW0gb3Igc28uLi4pXG5cbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQgPElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4ge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcEF0dHJpYnV0ZXMgPSB7XG4gICAgaWQ6ICdteW9wLWlkJ1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIElFbGVtZW50UmVmLCBNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuICAgICAgICAvL2NvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCpgKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IElFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICAvL2xldCBjb3VudGVyczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgfSAvL2Vsc2Uge1xuICAgICAgICAgICAgLy8gICAgIGlmICghY291bnRlcnNbaXRlbS50YWdOYW1lXSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gMDtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gKyAxO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgICBteW9wUmVmcy5wdXNoKG5ldyBYUGF0aEVsZW1lbnRSZWYoYCR7aXRlbS50YWdOYW1lfSgke2NvdW50ZXJzW2l0ZW0udGFnTmFtZV19KWAsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoKSwgZXZlbnQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY29uc3QgY2xlYW5VcFRhc2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaChjbGVhblVwVGFzayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vY2xlYW4gdXBcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBNeW9wTWVzc2FnZXMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDaGFuZ2VUZXh0TWVzc2FnZT4ge1xuICBcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcbiAgICBcbiAgICBleGVjdXRvciA9IChldmVudDogQ2hhbmdlVGV4dE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZTxUPiA9XG4gICAgVCBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiAvLyBFeGNsdWRlIGZ1bmN0aW9uc1xuICAgICAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBTZXJpYWxpemFibGU8VT5bXSA6IC8vIEhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3QgPyB7XG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEtdOiBTZXJpYWxpemFibGU8VFtLXT5cbiAgICAgICAgICAgIH0gOiBUOyAvLyBIYW5kbGUgb2JqZWN0c1xuXG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1ByaW1pdGl2ZXNPbmx5ID0gKG9iaikgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgaWYgaXQncyBhIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSXQncyBhIHByaW1pdGl2ZSwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm91bmQgYSBub24tcHJpbWl0aXZlIHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsIHZhbHVlcyBhcmUgcHJpbWl0aXZlcyBvciBuZXN0ZWQgb2JqZWN0cyB3aXRoIHByaW1pdGl2ZXNcbn1cblxuLy8gY3VycmVudGx5IHN1cHBvcnQgcm9vdCBsZXZlbCBvbmx5XG4vLyB7eDogMSwgeSA6ICdhJywgeiA6ICgpPT57Li4ufSwgaW5uZXIgOiB7IHg6IDEgLCB5IDogJ2EnfSB9XG4vLyB7eDogMSwgeSA6ICdhJ31cbi8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9GYWxzeVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBib29sZWFuIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+PiB8IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXphYmxlID0gPFQ+KFxuICAgIG9iajogVCxcbiAgICBza2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSB7fSxcbiAgICBpbmNsdWRlRmFsc3lLZXlzOiBib29sZWFuID0gdHJ1ZSwgLy8gVE9ETyA6IHVzZSB0aGF0IGFyZ1xuICAgIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBTZXJpYWxpemFibGU8YW55Pj4gPSBuZXcgV2Vha01hcCgpXG4pOiBTZXJpYWxpemFibGU8VD4gPT4ge1xuXG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBTZXJpYWxpemFibGU8VD47IC8vIERpcmVjdGx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQXJyYXk6IFNlcmlhbGl6YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVBcnJheSk7IC8vIFN0b3JlIHRoZSBhcnJheSBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iai5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQXJyYXlbaW5kZXhdID0gbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LCBza2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZUFycmF5IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZU9iamVjdDogUGFydGlhbDxTZXJpYWxpemFibGU8VD4+ID0ge307XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlT2JqZWN0KTsgLy8gU3RvcmUgdGhlIG9iamVjdCBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGluIHRoZSBza2VsZXRvbiBhbmQgaWYgaXQncyBhIHZhbGlkIGtleSB0byBzZXJpYWxpemVcblxuICAgICAgICAgICAgY29uc3Qga2V5SW5Ta2VsZXRvbiA9IHR5cGVvZiBza2VsZXRvbiA9PSBcImJvb2xlYW5cIiA/IHNrZWxldG9uIDogc2tlbGV0b25ba2V5XTtcblxuICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24pIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIHRvIHNlcmlhbGl6ZSB0aGlzIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZhbHN5S2V5cyA/IG9ialtrZXldICE9PSB1bmRlZmluZWQgOiBvYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCB0cnVlLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUluU2tlbGV0b24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgbmVzdGVkIGtleXMgdG8gc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCBrZXlJblNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZU9iamVjdCBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9IGFzIGFueTsgLy8gUmV0dXJuIGFuIGVtcHR5IG9iamVjdCBmb3Igb3RoZXIgY2FzZXNcbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBuZXcgUm9vdFJlZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5pbmNsdWRlcyhoYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kV2hlbiA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBwcmVkaWNhdGU6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gdm9pZCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgdXNlIGNvbXBvbmVudC5iaW5kV2hlbiB3aXRob3V0IGFuIGhhbmRsZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV07XG5cbiAgICAgICAgY29uc3QgcHJlZGljYXRlV3JhcHBlZEhhbmRsZXIgPSAoZTogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9UT0RPIDogaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gP1xuICAgICAgICBoYW5kbGVycy5wdXNoKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdvbk1lc3NhZ2VSZWNlaXZlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIGluY29tZU1lc3NhZ2UsIHRoaXMpO1xuICAgICAgICAvL1RPRE8gOiBoYW5kZWwgc3BlY2lhbCBldmV0cyA/IGxpa2UgaW5pdFJlcyA/XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKGluY29tZU1lc3NhZ2UgYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCk7XG5cbiAgICAgICAgICAgIC8va2VlcGluZyB0aGlzLm1ldGhvZCgpIHNvIHRoYXQgY29udGV4dCB3aWxsIHNhdmVkXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0odHlwZWRNZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgbWV0aG9kIG5vdCBmb3VuZCAke3R5cGVkTWVzc2FnZS5tZXRob2R9IG9uIGNvbXBvbmVudGAsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlZCB8fCBoYW5kbGVyKGluY29tZU1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBjb25zb2xlIG9ubHkgd2hlbiBkZWJ1ZyBjb25maWdcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIGhhbmRsZXJzIGZvdW5kIGZvciAnLCBpbmNvbWVNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSlcbiAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF93aGVuSW5pdGlhdGVkUmVzb2x2ZT86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuICAgIF93aGVuSW5pdGlhdGVkUmVqZWN0PzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG5cbiAgICBfd2hlbkluaXRpYXRlZDogUHJvbWlzZTxhbnk+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuSW5pdGlhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZENsZWFudXBNZXNzYWdlKG1lc3NhZ2U6IENsZWFudXBNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbihtZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gbWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgfSwgKG06IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLmhhbmRsZXIobSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICB0aGlzLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZW5kKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyIHtcbiAgICAgICAgLy9tZXNzYWdlcyB0aGF0IGV4ZXRyYWN0ZWQgZnJvbSBlbnZlbG9wZSBhbHJlYWR5IGhhdmUgc291cmNlIGluIHRoZW1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBsZXQgY2xlYW51cEhhbmRsZXI7XG4gICAgICAgIC8vIFRPRE8gOiBmaXggaGVhdnkgb3AuLlxuICAgICAgICAvLyAgaWYgKGlzSW5oZXJpdEZyb20obWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChtZXNzYWdlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIE15b3BCaW5kTWVzc2FnZSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4odHlwZWRNZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IHR5cGVkTWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgICAgIH0sIHR5cGVkTWVzc2FnZS5oYW5kbGVyKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZikge1xuICAgICAgICAgICAgLy8gc2VyaWFsaXphYmxlXG4gICAgICAgICAgICBtZXNzYWdlLnJlZiA9IG1lc3NhZ2UucmVmLl9fbm9uUHJveGllZCB8fCBtZXNzYWdlLnJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDbGVhbnVwTWVzc2FnZShuZXcgQ2xlYW51cE1lc3NhZ2UobWVzc2FnZS5pZCwgKHJlcGxheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2cgcmVwbGF5P1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSBzZGsubG9nZ2VyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdkaXNwb3NpbmcgYmVmb3JlIGlzSW5pdGlhdGVkJywgdGhpcy5pZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBjb21wb25lbnQnLCB0aGlzLmlkKTtcblxuICAgICAgICAvLyAvL1RPRE8gOiBpbXBsZW1lbnQgZGlzcG9zZSBmbG93XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHRoaXMucmVmcykuZm9yRWFjaChyZWZLZXk9PntcbiAgICAgICAgLy8gICAgIHRoaXMucmVmc1tyZWZLZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHRpbWUgZm9yIHRoZSBvXG4gICAgICAgIC8vIHRoZXIgc2lkZSB0byBwcm9jY2VzcyB0byBtZXNzYWdlIGJlZm9yZSBkaWUgP1xuICAgICAgICAvL25vdGlmeSB0aGUgb3RoZXIgc2lkZSBTREtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBEaXNwb3NlTWVzc2FnZSgpKVxuXG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddXG4gICAgICAgIGlmIChvbkRpc3Bvc2VIYW5kbGVycykge1xuICAgICAgICAgICAgb25EaXNwb3NlSGFuZGxlcnMuZm9yRWFjaChkaXNwb3NlSGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBudWxsIG9yIGZpeCB0aGUgdHlwZSA/XG4gICAgICAgICAgICAgICAgZGlzcG9zZUhhbmRsZXIobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge31cbiAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3BzOiBQID0ge30gYXMgdW5rbm93biBhcyBQO1xuICAgIHJlZnM6IFIgPSB7fSBhcyB1bmtub3duIGFzIFI7XG59XG4iLCAiZXhwb3J0IGNvbnN0IEVycm9ycyA9IHtcbiAgICBub3RTZXJpYWxpemFibGVSZWZDYWxsOiAocHJvcCwgYXJnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG5UaGUgaW5wdXQgcHJvdmlkZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgaXMgbm90IHNlcmlhbGl6YWJsZS4gU2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSBjYW4gYmUgc2FmZWx5IHRyYW5zZmVycmVkIHRvIHRoZSBza2luIGltcGxlbWVudGF0aW9uLiBcblRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGF0YSBhcmUgY29uc2lkZXJlZCBub24tc2VyaWFsaXphYmxlIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkOlxuXG4tIEZ1bmN0aW9uc1xuLSBET00gZWxlbWVudHNcbi0gQ2xhc3MgaW5zdGFuY2VzXG4tIENpcmN1bGFyIHJlZmVyZW5jZXNcbi0gU3ltYm9sc1xuLSBCaWdJbnQgdmFsdWVzXG5cbkluIHRoZSBmb2xsb3dpbmcgZXhlY3V0aW9uIHdlIGRldGVjdGVkIDpcbn5+fn5+fn5+XG4ke2FyZ30gXG5+fn5+fn5+flxuYXMgbm90IHNlcmlhbGl6YWJsZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGlucHV0cyBwYXNzZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgYXJlIGluIGEgc2VyaWFsaXphYmxlIGZvcm1hdC5cblRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMpLCBhcnJheXMsIGFuZCBwbGFpbiBvYmplY3RzLiBcbklmIHlvdSBuZWVkIHRvIGluY2x1ZGUgY29tcGxleCBkYXRhIHR5cGVzLCBjb25zaWRlciBjb252ZXJ0aW5nIHRoZW0gdG8gYSBzZXJpYWxpemFibGUgc3RydWN0dXJlIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGZ1bmN0aW9uLlxuT3IgdXNlIE15b3AgbWVzc2FnZSB0aGF0IHN1cHBvcnQgaXQ6IEN1c3RvbVJlZk1lc3NhZ2UsIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlIG9yIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLlxuXG5TdWdnZXN0ZWQgRml4OlxuMS4gUmVtb3ZlIG9yIHJlcGxhY2Ugbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgZnJvbSB5b3VyIGlucHV0LlxuMi4gSWYgdXNpbmcgb2JqZWN0cywgZW5zdXJlIHRoZXkgZG8gbm90IGNvbnRhaW4gYW55IGZ1bmN0aW9ucyBvciBjaXJjdWxhciByZWZlcmVuY2VzLlxuMy4gQ29udmVydCBhbnkgY2xhc3MgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHMgb3IgSlNPTi1jb21wYXRpYmxlIGZvcm1hdHMuXG40LiBVc2UgZGVkaWNhdGVkIE15b3AgbWVzc2FnZS5cblxuRm9yIG1vcmUgZGV0YWlscyBvbiBzZXJpYWxpemF0aW9uIGFuZCBNeW9wIG1lc3NhZ2UgZXhhbXBsZXMsIHJlZmVyIHRvIGh0dHBzOi8vZG9jcy5teW9wLmRldlxcLlxuXG5gKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50LCBJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RW52ZWxvcGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0VudmVsb3BlZE1lc3NhZ2VcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BSZWZDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBwYXJlbnQ6IElNeW9wQ29tcG9uZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICAvL1RPRE8gOiBjaGVjayBwYXJlbnRDb21wb25lbnQuY29udGFpbmVyLi4uXG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIHBhcmVudC5jb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKGFyZ3VtZW50cy5jYWxsZWUubmFtZSkpO1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2hpZGUnKSk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzaG93JykpO1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVhbCBjbGVhbnVwXG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBpbnNwZWN0IGNhbGxlZCwgY3JlYXRpbmcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBpbnNwZWN0JywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgdGhpcy5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2luc3BlY3QnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQnKSk7XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnKSB7XG4gICAgICAgIC8vICBkZWJ1Z2dlcjtcbiAgICAgICAgLy8gICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIG1lc3NhZ2Ugc2VuZGluZyAnLCBtZXNzYWdlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyB0aGlzLmlkIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBuZXN0ZWQgY29tcG9uZW50XG4gICAgICAgIHRoaXMucGFyZW50LnNlbmQobmV3IEVudmVsb3BlZE1lc3NhZ2UodGhpcy5pZCwgbWVzc2FnZSkpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdkaXNwb3NlJykpO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxufVxuIiwgIi8vdHlwZSBBQ29uc3RydWN0b3JUeXBlT2Y8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBDdXN0b21SZWZNZXNzYWdlLCBSZWZ9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgbWVzc2FnZXMgZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIENsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50Q29uZmlnLFxuICAgIHR5cGUgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudFJlZkJlaGF2aW9yLCBJSFRNTExvYWRlckNvbmZpZywgSVByb3BDb2RlQmVoYXZpb3IsXG4gICAgSVByb3BDb25maWcsIElTa2luQ29uZmlnLCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICBSZWZCZWhhdmlvclR5cGUsIFNoYWRvd1Jvb3RNb2RlVHlwZSwgU2tpbkxvYWRlcnMsIFNraW5Mb2FkZXJUeXBlXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7Y29udGFpbnNQcmltaXRpdmVzT25seX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQge0Vycm9yc30gZnJvbSBcIi4vbG9nTWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcFJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWwgZnJhbWUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWwgZnJhbWUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09IHJlZkNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICAvL3NhbWUgbWVtb3J5IGVudiwgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICE9PSByZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9cblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhlcmUgPlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHdoYXQgYWJvdXQgcmVhcHRlcnMgPyEgZHluYW1pYyA/IVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGV4c2lzdGluZ1JlZkNvbXBvbmVudCA9IGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gYXMgTXlvcFJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiAoZXhzaXN0aW5nUmVmQ29tcG9uZW50LmlkICYmIGV4c2lzdGluZ1JlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IFtjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLCByZWZDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLnB1c2gocmVmQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50OyAvL2hvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gcmVmQ29tcG9uZW50LmlkKSE7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaW4gd2ViY29tcG9uZW50IGNhc2UgdGhlIHNhbWUgaWQgd2lsbCBhbHJlZGF5IGJlIGhlcmUsIHdoaWNoIGlzIGdvb2QgIVxuICAgICAgICAgICAgICAgIC8vIG5hbWU6XG4gICAgICAgICAgICAgICAgLy8gICAgIGlkXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudERlZmluaXRpb25JZFxuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGlubmVyIGNvbXBvbmVudHMgaW5zaWRlIHJlZiBjb21wb25lbnQgOlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVzdGVkUmVmcy5mb3JFYWNoKG5lc3RlZFJlZkNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzIS5maW5kKGMgPT4gYy50eXBlLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucz8uZmluZChkZWYgPT4gZGVmLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJlZkNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy50eXBlLnJlZnMuZmluZChyID0+IHIubmFtZSA9PT0gbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXJlZkNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdubyByZWZDb25maWcgZm91bmQgZm9yIG5lc3RlZCByZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQobmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiwgcmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ29tcG9uZW50LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQucmVmc1tuZXN0ZWRSZWZDb25maWcucmVmTmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChuZXN0ZWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhyZWZDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgY29tcG9uZW50cywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDp1c2UgY29uZmlnIGNoZWNrIGZvciBhdXRvLWhpZ2h0IGFuZCBjb252ZXJ0IHR5cGUgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVmQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFJlZnMgPSBhc3luYyAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCB3aXRob3V0UmVmQ29tcG9uZW50czogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZWZzKVxuICAgICAgICBjb21wb25lbnQucmVmcyA9IHt9O1xuXG4gICAgY29uc3Qgd2FpdEZvciA9IE9iamVjdC52YWx1ZXMoY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVmcykubWFwKHJlZiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmLmJlaGF2aW9yLnR5cGUgPT0gUmVmQmVoYXZpb3JUeXBlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9XG5cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFJlZkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoYW5nZSB0byBnZXQgaXQgZnJvbSB0aGUgZmxvd1xuICAgICAgICAgICAgICAgIGxldCByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5jb21wb25lbnRJZDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZkNvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5pbnN0YW5jZS5jb21wb25lbnRJZFxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zIS5maW5kKGNvbXBkZWYgPT4gY29tcGRlZi5pZCA9PT0gcmVmQ29tcG9uZW50SWQpITtcbiAgICAgICAgICAgICAgICAvLyAvL2NvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhd2FpdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKGNvbXBvbmVudEluc3RhbmNlQ29uZmlnLmNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZSB3ZSB3aWxsIG5lZWQgaW5zdGFuY2UgaWQgaGVyZSAuLi5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPy5maW5kKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQudHlwZS5pZCA9PT0gcmVmQ29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDb21wb25lbnRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCBuZXN0ZWRDb21wb25lbnRDb25maWcgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY29uc3QgY29tcG9uZW50SW5zdGFuY2VDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UubmVzdGVkQ29tcG9uZW50cz8uZmluZChjb21wb25lbnRJbnN0YWNlID0+IGNvbXBvbmVudEluc3RhY2UuY29tcG9uZW50SWQgPT09IGNvbXBvbmVudERlZmluaXRpb25Db25maWcuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGlmKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPIFRPRE8gVE9ETyAnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6dGhpbmsgYWJvdXQgdGhhdCA6XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLnJlc29sdmVkRGVmaW5pdGlvbnMgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zO1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGluc3RhbmNlOiBuZXN0ZWRDb21wb25lbnRDb25maWcuaW5zdGFuY2UhLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6IG5lc3RlZENvbXBvbmVudENvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG5hbWU6IG5lc3RlZENvbXBvbmVudENvbmZpZy5uYW1lXG4gICAgICAgICAgICAgICAgLy8gICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBfcmVmID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbmVzdGVkICEhIGNyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50KF9yZWYsIG5lc3RlZENvbXBvbmVudENvbmZpZyEsIGNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgICAgIC8vVERPTyA6IHB1dCB0aGF0IHJlZiBjb21wb25lbnQgc29tZXdoZXJlP1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub25Qcm94aWVkID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBjcmVhdGVSZWZQcm94eShfX25vblByb3hpZWQsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJz8nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgdHlwZSBwcm9wVHlwZXM8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4gPSB7XG4gICAgW1Byb3BlcnR5IGluIGtleW9mIFRdOlxuICAgIFRbUHJvcGVydHldIGV4dGVuZHMgeyBtb2RlOiAnaW5wdXQnIH0gP1xuICAgICAgICBUW1Byb3BlcnR5XVsndHlwZSddIDpcbiAgICAgICAgUHJvbWlzZTxUW1Byb3BlcnR5XVsndHlwZSddPlxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuXG5leHBvcnQgY29uc3QgYWN0QXMgPSA8VD4ocmVmOiBSZWYpID0+IHtcbiAgICByZXR1cm4gcmVmIGFzIHVua25vd24gYXMgRnVuY3Rpb25pZnlSZWY8VD5cbn1cblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25pZnlSZWY8VCA9IGFueT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiAvLyBJZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgPyAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiAvLyBDb252ZXJ0IGl0IHRvIGEgcHJvbWlzZWQgZnVuY3Rpb25cbiAgICAgICAgOiBUW0tdXG59O1xuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNZXNzYWdlRGlyZWN0aW9uXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucylcblxuICAgICAgICBpZiAoKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy8gVE9ETyA6IHVzZSBiZXR0ZXIgY2hlY2sgZm9yIGluc3BlY3QgbW9kZVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaW5zcGVjdCBjYWxsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wSWZyYW1lQ29tcG9uZW50JywgMTAsIHRoaXMuY29udGFpbmVyLCB0aGlzLklmcmFtZUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ISgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3NlbmR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgc2VuZCh7aGVpZ2h0LCB3aWR0aH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIHNldFNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XG5cblxuICAgICAgICAgICAgLy9UT0RPOiBmaXggdGhhdCBoYWNrLCBrZWVwIHRoZSBmdW5jdGlvbiBpbiByaWdodCBmb3JtYXQgd2hpbGUgbWluaWZpZWQgOihcbiAgICAgICAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVG8gZW5zdXJlIGl0J3Mgbm90IG9wdGltaXplZCBhd2F5LCB5b3UgY2FuIGNhbGwgaXQgYXQgbGVhc3Qgb25jZVxuICAgICAgICAgICAgbGV0IHggPSBub09wKCk7XG4gICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB4LS07XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGAke3dpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgKzEgP1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAsIHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgKyB4ICsgJ3B4J1xuXG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByZXQuY29udGVudDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcbiAgICAgICAgLy9UT0RPIDogPyE/ISBzaG91bGQgaXQgYmUgaGVyZSA/XG4gICAgICAgIGlmIChtZXNzYWdlXy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlXyBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKVxuICAgICAgICAgICAgdGhpc1t0eXBlZE1lc3NhZ2UubWV0aG9kXSgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2sgOihcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICBtZXNzYWdlXy5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UobWVzc2FnZV8sICcqJyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLk11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG4gICAgICAgICAgICB8fCBpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIC8vdGhpcy5zZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdClcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QoKTtcblxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25lZWRzIHRvIGxvYWQgaW50byBhbiBleHNpc3RpbmcgSWZyYW1lLi4uJywgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MSUZyYW1lRWxlbWVudClcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdHlwZWRMb2FkZXJDb25maWcudXJsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCduZWVkcyB0byBjcmVhdGUgbmV3IElmcmFtZS4uLicsIGRvbUlkLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCA6XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgLy9jb25zdCB1bmlxVXJsID0gdXJsMmxvYWQgPT09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPyBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9tXCIsIGRvbUlkKSA6IHVybDJsb2FkXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2hhc1BhcmVudClcbiAgICAgICAgICAgICAgICB1cmwybG9hZCA9IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX215b3AtY29tcFwiLCB1bmlxSWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgJ3N0eWxlJyBhdHRyIG1lcmdlIGhlcmVcbiAgICAgICAgICAgIGxldCBlbGVtZW50QXR0cmlidXRlc1N0cmluZyA9ICcnO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVzU3RyaW5nID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2tleX09XCIke1N0cmluZyh2YWx1ZSl9XCJgO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50Lm91dGVySFRNTCA9IGA8aWZyYW1lIFxuICAgICAgICAgICAgICAgaWQ9XCIke2RvbUlkfVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIlxuICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgICAgIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07ICAgIFxuICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICR7b3B0aW9ucz8uaGlkZGVuID8gJ2Fic29sdXRlJyA6ICdzdGF0aWMnfTtcbiAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgc3JjPVwiJHt1cmwybG9hZH1cIlxuICAgICAgICAgICAgJHtlbGVtZW50QXR0cmlidXRlc1N0cmluZ31cbiAgICAgICAgICAgID48L2lmcmFtZT5gO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCMke2RvbUlkfWApIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21JZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvL05PIDogSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wV2ViY29tcG9uZW50Q29uc3RzID0ge1xuICAgIHdlYmNvbXBvbmVudF9tZXNzYWdlX2tleTogJ215b3Bfd2ViY29tcG9uZW50X21lc3NhZ2UnXG59XG4iLCAiaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50L2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgLy9UT0RPIDogY2FuIGJlIGRvbmUgd2l0aG91dCBjbG9uaW5nP1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2VfLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBuZXcgQ3VzdG9tRXZlbnQ8QmFzZU15b3BNZXNzYWdlPihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXyxcbiAgICAgICAgICAgIC8vIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1zZylcblxuICAgICAgICAvL3NlbmRpbmcgZGF0YSBmcm9tIGhvc3QgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkaXNwYXRjaEV2ZW50JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NCwgd2FpdH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3Qgc2VlbjogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuZXhwb3J0IGNsYXNzIFdlYmNvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5XZWJDb21wb25lbnRMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoIXNlZW5bbG9hZGVyQ29uZmlnLnVybF0pIHtcbiAgICAgICAgICAgIC8vIGF3YWl0IGltcG9ydCggLyogQHZpdGUtaWdub3JlICovIHdlYkNvbXBvbmVudExvYWRVcmwpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ21vZHVsZSBsb2FkZWQnKTtcbiAgICAgICAgICAgIHNlZW5bbG9hZGVyQ29uZmlnLnVybF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViQ29tcG9uZW50TG9hZFVybCA9IGxvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB3ZWJDb21wb25lbnRMb2FkVXJsO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kdWxlIGFscmVkYXkgbG9hZGVkIG9yIGluIGxvYWRpbmcgcHJvY2VzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2Vlbltsb2FkZXJDb25maWcudXJsXTtcblxuICAgICAgICAvL1RPRE8gOiBhZGQgcmV0cnkgbWVjaGFuaXNtIGluIGZhaWwgY2FzZS5cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLCBzaG91bGQgZml4IHRoZSByYWNlIGNvbmRpdGlvbiBmb3IgbG9hZGVkIG1vZHVsZXNcbiAgICAgICAgYXdhaXQgd2FpdCgxKTtcblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2FkZXJDb25maWcudGFnKTtcblxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmKG9wdGlvbnM/Ll9lbnZpcm9ubWVudCl7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbGVtZW50Ll9teW9wRW52aXJvbm1lbnQgPSBvcHRpb25zPy5fZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7bG9hZGVyQ29uZmlnLnRhZ30gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAnMC4xLjQ0JzsiLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZVwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZj8ucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuXG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZXZlbnQub3B0aW9ucy5pZCkhO1xuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8vLz4+Pj5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKGBmYWlsZWQgdG8gZmluZCAke2V2ZW50Lm9wdGlvbnMuaWR9IGluIG1lbSBzY29wZWAsIGhvc3RTREspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdGhlIHJlZiBjb21wb25lbnQgaW4gb3VyIEhvc3RTREsgKHNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vICByZWZDb21wb25lbnQucGFyZW50ID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIHJlZiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGhvc3RTREsuY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBob3N0U0RLLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCByZW1vdmVkIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgdXNpbmcgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm8gbmVlZCB0aGlzLCBwYXNzIG9wdGlvbnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvL2ltcGxlbWVudGF0aW9uQ29tcG9uZW50LmlkID0gZXZlbnQucHJlZGVmaW5lZElkO1xuICAgICAgICAgICAgICAgIC8vcmVmQ29tcG9uZW50LmlkICs9ICcuJztcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vdCByZWFsbHkgbmVlZGVkID9cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKClcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgXG4gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJHtvcHRpb25zPy5oaWRkZW4gPyAnYWJzb2x1dGUnIDogJ3N0YXRpYyd9O1xuICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgICAgIGApO1xuICAgICAgICAgICAgLy8gIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChJZnJhbWVFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gV3JpdGUgY29udGVudCBpbnRvIHRoZSBpZnJhbWVcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZG9jID0gSWZyYW1lRWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgICAgZG9jLm9wZW4oKTtcblxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuICAgICAgICAgICAgZG9jLndyaXRlbG4oYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fID0gXG4gICAgICAgICAgICAgICAgICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZSBcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9kYXkgd2UgZG9pbmcgc28ganVzdCBmb3IgdGhlIENKUyB2ZXJzaW9uIFxuICAgICAgICAgICAgICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pfX07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICA8L3NjcmlwdD5gKTtcblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lVc2VyRmxvd30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG4vKipcbiAqXG4gKiAjIyBPdmVydmlld1xuICpcbiAqIFRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBjbGFzcyBzZXJ2ZXMgYXMgYSBjZW50cmFsaXplZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgcmV0cmlldmluZyB1c2VyIGZsb3dzIGFuZCBjb21wb25lbnRzIGZyb20gdGhlIE15b3AuZGV2IGNsb3VkIHNlcnZpY2UuIEl0IGltcGxlbWVudHMgYSBzaW5nbGV0b24gcGF0dGVybiBhbmQgcHJvdmlkZXMgY2FjaGluZyBtZWNoYW5pc21zIHRvIG9wdGltaXplIEFQSSBjYWxscyBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqXG4gKiAjIyBDbGFzcyBTdHJ1Y3R1cmVcbiAqXG4gKiAjIyMgQ29uc3RydWN0b3JcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKVxuICogYGBgXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBfYmFzZVVybGAgKG9wdGlvbmFsKTogVGhlIGJhc2UgVVJMIGZvciB0aGUgTXlvcC5kZXYgY2xvdWQgQVBJLiBEZWZhdWx0cyB0byBgJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnYFxuICpcbiAqICMjIyBTdGF0aWMgUHJvcGVydGllc1xuICpcbiAqICMjIyMgTWFpblxuICogYGBgdHlwZXNjcmlwdFxuICogc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gKiBgYGBcbiAqXG4gKiBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgYENsb3VkUmVwb3NpdG9yeWAgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IGNyZWF0aW5nIG11bHRpcGxlIGluc3RhbmNlcy5cbiAqXG4gKiAjIyMgUHJpdmF0ZSBQcm9wZXJ0aWVzXG4gKlxuICogIyMjIyB1c2VyRmxvd3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG4gKiBgYGBcbiAqXG4gKiBBIGNhY2hlIG9iamVjdCB0aGF0IHN0b3JlcyBwcm9taXNlcyBmb3IgdXNlciBmbG93cywgaW5kZXhlZCBieSBmbG93IElELiBUaGlzIHByZXZlbnRzIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgYW5kIGVuc3VyZXMgY29uc2lzdGVudCBkYXRhIHJldHJpZXZhbC5cbiAqXG4gKiAjIyMjIF9iYXNlVXJsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBwcml2YXRlIF9iYXNlVXJsOiBzdHJpbmdcbiAqIGBgYFxuICpcbiAqIFRoZSBiYXNlIFVSTCBmb3IgdGhlIGNsb3VkIEFQSSBlbmRwb2ludHMsIHNldCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICpcbiAqICMjIE1ldGhvZHNcbiAqXG4gKiAjIyMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKVxuICpcbiAqIFJldHJpZXZlcyBhIGNvbXBsZXRlIHVzZXIgZmxvdyBmcm9tIHRoZSBjbG91ZCByZXBvc2l0b3J5LCBpbmNsdWRpbmcgYWxsIHJlc29sdmVkIGNvbXBvbmVudHMuXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBmbG93SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGZsb3cgdG8gcmV0cmlldmVcbiAqXG4gKiAqKlJldHVybnM6KipcbiAqIC0gYFByb21pc2U8SVVzZXJGbG93PmA6IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21wbGV0ZSB1c2VyIGZsb3cgb2JqZWN0XG4gKlxuICogKipCZWhhdmlvcjoqKlxuICogLSBJbXBsZW1lbnRzIHJlcXVlc3QgY2FjaGluZyB0byBhdm9pZCBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IElEXG4gKiAtIE1ha2VzIGEgR0VUIHJlcXVlc3QgdG8gYC9mbG93P2lkPXtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAqIC0gQXV0b21hdGljYWxseSByZXNvbHZlcyBjb21wb25lbnQgcmVmZXJlbmNlcyB3aXRoaW4gdGhlIGZsb3dcbiAqIC0gU3RvcmVzIHRoZSBwcm9taXNlIGluIHRoZSBjYWNoZSBmb3IgZnV0dXJlIHVzZVxuICpcbiAqICoqRXhhbXBsZSBVc2FnZToqKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdygnbXktZmxvdy1pZCcpO1xuICogY29uc29sZS5sb2coZmxvdy5jb21wb25lbnRzKTtcbiAqIGBgYFxuICpcbiAqICMjIyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ6IHN0cmluZylcbiAqXG4gKiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyBjb21wb25lbnQgZnJvbSB3aXRoaW4gYSB1c2VyIGZsb3cuXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBjb21wb25lbnRJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudCB0byByZXRyaWV2ZVxuICogLSBgZmxvd0lkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBmbG93IGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudFxuICpcbiAqICoqUmV0dXJuczoqKlxuICogLSBgUHJvbWlzZTxDb21wb25lbnQgfCB1bmRlZmluZWQ+YDogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBvbmVudCBvYmplY3QgaWYgZm91bmQsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAqXG4gKiAqKkJlaGF2aW9yOioqXG4gKiAtIEZpcnN0IGZldGNoZXMgdGhlIGNvbXBsZXRlIGZsb3cgdXNpbmcgYGZldGNoRmxvdygpYFxuICogLSBTZWFyY2hlcyB0aHJvdWdoIHRoZSBmbG93J3MgY29tcG9uZW50cyBhcnJheSB0byBmaW5kIHRoZSBtYXRjaGluZyBjb21wb25lbnRcbiAqIC0gVXNlcyB0aGUgY29tcG9uZW50J3MgYHR5cGUuaWRgIHByb3BlcnR5IGZvciBtYXRjaGluZ1xuICpcbiAqICoqRXhhbXBsZSBVc2FnZToqKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcG9uZW50ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoJ2J1dHRvbi1jb21wb25lbnQnLCAnbXktZmxvdy1pZCcpO1xuICogaWYgKGNvbXBvbmVudCkge1xuICogICAgIGNvbnNvbGUubG9nKCdDb21wb25lbnQgZm91bmQ6JywgY29tcG9uZW50KTtcbiAqIH0gZWxzZSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0NvbXBvbmVudCBub3QgZm91bmQgaW4gZmxvdycpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMgQVBJIEludGVncmF0aW9uXG4gKlxuICogIyMjIEVuZHBvaW50IFN0cnVjdHVyZVxuICpcbiAqIFRoZSBjbGFzcyBpbnRlZ3JhdGVzIHdpdGggdGhlIGZvbGxvd2luZyBNeW9wLmRldiBjbG91ZCBBUEkgZW5kcG9pbnQ6XG4gKlxuICogYGBgXG4gKiBHRVQge2Jhc2VVcmx9L2Zsb3c/aWQ9e2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzXG4gKiBgYGBcbiAqXG4gKiAqKlF1ZXJ5IFBhcmFtZXRlcnM6KipcbiAqIC0gYGlkYDogVGhlIGZsb3cgaWRlbnRpZmllclxuICogLSBgcmVzb2x2ZT1jb21wb25lbnRzYDogSW5zdHJ1Y3RzIHRoZSBBUEkgdG8gaW5jbHVkZSByZXNvbHZlZCBjb21wb25lbnQgZGF0YSBpbiB0aGUgcmVzcG9uc2VcbiAqXG4gKiAjIyMgUmVzcG9uc2UgRm9ybWF0XG4gKlxuICogVGhlIEFQSSBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBKU09OIHJlc3BvbnNlIHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKlxuICogYGBganNvblxuICoge1xuICogICAgIFwiaXRlbVwiOiB7XG4gKiAgICAgICAgIC8vIElVc2VyRmxvdyBvYmplY3Qgd2l0aCByZXNvbHZlZCBjb21wb25lbnRzXG4gKiAgICAgICAgIFwiY29tcG9uZW50c1wiOiBbXG4gKiAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiBcImNvbXBvbmVudC1pZFwiXG4gKiAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgIC8vIC4uLiBvdGhlciBjb21wb25lbnQgcHJvcGVydGllc1xuICogICAgICAgICAgICAgfVxuICogICAgICAgICBdXG4gKiAgICAgICAgIC8vIC4uLiBvdGhlciBmbG93IHByb3BlcnRpZXNcbiAqICAgICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBDYWNoaW5nIFN0cmF0ZWd5XG4gKlxuICogVGhlIGBDbG91ZFJlcG9zaXRvcnlgIGltcGxlbWVudHMgYSBwcm9taXNlLWJhc2VkIGNhY2hpbmcgbWVjaGFuaXNtOlxuICpcbiAqIDEuICoqQ2FjaGUgS2V5Kio6IEZsb3cgSUQgaXMgdXNlZCBhcyB0aGUgY2FjaGUga2V5XG4gKiAyLiAqKkNhY2hlIFZhbHVlKio6IFByb21pc2VzIGFyZSBjYWNoZWQgcmF0aGVyIHRoYW4gcmVzb2x2ZWQgdmFsdWVzIHRvIGhhbmRsZSBjb25jdXJyZW50IHJlcXVlc3RzXG4gKiAzLiAqKkNhY2hlIER1cmF0aW9uKio6IENhY2hlIHBlcnNpc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIDQuICoqQ2FjaGUgSW52YWxpZGF0aW9uKio6IE5vIGF1dG9tYXRpYyBjYWNoZSBpbnZhbGlkYXRpb24gaXMgaW1wbGVtZW50ZWRcbiAqXG4gKiAjIyBFcnJvciBIYW5kbGluZ1xuICpcbiAqIC0gTmV0d29yayBlcnJvcnMgYW5kIEFQSSBmYWlsdXJlcyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdoIHByb21pc2UgcmVqZWN0aW9uXG4gKiAtIE5vIHNwZWNpZmljIGVycm9yIGhhbmRsaW5nIG9yIHJldHJ5IGxvZ2ljIGlzIGltcGxlbWVudGVkIGF0IHRoZSByZXBvc2l0b3J5IGxldmVsXG4gKiAtIENvbnN1bWVycyBzaG91bGQgaW1wbGVtZW50IGFwcHJvcHJpYXRlIGVycm9yIGhhbmRsaW5nIHdoZW4gY2FsbGluZyByZXBvc2l0b3J5IG1ldGhvZHNcbiAqXG4gKiAjIyBVc2FnZSBQYXR0ZXJuc1xuICpcbiAqICMjIyBTaW5nbGV0b24gQWNjZXNzXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tICcuL3BhdGgvdG8vQ2xvdWRSZXBvc2l0b3J5JztcbiAqXG4gKiAvLyBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdygnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMjIEN1c3RvbSBJbnN0YW5jZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgY3VzdG9tIGluc3RhbmNlIHdpdGggZGlmZmVyZW50IGJhc2UgVVJMXG4gKiBjb25zdCBjdXN0b21SZXBvID0gbmV3IENsb3VkUmVwb3NpdG9yeSgnaHR0cHM6Ly9jdXN0b20tYXBpLmV4YW1wbGUuY29tJyk7XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgY3VzdG9tUmVwby5mZXRjaEZsb3coJ2Zsb3ctaWQnKTtcbiAqIGBgYFxuICpcbiAqICMjIyBDb21wb25lbnQgUmV0cmlldmFsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgYSBzcGVjaWZpYyBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAqIGNvbnN0IGNvbXBvbmVudCA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KCdjb21wb25lbnQtaWQnLCAnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMgRGVwZW5kZW5jaWVzXG4gKlxuICogLSAqKklVc2VyRmxvdyoqOiBJbnRlcmZhY2UgaW1wb3J0ZWQgZnJvbSBgLi4vY29tbW9uYCB0aGF0IGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB1c2VyIGZsb3cgb2JqZWN0c1xuICogLSAqKkZldGNoIEFQSSoqOiBVc2VzIHRoZSBuYXRpdmUgYGZldGNoYCBmdW5jdGlvbiBmb3IgSFRUUCByZXF1ZXN0c1xuICpcbiAqICMjIFBlcmZvcm1hbmNlIENvbnNpZGVyYXRpb25zXG4gKlxuICogLSAqKkNhY2hpbmcqKjogUHJldmVudHMgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBJRFxuICogLSAqKlByb21pc2UgQ2FjaGluZyoqOiBIYW5kbGVzIGNvbmN1cnJlbnQgcmVxdWVzdHMgZWZmaWNpZW50bHkgYnkgY2FjaGluZyBwcm9taXNlc1xuICogLSAqKkNvbXBvbmVudCBSZXNvbHV0aW9uKio6IFRoZSBgcmVzb2x2ZT1jb21wb25lbnRzYCBwYXJhbWV0ZXIgZW5zdXJlcyBjb21wb25lbnRzIGFyZSBmdWxseSByZXNvbHZlZCBpbiBhIHNpbmdsZSBBUEkgY2FsbFxuICpcbiAqICMjIEZ1dHVyZSBFbmhhbmNlbWVudHNcbiAqXG4gKiBUaGUgY2xhc3Mgc3RydWN0dXJlIHN1Z2dlc3RzIHBsYW5uZWQgZnVuY3Rpb25hbGl0eSB0aGF0IGNvdWxkIGJlIGltcGxlbWVudGVkOlxuICpcbiAqIC0gKipDb21wb25lbnQgQ2FjaGluZyoqOiBUaGUgY29tbWVudGVkIGBjb21wb25lbnRzYCBwcm9wZXJ0eSBpbmRpY2F0ZXMgcG90ZW50aWFsIGluZGl2aWR1YWwgY29tcG9uZW50IGNhY2hpbmdcbiAqIC0gKipDYWNoZSBJbnZhbGlkYXRpb24qKjogTWV0aG9kcyB0byBjbGVhciBvciByZWZyZXNoIGNhY2hlZCBkYXRhXG4gKiAtICoqRXJyb3IgUmV0cnkgTG9naWMqKjogQXV0b21hdGljIHJldHJ5IG1lY2hhbmlzbXMgZm9yIGZhaWxlZCByZXF1ZXN0c1xuICogLSAqKkJhdGNoIE9wZXJhdGlvbnMqKjogTWV0aG9kcyB0byBmZXRjaCBtdWx0aXBsZSBmbG93cyBvciBjb21wb25lbnRzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHN0YXRpYyBNYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIC8vIHByaXZhdGUgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtjb21wb25lbnRJZH0mYXV0bz10cnVlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxufVxuIiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHR5cGUge0lmcmFtZVNES30gZnJvbSBcIi4uL0lmcmFtZVwiO1xuaW1wb3J0IHtjb25uZWN0UHJvcHMsIGNvbm5lY3RSZWZzLCBjcmVhdGVSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElFeHBlcmllbmNlLCBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCwgSVNlZ21lbnRlZFNraW5Db25maWcsIElTZWdtZW50RXhwZXJpZW5jZSxcbiAgICBJU2tpbkNvbmZpZywgSVNraW5TZWxlY3RvckNvbmZpZywgU2tpblNlbGVjdG9yVHlwZXMsXG5cblxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtIVE1MQ29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7Y2hlY2tNeW9wT3ZlcnJpZGV9IGZyb20gXCIuL215b3BPdmVycmlkZS50c1wiO1xuXG5pbnRlcmZhY2UgY29tcG9uZW50TG9hZGVyQ3JlYXRvciB7XG4gICAgbmV3KGxvYWRlcnM6IElNeW9wTG9hZGVyW10pOiBhbnk7XG59XG5cbi8vIGNvbnN0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjMwMDAvY29tcG9uZW50P2lkPSR7aWR9YCk7XG4vLyAgICAgY29uc3QgY29tcG9uZW50RGVmOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IChhd2FpdCByZXMuanNvbigpKS5pdGVtO1xuLy8gICAgIHJldHVybiBjb21wb25lbnREZWZcbi8vIH1cblxuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG4vKipcbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3N0U0RLIHtcbiAgICBzdGF0aWMgSW5zdGFuY2UgPSAoKSA9PiB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG4gICAgY29tcG9uZW50czJpbml0OiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHNMb2FkZXJzOiBJTXlvcExvYWRlcltdID0gW107XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdpbmNvbWluZ01lc3NhZ2VIYW5kbGVyIEdPVCAnLCBldmVudClcbiAgICAgICAgLy9UT0RPIDogIGlmIChldmVudC5vcmlnaW4gIT09IFwiaHR0cDovL2V4YW1wbGUub3JnOjgwODBcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0kgS25vdyB0aGF0ICEhIScpO1xuICAgICAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubXlvcCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLnVwICYmIGV2ZW50LmRhdGEubWVzc2FnZVR5cGUgIT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGhvc3RzZGssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcE1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RTREsgYWxyZWFkeSBpbml0aWF0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2ljTG9hZGVycyA9IFtcbiAgICAgICAgICAgIG5ldyBNeW9wSWZyYW1lTG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgV2ViY29tcG9uZW50TG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgSFRNTENvbXBvbmVudExvYWRlcigpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IFtcbiAgICAgICAgICAgIC4uLmJhc2ljTG9hZGVyc1xuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycykge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzLmZvckVhY2goY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSA9IGxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LnB1c2goY29tcG9uZW50KVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIHRydWUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5jb25uZWN0UHJvcHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIHR5cGUgZmllbGQgY29uZGl0aW9uYWwgdHlwZSBpbmZlciBcInN0cmluZ1wiID4gc3RyaW5nLCBcIm51bWJlclwiID4gbnVtYmVyLCBldGMuLi5cbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbm5lY3RQcm9wcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZy50eXBlLnByb3BzLCBzZWxlY3RlZFNraW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2Ugb3B0aW9uYWw/XG4gICAgICAgICAgICAvL1RPRE8gOiBmaXggaXNzdWVzIHdpdGggdGltZW91dCBhbmQgd3JvbmcgcmVmIG5hbWVzIGZyb20gY29uZmlnIHZzIGN1cnJlbnQgc2tpblxuICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gVE9PRCA6IHRocm93ID9cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnM/LnNraXBJbml0KVxuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIG5ld0NvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgb3B0aW9ucz86IG5hdmlnYXRpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdmlnYXRpbmcgb24gcmVtb3RlIHJlZiBjb21wb25lbnRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAob3B0aW9ucz8uaW5wbGFjZSkge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCBuZXdDb21wb25lbnQuaW5pdGlhdGVkKCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgLy8gICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWdlZCkge1xuICAgICAgICAgICAgLy9jb25zdCBzZWxlY3RlZFNraW4gPSB0aGlzLnJ1blNraW5TZWxlY3RvcihuZXdDb21wb25lbnRDb25maWcpXG4gICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge2RpcmVjdGlvbjogJ2FmdGVyJywgY2hpbGQ6IGNvbXBvbmVudC5lbGVtZW50IX0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gY29tcG9uZW50LmVsZW1lbnQhLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYmVmb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBuYXZpZ2F0aW9uT3B0aW9ucyA9IHtcbiAgICBzdGFnZWQ/OiBib29sZWFuLFxuICAgIC8vaW5wbGFjZT86IGJvb2xlYW4sXG4gICAgaW5pdD86IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG59ICYgbG9hZGVyT3B0aW9uc1xuXG50eXBlIHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvbiA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuXG5leHBvcnQgdHlwZSBsb2FkZXJIb29rcyA9IHtcbiAgICBhZnRlclNraW5TZWxlY3RlZD86IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiBQcm9taXNlPElTa2luQ29uZmlnPlxufSAmXG4gICAgLy8gc2VnbWVudGF0aW9uIGhvb2tzXG4gICAgKHsgW2tleTogc3RyaW5nXTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4gfSB8IHt9KVxuXG4vL1RPRE86IHN1cHBvcnQgc2VyaWFsaXphYmxlIHZlcnNpb24gb2YgdGhhdCBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgcmVsYXRpdmVMb2FkQ29uZmlnIHtcbiAgICAvL0lmIHRoaXMgaXMgbnVsbCwgdGhlbiBuZXdOb2RlIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgb2Ygbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvaW5zZXJ0QmVmb3JlXG4gICAgY2hpbGQ6IENoaWxkTm9kZSB8IG51bGxcbiAgICBkaXJlY3Rpb246IHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnZpcm9ubWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIGxvYWRlck9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgaGlkZGVuPzogYm9vbGVhbixcbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlcixcbiAgICBza2lwSW5pdD86IGJvb2xlYW4sXG4gICAgcmVsYXRpdmU/OiByZWxhdGl2ZUxvYWRDb25maWcsXG4gICAgaG9va3M/OiBsb2FkZXJIb29rcyxcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzLFxuICAgIF9lbnZpcm9ubWVudD86IElFbnZpcm9ubWVudCxcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3QgaG9zdFNESzogSG9zdFNESyA9IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ2hvc3RTREsnLCBob3N0U0RLKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBteW9wOiB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXzogc3RyaW5nLFxuICAgICAgICAgICAgaG9zdFNESzogSG9zdFNESyxcbiAgICAgICAgICAgIElmcmFtZVNESzogSW5zdGFuY2VUeXBlPHR5cGVvZiBJZnJhbWVTREs+XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50c1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2UgcmVmIGhlbHBlciBoZXJlXG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCB0byBwYXNzIHRoZSBhc3NpZ25lZCBpZHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZWZDb21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IHJlZkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpO1xuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICIvLyBAdHMtbm9jaGVja1xuZXhwb3J0IGNvbnN0IG9ic2VydmVET00gPSAob2JqOiBIVE1MRWxlbWVudCB8IG51bGwsIGNhbGxiYWNrOiAobXV0YXRpb25SZWNvcmRzPzogTXV0YXRpb25SZWNvcmRbXSkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIGlmICghb2JqIHx8IG9iai5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKE11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gZGVmaW5lIGEgbmV3IG9ic2VydmVyXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaylcbiAgICAgICAgLy8gaGF2ZSB0aGUgb2JzZXJ2ZXIgb2JzZXJ2ZSBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjb25maWcgPSB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9iaiwgY29uZmlnKVxuICAgICAgICByZXR1cm4gbXV0YXRpb25PYnNlcnZlclxuICAgIH1cblxuICAgIC8vIGJyb3dzZXIgc3VwcG9ydCBmYWxsYmFja1xuICAgIGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7b2JzZXJ2ZURPTX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9kb21PYnNlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UpIHtcbiAgICAgICAgICAgIG9ic2VydmVET00oZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgbmV3IEVudmVsb3BlZE1lc3NhZ2UoZXZlbnQuc291cmNlISwgbmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldIHx8ICFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlIHx8IG5vZGVEYXRhLnZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBnZXRJbnB1dFZhbHVlKGl0ZW0pXG4gICAgICAgICAgICApLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlTWVzc2FnZSwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEZpcnN0RWxlbWVudEJ5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rmlyc3RFbGVtZW50QnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudClcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZShpdGVtLmdldEF0dHJpYnV0ZShldmVudC5uYW1lKSksIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tICcuLi8uLi9tZXNzYWdlcydcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHBhc3MgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0SW5uZXJIdG1sKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuICogQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuICogVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cbiAqXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtJZnJhbWVTREt9IGZyb20gJ0BteW9wL3Nkay9pZnJhbWUnO1xuIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldFJlc2l6ZU9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cblxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJZnJhbWVTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3cubXlvcCA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsgPSB0aGlzO1xuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IE9iamVjdC5rZXlzKHRoaXMuY29tcG9uZW50cyk7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVwbGF5VG8/LnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFraW5nIHRoZSBmaXJzdCBjb21wb25lbnQgdGhhdCBpbml0aWF0ZWQgdGhhdCBjeWNsZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSByZXBsYXlUby5yb3V0ZVtyZXBsYXlUby5yb3V0ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IGNvbXBvbmVudElkc1swXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IGNvbXBvbmVudElkc1swXTtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcblxuICAgICAgICB3aW5kb3cucGFyZW50Py5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tZXNzYWdlXG4gICAgICAgIH0sICcqJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG5cbiAgICAgICAgLy9jb21wb3NpdGUgc3VwcG9ydCBtZXNzYWdlcyA6XG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICB3aW5kb3cub25tZXNzYWdlID0gdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcy5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICB9XG5cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnSWZyYW1lU0RLJywgSWZyYW1lU0RLKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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cHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJoZWlnaHQiLCAid2lkdGgiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJob3N0U0RLIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImVsZW1lbnQiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZWVuIiwgInNkayIsICJkb21JZCIsICJzZGsiLCAic2VlbiIsICJza2luIiwgImNvbXBvbmVudCIsICJzZWdtZW50IiwgImV4cGVyaWVuY2UiLCAic2VsZWN0ZWRTa2luIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImhvc3RTREsiLCAiZ2V0SW5wdXRWYWx1ZSIsICJlbGVtZW50IiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiXQp9Cg==
2969
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudENvcmUudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSU15b3BMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9pZnJhbWVMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyLnRzIiwgInZlcnNpb246bXlvcC1zZGstdmVyc2lvbiIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIHJ1bkV4ZWN1dG9yQ2xlYW51cH0gZnJvbSBcIi4vaW5kZXgudHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9iYXNlTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLCBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEVudmVsb3BlZE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIEhvc3RlZENvbXBvbmVudDxUID0gYW55PiB7XG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAvL29uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBJTXlvcE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWQ6IHN0cmluZywgcHVibGljIGNvbnRleHQ/OiBUKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BTREsge1xuICAgIGluaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXM6IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD47XG59XG5cbi8vIGNvbnN0IGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcyA9IFtcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QsXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSxcbi8vICAgICAvL015b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlLFxuLy8gXVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BTREsgaW1wbGVtZW50cyBJTXlvcFNESyB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGFic3RyYWN0IHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIG1lc3NhZ2VUb0hhbmRsZUFmdGVySW5pdDogQmFzZU15b3BNZXNzYWdlW10gPSBbXTtcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD4gPSB7fTtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3Q6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgbWVzc2FnZUNsZWFudXBDYWNoZTogUmVjb3JkPHN0cmluZywgQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPj4gfCBQcm9taXNlPHZvaWQ+ID0ge307XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGV2ZW50LmRhdGEgPyBldmVudC5kYXRhIDogZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgLy8gbm90IG15b3AgbWFya2VkIGV2ZW50IFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBiYXNlU0RLLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgKGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICAgIC8vVE9ETyA6IGZpeCBkaXJlY3Rpb24gPyBtZXNzYWdlIHdpbGwgbm90IHByb2NjZXNzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5EaXNwb3NlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzaG91bGQgbm90IGJlIG9wdGlvbmFsLCBmaXggYW5kIHJlbW92ZSAnaWYnXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbl1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGdvdCBvdXIgaWQgZnJvbSBvdXIgaG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IFNESyBtYXkgc2VydmUgbW9yZSB0aGFuIDEgY29tcG9uZW50IC4uIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicmVjaGl2ZWQgaW5pdCBtZXNzYWdlIGZvciBhbiBleHNpc2luZyBjb21wb25lbnQuXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdID0gbmV3IEhvc3RlZENvbXBvbmVudChuZXdDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXNwb25zZShuZXdDb21wb25lbnRJZCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHNhbWUgSG9zdFNESyBjYXNlc1xuICAgICAgICAgICAgLy8gd2hlbiBib3RoIFJlZkNvbXBvbmVudCBhbmQgcmVhbENvbXBvbmVudCBob3N0ZWQgaW4gdGhlIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9IGVudmVsb3BlZE1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gaW5uZXJNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCB8fCB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbiFdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gaW5uZXJNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGVudmVsb3BlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgOiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlID0gbWVzc2FnZSBhcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuICAgICAgICAgICAgLy8gLy8gICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DbGVhbnVwTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENsZWFudXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwTWVzc2FnZSA9IG5ldyBDbGVhbnVwUmVwbGF5TWVzc2FnZSghIWNsZWFudXApO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwTWVzc2FnZS5kZXN0aW5hdGlvbiA9IG1lc3NhZ2UuZGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRvckNsZWFudXAoY2xlYW51cCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRlbCBlcnJvcj9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25IYW5kbGVyRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIubWVzc2FnZVR5cGUgPT09IG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gaGFuZGxlci5leGVjdXRvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlICYmIGNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbbWVzc2FnZS5pZF0gPSBjbGVhbnVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCAmJiAhbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIG5vbi1jbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xlYW51cCAmJiBtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3IgYSBjbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25IYW5kbGVyRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogcHJpbnQgd2l0aCBkZWJ1ZyBjb25maWcgb25seVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBtZXNzYWdlIGhhbmRsZXIgd2FzIGZvdW5kIGZvciAnLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbml0OiAoKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL015b3BFbGVtZW50UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZU1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQmFzZU15b3BTREsnO1xuXG5leHBvcnQgdHlwZSBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgRGljdGlvbmFyeTxUPiA9IHsgW2tleTogc3RyaW5nXTogVDsgfTtcblxuLy9leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9ICdJZnJhbWVMb2FkZXInIHwgJ1dlYkNvbXBvbmVudExvYWRlcicgfCAnSFRNTExvYWRlcicgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBTa2luTG9hZGVycyA9IHtcbiAgICBcIklmcmFtZUxvYWRlclwiOiBcIklmcmFtZUxvYWRlclwiLFxuICAgIFwiV2ViQ29tcG9uZW50TG9hZGVyXCI6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCIsXG4gICAgXCJIVE1MTG9hZGVyXCI6IFwiSFRNTExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Db25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIC8vIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBJUHJvcENvbmZpZz4gLy9pZCAtIHR5cGVcbiAgICAvLyByZWZzOiBSZWNvcmQ8c3RyaW5nLCBJUmVmQ29uZmlnPixcbiAgICAvLyBza2luczogUmVjb3JkPHN0cmluZywgSVNraW5Db25maWc+XG4gICAgcHJvcHM6IElQcm9wQ29uZmlnW10sXG4gICAgcmVmczogSVJlZkNvbmZpZ1tdLFxuICAgIHNraW5zOiBJU2tpbkNvbmZpZ1tdLFxuICAgIGRlZmF1bHRTa2luOiBudW1iZXI7XG5cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgLy9yZXNvbHZlZERlZmluaXRpb25zPzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbXVxuICAgIC8vVE9ETyA6IG1vdmUgdG8gYmFzZSBjbGFzcyAoIElTdG9yYWJsZUl0ZW0gb3Igc28uLi4pXG5cbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQgPElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4ge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcEF0dHJpYnV0ZXMgPSB7XG4gICAgaWQ6ICdteW9wLWlkJ1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIElFbGVtZW50UmVmLCBNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuICAgICAgICAvL2NvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCpgKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IElFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICAvL2xldCBjb3VudGVyczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgfSAvL2Vsc2Uge1xuICAgICAgICAgICAgLy8gICAgIGlmICghY291bnRlcnNbaXRlbS50YWdOYW1lXSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gMDtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gKyAxO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgICBteW9wUmVmcy5wdXNoKG5ldyBYUGF0aEVsZW1lbnRSZWYoYCR7aXRlbS50YWdOYW1lfSgke2NvdW50ZXJzW2l0ZW0udGFnTmFtZV19KWAsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoKSwgZXZlbnQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY29uc3QgY2xlYW5VcFRhc2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaChjbGVhblVwVGFzayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vY2xlYW4gdXBcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBNeW9wTWVzc2FnZXMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDaGFuZ2VUZXh0TWVzc2FnZT4ge1xuICBcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcbiAgICBcbiAgICBleGVjdXRvciA9IChldmVudDogQ2hhbmdlVGV4dE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZTxUPiA9XG4gICAgVCBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiAvLyBFeGNsdWRlIGZ1bmN0aW9uc1xuICAgICAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBTZXJpYWxpemFibGU8VT5bXSA6IC8vIEhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3QgPyB7XG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEtdOiBTZXJpYWxpemFibGU8VFtLXT5cbiAgICAgICAgICAgIH0gOiBUOyAvLyBIYW5kbGUgb2JqZWN0c1xuXG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1ByaW1pdGl2ZXNPbmx5ID0gKG9iaikgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgaWYgaXQncyBhIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSXQncyBhIHByaW1pdGl2ZSwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm91bmQgYSBub24tcHJpbWl0aXZlIHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsIHZhbHVlcyBhcmUgcHJpbWl0aXZlcyBvciBuZXN0ZWQgb2JqZWN0cyB3aXRoIHByaW1pdGl2ZXNcbn1cblxuLy8gY3VycmVudGx5IHN1cHBvcnQgcm9vdCBsZXZlbCBvbmx5XG4vLyB7eDogMSwgeSA6ICdhJywgeiA6ICgpPT57Li4ufSwgaW5uZXIgOiB7IHg6IDEgLCB5IDogJ2EnfSB9XG4vLyB7eDogMSwgeSA6ICdhJ31cbi8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9GYWxzeVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBib29sZWFuIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+PiB8IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXphYmxlID0gPFQ+KFxuICAgIG9iajogVCxcbiAgICBza2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSB7fSxcbiAgICBpbmNsdWRlRmFsc3lLZXlzOiBib29sZWFuID0gdHJ1ZSwgLy8gVE9ETyA6IHVzZSB0aGF0IGFyZ1xuICAgIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBTZXJpYWxpemFibGU8YW55Pj4gPSBuZXcgV2Vha01hcCgpXG4pOiBTZXJpYWxpemFibGU8VD4gPT4ge1xuXG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBTZXJpYWxpemFibGU8VD47IC8vIERpcmVjdGx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQXJyYXk6IFNlcmlhbGl6YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVBcnJheSk7IC8vIFN0b3JlIHRoZSBhcnJheSBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iai5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQXJyYXlbaW5kZXhdID0gbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LCBza2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZUFycmF5IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZU9iamVjdDogUGFydGlhbDxTZXJpYWxpemFibGU8VD4+ID0ge307XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlT2JqZWN0KTsgLy8gU3RvcmUgdGhlIG9iamVjdCBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGluIHRoZSBza2VsZXRvbiBhbmQgaWYgaXQncyBhIHZhbGlkIGtleSB0byBzZXJpYWxpemVcblxuICAgICAgICAgICAgY29uc3Qga2V5SW5Ta2VsZXRvbiA9IHR5cGVvZiBza2VsZXRvbiA9PSBcImJvb2xlYW5cIiA/IHNrZWxldG9uIDogc2tlbGV0b25ba2V5XTtcblxuICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24pIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIHRvIHNlcmlhbGl6ZSB0aGlzIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZhbHN5S2V5cyA/IG9ialtrZXldICE9PSB1bmRlZmluZWQgOiBvYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCB0cnVlLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUluU2tlbGV0b24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgbmVzdGVkIGtleXMgdG8gc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCBrZXlJblNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZU9iamVjdCBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9IGFzIGFueTsgLy8gUmV0dXJuIGFuIGVtcHR5IG9iamVjdCBmb3Igb3RoZXIgY2FzZXNcbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBuZXcgUm9vdFJlZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5pbmNsdWRlcyhoYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kV2hlbiA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBwcmVkaWNhdGU6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gdm9pZCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgdXNlIGNvbXBvbmVudC5iaW5kV2hlbiB3aXRob3V0IGFuIGhhbmRsZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV07XG5cbiAgICAgICAgY29uc3QgcHJlZGljYXRlV3JhcHBlZEhhbmRsZXIgPSAoZTogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9UT0RPIDogaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gP1xuICAgICAgICBoYW5kbGVycy5wdXNoKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdvbk1lc3NhZ2VSZWNlaXZlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIGluY29tZU1lc3NhZ2UsIHRoaXMpO1xuICAgICAgICAvL1RPRE8gOiBoYW5kZWwgc3BlY2lhbCBldmV0cyA/IGxpa2UgaW5pdFJlcyA/XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKGluY29tZU1lc3NhZ2UgYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCk7XG5cbiAgICAgICAgICAgIC8va2VlcGluZyB0aGlzLm1ldGhvZCgpIHNvIHRoYXQgY29udGV4dCB3aWxsIHNhdmVkXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0odHlwZWRNZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgbWV0aG9kIG5vdCBmb3VuZCAke3R5cGVkTWVzc2FnZS5tZXRob2R9IG9uIGNvbXBvbmVudGAsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlZCB8fCBoYW5kbGVyKGluY29tZU1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBjb25zb2xlIG9ubHkgd2hlbiBkZWJ1ZyBjb25maWdcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIGhhbmRsZXJzIGZvdW5kIGZvciAnLCBpbmNvbWVNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSlcbiAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF93aGVuSW5pdGlhdGVkUmVzb2x2ZT86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuICAgIF93aGVuSW5pdGlhdGVkUmVqZWN0PzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG5cbiAgICBfd2hlbkluaXRpYXRlZDogUHJvbWlzZTxhbnk+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuSW5pdGlhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZENsZWFudXBNZXNzYWdlKG1lc3NhZ2U6IENsZWFudXBNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbihtZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gbWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgfSwgKG06IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLmhhbmRsZXIobSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICB0aGlzLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZW5kKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyIHtcbiAgICAgICAgLy9tZXNzYWdlcyB0aGF0IGV4ZXRyYWN0ZWQgZnJvbSBlbnZlbG9wZSBhbHJlYWR5IGhhdmUgc291cmNlIGluIHRoZW1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBsZXQgY2xlYW51cEhhbmRsZXI7XG4gICAgICAgIC8vIFRPRE8gOiBmaXggaGVhdnkgb3AuLlxuICAgICAgICAvLyAgaWYgKGlzSW5oZXJpdEZyb20obWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChtZXNzYWdlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIE15b3BCaW5kTWVzc2FnZSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4odHlwZWRNZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IHR5cGVkTWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgICAgIH0sIHR5cGVkTWVzc2FnZS5oYW5kbGVyKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZikge1xuICAgICAgICAgICAgLy8gc2VyaWFsaXphYmxlXG4gICAgICAgICAgICBtZXNzYWdlLnJlZiA9IG1lc3NhZ2UucmVmLl9fbm9uUHJveGllZCB8fCBtZXNzYWdlLnJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDbGVhbnVwTWVzc2FnZShuZXcgQ2xlYW51cE1lc3NhZ2UobWVzc2FnZS5pZCwgKHJlcGxheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2cgcmVwbGF5P1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSBzZGsubG9nZ2VyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdkaXNwb3NpbmcgYmVmb3JlIGlzSW5pdGlhdGVkJywgdGhpcy5pZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBjb21wb25lbnQnLCB0aGlzLmlkKTtcblxuICAgICAgICAvLyAvL1RPRE8gOiBpbXBsZW1lbnQgZGlzcG9zZSBmbG93XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHRoaXMucmVmcykuZm9yRWFjaChyZWZLZXk9PntcbiAgICAgICAgLy8gICAgIHRoaXMucmVmc1tyZWZLZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHRpbWUgZm9yIHRoZSBvXG4gICAgICAgIC8vIHRoZXIgc2lkZSB0byBwcm9jY2VzcyB0byBtZXNzYWdlIGJlZm9yZSBkaWUgP1xuICAgICAgICAvL25vdGlmeSB0aGUgb3RoZXIgc2lkZSBTREtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBEaXNwb3NlTWVzc2FnZSgpKVxuXG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddXG4gICAgICAgIGlmIChvbkRpc3Bvc2VIYW5kbGVycykge1xuICAgICAgICAgICAgb25EaXNwb3NlSGFuZGxlcnMuZm9yRWFjaChkaXNwb3NlSGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBudWxsIG9yIGZpeCB0aGUgdHlwZSA/XG4gICAgICAgICAgICAgICAgZGlzcG9zZUhhbmRsZXIobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge31cbiAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3BzOiBQID0ge30gYXMgdW5rbm93biBhcyBQO1xuICAgIHJlZnM6IFIgPSB7fSBhcyB1bmtub3duIGFzIFI7XG59XG4iLCAiZXhwb3J0IGNvbnN0IEVycm9ycyA9IHtcbiAgICBub3RTZXJpYWxpemFibGVSZWZDYWxsOiAocHJvcCwgYXJnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG5UaGUgaW5wdXQgcHJvdmlkZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgaXMgbm90IHNlcmlhbGl6YWJsZS4gU2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSBjYW4gYmUgc2FmZWx5IHRyYW5zZmVycmVkIHRvIHRoZSBza2luIGltcGxlbWVudGF0aW9uLiBcblRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGF0YSBhcmUgY29uc2lkZXJlZCBub24tc2VyaWFsaXphYmxlIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkOlxuXG4tIEZ1bmN0aW9uc1xuLSBET00gZWxlbWVudHNcbi0gQ2xhc3MgaW5zdGFuY2VzXG4tIENpcmN1bGFyIHJlZmVyZW5jZXNcbi0gU3ltYm9sc1xuLSBCaWdJbnQgdmFsdWVzXG5cbkluIHRoZSBmb2xsb3dpbmcgZXhlY3V0aW9uIHdlIGRldGVjdGVkIDpcbn5+fn5+fn5+XG4ke2FyZ30gXG5+fn5+fn5+flxuYXMgbm90IHNlcmlhbGl6YWJsZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGlucHV0cyBwYXNzZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgYXJlIGluIGEgc2VyaWFsaXphYmxlIGZvcm1hdC5cblRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMpLCBhcnJheXMsIGFuZCBwbGFpbiBvYmplY3RzLiBcbklmIHlvdSBuZWVkIHRvIGluY2x1ZGUgY29tcGxleCBkYXRhIHR5cGVzLCBjb25zaWRlciBjb252ZXJ0aW5nIHRoZW0gdG8gYSBzZXJpYWxpemFibGUgc3RydWN0dXJlIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGZ1bmN0aW9uLlxuT3IgdXNlIE15b3AgbWVzc2FnZSB0aGF0IHN1cHBvcnQgaXQ6IEN1c3RvbVJlZk1lc3NhZ2UsIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlIG9yIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLlxuXG5TdWdnZXN0ZWQgRml4OlxuMS4gUmVtb3ZlIG9yIHJlcGxhY2Ugbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgZnJvbSB5b3VyIGlucHV0LlxuMi4gSWYgdXNpbmcgb2JqZWN0cywgZW5zdXJlIHRoZXkgZG8gbm90IGNvbnRhaW4gYW55IGZ1bmN0aW9ucyBvciBjaXJjdWxhciByZWZlcmVuY2VzLlxuMy4gQ29udmVydCBhbnkgY2xhc3MgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHMgb3IgSlNPTi1jb21wYXRpYmxlIGZvcm1hdHMuXG40LiBVc2UgZGVkaWNhdGVkIE15b3AgbWVzc2FnZS5cblxuRm9yIG1vcmUgZGV0YWlscyBvbiBzZXJpYWxpemF0aW9uIGFuZCBNeW9wIG1lc3NhZ2UgZXhhbXBsZXMsIHJlZmVyIHRvIGh0dHBzOi8vZG9jcy5teW9wLmRldlxcLlxuXG5gKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50LCBJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RW52ZWxvcGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0VudmVsb3BlZE1lc3NhZ2VcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BSZWZDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBwYXJlbnQ6IElNeW9wQ29tcG9uZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICAvL1RPRE8gOiBjaGVjayBwYXJlbnRDb21wb25lbnQuY29udGFpbmVyLi4uXG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIHBhcmVudC5jb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKGFyZ3VtZW50cy5jYWxsZWUubmFtZSkpO1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2hpZGUnKSk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzaG93JykpO1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVhbCBjbGVhbnVwXG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBpbnNwZWN0IGNhbGxlZCwgY3JlYXRpbmcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBpbnNwZWN0JywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgdGhpcy5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2luc3BlY3QnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQnKSk7XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnKSB7XG4gICAgICAgIC8vICBkZWJ1Z2dlcjtcbiAgICAgICAgLy8gICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIG1lc3NhZ2Ugc2VuZGluZyAnLCBtZXNzYWdlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyB0aGlzLmlkIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBuZXN0ZWQgY29tcG9uZW50XG4gICAgICAgIHRoaXMucGFyZW50LnNlbmQobmV3IEVudmVsb3BlZE1lc3NhZ2UodGhpcy5pZCwgbWVzc2FnZSkpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdkaXNwb3NlJykpO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxufVxuIiwgIi8vdHlwZSBBQ29uc3RydWN0b3JUeXBlT2Y8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBDdXN0b21SZWZNZXNzYWdlLCBSZWZ9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgbWVzc2FnZXMgZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIENsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50Q29uZmlnLFxuICAgIHR5cGUgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudFJlZkJlaGF2aW9yLCBJSFRNTExvYWRlckNvbmZpZywgSVByb3BDb2RlQmVoYXZpb3IsXG4gICAgSVByb3BDb25maWcsIElTa2luQ29uZmlnLCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICBSZWZCZWhhdmlvclR5cGUsIFNoYWRvd1Jvb3RNb2RlVHlwZSwgU2tpbkxvYWRlcnMsIFNraW5Mb2FkZXJUeXBlXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7Y29udGFpbnNQcmltaXRpdmVzT25seX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQge0Vycm9yc30gZnJvbSBcIi4vbG9nTWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcFJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWwgZnJhbWUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWwgZnJhbWUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09IHJlZkNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICAvL3NhbWUgbWVtb3J5IGVudiwgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICE9PSByZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9cblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhlcmUgPlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHdoYXQgYWJvdXQgcmVhcHRlcnMgPyEgZHluYW1pYyA/IVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGV4c2lzdGluZ1JlZkNvbXBvbmVudCA9IGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gYXMgTXlvcFJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiAoZXhzaXN0aW5nUmVmQ29tcG9uZW50LmlkICYmIGV4c2lzdGluZ1JlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IFtjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLCByZWZDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLnB1c2gocmVmQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50OyAvL2hvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gcmVmQ29tcG9uZW50LmlkKSE7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaW4gd2ViY29tcG9uZW50IGNhc2UgdGhlIHNhbWUgaWQgd2lsbCBhbHJlZGF5IGJlIGhlcmUsIHdoaWNoIGlzIGdvb2QgIVxuICAgICAgICAgICAgICAgIC8vIG5hbWU6XG4gICAgICAgICAgICAgICAgLy8gICAgIGlkXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudERlZmluaXRpb25JZFxuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGlubmVyIGNvbXBvbmVudHMgaW5zaWRlIHJlZiBjb21wb25lbnQgOlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVzdGVkUmVmcy5mb3JFYWNoKG5lc3RlZFJlZkNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzIS5maW5kKGMgPT4gYy50eXBlLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucz8uZmluZChkZWYgPT4gZGVmLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJlZkNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy50eXBlLnJlZnMuZmluZChyID0+IHIubmFtZSA9PT0gbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXJlZkNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdubyByZWZDb25maWcgZm91bmQgZm9yIG5lc3RlZCByZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQobmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiwgcmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ29tcG9uZW50LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQucmVmc1tuZXN0ZWRSZWZDb25maWcucmVmTmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChuZXN0ZWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhyZWZDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgY29tcG9uZW50cywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDp1c2UgY29uZmlnIGNoZWNrIGZvciBhdXRvLWhpZ2h0IGFuZCBjb252ZXJ0IHR5cGUgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVmQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFJlZnMgPSBhc3luYyAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCB3aXRob3V0UmVmQ29tcG9uZW50czogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZWZzKVxuICAgICAgICBjb21wb25lbnQucmVmcyA9IHt9O1xuXG4gICAgY29uc3Qgd2FpdEZvciA9IE9iamVjdC52YWx1ZXMoY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVmcykubWFwKHJlZiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmLmJlaGF2aW9yLnR5cGUgPT0gUmVmQmVoYXZpb3JUeXBlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9XG5cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFJlZkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoYW5nZSB0byBnZXQgaXQgZnJvbSB0aGUgZmxvd1xuICAgICAgICAgICAgICAgIGxldCByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5jb21wb25lbnRJZDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZkNvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5pbnN0YW5jZS5jb21wb25lbnRJZFxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zIS5maW5kKGNvbXBkZWYgPT4gY29tcGRlZi5pZCA9PT0gcmVmQ29tcG9uZW50SWQpITtcbiAgICAgICAgICAgICAgICAvLyAvL2NvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhd2FpdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKGNvbXBvbmVudEluc3RhbmNlQ29uZmlnLmNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZSB3ZSB3aWxsIG5lZWQgaW5zdGFuY2UgaWQgaGVyZSAuLi5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPy5maW5kKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQudHlwZS5pZCA9PT0gcmVmQ29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDb21wb25lbnRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCBuZXN0ZWRDb21wb25lbnRDb25maWcgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY29uc3QgY29tcG9uZW50SW5zdGFuY2VDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UubmVzdGVkQ29tcG9uZW50cz8uZmluZChjb21wb25lbnRJbnN0YWNlID0+IGNvbXBvbmVudEluc3RhY2UuY29tcG9uZW50SWQgPT09IGNvbXBvbmVudERlZmluaXRpb25Db25maWcuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGlmKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPIFRPRE8gVE9ETyAnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6dGhpbmsgYWJvdXQgdGhhdCA6XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLnJlc29sdmVkRGVmaW5pdGlvbnMgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zO1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGluc3RhbmNlOiBuZXN0ZWRDb21wb25lbnRDb25maWcuaW5zdGFuY2UhLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6IG5lc3RlZENvbXBvbmVudENvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG5hbWU6IG5lc3RlZENvbXBvbmVudENvbmZpZy5uYW1lXG4gICAgICAgICAgICAgICAgLy8gICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBfcmVmID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbmVzdGVkICEhIGNyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50KF9yZWYsIG5lc3RlZENvbXBvbmVudENvbmZpZyEsIGNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgICAgIC8vVERPTyA6IHB1dCB0aGF0IHJlZiBjb21wb25lbnQgc29tZXdoZXJlP1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub25Qcm94aWVkID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBjcmVhdGVSZWZQcm94eShfX25vblByb3hpZWQsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJz8nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgdHlwZSBwcm9wVHlwZXM8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4gPSB7XG4gICAgW1Byb3BlcnR5IGluIGtleW9mIFRdOlxuICAgIFRbUHJvcGVydHldIGV4dGVuZHMgeyBtb2RlOiAnaW5wdXQnIH0gP1xuICAgICAgICBUW1Byb3BlcnR5XVsndHlwZSddIDpcbiAgICAgICAgUHJvbWlzZTxUW1Byb3BlcnR5XVsndHlwZSddPlxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuXG5leHBvcnQgY29uc3QgYWN0QXMgPSA8VD4ocmVmOiBSZWYpID0+IHtcbiAgICByZXR1cm4gcmVmIGFzIHVua25vd24gYXMgRnVuY3Rpb25pZnlSZWY8VD5cbn1cblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25pZnlSZWY8VCA9IGFueT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiAvLyBJZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgPyAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiAvLyBDb252ZXJ0IGl0IHRvIGEgcHJvbWlzZWQgZnVuY3Rpb25cbiAgICAgICAgOiBUW0tdXG59O1xuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNZXNzYWdlRGlyZWN0aW9uXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucylcblxuICAgICAgICBpZiAoKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy8gVE9ETyA6IHVzZSBiZXR0ZXIgY2hlY2sgZm9yIGluc3BlY3QgbW9kZVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaW5zcGVjdCBjYWxsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wSWZyYW1lQ29tcG9uZW50JywgMTAsIHRoaXMuY29udGFpbmVyLCB0aGlzLklmcmFtZUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ISgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3NlbmR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgc2VuZCh7aGVpZ2h0LCB3aWR0aH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIHNldFNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XG5cblxuICAgICAgICAgICAgLy9UT0RPOiBmaXggdGhhdCBoYWNrLCBrZWVwIHRoZSBmdW5jdGlvbiBpbiByaWdodCBmb3JtYXQgd2hpbGUgbWluaWZpZWQgOihcbiAgICAgICAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVG8gZW5zdXJlIGl0J3Mgbm90IG9wdGltaXplZCBhd2F5LCB5b3UgY2FuIGNhbGwgaXQgYXQgbGVhc3Qgb25jZVxuICAgICAgICAgICAgbGV0IHggPSBub09wKCk7XG4gICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB4LS07XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGAke3dpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgKzEgP1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAsIHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgKyB4ICsgJ3B4J1xuXG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByZXQuY29udGVudDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcbiAgICAgICAgLy9UT0RPIDogPyE/ISBzaG91bGQgaXQgYmUgaGVyZSA/XG4gICAgICAgIGlmIChtZXNzYWdlXy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlXyBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKVxuICAgICAgICAgICAgdGhpc1t0eXBlZE1lc3NhZ2UubWV0aG9kXSgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2sgOihcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICBtZXNzYWdlXy5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UobWVzc2FnZV8sICcqJyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLk11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG4gICAgICAgICAgICB8fCBpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIC8vdGhpcy5zZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdClcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QoKTtcblxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25lZWRzIHRvIGxvYWQgaW50byBhbiBleHNpc3RpbmcgSWZyYW1lLi4uJywgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MSUZyYW1lRWxlbWVudClcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdHlwZWRMb2FkZXJDb25maWcudXJsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCduZWVkcyB0byBjcmVhdGUgbmV3IElmcmFtZS4uLicsIGRvbUlkLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCA6XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgLy9jb25zdCB1bmlxVXJsID0gdXJsMmxvYWQgPT09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPyBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9tXCIsIGRvbUlkKSA6IHVybDJsb2FkXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2hhc1BhcmVudClcbiAgICAgICAgICAgICAgICB1cmwybG9hZCA9IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX215b3AtY29tcFwiLCB1bmlxSWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgJ3N0eWxlJyBhdHRyIG1lcmdlIGhlcmVcbiAgICAgICAgICAgIGxldCBlbGVtZW50QXR0cmlidXRlc1N0cmluZyA9ICcnO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVzU3RyaW5nID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2tleX09XCIke1N0cmluZyh2YWx1ZSl9XCJgO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50Lm91dGVySFRNTCA9IGA8aWZyYW1lIFxuICAgICAgICAgICAgICAgaWQ9XCIke2RvbUlkfVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIlxuICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgICAgIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07ICAgIFxuICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICR7b3B0aW9ucz8uaGlkZGVuID8gJ2Fic29sdXRlJyA6ICdzdGF0aWMnfTtcbiAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgc3JjPVwiJHt1cmwybG9hZH1cIlxuICAgICAgICAgICAgJHtlbGVtZW50QXR0cmlidXRlc1N0cmluZ31cbiAgICAgICAgICAgID48L2lmcmFtZT5gO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCMke2RvbUlkfWApIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21JZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvL05PIDogSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wV2ViY29tcG9uZW50Q29uc3RzID0ge1xuICAgIHdlYmNvbXBvbmVudF9tZXNzYWdlX2tleTogJ215b3Bfd2ViY29tcG9uZW50X21lc3NhZ2UnXG59XG4iLCAiaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50L2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgLy9UT0RPIDogY2FuIGJlIGRvbmUgd2l0aG91dCBjbG9uaW5nP1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2VfLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBuZXcgQ3VzdG9tRXZlbnQ8QmFzZU15b3BNZXNzYWdlPihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXyxcbiAgICAgICAgICAgIC8vIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1zZylcblxuICAgICAgICAvL3NlbmRpbmcgZGF0YSBmcm9tIGhvc3QgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkaXNwYXRjaEV2ZW50JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NCwgd2FpdH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3Qgc2VlbjogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuZXhwb3J0IGNsYXNzIFdlYmNvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5XZWJDb21wb25lbnRMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoIXNlZW5bbG9hZGVyQ29uZmlnLnVybF0pIHtcbiAgICAgICAgICAgIC8vIGF3YWl0IGltcG9ydCggLyogQHZpdGUtaWdub3JlICovIHdlYkNvbXBvbmVudExvYWRVcmwpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ21vZHVsZSBsb2FkZWQnKTtcbiAgICAgICAgICAgIHNlZW5bbG9hZGVyQ29uZmlnLnVybF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViQ29tcG9uZW50TG9hZFVybCA9IGxvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB3ZWJDb21wb25lbnRMb2FkVXJsO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kdWxlIGFscmVkYXkgbG9hZGVkIG9yIGluIGxvYWRpbmcgcHJvY2VzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2Vlbltsb2FkZXJDb25maWcudXJsXTtcblxuICAgICAgICAvL1RPRE8gOiBhZGQgcmV0cnkgbWVjaGFuaXNtIGluIGZhaWwgY2FzZS5cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLCBzaG91bGQgZml4IHRoZSByYWNlIGNvbmRpdGlvbiBmb3IgbG9hZGVkIG1vZHVsZXNcbiAgICAgICAgYXdhaXQgd2FpdCgxKTtcblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2FkZXJDb25maWcudGFnKTtcblxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmKG9wdGlvbnM/Ll9lbnZpcm9ubWVudCl7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbGVtZW50Ll9teW9wRW52aXJvbm1lbnQgPSBvcHRpb25zPy5fZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7bG9hZGVyQ29uZmlnLnRhZ30gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAnMC4xLjQ1JzsiLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZVwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZj8ucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuXG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZXZlbnQub3B0aW9ucy5pZCkhO1xuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8vLz4+Pj5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKGBmYWlsZWQgdG8gZmluZCAke2V2ZW50Lm9wdGlvbnMuaWR9IGluIG1lbSBzY29wZWAsIGhvc3RTREspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdGhlIHJlZiBjb21wb25lbnQgaW4gb3VyIEhvc3RTREsgKHNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vICByZWZDb21wb25lbnQucGFyZW50ID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIHJlZiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGhvc3RTREsuY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBob3N0U0RLLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCByZW1vdmVkIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgdXNpbmcgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm8gbmVlZCB0aGlzLCBwYXNzIG9wdGlvbnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvL2ltcGxlbWVudGF0aW9uQ29tcG9uZW50LmlkID0gZXZlbnQucHJlZGVmaW5lZElkO1xuICAgICAgICAgICAgICAgIC8vcmVmQ29tcG9uZW50LmlkICs9ICcuJztcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vdCByZWFsbHkgbmVlZGVkID9cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKClcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgXG4gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJHtvcHRpb25zPy5oaWRkZW4gPyAnYWJzb2x1dGUnIDogJ3N0YXRpYyd9O1xuICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgICAgIGApO1xuICAgICAgICAgICAgLy8gIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChJZnJhbWVFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gV3JpdGUgY29udGVudCBpbnRvIHRoZSBpZnJhbWVcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZG9jID0gSWZyYW1lRWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgICAgZG9jLm9wZW4oKTtcblxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuICAgICAgICAgICAgZG9jLndyaXRlbG4oYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fID0gXG4gICAgICAgICAgICAgICAgICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZSBcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9kYXkgd2UgZG9pbmcgc28ganVzdCBmb3IgdGhlIENKUyB2ZXJzaW9uIFxuICAgICAgICAgICAgICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pfX07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgIDwvc2NyaXB0PmApO1xuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAobG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gY29tcC5wcm9wcy5fZ2xvYmFsID0gY29tcC5lbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgICAgICAgICByZXR1cm4gY29tcDtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm5vbmUpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlciA9IHBhcnNlciA/IHBhcnNlciA6IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBkb2MuYm9keS5maXJzdENoaWxkO1xuICAgICAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBkb21JZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MOy8vLnRyaW0oKTtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IHogPSBmaXJzdEVsZW1lbnQgPyBmaXJzdEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgICAgIC8vICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHRlbXBsYXRlLCBmaXJzdEVsZW1lbnQsIHopXG4gICAgICAgICAgICAvLyAgIGVsZW1lbnQgPSBmaXJzdEVsZW1lbnRcblxuICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gY29udGFpbmVyLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKGVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnROYW1lID0gdG9DdXN0b21FbGVtZW50TmFtZShjb21wb25lbnREZWZpbml0aW9uLm5hbWUgKyBza2luLmlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWRlZmluZSAhXG4gICAgICAgICAgICBpZiAoIXNlZW4uaW5jbHVkZXMoY3VzdG9tRWxlbWVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50KGN1c3RvbUVsZW1lbnROYW1lLCBsb2FkZXJDb25maWcuSFRNTCwgbG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlKTtcbiAgICAgICAgICAgICAgICBzZWVuLnB1c2goY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7Y3VzdG9tRWxlbWVudE5hbWV9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SVVzZXJGbG93fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbi8qKlxuICpcbiAqICMjIE92ZXJ2aWV3XG4gKlxuICogVGhlIGBDbG91ZFJlcG9zaXRvcnlgIGNsYXNzIHNlcnZlcyBhcyBhIGNlbnRyYWxpemVkIGRhdGEgYWNjZXNzIGxheWVyIGZvciByZXRyaWV2aW5nIHVzZXIgZmxvd3MgYW5kIGNvbXBvbmVudHMgZnJvbSB0aGUgTXlvcC5kZXYgY2xvdWQgc2VydmljZS4gSXQgaW1wbGVtZW50cyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBwcm92aWRlcyBjYWNoaW5nIG1lY2hhbmlzbXMgdG8gb3B0aW1pemUgQVBJIGNhbGxzIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICpcbiAqICMjIENsYXNzIFN0cnVjdHVyZVxuICpcbiAqICMjIyBDb25zdHJ1Y3RvclxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpXG4gKiBgYGBcbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYF9iYXNlVXJsYCAob3B0aW9uYWwpOiBUaGUgYmFzZSBVUkwgZm9yIHRoZSBNeW9wLmRldiBjbG91ZCBBUEkuIERlZmF1bHRzIHRvIGAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldidgXG4gKlxuICogIyMjIFN0YXRpYyBQcm9wZXJ0aWVzXG4gKlxuICogIyMjIyBNYWluXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBzdGF0aWMgTWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAqIGBgYFxuICpcbiAqIEEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uIHdpdGhvdXQgY3JlYXRpbmcgbXVsdGlwbGUgaW5zdGFuY2VzLlxuICpcbiAqICMjIyBQcml2YXRlIFByb3BlcnRpZXNcbiAqXG4gKiAjIyMjIHVzZXJGbG93c1xuICogYGBgdHlwZXNjcmlwdFxuICogcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcbiAqIGBgYFxuICpcbiAqIEEgY2FjaGUgb2JqZWN0IHRoYXQgc3RvcmVzIHByb21pc2VzIGZvciB1c2VyIGZsb3dzLCBpbmRleGVkIGJ5IGZsb3cgSUQuIFRoaXMgcHJldmVudHMgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBhbmQgZW5zdXJlcyBjb25zaXN0ZW50IGRhdGEgcmV0cmlldmFsLlxuICpcbiAqICMjIyMgX2Jhc2VVcmxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgX2Jhc2VVcmw6IHN0cmluZ1xuICogYGBgXG4gKlxuICogVGhlIGJhc2UgVVJMIGZvciB0aGUgY2xvdWQgQVBJIGVuZHBvaW50cywgc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gKlxuICogIyMgTWV0aG9kc1xuICpcbiAqICMjIyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpXG4gKlxuICogUmV0cmlldmVzIGEgY29tcGxldGUgdXNlciBmbG93IGZyb20gdGhlIGNsb3VkIHJlcG9zaXRvcnksIGluY2x1ZGluZyBhbGwgcmVzb2x2ZWQgY29tcG9uZW50cy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGZsb3dJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZmxvdyB0byByZXRyaWV2ZVxuICpcbiAqICoqUmV0dXJuczoqKlxuICogLSBgUHJvbWlzZTxJVXNlckZsb3c+YDogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBsZXRlIHVzZXIgZmxvdyBvYmplY3RcbiAqXG4gKiAqKkJlaGF2aW9yOioqXG4gKiAtIEltcGxlbWVudHMgcmVxdWVzdCBjYWNoaW5nIHRvIGF2b2lkIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgSURcbiAqIC0gTWFrZXMgYSBHRVQgcmVxdWVzdCB0byBgL2Zsb3c/aWQ9e2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICogLSBBdXRvbWF0aWNhbGx5IHJlc29sdmVzIGNvbXBvbmVudCByZWZlcmVuY2VzIHdpdGhpbiB0aGUgZmxvd1xuICogLSBTdG9yZXMgdGhlIHByb21pc2UgaW4gdGhlIGNhY2hlIGZvciBmdXR1cmUgdXNlXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdteS1mbG93LWlkJyk7XG4gKiBjb25zb2xlLmxvZyhmbG93LmNvbXBvbmVudHMpO1xuICogYGBgXG4gKlxuICogIyMjIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZDogc3RyaW5nKVxuICpcbiAqIFJldHJpZXZlcyBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIHdpdGhpbiBhIHVzZXIgZmxvdy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGNvbXBvbmVudElkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50IHRvIHJldHJpZXZlXG4gKiAtIGBmbG93SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGZsb3cgY29udGFpbmluZyB0aGUgY29tcG9uZW50XG4gKlxuICogKipSZXR1cm5zOioqXG4gKiAtIGBQcm9taXNlPENvbXBvbmVudCB8IHVuZGVmaW5lZD5gOiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9uZW50IG9iamVjdCBpZiBmb3VuZCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICpcbiAqICoqQmVoYXZpb3I6KipcbiAqIC0gRmlyc3QgZmV0Y2hlcyB0aGUgY29tcGxldGUgZmxvdyB1c2luZyBgZmV0Y2hGbG93KClgXG4gKiAtIFNlYXJjaGVzIHRocm91Z2ggdGhlIGZsb3cncyBjb21wb25lbnRzIGFycmF5IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbXBvbmVudFxuICogLSBVc2VzIHRoZSBjb21wb25lbnQncyBgdHlwZS5pZGAgcHJvcGVydHkgZm9yIG1hdGNoaW5nXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21wb25lbnQgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudCgnYnV0dG9uLWNvbXBvbmVudCcsICdteS1mbG93LWlkJyk7XG4gKiBpZiAoY29tcG9uZW50KSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0NvbXBvbmVudCBmb3VuZDonLCBjb21wb25lbnQpO1xuICogfSBlbHNlIHtcbiAqICAgICBjb25zb2xlLmxvZygnQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBmbG93Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBBUEkgSW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgRW5kcG9pbnQgU3RydWN0dXJlXG4gKlxuICogVGhlIGNsYXNzIGludGVncmF0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIE15b3AuZGV2IGNsb3VkIEFQSSBlbmRwb2ludDpcbiAqXG4gKiBgYGBcbiAqIEdFVCB7YmFzZVVybH0vZmxvdz9pZD17Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNcbiAqIGBgYFxuICpcbiAqICoqUXVlcnkgUGFyYW1ldGVyczoqKlxuICogLSBgaWRgOiBUaGUgZmxvdyBpZGVudGlmaWVyXG4gKiAtIGByZXNvbHZlPWNvbXBvbmVudHNgOiBJbnN0cnVjdHMgdGhlIEFQSSB0byBpbmNsdWRlIHJlc29sdmVkIGNvbXBvbmVudCBkYXRhIGluIHRoZSByZXNwb25zZVxuICpcbiAqICMjIyBSZXNwb25zZSBGb3JtYXRcbiAqXG4gKiBUaGUgQVBJIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIEpTT04gcmVzcG9uc2Ugd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgICAgXCJpdGVtXCI6IHtcbiAqICAgICAgICAgLy8gSVVzZXJGbG93IG9iamVjdCB3aXRoIHJlc29sdmVkIGNvbXBvbmVudHNcbiAqICAgICAgICAgXCJjb21wb25lbnRzXCI6IFtcbiAqICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICBcInR5cGVcIjoge1xuICogICAgICAgICAgICAgICAgICAgICBcImlkXCI6IFwiY29tcG9uZW50LWlkXCJcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgLy8gLi4uIG90aGVyIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgICAgLy8gLi4uIG90aGVyIGZsb3cgcHJvcGVydGllc1xuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIENhY2hpbmcgU3RyYXRlZ3lcbiAqXG4gKiBUaGUgYENsb3VkUmVwb3NpdG9yeWAgaW1wbGVtZW50cyBhIHByb21pc2UtYmFzZWQgY2FjaGluZyBtZWNoYW5pc206XG4gKlxuICogMS4gKipDYWNoZSBLZXkqKjogRmxvdyBJRCBpcyB1c2VkIGFzIHRoZSBjYWNoZSBrZXlcbiAqIDIuICoqQ2FjaGUgVmFsdWUqKjogUHJvbWlzZXMgYXJlIGNhY2hlZCByYXRoZXIgdGhhbiByZXNvbHZlZCB2YWx1ZXMgdG8gaGFuZGxlIGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAqIDMuICoqQ2FjaGUgRHVyYXRpb24qKjogQ2FjaGUgcGVyc2lzdHMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogNC4gKipDYWNoZSBJbnZhbGlkYXRpb24qKjogTm8gYXV0b21hdGljIGNhY2hlIGludmFsaWRhdGlvbiBpcyBpbXBsZW1lbnRlZFxuICpcbiAqICMjIEVycm9yIEhhbmRsaW5nXG4gKlxuICogLSBOZXR3b3JrIGVycm9ycyBhbmQgQVBJIGZhaWx1cmVzIGFyZSBwcm9wYWdhdGVkIHRocm91Z2ggcHJvbWlzZSByZWplY3Rpb25cbiAqIC0gTm8gc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcgb3IgcmV0cnkgbG9naWMgaXMgaW1wbGVtZW50ZWQgYXQgdGhlIHJlcG9zaXRvcnkgbGV2ZWxcbiAqIC0gQ29uc3VtZXJzIHNob3VsZCBpbXBsZW1lbnQgYXBwcm9wcmlhdGUgZXJyb3IgaGFuZGxpbmcgd2hlbiBjYWxsaW5nIHJlcG9zaXRvcnkgbWV0aG9kc1xuICpcbiAqICMjIFVzYWdlIFBhdHRlcm5zXG4gKlxuICogIyMjIFNpbmdsZXRvbiBBY2Nlc3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gJy4vcGF0aC90by9DbG91ZFJlcG9zaXRvcnknO1xuICpcbiAqIC8vIFVzZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ3VzdG9tIEluc3RhbmNlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBjdXN0b20gaW5zdGFuY2Ugd2l0aCBkaWZmZXJlbnQgYmFzZSBVUkxcbiAqIGNvbnN0IGN1c3RvbVJlcG8gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCdodHRwczovL2N1c3RvbS1hcGkuZXhhbXBsZS5jb20nKTtcbiAqIGNvbnN0IGZsb3cgPSBhd2FpdCBjdXN0b21SZXBvLmZldGNoRmxvdygnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMjIENvbXBvbmVudCBSZXRyaWV2YWxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEdldCBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICogY29uc3QgY29tcG9uZW50ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoJ2NvbXBvbmVudC1pZCcsICdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXNcbiAqXG4gKiAtICoqSVVzZXJGbG93Kio6IEludGVyZmFjZSBpbXBvcnRlZCBmcm9tIGAuLi9jb21tb25gIHRoYXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHVzZXIgZmxvdyBvYmplY3RzXG4gKiAtICoqRmV0Y2ggQVBJKio6IFVzZXMgdGhlIG5hdGl2ZSBgZmV0Y2hgIGZ1bmN0aW9uIGZvciBIVFRQIHJlcXVlc3RzXG4gKlxuICogIyMgUGVyZm9ybWFuY2UgQ29uc2lkZXJhdGlvbnNcbiAqXG4gKiAtICoqQ2FjaGluZyoqOiBQcmV2ZW50cyBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IElEXG4gKiAtICoqUHJvbWlzZSBDYWNoaW5nKio6IEhhbmRsZXMgY29uY3VycmVudCByZXF1ZXN0cyBlZmZpY2llbnRseSBieSBjYWNoaW5nIHByb21pc2VzXG4gKiAtICoqQ29tcG9uZW50IFJlc29sdXRpb24qKjogVGhlIGByZXNvbHZlPWNvbXBvbmVudHNgIHBhcmFtZXRlciBlbnN1cmVzIGNvbXBvbmVudHMgYXJlIGZ1bGx5IHJlc29sdmVkIGluIGEgc2luZ2xlIEFQSSBjYWxsXG4gKlxuICogIyMgRnV0dXJlIEVuaGFuY2VtZW50c1xuICpcbiAqIFRoZSBjbGFzcyBzdHJ1Y3R1cmUgc3VnZ2VzdHMgcGxhbm5lZCBmdW5jdGlvbmFsaXR5IHRoYXQgY291bGQgYmUgaW1wbGVtZW50ZWQ6XG4gKlxuICogLSAqKkNvbXBvbmVudCBDYWNoaW5nKio6IFRoZSBjb21tZW50ZWQgYGNvbXBvbmVudHNgIHByb3BlcnR5IGluZGljYXRlcyBwb3RlbnRpYWwgaW5kaXZpZHVhbCBjb21wb25lbnQgY2FjaGluZ1xuICogLSAqKkNhY2hlIEludmFsaWRhdGlvbioqOiBNZXRob2RzIHRvIGNsZWFyIG9yIHJlZnJlc2ggY2FjaGVkIGRhdGFcbiAqIC0gKipFcnJvciBSZXRyeSBMb2dpYyoqOiBBdXRvbWF0aWMgcmV0cnkgbWVjaGFuaXNtcyBmb3IgZmFpbGVkIHJlcXVlc3RzXG4gKiAtICoqQmF0Y2ggT3BlcmF0aW9ucyoqOiBNZXRob2RzIHRvIGZldGNoIG11bHRpcGxlIGZsb3dzIG9yIGNvbXBvbmVudHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgLy8gcHJpdmF0ZSBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+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/OiBib29sZWFuLFxuICAgIGNvbm5lY3RQcm9wcz86IGJvb2xlYW5cbiAgICB0aW1lb3V0PzogbnVtYmVyLFxuICAgIHNraXBJbml0PzogYm9vbGVhbixcbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZyxcbiAgICBob29rcz86IGxvYWRlckhvb2tzLFxuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXMsXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50LFxuICAgIF9oYXNQYXJlbnQ/OiBib29sZWFuXG4gICAgX2luc3BlY3Rpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLnRzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSByZWYgaGVscGVyIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIGl0IHRvIHBhc3MgdGhlIGFzc2lnbmVkIGlkc1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlZkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gcmVmQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKCk7XG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgIi8vIEB0cy1ub2NoZWNrXG5leHBvcnQgY29uc3Qgb2JzZXJ2ZURPTSA9IChvYmo6IEhUTUxFbGVtZW50IHwgbnVsbCwgY2FsbGJhY2s6IChtdXRhdGlvblJlY29yZHM/OiBNdXRhdGlvblJlY29yZFtdKSA9PiB2b2lkKSA9PiB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgY29uc29sZS5sb2coJ24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgTXV0YXRpb25PYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgaWYgKCFvYmogfHwgb2JqLm5vZGVUeXBlICE9PSAxKSByZXR1cm47XG5cbiAgICBpZiAoTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICAvLyBkZWZpbmUgYSBuZXcgb2JzZXJ2ZXJcbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKVxuICAgICAgICAvLyBoYXZlIHRoZSBvYnNlcnZlciBvYnNlcnZlIGZvciBjaGFuZ2VzIGluIGNoaWxkcmVuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHthdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9O1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JqLCBjb25maWcpXG4gICAgICAgIHJldHVybiBtdXRhdGlvbk9ic2VydmVyXG4gICAgfVxuXG4gICAgLy8gYnJvd3NlciBzdXBwb3J0IGZhbGxiYWNrXG4gICAgZWxzZSBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVSZW1vdmVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtvYnNlcnZlRE9NfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL2RvbU9ic2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZURPTShkb2N1bWVudC5ib2R5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpXG4gICAgICAgICAgICAgICAgICAgIC8vICBuZXcgRW52ZWxvcGVkTWVzc2FnZShldmVudC5zb3VyY2UhLCBuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuXG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gfHwgIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUgfHwgbm9kZURhdGEudmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGdldElucHV0VmFsdWUoaXRlbSlcbiAgICAgICAgICAgICksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVNZXNzYWdlLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0Rmlyc3RFbGVtZW50QnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBnZXRGaXJzdEVsZW1lbnRCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KVxuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKGl0ZW0uZ2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUpKSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7UmVzaXplT2JzZXJ2ZXJNZXNzYWdlLCBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2V9IGZyb20gJy4uLy4uL21lc3NhZ2VzJ1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogcGFzcyB0aGUgaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlc2l6ZU9ic2VydmVyTWVzc2FnZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRJbm5lckh0bWwpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gKiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gKiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuICpcbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge0lmcmFtZVNES30gZnJvbSAnQG15b3Avc2RrL2lmcmFtZSc7XG4gYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlclwiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElmcmFtZVNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHdpbmRvdy5teW9wID0ge31cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESyA9IHRoaXM7XG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50SWRzID0gT2JqZWN0LmtleXModGhpcy5jb21wb25lbnRzKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChyZXBsYXlUbz8ucm91dGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCB0aGF0IGluaXRpYXRlZCB0aGF0IGN5Y2xlXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHJlcGxheVRvLnJvdXRlW3JlcGxheVRvLnJvdXRlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gY29tcG9uZW50SWRzWzBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gY29tcG9uZW50SWRzWzBdO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuXG4gICAgICAgIHdpbmRvdy5wYXJlbnQ/LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2VcbiAgICAgICAgfSwgJyonKTtcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcblxuICAgICAgICAvL2NvbXBvc2l0ZSBzdXBwb3J0IG1lc3NhZ2VzIDpcbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdClcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5vbm1lc3NhZ2UgPSB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgIH1cblxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdJZnJhbWVTREsnLCBJZnJhbWVTREspO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgImhlaWdodCIsICJ3aWR0aCIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImhvc3RTREsiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiZWxlbWVudCIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNlZW4iLCAic2RrIiwgImRvbUlkIiwgInNkayIsICJzZWVuIiwgInNraW4iLCAiY29tcG9uZW50IiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaG9zdFNESyIsICJnZXRJbnB1dFZhbHVlIiwgImVsZW1lbnQiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciJdCn0K