@ragemp-mango/core 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/index.js +1 -1
- package/dist/app/module-tree/index.js +1 -1
- package/dist/{chunk-Z7RHJLDL.js → chunk-UFGGTRGJ.js} +16 -16
- package/dist/decorators/index.d.ts +2 -3
- package/dist/decorators/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/services/index.js +1 -1
- package/package.json +1 -1
package/dist/app/index.js
CHANGED
|
@@ -258,7 +258,7 @@ var AppRuntime = class {
|
|
|
258
258
|
...module.metadata.internalProviders,
|
|
259
259
|
...module.metadata.externalProviders
|
|
260
260
|
].forEach(([token]) => module.container.get(token));
|
|
261
|
-
this.loggerService.log(
|
|
261
|
+
this.loggerService.log(`Module ${module.metadata.classRef.name} loaded (${Date.now() - startTime}ms)`);
|
|
262
262
|
await this.runLifecycleMethod(module, "onModuleInit");
|
|
263
263
|
});
|
|
264
264
|
await this.runLifecycleMethods(resolvedTree, "onAppBootstrap");
|
|
@@ -268,7 +268,7 @@ var AppRuntime = class {
|
|
|
268
268
|
const time = Date.now();
|
|
269
269
|
this.registerTimers(controller);
|
|
270
270
|
this.registerListeners(controller);
|
|
271
|
-
this.loggerService.log(
|
|
271
|
+
this.loggerService.log(`Controller ${controller.metadata.classRef.name} timers and listeners registered (${Date.now() - time}ms)`);
|
|
272
272
|
});
|
|
273
273
|
});
|
|
274
274
|
}
|
|
@@ -493,7 +493,7 @@ var ModuleDependencyBinder = class {
|
|
|
493
493
|
module.container.bind(classRef).toSelf().inSingletonScope();
|
|
494
494
|
}
|
|
495
495
|
module.container.bind(TIMER_SERVICE).to(TimerService).inSingletonScope();
|
|
496
|
-
this.loggerService.log(
|
|
496
|
+
this.loggerService.log(`Module ${module.metadata.classRef.name} dependencies binded (${Date.now() - startTime}ms)`);
|
|
497
497
|
});
|
|
498
498
|
}
|
|
499
499
|
bindProvider(provider, container) {
|
|
@@ -570,7 +570,7 @@ var ModuleTreeScanner = class {
|
|
|
570
570
|
const moduleMetadata = await this.moduleMetadataReader.read(classRef);
|
|
571
571
|
const module = new Module();
|
|
572
572
|
module.metadata = moduleMetadata;
|
|
573
|
-
this.loggerService.log(
|
|
573
|
+
this.loggerService.log(`Module ${module.metadata.classRef.name} scanned (${Date.now() - startTime}ms)`);
|
|
574
574
|
await this.scanControllers(module);
|
|
575
575
|
const moduleTree = new Tree(module);
|
|
576
576
|
const scannedModules = /* @__PURE__ */ new Map();
|
|
@@ -592,7 +592,7 @@ var ModuleTreeScanner = class {
|
|
|
592
592
|
const module = new Module();
|
|
593
593
|
module.metadata = moduleMetadata;
|
|
594
594
|
module.parent = parentNode.value;
|
|
595
|
-
this.loggerService.log(
|
|
595
|
+
this.loggerService.log(`Module ${module.metadata.classRef.name} scanned (${Date.now() - startTime}ms)`);
|
|
596
596
|
await this.scanControllers(module);
|
|
597
597
|
const treeNode = new TreeNode(module);
|
|
598
598
|
parentNode.addChild(treeNode);
|
|
@@ -609,7 +609,7 @@ var ModuleTreeScanner = class {
|
|
|
609
609
|
controller.metadata = controllerMetadata;
|
|
610
610
|
controller.owner = module;
|
|
611
611
|
module.controllers.push(controller);
|
|
612
|
-
this.loggerService.log(
|
|
612
|
+
this.loggerService.log(`Controller ${classRef.name} scanned (${Date.now() - startTime}ms)`);
|
|
613
613
|
}
|
|
614
614
|
}
|
|
615
615
|
async checkCircularDependency(parentMetadata, moduleMetadata) {
|
|
@@ -930,22 +930,22 @@ var App = class {
|
|
|
930
930
|
this.loggerService.error("Error occurred while starting the app.");
|
|
931
931
|
throw new Error(ErrorMessage.AppAlreadyLoaded);
|
|
932
932
|
}
|
|
933
|
-
this.loggerService.log("
|
|
933
|
+
this.loggerService.log("Starting app...");
|
|
934
934
|
await this.runPluginMethods("beforeStart");
|
|
935
|
-
this.loggerService.log("
|
|
935
|
+
this.loggerService.log("Scanning module tree...");
|
|
936
936
|
await this.runPluginMethods("beforeScan");
|
|
937
937
|
this.moduleTree = await this.moduleTreeScanner.scan(rootModule);
|
|
938
938
|
await this.runPluginMethods("afterScan");
|
|
939
|
-
this.loggerService.log("
|
|
939
|
+
this.loggerService.log("Binding module dependencies...");
|
|
940
940
|
await this.runPluginMethods("beforeBind");
|
|
941
941
|
await this.moduleDependencyBinder.bind(this.moduleTree);
|
|
942
942
|
await this.runPluginMethods("afterBind");
|
|
943
|
-
this.loggerService.log("
|
|
943
|
+
this.loggerService.log("Loading app...");
|
|
944
944
|
await this.runPluginMethods("beforeLoad");
|
|
945
945
|
await this.appRuntime.boot(this.moduleTree);
|
|
946
946
|
this.loaded = true;
|
|
947
947
|
await this.runPluginMethods("afterLoad");
|
|
948
|
-
this.loggerService.log("
|
|
948
|
+
this.loggerService.log("App loaded");
|
|
949
949
|
await this.runPluginMethods("afterStart");
|
|
950
950
|
}
|
|
951
951
|
async stop() {
|
|
@@ -954,10 +954,10 @@ var App = class {
|
|
|
954
954
|
throw new Error(ErrorMessage.AppNotLoaded);
|
|
955
955
|
}
|
|
956
956
|
await this.runPluginMethods("beforeStop");
|
|
957
|
-
this.loggerService.log("
|
|
957
|
+
this.loggerService.log("Stopping app...");
|
|
958
958
|
await this.appRuntime.shutdown(this.moduleTree);
|
|
959
959
|
this.loaded = false;
|
|
960
|
-
this.loggerService.log("
|
|
960
|
+
this.loggerService.log("App stopped");
|
|
961
961
|
await this.runPluginMethods("afterStop");
|
|
962
962
|
}
|
|
963
963
|
async runPluginMethods(method) {
|
|
@@ -1633,9 +1633,9 @@ function createParamDecorator(factory) {
|
|
|
1633
1633
|
__name(createParamDecorator, "createParamDecorator");
|
|
1634
1634
|
|
|
1635
1635
|
// src/decorators/forward-ref.util.ts
|
|
1636
|
-
import {
|
|
1636
|
+
import { LazyServiceIdentifier } from "inversify";
|
|
1637
1637
|
function forwardRef(fn) {
|
|
1638
|
-
return new
|
|
1638
|
+
return new LazyServiceIdentifier(fn);
|
|
1639
1639
|
}
|
|
1640
1640
|
__name(forwardRef, "forwardRef");
|
|
1641
1641
|
|
|
@@ -1889,4 +1889,4 @@ export {
|
|
|
1889
1889
|
createParamDecorator,
|
|
1890
1890
|
forwardRef
|
|
1891
1891
|
};
|
|
1892
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NlcnZpY2VzL3JlZmxlY3Rvci5zZXJ2aWNlLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvY29udHJvbGxlci5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY29yZS9nbG9iYWwuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvaW5qZWN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL2luamVjdGFibGUuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvbW9kdWxlLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL29wdGlvbmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL3NldC1tZXRhZGF0YS5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXJyb3JzL2NhdGNoLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9lcnJvcnMvdXNlLWZpbHRlcnMuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9hcHAvbW9kdWxlLXRyZWUvYXBwLXJ1bnRpbWUudHMiLCAiLi4vc3JjL2FwcC9tb2R1bGUtdHJlZS9kZXBlbmRlbmN5LWJpbmRlci50cyIsICIuLi9zcmMvYXBwL21vZHVsZS10cmVlL21vZHVsZS10cmVlLXNjYW5uZXIudHMiLCAiLi4vc3JjL2FwcC9tdWx0aXBsYXllci9yYWdlbXAvcmFnZW1wLXNjcmlwdC1ldmVudC1oYW5kbGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1ldmVudC1lbW1pdGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC10aW1lci50cyIsICIuLi9zcmMvYXBwL211bHRpcGxheWVyL3JhZ2VtcC9yYWdlbXAtdGltZXJzLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1tdWx0aXBsYXllci5zZXJ2aWNlLnRzIiwgIi4uL3NyYy9hcHAvYXBwLWJ1aWxkZXIudHMiLCAiLi4vc3JjL2FwcC9hcHAudHMiLCAiLi4vc3JjL2FwcC9jcmVhdGUtYXBwLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLWludGVybmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb24td2Vidmlldy5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb25jZS1pbnRlcm5hbC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uY2UuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2V2ZW50cy9vbmNlLXdlYnZpZXcuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9ib2R5LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvaW5kZXguZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvcGFyYW0uZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXNwb25zZS5kZW9yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtZ3VhcmRzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtaW50ZXJjZXB0b3JzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtcGlwZXMuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ycGMtZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3JwYy9vbi1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ycGMvb24td2Vidmlldy1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jcmVhdGUtdGltZXIuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3RpbWVycy9jcm9uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvZXZlcnktdGljay5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvdGltZXJzL2ludGVydmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvdGltZW91dC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvYXBwbHktZGVjb3JhdG9yLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY3JlYXRlLXBhcmFtLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZm9yd2FyZC1yZWYudXRpbC50cyIsICIuLi9zcmMvc2VydmljZXMvdGltZXIuc2VydmljZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBTZXRNZXRhZGF0YSB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVEZWNvcmF0b3JPcHRpb25zLCBDcmVhdGVEZWNvcmF0b3JXaXRoVHJhbnNmb3JtT3B0aW9ucywgUmVmbGVjdGFibGVEZWNvcmF0b3IgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlUmFuZG9tSWQsIGlzRW1wdHksIGlzT2JqZWN0IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVmbGVjdG9yU2VydmljZSB7XG4gICAgcHVibGljIGdldDxUUmVzdWx0ID0gdW5rbm93biwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4obWV0YWRhdGFLZXk6IFRLZXksIHRhcmdldDogTmV3YWJsZSB8IEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhPFRSZXN1bHQ+KG1ldGFkYXRhS2V5LCB0YXJnZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGw8VFJlc3VsdCBleHRlbmRzIHVua25vd25bXSA9IHVua25vd25bXSwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4oXG4gICAgICAgIG1ldGFkYXRhS2V5OiBUS2V5LFxuICAgICAgICB0YXJnZXRzOiAoTmV3YWJsZSB8IEZ1bmN0aW9uKVtdLFxuICAgICkge1xuICAgICAgICByZXR1cm4gPFRSZXN1bHQ+KHRhcmdldHMgfHwgW10pLm1hcCgodGFyZ2V0KSA9PiB0aGlzLmdldChtZXRhZGF0YUtleSwgdGFyZ2V0KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbEFuZE1lcmdlPFRSZXN1bHQgZXh0ZW5kcyB1bmtub3duW10gPSB1bmtub3duW10sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgPSBzdHJpbmc+KFxuICAgICAgICBtZXRhZGF0YUtleTogVEtleSxcbiAgICAgICAgdGFyZ2V0czogKE5ld2FibGUgfCBGdW5jdGlvbilbXSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFDb2xsZWN0aW9uID0gdGhpcy5nZXRBbGw8VFJlc3VsdCwgVEtleT4obWV0YWRhdGFLZXksIHRhcmdldHMpLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBpZiAoaXNFbXB0eShtZXRhZGF0YUNvbGxlY3Rpb24pKSByZXR1cm4gPFRSZXN1bHQ+bWV0YWRhdGFDb2xsZWN0aW9uO1xuXG4gICAgICAgIHJldHVybiA8VFJlc3VsdD5tZXRhZGF0YUNvbGxlY3Rpb24ucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc09iamVjdChhKSAmJiBpc09iamVjdChiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIC4uLmIsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbYSwgYl07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxBbmRPdmVycmlkZTxUUmVzdWx0ID0gdW5rbm93biwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4obWV0YWRhdGFLZXk6IFRLZXksIHRhcmdldHM6IChOZXdhYmxlIHwgRnVuY3Rpb24pW10pIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXQobWV0YWRhdGFLZXksIHRhcmdldCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHJldHVybiA8VFJlc3VsdD5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlY29yYXRvcjxUUGFyYW0+KG9wdGlvbnM/OiBDcmVhdGVEZWNvcmF0b3JPcHRpb25zPFRQYXJhbT4pOiBSZWZsZWN0YWJsZURlY29yYXRvcjxUUGFyYW0+O1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPihcbiAgICAgICAgb3B0aW9uczogQ3JlYXRlRGVjb3JhdG9yV2l0aFRyYW5zZm9ybU9wdGlvbnM8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+LFxuICAgICk6IFJlZmxlY3RhYmxlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPjtcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlY29yYXRvcjxUUGFyYW0sIFRUcmFuc2Zvcm1lZCA9IFRQYXJhbT4oXG4gICAgICAgIG9wdGlvbnM6IENyZWF0ZURlY29yYXRvck9wdGlvbnM8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+ID0ge30sXG4gICAgKTogUmVmbGVjdGFibGVEZWNvcmF0b3I8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+IHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFLZXkgPSBvcHRpb25zLmtleSA/PyBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvckZuID0gKG1ldGFkYXRhVmFsdWU6IFRQYXJhbSkgPT4gKHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sIGtleT86IHN0cmluZyB8IHN5bWJvbCwgZGVzY3JpcHRvcj86IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnRyYW5zZm9ybSA/IG9wdGlvbnMudHJhbnNmb3JtKG1ldGFkYXRhVmFsdWUpIDogbWV0YWRhdGFWYWx1ZTtcbiAgICAgICAgICAgIFNldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB2YWx1ZSA/PyB7fSkodGFyZ2V0LCBrZXkhLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkZWNvcmF0b3JGbi5LRVkgPSBtZXRhZGF0YUtleTtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvckZuIGFzIFJlZmxlY3RhYmxlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29udHJvbGxlcjxUIGV4dGVuZHMgTmV3YWJsZT4ob3B0aW9ucz86IENvbnRyb2xsZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IFQpID0+IHtcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXIsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUNvbnRyb2xsZXJPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gR2xvYmFsPFQgZXh0ZW5kcyBOZXdhYmxlPigpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5HbG9iYWxNb2R1bGUsIHRydWUsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gSW5qZWN0PFQgPSB1bmtub3duPihrZXk/OiBJbmplY3Rpb25Ub2tlbjxUPikge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKGtleSkgJiYgIXZhbGlkYXRlSW5qZWN0aW9uVG9rZW4oa2V5KS52YWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5JbnZhbGlkSW5qZWN0aW9uVG9rZW5TcGVjaWZpZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBrZXkgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YTxJbmplY3Rpb25Ub2tlbj4oJ2Rlc2lnbjp0eXBlJywgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW5qZWN0aW9uVG9rZW5Ob3RGb3VuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtSW5kZXgpO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmplY3RhYmxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogSW5qZWN0YWJsZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBpZiAoUmVmbGVjdC5oYXNNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuSW5qZWN0YWJsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5JbmplY3RhYmxlLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kdWxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogTW9kdWxlT3B0aW9ucykge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZU1vZHVsZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvciEpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHZhbHVlLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiBpbmplY3RhYmxlKCkodGFyZ2V0KTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IG9wdGlvbmFsIH0gZnJvbSAnaW52ZXJzaWZ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIE9wdGlvbmFsKCkge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uYWwoKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbUluZGV4KTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEN1c3RvbURlY29yYXRvciB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFNldE1ldGFkYXRhPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFYgPSB1bmtub3duPihrZXk6IEssIHZhbHVlOiBWKSB7XG4gICAgY29uc3QgZGVjb3JhdG9yRmFjdG9yeSA9IDxDdXN0b21EZWNvcmF0b3I+KCh0YXJnZXQ6IG9iamVjdCwgX21ldGhvZD86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShrZXksIHZhbHVlLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoa2V5LCB2YWx1ZSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgICBkZWNvcmF0b3JGYWN0b3J5LktFWSA9IGtleTtcbiAgICByZXR1cm4gZGVjb3JhdG9yRmFjdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ2F0Y2g8VCBleHRlbmRzIE5ld2FibGU+KC4uLmV4Y2VwdGlvbnM6IHVua25vd25bXSkge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5DYXRjaCwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gZXhjZXB0aW9ucy5maWx0ZXIoKGV4Y2VwdGlvbiwgaW5kZXgpID0+IGV4Y2VwdGlvbnMuaW5kZXhPZihleGNlcHRpb24pICE9PSBpbmRleCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FeGNlcHRpb25IYW5kbGluZ0NvbmZsaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNhdGNoLCBleGNlcHRpb25zLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRmlsdGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFcnJvckZpbHRlciB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRmlsdGVycyguLi5maWx0ZXJzOiAoTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcilbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZpbHRlcnM6IChOZXdhYmxlPEVycm9yRmlsdGVyPiB8IEVycm9yRmlsdGVyKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVFcnJvckZpbHRlcihmaWx0ZXIpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEZpbHRlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RGaWx0ZXJzID1cbiAgICAgICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8RXJyb3JGaWx0ZXI+W10+KENvcmVNZXRhZGF0YUtleS5FcnJvckZpbHRlcnMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIGlmICghaXNOaWwobWV0aG9kRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVFcnJvckZpbHRlckRldGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLm1ldGhvZEZpbHRlcnNdLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NGaWx0ZXJzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEVycm9yRmlsdGVyPltdPihDb3JlTWV0YWRhdGFLZXkuRXJyb3JGaWx0ZXJzLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBpZiAoIWlzTmlsKGNsYXNzRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkR1cGxpY2F0ZUVycm9yRmlsdGVyRGV0ZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLmNsYXNzRmlsdGVyc10sIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRU5BQkxFX1NIVVRET1dOX0hPT0tTLCBHTE9CQUxfRVJST1JfRklMVEVSUywgR0xPQkFMX0dVQVJEUywgR0xPQkFMX0lOVEVSQ0VQVE9SUywgR0xPQkFMX1BJUEVTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JGaWx0ZXIsIEd1YXJkLCBJbnRlcmNlcHRvciB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSwgb3B0aW9uYWwgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgQ29udHJvbGxlckV2ZW50SGFuZGxlciwgQ29udHJvbGxlclJQQ0hhbmRsZXIgfSBmcm9tICcuLi9jb250cm9sbGVyJztcbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFLCBUSU1FUl9TRVJWSUNFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTG9nZ2VyU2VydmljZSwgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBUcmVlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBUaW1lclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBSdW50aW1lIHtcbiAgICBAaW5qZWN0KENvbnRyb2xsZXJFdmVudEhhbmRsZXIpIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyOiBDb250cm9sbGVyRXZlbnRIYW5kbGVyO1xuICAgIEBpbmplY3QoQ29udHJvbGxlclJQQ0hhbmRsZXIpIHByaXZhdGUgcmVhZG9ubHkgcnBjSGFuZGxlcjogQ29udHJvbGxlclJQQ0hhbmRsZXI7XG4gICAgQGluamVjdChHTE9CQUxfR1VBUkRTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEd1YXJkczogKE5ld2FibGU8R3VhcmQ+IHwgR3VhcmQpW107XG4gICAgQGluamVjdChHTE9CQUxfSU5URVJDRVBUT1JTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEludGVyY2VwdG9yczogKE5ld2FibGU8SW50ZXJjZXB0b3I+IHwgSW50ZXJjZXB0b3IpW107XG4gICAgQGluamVjdChHTE9CQUxfUElQRVMpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXTtcbiAgICBAaW5qZWN0KEdMT0JBTF9FUlJPUl9GSUxURVJTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEVycm9yRmlsdGVyczogKE5ld2FibGU8RXJyb3JGaWx0ZXI+IHwgRXJyb3JGaWx0ZXIpW107XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuICAgIEBpbmplY3QoRU5BQkxFX1NIVVRET1dOX0hPT0tTKSBAb3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVNodXRkb3duSG9va3M6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChyZXNvbHZlZFRyZWU6IFRyZWU8TW9kdWxlPikge1xuICAgICAgICBhd2FpdCByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbW9kdWxlLCBjb250cm9sbGVycyBhbmQgcHJvdmlkZXJzLlxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIG1vZHVsZS5pbnN0YW5jZSA9IG1vZHVsZS5jb250YWluZXIuZ2V0PHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT4obW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmKTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChjb250cm9sbGVyKSA9PiAoY29udHJvbGxlci5pbnN0YW5jZSA9IG1vZHVsZS5jb250YWluZXIuZ2V0PHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT4oY29udHJvbGxlci5tZXRhZGF0YS5jbGFzc1JlZikpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFsuLi5tb2R1bGUubWV0YWRhdGEuaW50ZXJuYWxQcm92aWRlcnMsIC4uLm1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVyc10uZm9yRWFjaCgoW3Rva2VuXSkgPT5cbiAgICAgICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmdldDxhbnk+KHRva2VuKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExvZyBtb2R1bGUgbG9hZGVkLlxuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgfmx3fk1vZHVsZSB+bGJ+JHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fmxvYWRlZCB+bGt+KCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kKG1vZHVsZSwgJ29uTW9kdWxlSW5pdCcpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ29uTW9kdWxlSW5pdCcpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZHMocmVzb2x2ZWRUcmVlLCAnb25BcHBCb290c3RyYXAnKTtcblxuICAgICAgICAvLyBSZWdpc3RlciBldmVudCBhbmQgcnBjIGxpc3RlbmVycy5cbiAgICAgICAgcmVzb2x2ZWRUcmVlLnRyYXZlcnNlKChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLmZvckVhY2goKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGltZXJzKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYH5sd35Db250cm9sbGVyIH5sY34ke2NvbnRyb2xsZXIubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fnRpbWVycyBhbmQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgfmxrfigke0RhdGUubm93KCkgLSB0aW1lfW1zKWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ocmVzb2x2ZWRUcmVlOiBUcmVlPE1vZHVsZT4pIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2h1dGRvd25Ib29rcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ29uTW9kdWxlRGVzdHJveScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ2JlZm9yZUFwcFNodXRkb3duJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXJTZXJ2aWNlID0gY29udHJvbGxlci5vd25lci5jb250YWluZXIuZ2V0PFRpbWVyU2VydmljZT4oVElNRVJfU0VSVklDRSk7XG5cbiAgICAgICAgICAgICAgICAvLyBEZXN0cm95IGFsbCB0aW1lcnMuXG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmV2ZXJ5dGlja3MuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmludGVydmFscy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UudGltZW91dHMuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmNyb25zLmZvckVhY2goKGNyb24pID0+IGNyb24uc3RvcCgpKTtcblxuICAgICAgICAgICAgICAgIC8vIERlc3Ryb3kgYWxsIHNjcmlwdCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmV2ZW50SGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucnBjSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC8vIERlc3Ryb3kgYWxsIHRpbWVycy5cbiAgICAgICAgLy8gdGhpcy50aW1lclNlcnZpY2UuZXZlcnl0aWNrcy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgLy8gdGhpcy50aW1lclNlcnZpY2UuaW50ZXJ2YWxzLmZvckVhY2goKHRpbWVyKSA9PiB0aW1lci5kZXN0cm95KCkpO1xuICAgICAgICAvLyB0aGlzLnRpbWVyU2VydmljZS50aW1lb3V0cy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgLy8gdGhpcy50aW1lclNlcnZpY2UuY3JvbkpvYnMuZm9yRWFjaCgoY3JvbkpvYikgPT4gY3JvbkpvYi5zdG9wKCkpO1xuXG4gICAgICAgIC8vIC8vIERlc3Ryb3kgYWxsIHNjcmlwdCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgLy8gdGhpcy5ldmVudFNlcnZpY2UuJGxvY2FsSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuICAgICAgICAvLyB0aGlzLmV2ZW50U2VydmljZS4kaW50ZXJuYWxIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyLmRlc3Ryb3koKSk7XG4gICAgICAgIC8vIHRoaXMuZXZlbnRTZXJ2aWNlLiRyZW1vdGVIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyLmRlc3Ryb3koKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2h1dGRvd25Ib29rcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ29uQXBwU2h1dGRvd24nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJMaXN0ZW5lcnMoY29udHJvbGxlcjogQ29udHJvbGxlcikge1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBjb250cm9sbGVyLm93bmVyO1xuICAgICAgICBjb250cm9sbGVyLm1ldGFkYXRhLmV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3VhcmRzID0gWy4uLnRoaXMuZ2xvYmFsR3VhcmRzLCAuLi5tb2R1bGUubWV0YWRhdGEuZ3VhcmRzLCAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmd1YXJkcywgLi4uZXZlbnQuZ3VhcmRzXTtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdsb2JhbEludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5tb2R1bGUubWV0YWRhdGEuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBwaXBlcyA9IFsuLi50aGlzLmdsb2JhbFBpcGVzLCAuLi5tb2R1bGUubWV0YWRhdGEucGlwZXMsIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEucGlwZXMsIC4uLmV2ZW50LnBpcGVzXTtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZEVycm9yRmlsdGVycyA9IHRoaXMubWFwRXJyb3JGaWx0ZXJzKFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdsb2JhbEVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5tb2R1bGUubWV0YWRhdGEuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5ldmVudEhhbmRsZXIucmVnaXN0ZXJFdmVudChndWFyZHMsIGludGVyY2VwdG9ycywgcGlwZXMsIG1hcHBlZEVycm9yRmlsdGVycywgY29udHJvbGxlciwgZXZlbnQpO1xuICAgICAgICAgICAgY29udHJvbGxlci5ldmVudEhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRyb2xsZXIubWV0YWRhdGEucnBjcy5mb3JFYWNoKGFzeW5jIChycGMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGd1YXJkcyA9IFsuLi50aGlzLmdsb2JhbEd1YXJkcywgLi4ubW9kdWxlLm1ldGFkYXRhLmd1YXJkcywgLi4uY29udHJvbGxlci5tZXRhZGF0YS5ndWFyZHMsIC4uLnJwYy5ndWFyZHNdO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2xvYmFsSW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLm1vZHVsZS5tZXRhZGF0YS5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbGxlci5tZXRhZGF0YS5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4ucnBjLmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBwaXBlcyA9IFsuLi50aGlzLmdsb2JhbFBpcGVzLCAuLi5tb2R1bGUubWV0YWRhdGEucGlwZXMsIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEucGlwZXMsIC4uLnJwYy5waXBlc107XG4gICAgICAgICAgICBjb25zdCBtYXBwZWRFcnJvckZpbHRlcnMgPSB0aGlzLm1hcEVycm9yRmlsdGVycyhbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nbG9iYWxFcnJvckZpbHRlcnMsXG4gICAgICAgICAgICAgICAgLi4ubW9kdWxlLm1ldGFkYXRhLmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5ycGMuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLnJwY0hhbmRsZXIucmVnaXN0ZXJSUEMoZ3VhcmRzLCBpbnRlcmNlcHRvcnMsIHBpcGVzLCBtYXBwZWRFcnJvckZpbHRlcnMsIGNvbnRyb2xsZXIsIHJwYyk7XG4gICAgICAgICAgICBjb250cm9sbGVyLnJwY0hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclRpbWVycyhjb250cm9sbGVyOiBDb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyU2VydmljZSA9IGNvbnRyb2xsZXIub3duZXIuY29udGFpbmVyLmdldDxUaW1lclNlcnZpY2U+KFRJTUVSX1NFUlZJQ0UpO1xuXG4gICAgICAgIGNvbnRyb2xsZXIubWV0YWRhdGEudGltZXJzLmZvckVhY2goKHRpbWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodGltZXIudHlwZSA9PT0gJ2Nyb24nKSB7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmNyZWF0ZUNyb25Kb2IoY29udHJvbGxlci5pbnN0YW5jZVt0aW1lci5tZXRob2RdIS5iaW5kKGNvbnRyb2xsZXIuaW5zdGFuY2UpLCB0aW1lci5vcHRpb25zKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXIudHlwZSA9PT0gJ2V2ZXJ5dGljaycpIHtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuY3JlYXRlRXZlcnlUaWNrKGNvbnRyb2xsZXIuaW5zdGFuY2VbdGltZXIubWV0aG9kXSEuYmluZChjb250cm9sbGVyLmluc3RhbmNlKSwgdGltZXIubmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVyLnR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuY3JlYXRlSW50ZXJ2YWwoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaW5zdGFuY2VbdGltZXIubWV0aG9kXSEuYmluZChjb250cm9sbGVyLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgdGltZXIub3B0aW9ucy50aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICB0aW1lci5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVyLnR5cGUgPT09ICd0aW1lb3V0Jykge1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5jcmVhdGVUaW1lb3V0KGNvbnRyb2xsZXIuaW5zdGFuY2VbdGltZXIubWV0aG9kXSEuYmluZChjb250cm9sbGVyLmluc3RhbmNlKSwgdGltZXIub3B0aW9ucy50aW1lb3V0LCB0aW1lci5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBFcnJvckZpbHRlcnMoZXJyb3JGaWx0ZXJzOiAoTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcilbXSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJNYXA6IFt1bmtub3duIHwgJ01BTkdPX0FOWV9FUlJPUicsIE5ld2FibGU8RXJyb3JGaWx0ZXI+IHwgRXJyb3JGaWx0ZXJdW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBlcnJvckZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8YW55W10+KENvcmVNZXRhZGF0YUtleS5DYXRjaCwgZmlsdGVyKSA/PyBbXTtcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goJ01BTkdPX0FOWV9FUlJPUicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmlsKGZpbHRlck1hcC5maW5kKChmaWx0ZXJFcnJvcikgPT4gZmlsdGVyRXJyb3JbMF0gPT09IGVycm9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gbWFwIGVycm9yIGZpbHRlcnMuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRXJyb3JBbHJlYWR5SGFuZGxlZEJ5RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmlsdGVyTWFwLnB1c2goW2Vycm9yLCBmaWx0ZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJNYXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5MaWZlY3ljbGVNZXRob2RzKFxuICAgICAgICByZXNvbHZlZFRyZWU6IFRyZWU8TW9kdWxlPixcbiAgICAgICAgbWV0aG9kOiAnb25Nb2R1bGVJbml0JyB8ICdvbk1vZHVsZURlc3Ryb3knIHwgJ29uQXBwQm9vdHN0cmFwJyB8ICdiZWZvcmVBcHBTaHV0ZG93bicgfCAnb25BcHBTaHV0ZG93bicsXG4gICAgKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4gYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2Qobm9kZS52YWx1ZSwgbWV0aG9kKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5MaWZlY3ljbGVNZXRob2QoXG4gICAgICAgIG1vZHVsZTogTW9kdWxlLFxuICAgICAgICBtZXRob2Q6ICdvbk1vZHVsZUluaXQnIHwgJ29uTW9kdWxlRGVzdHJveScgfCAnb25BcHBCb290c3RyYXAnIHwgJ2JlZm9yZUFwcFNodXRkb3duJyB8ICdvbkFwcFNodXRkb3duJyxcbiAgICApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMubWFwKGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc09iamVjdChjb250cm9sbGVyLmluc3RhbmNlKSB8fCBpc05pbChjb250cm9sbGVyLmluc3RhbmNlW21ldGhvZF0pKSByZXR1cm47XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbGxlci5pbnN0YW5jZVttZXRob2RdISgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgWy4uLm1vZHVsZS5tZXRhZGF0YS5pbnRlcm5hbFByb3ZpZGVycywgLi4ubW9kdWxlLm1ldGFkYXRhLmV4dGVybmFsUHJvdmlkZXJzXS5tYXAoYXN5bmMgKFt0b2tlbl0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm92aWRlckluc3RhbmNlID0gPHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT5tb2R1bGUuY29udGFpbmVyLmdldCh0b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKCFpc09iamVjdChwcm92aWRlckluc3RhbmNlKSB8fCBpc05pbChwcm92aWRlckluc3RhbmNlW21ldGhvZF0pKSByZXR1cm47XG4gICAgICAgICAgICAgICAgYXdhaXQgcHJvdmlkZXJJbnN0YW5jZVttZXRob2RdISgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaXNPYmplY3QobW9kdWxlLmluc3RhbmNlKSB8fCBpc05pbChtb2R1bGUuaW5zdGFuY2VbbWV0aG9kXSkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgbW9kdWxlLmluc3RhbmNlW21ldGhvZF0hKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTG9nZ2VyU2VydmljZSwgUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ09OVEFJTkVSX09QVElPTlMsIEdMT0JBTF9BUFBfQ09OVEFJTkVSIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1vZHVsZSwgTW9kdWxlQ29udGFpbmVyIH0gZnJvbSAnLi4vbW9kdWxlJztcbmltcG9ydCB7IENvbnRhaW5lciwgaW5qZWN0LCBpbmplY3RhYmxlLCBvcHRpb25hbCwgdHlwZSBpbnRlcmZhY2VzIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFLCBNT0RVTEVfQ09OVEFJTkVSLCBUSU1FUl9TRVJWSUNFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgVHJlZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vZHVsZURlcGVuZGVuY3lCaW5kZXIge1xuICAgIEBpbmplY3QoR0xPQkFMX0FQUF9DT05UQUlORVIpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsQXBwQ29udGFpbmVyOiBDb250YWluZXI7XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuICAgIEBvcHRpb25hbCgpIEBpbmplY3QoQ09OVEFJTkVSX09QVElPTlMpIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyT3B0aW9ucz86IGludGVyZmFjZXMuQ29udGFpbmVyT3B0aW9ucztcblxuICAgIHB1YmxpYyBhc3luYyBiaW5kKHJlc29sdmVkVHJlZTogVHJlZTxNb2R1bGU+KSB7XG4gICAgICAgIGF3YWl0IHJlc29sdmVkVHJlZS5hc3luY1RyYXZlcnNlKGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lciA9IG5ldyBNb2R1bGVDb250YWluZXIobW9kdWxlLm1ldGFkYXRhLmNvbnRhaW5lciA/PyB0aGlzLmNvbnRhaW5lck9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gQXR0YWNoIHRoZSBnbG9iYWwgY29udGFpbmVyIHRvIHRoZSBtb2R1bGUgY29udGFpbmVyLCBzbyBpdCBjYW4gYmUgdXNlZCB0byByZXNvbHZlIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIucGFyZW50ID0gdGhpcy5nbG9iYWxBcHBDb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbEFwcENvbnRhaW5lci5iaW5kKG1vZHVsZS5tZXRhZGF0YS5jbGFzc1JlZikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kdWxlIGlzIGdsb2JhbCwgd2Ugd2FudCB0byBiaW5kIGl0IHRvIHRoZSBnbG9iYWwgY29udGFpbmVyLlxuICAgICAgICAgICAgaWYgKG1vZHVsZS5tZXRhZGF0YS5nbG9iYWwpIHtcbiAgICAgICAgICAgICAgICAvLyBCaW5kIGV4dGVybmFsIHByb3ZpZGVycyB0byB0aGUgZ2xvYmFsIGNvbnRhaW5lciwgc28gdGhleSBjYW4gYmUgaW5qZWN0ZWQgaW4gb3RoZXIgbW9kdWxlcy5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBwcm92aWRlcl0gb2YgbW9kdWxlLm1ldGFkYXRhLmV4dGVybmFsUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFByb3ZpZGVyKHByb3ZpZGVyLCB0aGlzLmdsb2JhbEFwcENvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbW9kdWxlIGlzIG5vdCBnbG9iYWwsIHdlIHdhbnQgdG8gYmluZCBpdCB0byBpdHMgb3duIGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0b2tlbiwgcHJvdmlkZXJdIG9mIG1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRQcm92aWRlcihwcm92aWRlciwgbW9kdWxlLmNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5wYXJlbnQ/LmNvbnRhaW5lci5iaW5kKHRva2VuKS50b0R5bmFtaWNWYWx1ZSgoKSA9PiBtb2R1bGUuY29udGFpbmVyLmdldCh0b2tlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGltcG9ydE1vZHVsZSBvZiBtb2R1bGUucmVwZXRpdGl2ZUltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdG9rZW5dIG9mIGltcG9ydE1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lci5iaW5kKHRva2VuKS50b0R5bmFtaWNWYWx1ZSgoKSA9PiBpbXBvcnRNb2R1bGUuY29udGFpbmVyLmdldCh0b2tlbikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCaW5kIGludGVybmFsIHByb3ZpZGVycy5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW18sIHByb3ZpZGVyXSBvZiBtb2R1bGUubWV0YWRhdGEuaW50ZXJuYWxQcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRQcm92aWRlcihwcm92aWRlciwgbW9kdWxlLmNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgY29udGFpbmVyIHRvIGl0c2VsZiBzbyBpdCBjYW4gYmUgaW5qZWN0ZWQuXG4gICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmJpbmQoTU9EVUxFX0NPTlRBSU5FUikudG9Db25zdGFudFZhbHVlKG1vZHVsZS5jb250YWluZXIpO1xuXG4gICAgICAgICAgICAvLyBCaW5kIGNvbnRyb2xsZXJzIHRvIHRoZSBjb250YWluZXIuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNsYXNzUmVmIG9mIG1vZHVsZS5tZXRhZGF0YS5jb250cm9sbGVycykge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIuYmluZChjbGFzc1JlZikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCaW5kIHNlcnZpY2VzIHRvIHRoZSBjb250YWluZXIuXG4gICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmJpbmQoVElNRVJfU0VSVklDRSkudG8oVGltZXJTZXJ2aWNlKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coXG4gICAgICAgICAgICAgICAgYH5sd35Nb2R1bGUgfmxifiR7bW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmLm5hbWV9IH5sd35kZXBlbmRlbmNpZXMgYmluZGVkIH5sa34oJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRQcm92aWRlcihwcm92aWRlcjogRXhjbHVkZTxQcm92aWRlciwgTmV3YWJsZT4sIGNvbnRhaW5lcjogQ29udGFpbmVyKSB7XG4gICAgICAgIGlmICgndXNlVmFsdWUnIGluIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb250YWluZXIuYmluZChwcm92aWRlci5wcm92aWRlKS50b0NvbnN0YW50VmFsdWUocHJvdmlkZXIudXNlVmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKCd1c2VGYWN0b3J5JyBpbiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IGNvbnRhaW5lci5iaW5kKHByb3ZpZGVyLnByb3ZpZGUpLnRvRHluYW1pY1ZhbHVlKChjdHgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBzID1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuaW5qZWN0Py5tYXAoKGRlcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGRlcCkgJiYgJ3Rva2VuJyBpbiBkZXAgJiYgJ29wdGlvbmFsJyBpbiBkZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmNvbnRhaW5lci5nZXQoZGVwLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcC5vcHRpb25hbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVzb2x2ZSBhIGRlcGVuZGVuY3kuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmNvbnRhaW5lci5nZXQoZGVwKTtcbiAgICAgICAgICAgICAgICAgICAgfSkgPz8gW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLnVzZUZhY3RvcnkoLi4uZGVwcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlci5zY29wZSA9PT0gJ3RyYW5zaWVudCcpIGJpbmRpbmcuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIuc2NvcGUgPT09ICdyZXF1ZXN0JykgYmluZGluZy5pblJlcXVlc3RTY29wZSgpO1xuICAgICAgICAgICAgZWxzZSBiaW5kaW5nLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICgndXNlQ2xhc3MnIGluIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gY29udGFpbmVyLmJpbmQocHJvdmlkZXIucHJvdmlkZSkudG8ocHJvdmlkZXIudXNlQ2xhc3MpO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnNjb3BlID09PSAndHJhbnNpZW50JykgYmluZGluZy5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci5zY29wZSA9PT0gJ3JlcXVlc3QnKSBiaW5kaW5nLmluUmVxdWVzdFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGJpbmRpbmcuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCd1c2VFeGlzdGluZycgaW4gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5iaW5kKHByb3ZpZGVyLnByb3ZpZGUpLnRvU2VydmljZShwcm92aWRlci51c2VFeGlzdGluZyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEeW5hbWljTW9kdWxlLCBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9jb250cm9sbGVyJztcbmltcG9ydCB7IE1vZHVsZSwgTW9kdWxlTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9tb2R1bGUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IFRyZWUsIFRyZWVOb2RlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVNZXRhZGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2R1bGVUcmVlU2Nhbm5lciB7XG4gICAgQGluamVjdChNb2R1bGVNZXRhZGF0YVJlYWRlcikgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVNZXRhZGF0YVJlYWRlcjogTW9kdWxlTWV0YWRhdGFSZWFkZXI7XG4gICAgQGluamVjdChDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIpIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbGxlck1ldGFkYXRhUmVhZGVyOiBDb250cm9sbGVyTWV0YWRhdGFSZWFkZXI7XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuXG4gICAgcHVibGljIGFzeW5jIHNjYW4oY2xhc3NSZWY6IE5ld2FibGUgfCBEeW5hbWljTW9kdWxlIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPikge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBSZWFkIG1vZHVsZSBtZXRhZGF0YVxuICAgICAgICBjb25zdCBtb2R1bGVNZXRhZGF0YSA9IGF3YWl0IHRoaXMubW9kdWxlTWV0YWRhdGFSZWFkZXIucmVhZChjbGFzc1JlZik7XG4gICAgICAgIC8vIENyZWF0ZSBtb2R1bGUgaW5zdGFuY2UgYW5kIHNldCBtZXRhZGF0YSB0byBpdFxuICAgICAgICBjb25zdCBtb2R1bGUgPSBuZXcgTW9kdWxlKCk7XG4gICAgICAgIG1vZHVsZS5tZXRhZGF0YSA9IG1vZHVsZU1ldGFkYXRhO1xuICAgICAgICAvLyBMb2cgbW9kdWxlIGluZm9cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgfmx3fk1vZHVsZSB+bGJ+JHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fnNjYW5uZWQgfmxrfigke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXMpYCk7XG4gICAgICAgIC8vIFNjYW4gY29udHJvbGxlcnMgaW4gbW9kdWxlXG4gICAgICAgIGF3YWl0IHRoaXMuc2NhbkNvbnRyb2xsZXJzKG1vZHVsZSk7XG4gICAgICAgIC8vIFNjYW4gY29udHJvbGxlcnMgaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZVRyZWUgPSBuZXcgVHJlZShtb2R1bGUpO1xuICAgICAgICBjb25zdCBzY2FubmVkTW9kdWxlcyA9IG5ldyBNYXA8TmV3YWJsZSB8IER5bmFtaWNNb2R1bGUgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+LCBNb2R1bGU+KCk7XG4gICAgICAgIHNjYW5uZWRNb2R1bGVzLnNldChjbGFzc1JlZiwgbW9kdWxlKTtcbiAgICAgICAgLy8gU2NhbiBpbXBvcnRlZCBtb2R1bGVzXG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0ZWRNb2R1bGUgb2YgbW9kdWxlTWV0YWRhdGEuaW1wb3J0cykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY2FuTW9kdWxlcyhtb2R1bGVUcmVlLnJvb3QsIGltcG9ydGVkTW9kdWxlLCBzY2FubmVkTW9kdWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZVRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuTW9kdWxlcyhcbiAgICAgICAgcGFyZW50Tm9kZTogVHJlZU5vZGU8TW9kdWxlPixcbiAgICAgICAgY2xhc3NSZWY6IE5ld2FibGUgfCBEeW5hbWljTW9kdWxlIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPixcbiAgICAgICAgc2Nhbm5lZE1vZHVsZXMgPSBuZXcgTWFwPE5ld2FibGUgfCBEeW5hbWljTW9kdWxlIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPiwgTW9kdWxlPigpLFxuICAgICkge1xuICAgICAgICAvLyBDaGVjayBpZiBtb2R1bGUgaXMgYWxyZWFkeSBpbXBvcnRlZFxuICAgICAgICBjb25zdCBzY2FubmVkTW9kdWxlID0gc2Nhbm5lZE1vZHVsZXMuZ2V0KGNsYXNzUmVmKTtcbiAgICAgICAgaWYgKCFpc05pbChzY2FubmVkTW9kdWxlKSkge1xuICAgICAgICAgICAgcGFyZW50Tm9kZS52YWx1ZS5yZXBldGl0aXZlSW1wb3J0cy5hZGQoc2Nhbm5lZE1vZHVsZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFJlYWQgbW9kdWxlIG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IG1vZHVsZU1ldGFkYXRhID0gYXdhaXQgdGhpcy5tb2R1bGVNZXRhZGF0YVJlYWRlci5yZWFkKGNsYXNzUmVmKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgICAgIHRoaXMuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGFyZW50Tm9kZS52YWx1ZS5tZXRhZGF0YSwgbW9kdWxlTWV0YWRhdGEpO1xuICAgICAgICAvLyBDcmVhdGUgbW9kdWxlIGluc3RhbmNlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBNb2R1bGUoKTtcbiAgICAgICAgbW9kdWxlLm1ldGFkYXRhID0gbW9kdWxlTWV0YWRhdGE7XG4gICAgICAgIG1vZHVsZS5wYXJlbnQgPSBwYXJlbnROb2RlLnZhbHVlO1xuICAgICAgICAvLyBMb2cgbW9kdWxlIGluZm9cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgfmx3fk1vZHVsZSB+bGJ+JHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fnNjYW5uZWQgfmxrfigke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXMpYCk7XG4gICAgICAgIC8vIFNjYW4gY29udHJvbGxlcnMgaW4gbW9kdWxlXG4gICAgICAgIGF3YWl0IHRoaXMuc2NhbkNvbnRyb2xsZXJzKG1vZHVsZSk7XG4gICAgICAgIC8vIEFkZCBtb2R1bGUgdG8gdHJlZVxuICAgICAgICBjb25zdCB0cmVlTm9kZSA9IG5ldyBUcmVlTm9kZShtb2R1bGUpO1xuICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKHRyZWVOb2RlKTtcbiAgICAgICAgLy8gQWRkIG1vZHVsZSB0byBpbXBvcnRlZCBtb2R1bGVzIHNldCB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHNjYW5uaW5nXG4gICAgICAgIHNjYW5uZWRNb2R1bGVzLnNldChjbGFzc1JlZiwgbW9kdWxlKTtcbiAgICAgICAgLy8gU2NhbiBpbXBvcnRlZCBtb2R1bGVzIHJlY3Vyc2l2ZWx5XG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0TW9kdWxlIG9mIG1vZHVsZU1ldGFkYXRhLmltcG9ydHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nhbk1vZHVsZXModHJlZU5vZGUsIGltcG9ydE1vZHVsZSwgc2Nhbm5lZE1vZHVsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuQ29udHJvbGxlcnMobW9kdWxlOiBNb2R1bGUpIHtcbiAgICAgICAgLy8gU2NhbiBjb250cm9sbGVyc1xuICAgICAgICBmb3IgKGNvbnN0IGNsYXNzUmVmIG9mIG1vZHVsZS5tZXRhZGF0YS5jb250cm9sbGVycykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXJNZXRhZGF0YSA9IGF3YWl0IHRoaXMuY29udHJvbGxlck1ldGFkYXRhUmVhZGVyLnJlYWQoY2xhc3NSZWYpO1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLm1ldGFkYXRhID0gY29udHJvbGxlck1ldGFkYXRhO1xuICAgICAgICAgICAgY29udHJvbGxlci5vd25lciA9IG1vZHVsZTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5wdXNoKGNvbnRyb2xsZXIpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKGB+bHd+Q29udHJvbGxlciB+bGN+JHtjbGFzc1JlZi5uYW1lfSB+bHd+c2Nhbm5lZCB+bGt+KCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGFyZW50TWV0YWRhdGE6IE1vZHVsZU1ldGFkYXRhLCBtb2R1bGVNZXRhZGF0YTogTW9kdWxlTWV0YWRhdGEpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcGFyZW50IG1vZHVsZSBpcyBpbXBvcnRlZCBpbiBtb2R1bGVcbiAgICAgICAgaWYgKG1vZHVsZU1ldGFkYXRhLmltcG9ydHMuaW5jbHVkZXMocGFyZW50TWV0YWRhdGEuY2xhc3NSZWYpKSB7XG4gICAgICAgICAgICAvLyB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjYW5uaW5nIHRoZSBtb2R1bGUgdHJlZS4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQ2lyY3VsYXJEZXBlbmRlbmN5RGV0ZWN0ZWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2NyaXB0RXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBTY3JpcHRFdmVudCBpbXBsZW1lbnRzIFNjcmlwdEV2ZW50SGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCxcbiAgICApIHt9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBtcC5ldmVudHMucmVtb3ZlKHRoaXMuZXZlbnROYW1lLCB0aGlzLmxpc3RlbmVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFdmVudEVtbWl0ZXIsIFNjcmlwdEV2ZW50SGFuZGxlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmFnZU1QU2NyaXB0RXZlbnQgfSBmcm9tICcuL3JhZ2VtcC1zY3JpcHQtZXZlbnQtaGFuZGxlcic7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBFdmVudEVtbWl0ZXIgaW1wbGVtZW50cyBFdmVudEVtbWl0ZXIge1xuICAgIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIG1wLmV2ZW50cy5jYWxsKGV2ZW50TmFtZSwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgb24oZXZlbnROYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiBTY3JpcHRFdmVudEhhbmRsZXIge1xuICAgICAgICBtcC5ldmVudHMuYWRkKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gbmV3IFJhZ2VNUFNjcmlwdEV2ZW50KGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIG9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiBTY3JpcHRFdmVudEhhbmRsZXIge1xuICAgICAgICBjb25zdCBvbmNlV3JhcHBlciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgbXAuZXZlbnRzLnJlbW92ZShldmVudE5hbWUsIG9uY2VXcmFwcGVyKTtcbiAgICAgICAgICAgIGxpc3RlbmVyKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBtcC5ldmVudHMuYWRkKGV2ZW50TmFtZSwgb25jZVdyYXBwZXIpO1xuICAgICAgICByZXR1cm4gbmV3IFJhZ2VNUFNjcmlwdEV2ZW50KGV2ZW50TmFtZSwgb25jZVdyYXBwZXIpO1xuICAgIH1cblxuICAgIG9mZihldmVudE5hbWU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBtcC5ldmVudHMucmVtb3ZlKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpcGxheWVyVGltZXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNsYXNzIFJhZ2VNUFRpbWVyIGltcGxlbWVudHMgTXVsdGlwbGF5ZXJUaW1lciB7XG4gICAgcHVibGljIGxhc3RUaWNrID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGlkOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBpbnRlcnZhbDogbnVtYmVyID0gMCxcbiAgICAgICAgcHVibGljIG9uY2U6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyBjYWxsYmFjazogRnVuY3Rpb24sXG4gICAgICAgIHByaXZhdGUgY2xlYXJUaW1lcjogRnVuY3Rpb24sXG4gICAgKSB7fVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlwbGF5ZXJUaW1lciwgTXVsdGlwbGF5ZXJUaW1lcnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJhZ2VNUFRpbWVyIH0gZnJvbSAnLi9yYWdlbXAtdGltZXInO1xuXG5leHBvcnQgY2xhc3MgUmFnZU1QVGltZXJzIGltcGxlbWVudHMgTXVsdGlwbGF5ZXJUaW1lcnMge1xuICAgIHByaXZhdGUgdGltZXJJbmNyZW1lbnRlcjogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHRpbWVycyA9IG5ldyBNYXA8bnVtYmVyLCBNdWx0aXBsYXllclRpbWVyPigpO1xuICAgIHByaXZhdGUgZXZlcnlUaWNrSGFuZGxlcnMgPSBuZXcgTWFwPG51bWJlciwgeyBjYWxsYmFjazogRnVuY3Rpb247IGJvdW5kOiBGdW5jdGlvbiB9PigpO1xuICAgIHByaXZhdGUgaXNFdmVyeVRpY2tSdW5uaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBldmVyeVRpY2tNYWluSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgZ2V0IGFsbCgpOiBNdWx0aXBsYXllclRpbWVyW10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMudGltZXJzLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHdhcm5pbmdUaHJlc2hvbGQoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSB0aGlzIGZlYXR1cmVcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3YXJuaW5nVGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgdGhpcyBmZWF0dXJlXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgdGhpcyBmZWF0dXJlXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudChfdmFsdWU6IG51bWJlcikge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIHRoaXMgZmVhdHVyZVxuICAgIH1cblxuICAgIGdldEJ5SUQoaWQ6IG51bWJlcik6IE11bHRpcGxheWVyVGltZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnRpbWVycy5nZXQoaWQpO1xuICAgICAgICByZXR1cm4gdGltZXIgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRpbWVyKFxuICAgICAgICBjcmVhdGVUaW1lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBudW1iZXIsXG4gICAgICAgIGNsZWFyOiAoaWQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICAgICAgY2FsbGJhY2s6IEZ1bmN0aW9uLFxuICAgICAgICBpbnRlcnZhbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICBvbmNlOiBib29sZWFuLFxuICAgICAgICAuLi5hcmdzOiB1bmtub3duW11cbiAgICApIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tCaW5kID0gY2FsbGJhY2suYmluZCh0aGlzLCAuLi4oQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbXSkpO1xuICAgICAgICBjb25zdCB0aW1lcklkID0gdHlwZW9mIGludGVydmFsID09PSAnbnVtYmVyJyA/IGNyZWF0ZVRpbWVyKGNhbGxiYWNrQmluZCwgaW50ZXJ2YWwpIDogY3JlYXRlVGltZXIoY2FsbGJhY2tCaW5kKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpbWVySW5jcmVtZW50ZXIrKztcblxuICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgaW50ZXJ2YWwgPz8gMCwgb25jZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhcih0aW1lcklkKTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVycy5zZXQoaWQsIHJhZ2VNUFRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgIH1cblxuICAgIHNldEludGVydmFsKGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZTogbnVtYmVyLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGltZXIoXG4gICAgICAgICAgICAoY2I6IEZ1bmN0aW9uLCBpbnRlcnZhbDogbnVtYmVyKSA9PiBzZXRJbnRlcnZhbChjYiBhcyAoKSA9PiB2b2lkLCBpbnRlcnZhbCkgYXMgdW5rbm93biBhcyBudW1iZXIsXG4gICAgICAgICAgICAoaWQ6IG51bWJlcikgPT4gY2xlYXJJbnRlcnZhbChpZCksXG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIHRpbWUsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZTogbnVtYmVyLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpbWVySW5jcmVtZW50ZXIrKztcbiAgICAgICAgY29uc3QgY2FsbGJhY2tCaW5kID0gY2FsbGJhY2suYmluZCh0aGlzLCAuLi4oQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbXSkpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrQmluZCgpO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgfSwgdGltZSkgYXMgdW5rbm93biBhcyBudW1iZXI7XG5cbiAgICAgICAgY29uc3QgcmFnZU1QVGltZXIgPSBuZXcgUmFnZU1QVGltZXIoaWQsIHRpbWUsIHRydWUsIGNhbGxiYWNrQmluZCwgKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGltZXJzLnNldChpZCwgcmFnZU1QVGltZXIpO1xuICAgICAgICByZXR1cm4gcmFnZU1QVGltZXI7XG4gICAgfVxuXG4gICAgZXZlcnlUaWNrKGNhbGxiYWNrOiBGdW5jdGlvbiwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy50aW1lckluY3JlbWVudGVyKys7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrQmluZCA9IGNhbGxiYWNrLmJpbmQodGhpcywgLi4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pKTtcblxuICAgICAgICB0aGlzLmV2ZXJ5VGlja0hhbmRsZXJzLnNldChpZCwgeyBjYWxsYmFjaywgYm91bmQ6IGNhbGxiYWNrQmluZCB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvbiBjbGllbnQtc2lkZSAocmVuZGVyIGV2ZW50IGV4aXN0cykgb3Igc2VydmVyLXNpZGVcbiAgICAgICAgY29uc3QgaXNDbGllbnRTaWRlID0gdHlwZW9mIG1wICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgKG1wIGFzIGFueSkuYnJvd3NlcnMgIT09ICd1bmRlZmluZWQnO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSB0aWNrIGxvb3AgaWYgbm90IGFscmVhZHkgcnVubmluZ1xuICAgICAgICBpZiAoIXRoaXMuaXNFdmVyeVRpY2tSdW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmlzRXZlcnlUaWNrUnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChpc0NsaWVudFNpZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDbGllbnQtc2lkZTogdXNlIHJlbmRlciBldmVudCBmb3IgZnJhbWUtYWNjdXJhdGUgdGlja2luZ1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlcnlUaWNrTWFpbkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgWywgaGFuZGxlcl0gb2YgdGhpcy5ldmVyeVRpY2tIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmJvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAuY29uc29sZS5sb2dFcnJvcihgRXJyb3IgaW4gZXZlcnlUaWNrIGhhbmRsZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbXAuZXZlbnRzLmFkZCgncmVuZGVyJywgdGhpcy5ldmVyeVRpY2tNYWluSGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNlcnZlci1zaWRlOiB1c2Ugc2V0SW50ZXJ2YWwgd2l0aCBtaW5pbWFsIGRlbGF5IGFzIGFwcHJveGltYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnZhbEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgWywgaGFuZGxlcl0gb2YgdGhpcy5ldmVyeVRpY2tIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmJvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAuY29uc29sZS5sb2dFcnJvcihgRXJyb3IgaW4gZXZlcnlUaWNrIGhhbmRsZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KS5fZXZlcnlUaWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChpbnRlcnZhbEhhbmRsZXIsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFnZU1QVGltZXIgPSBuZXcgUmFnZU1QVGltZXIoaWQsIDAsIGZhbHNlLCBjYWxsYmFja0JpbmQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXZlcnlUaWNrSGFuZGxlcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgdGhlIHRpY2sgbG9vcCBpZiBubyBtb3JlIGhhbmRsZXJzXG4gICAgICAgICAgICBpZiAodGhpcy5ldmVyeVRpY2tIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2xpZW50U2lkZSAmJiB0aGlzLmV2ZXJ5VGlja01haW5IYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG1wLmV2ZW50cy5yZW1vdmUoJ3JlbmRlcicsIHRoaXMuZXZlcnlUaWNrTWFpbkhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZXJ5VGlja01haW5IYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzIGFzIGFueSkuX2V2ZXJ5VGlja0ludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoKHRoaXMgYXMgYW55KS5fZXZlcnlUaWNrSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLl9ldmVyeVRpY2tJbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNFdmVyeVRpY2tSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVycy5zZXQoaWQsIHJhZ2VNUFRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgIH1cblxuICAgIG5leHRUaWNrKGNhbGxiYWNrOiBGdW5jdGlvbiwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy50aW1lckluY3JlbWVudGVyKys7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrQmluZCA9IGNhbGxiYWNrLmJpbmQodGhpcywgLi4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvbiBjbGllbnQtc2lkZSAocmVuZGVyIGV2ZW50IGV4aXN0cykgb3Igc2VydmVyLXNpZGVcbiAgICAgICAgY29uc3QgaXNDbGllbnRTaWRlID0gdHlwZW9mIG1wICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgKG1wIGFzIGFueSkuYnJvd3NlcnMgIT09ICd1bmRlZmluZWQnO1xuXG4gICAgICAgIGxldCB0aW1lcklkOiBhbnk7XG5cbiAgICAgICAgaWYgKGlzQ2xpZW50U2lkZSkge1xuICAgICAgICAgICAgLy8gQ2xpZW50LXNpZGU6IHVzZSByZW5kZXIgZXZlbnQgZm9yIG5leHQgZnJhbWVcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tCaW5kKCk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgbXAuZXZlbnRzLnJlbW92ZSgncmVuZGVyJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1wLmV2ZW50cy5hZGQoJ3JlbmRlcicsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgMCwgdHJ1ZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbXAuZXZlbnRzLnJlbW92ZSgncmVuZGVyJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuc2V0KGlkLCByYWdlTVBUaW1lcik7XG4gICAgICAgICAgICByZXR1cm4gcmFnZU1QVGltZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXJ2ZXItc2lkZTogdXNlIHNldEltbWVkaWF0ZSBvciBzZXRUaW1lb3V0KDApIGZvciBuZXh0IHRpY2tcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0JpbmQoKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgMCwgdHJ1ZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLnNldChpZCwgcmFnZU1QVGltZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGltZShfbmFtZT86IHN0cmluZykge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIGNvbnNvbGUudGltZSBlcXVpdmFsZW50XG4gICAgICAgIC8vIENvdWxkIGltcGxlbWVudCBjdXN0b20gdGltaW5nIGlmIG5lZWRlZFxuICAgIH1cblxuICAgIHRpbWVFbmQoX25hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSBjb25zb2xlLnRpbWVFbmQgZXF1aXZhbGVudFxuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEV2ZW50RW1taXRlciwgTXVsdGlwbGF5ZXJTZXJ2aWNlLCBNdWx0aXBsYXllclRpbWVycyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmFnZU1QRXZlbnRFbW1pdGVyIH0gZnJvbSAnLi9yYWdlbXAtZXZlbnQtZW1taXRlcic7XG5pbXBvcnQgeyBSYWdlTVBUaW1lcnMgfSBmcm9tICcuL3JhZ2VtcC10aW1lcnMnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBNdWx0aXBsYXllclNlcnZpY2UgaW1wbGVtZW50cyBNdWx0aXBsYXllclNlcnZpY2Uge1xuICAgIHJlYWRvbmx5IFRpbWVyczogTXVsdGlwbGF5ZXJUaW1lcnM7XG4gICAgcmVhZG9ubHkgRXZlbnRzOiBFdmVudEVtbWl0ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5FdmVudHMgPSBuZXcgUmFnZU1QRXZlbnRFbW1pdGVyKCk7XG4gICAgICAgIHRoaXMuVGltZXJzID0gbmV3IFJhZ2VNUFRpbWVycygpO1xuICAgIH1cblxuICAgIHBhcnNlSW50ZXJuYWxBcmdzPFUgPSB1bmtub3duLCBUID0gdW5rbm93bj4oXG4gICAgICAgIC4uLmFyZ3M6IGFueVxuICAgICk6IHtcbiAgICAgICAgcGxheWVyPzogVTtcbiAgICAgICAgYm9keT86IFQ7XG4gICAgfSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IChpc09iamVjdChhcmdzWzBdKSA/IGFyZ3NbMF0gOiB1bmRlZmluZWQpIGFzIFU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICAgIGJvZHk6IGFyZ3MsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgbG9nKGFyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gW2FyZywgLi4uYXJnc10ubWFwKGEgPT5cbiAgICAgICAgICAgIHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGEpIDogU3RyaW5nKGEpXG4gICAgICAgICkuam9pbignICcpO1xuICAgICAgICBtcC5jb25zb2xlLmxvZ0luZm8obWVzc2FnZSk7XG4gICAgfVxuXG4gICAgbG9nRXJyb3IoYXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbYXJnLCAuLi5hcmdzXS5tYXAoYSA9PlxuICAgICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYSkgOiBTdHJpbmcoYSlcbiAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgIG1wLmNvbnNvbGUubG9nRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgbG9nV2FybmluZyhhcmc6IGFueSwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFthcmcsIC4uLmFyZ3NdLm1hcChhID0+XG4gICAgICAgICAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhKSA6IFN0cmluZyhhKVxuICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgbXAuY29uc29sZS5sb2dXYXJuaW5nKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGxvZ0RlYnVnKGFyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIGEgZGVkaWNhdGVkIGRlYnVnIGxvZywgdXNlIGluZm9cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFthcmcsIC4uLmFyZ3NdLm1hcChhID0+XG4gICAgICAgICAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhKSA6IFN0cmluZyhhKVxuICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgbXAuY29uc29sZS5sb2dJbmZvKGBbREVCVUddICR7bWVzc2FnZX1gKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgdmFsaWRhdGVFcnJvckZpbHRlciwgdmFsaWRhdGVHdWFyZCwgdmFsaWRhdGVJbnRlcmNlcHRvciwgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vc2NoZW1hcy9ldmVudHMnO1xuaW1wb3J0IHtcbiAgICBJTlRFUk5BTF9BUFBfQ09OVEFJTkVSLFxuICAgIEdMT0JBTF9FUlJPUl9GSUxURVJTLFxuICAgIEdMT0JBTF9HVUFSRFMsXG4gICAgR0xPQkFMX0lOVEVSQ0VQVE9SUyxcbiAgICBHTE9CQUxfUElQRVMsXG4gICAgRU5BQkxFX1NIVVRET1dOX0hPT0tTLFxuICAgIFBMVUdJTlMsXG4gICAgR0xPQkFMX0FQUF9DT05UQUlORVIsXG4gICAgQVBQX0VOVklST01FTlQsXG4gICAgTUFOR09fUkVRVUVTVF9GQUNUT1JZLFxuICAgIE1BTkdPX1JFU1BPTlNFX0ZBQ1RPUlksXG4gICAgRVhFQ1VUSU9OX0NPTlRFWFRfRkFDVE9SWSxcbiAgICBDT05UQUlORVJfT1BUSU9OUyxcbiAgICBNVUxUSVBMQVlFUl9TRVJWSUNFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBpbmplY3QsIENvbnRhaW5lciwgaW5qZWN0YWJsZSwgdHlwZSBpbnRlcmZhY2VzIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcbmltcG9ydCB0eXBlIHsgRXJyb3JGaWx0ZXIsIEd1YXJkLCBJbnRlcmNlcHRvciwgTWFuZ29QbHVnaW4sIE11bHRpcGxheWVyU2VydmljZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gICAgQ29udHJvbGxlckV2ZW50SGFuZGxlcixcbiAgICBDb250cm9sbGVyRmxvd0hhbmRsZXIsXG4gICAgQ29udHJvbGxlck1ldGFkYXRhUmVhZGVyLFxuICAgIENvbnRyb2xsZXJSUENIYW5kbGVyLFxuICAgIFBpcGVsaW5lSGFuZGxlcixcbn0gZnJvbSAnLi9jb250cm9sbGVyJztcbmltcG9ydCB7IE1vZHVsZSwgTW9kdWxlTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuL21vZHVsZSc7XG5pbXBvcnQgeyBBcHBSdW50aW1lLCBNb2R1bGVEZXBlbmRlbmN5QmluZGVyLCBNb2R1bGVUcmVlU2Nhbm5lciB9IGZyb20gJy4vbW9kdWxlLXRyZWUnO1xuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gJy4vY29udHJvbGxlcic7XG5pbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0QmFzZSwgTWFuZ29SZXF1ZXN0QmFzZSwgTWFuZ29SZXNwb25zZUJhc2UgfSBmcm9tICcuL3BpcGVsaW5lJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IFJFRkxFQ1RPUl9TRVJWSUNFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFJlZmxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBCdWlsZGVyPEcgZXh0ZW5kcyBHdWFyZCA9IEd1YXJkLCBJIGV4dGVuZHMgSW50ZXJjZXB0b3IgPSBJbnRlcmNlcHRvciwgRUYgZXh0ZW5kcyBFcnJvckZpbHRlciA9IEVycm9yRmlsdGVyPiB7XG4gICAgQGluamVjdChBUFBfRU5WSVJPTUVOVCkgcHJvdGVjdGVkIHJlYWRvbmx5IGVudmlyb21lbnQ6IHN0cmluZztcbiAgICBAaW5qZWN0KElOVEVSTkFMX0FQUF9DT05UQUlORVIpIHByb3RlY3RlZCByZWFkb25seSBpbnRlcm5hbEFwcENvbnRhaW5lcjogQ29udGFpbmVyO1xuICAgIEBpbmplY3QoTVVMVElQTEFZRVJfU0VSVklDRSkgcHJvdGVjdGVkIHJlYWRvbmx5IG11bHRpcGxheWVyU2VydmljZTogTXVsdGlwbGF5ZXJTZXJ2aWNlO1xuICAgIEBpbmplY3QoUExVR0lOUykgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbnM6IE5ld2FibGU8TWFuZ29QbHVnaW4+W107XG5cbiAgICBwcml2YXRlIGdsb2JhbENvbnRhaW5lck9wdGlvbnM6IGludGVyZmFjZXMuQ29udGFpbmVyT3B0aW9ucyA9IHt9O1xuXG4gICAgcHVibGljIHVzZUdsb2JhbEd1YXJkcyguLi5ndWFyZHM6IChOZXdhYmxlPEc+IHwgRylbXSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRHdWFyZHM6IChOZXdhYmxlPEc+IHwgRylbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUd1YXJkKGd1YXJkKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRHdWFyZHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0dVQVJEUykudG9Db25zdGFudFZhbHVlKHZhbGlkYXRlZEd1YXJkcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJPiB8IEkpW10pIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkSW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJPiB8IEkpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkSW50ZXJjZXB0b3JzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9JTlRFUkNFUFRPUlMpLnRvQ29uc3RhbnRWYWx1ZSh2YWxpZGF0ZWRJbnRlcmNlcHRvcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlR2xvYmFsUGlwZXMoLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX1BJUEVTKS50b0NvbnN0YW50VmFsdWUodmFsaWRhdGVkUGlwZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlR2xvYmFsRmlsdGVycyguLi5maWx0ZXJzOiAoTmV3YWJsZTxFRj4gfCBFRilbXSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGSWx0ZXJzOiAoTmV3YWJsZTxFRj4gfCBFRilbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlRXJyb3JGaWx0ZXIoZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRGSWx0ZXJzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9FUlJPUl9GSUxURVJTKS50b0NvbnN0YW50VmFsdWUodmFsaWRhdGVkRklsdGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB1c2VQbHVnaW5zKC4uLnBsdWdpbnM6IE5ld2FibGU8TWFuZ29QbHVnaW4+W10pIHtcbiAgICAgICAgcGx1Z2lucy5mb3JFYWNoKChwKSA9PiB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQocCkudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpKTtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxQbHVnaW5zID0gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQ8TmV3YWJsZTxNYW5nb1BsdWdpbj5bXT4oUExVR0lOUyk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIucmViaW5kKFBMVUdJTlMpLnRvQ29uc3RhbnRWYWx1ZShbLi4uaW50ZXJuYWxQbHVnaW5zLCAuLi5wbHVnaW5zXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmFibGVTaHV0ZG93bkhvb2tzKCkge1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoRU5BQkxFX1NIVVRET1dOX0hPT0tTKS50b0NvbnN0YW50VmFsdWUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb250YWluZXJPcHRpb25zKG9wdGlvbnM6IGludGVyZmFjZXMuQ29udGFpbmVyT3B0aW9ucywgb25seUdsb2JhbCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29udGFpbmVyT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChvbmx5R2xvYmFsKSByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENPTlRBSU5FUl9PUFRJT05TKS50b0NvbnN0YW50VmFsdWUob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsQXBwQ29udGFpbmVyID0gbmV3IENvbnRhaW5lcih0aGlzLmdsb2JhbENvbnRhaW5lck9wdGlvbnMpO1xuICAgICAgICAvLyBHTG9iYWwgc2VydmljZSBiaW5kaW5nc1xuICAgICAgICBnbG9iYWxBcHBDb250YWluZXIuYmluZChSRUZMRUNUT1JfU0VSVklDRSkudG9Db25zdGFudFZhbHVlKFJlZmxlY3RvclNlcnZpY2UpO1xuICAgICAgICBnbG9iYWxBcHBDb250YWluZXIuYmluZChSZWZsZWN0b3JTZXJ2aWNlKS50b1NlcnZpY2UoUkVGTEVDVE9SX1NFUlZJQ0UpO1xuXG4gICAgICAgIC8vIE11bHRpcGxheWVyIHNlcnZpY2UgYmluZGluZ3NcbiAgICAgICAgZ2xvYmFsQXBwQ29udGFpbmVyLmJpbmQoTVVMVElQTEFZRVJfU0VSVklDRSkudG9Db25zdGFudFZhbHVlKHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlKTtcbiBcbiAgICAgICAgLy8gQXBwIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChBcHApLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9BUFBfQ09OVEFJTkVSKS50b0NvbnN0YW50VmFsdWUoZ2xvYmFsQXBwQ29udGFpbmVyKTtcblxuICAgICAgICAvLyBNb2R1bGUgdHJlZSBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTW9kdWxlVHJlZVNjYW5uZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1vZHVsZURlcGVuZGVuY3lCaW5kZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEFwcFJ1bnRpbWUpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgICAgICAvLyBBcHAgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKFBpcGVsaW5lSGFuZGxlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgIC8vIE1vZHVsZSBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTW9kdWxlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNb2R1bGVNZXRhZGF0YVJlYWRlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgIC8vIENvbnRyb2xsZXIgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENvbnRyb2xsZXIpLnRvU2VsZigpLmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENvbnRyb2xsZXJNZXRhZGF0YVJlYWRlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQ29udHJvbGxlckZsb3dIYW5kbGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDb250cm9sbGVyRXZlbnRIYW5kbGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDb250cm9sbGVyUlBDSGFuZGxlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgIC8vIE1hbmdvIFJlcXVlc3QgYW5kIFJlc3BvbnNlIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNYW5nb1JlcXVlc3RCYXNlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNQU5HT19SRVFVRVNUX0ZBQ1RPUlkpLnRvRmFjdG9yeSgoY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChib2R5OiB1bmtub3duLCBwbGF5ZXI6IFBsYXllck1wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGNvbnRleHQuY29udGFpbmVyLmdldChNYW5nb1JlcXVlc3RCYXNlKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LiRib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LiRwbGF5ZXIgPSBwbGF5ZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1hbmdvUmVzcG9uc2VCYXNlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNQU5HT19SRVNQT05TRV9GQUNUT1JZKS50b0ZhY3RvcnkoKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbmVyLmdldChNYW5nb1Jlc3BvbnNlQmFzZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEV4ZWN1dGlvbkNvbnRleHRCYXNlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChFWEVDVVRJT05fQ09OVEVYVF9GQUNUT1JZKS50b0ZhY3RvcnkoKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdHlwZTogRXhlY3V0aW9uQ29udGV4dFR5cGUsXG4gICAgICAgICAgICAgICAgY2xhc3NSZWY6IE5ld2FibGUsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogTWFuZ29SZXF1ZXN0QmFzZSxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogTWFuZ29SZXNwb25zZUJhc2UsXG4gICAgICAgICAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGNvbnRleHQuY29udGFpbmVyLmdldChFeGVjdXRpb25Db250ZXh0QmFzZSk7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kdHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kcmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiRoYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiRjbGFzc1JlZiA9IGNsYXNzUmVmO1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuJG5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRpb25Db250ZXh0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGx1Z2lucyBiaW5kaW5nc1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChwbHVnaW4pLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQocGx1Z2luKTtcbiAgICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2Uub25CdWlsZCkgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCBwbHVnaW5JbnN0YW5jZS5vbkJ1aWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuaXNCb3VuZChHTE9CQUxfR1VBUkRTKSkgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9HVUFSRFMpLnRvQ29uc3RhbnRWYWx1ZShbXSk7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5pc0JvdW5kKEdMT0JBTF9JTlRFUkNFUFRPUlMpKVxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9JTlRFUkNFUFRPUlMpLnRvQ29uc3RhbnRWYWx1ZShbXSk7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5pc0JvdW5kKEdMT0JBTF9QSVBFUykpIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfUElQRVMpLnRvQ29uc3RhbnRWYWx1ZShbXSk7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5pc0JvdW5kKEdMT0JBTF9FUlJPUl9GSUxURVJTKSlcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfRVJST1JfRklMVEVSUykudG9Db25zdGFudFZhbHVlKFtdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQoQXBwKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ29udGFpbmVyLCBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgTW9kdWxlRGVwZW5kZW5jeUJpbmRlciwgTW9kdWxlVHJlZVNjYW5uZXIgfSBmcm9tICcuL21vZHVsZS10cmVlJztcbmltcG9ydCB7IE1vZHVsZSB9IGZyb20gJy4vbW9kdWxlL21vZHVsZSc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBJTlRFUk5BTF9BUFBfQ09OVEFJTkVSLCBQTFVHSU5TIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXBwUnVudGltZSB9IGZyb20gJy4vbW9kdWxlLXRyZWUnO1xuaW1wb3J0IHR5cGUgeyBNYW5nb1BsdWdpbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb3JlL21hbmdvLXBsdWdpbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBUcmVlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB0eXBlIExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gICAgQGluamVjdChNb2R1bGVUcmVlU2Nhbm5lcikgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVUcmVlU2Nhbm5lcjogTW9kdWxlVHJlZVNjYW5uZXI7XG4gICAgQGluamVjdChNb2R1bGVEZXBlbmRlbmN5QmluZGVyKSBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZURlcGVuZGVuY3lCaW5kZXI6IE1vZHVsZURlcGVuZGVuY3lCaW5kZXI7XG4gICAgQGluamVjdChBcHBSdW50aW1lKSBwcml2YXRlIHJlYWRvbmx5IGFwcFJ1bnRpbWU6IEFwcFJ1bnRpbWU7XG4gICAgQGluamVjdChJTlRFUk5BTF9BUFBfQ09OVEFJTkVSKSBwcml2YXRlIHJlYWRvbmx5IGludGVybmFsQXBwQ29udGFpbmVyOiBDb250YWluZXI7XG4gICAgQGluamVjdChQTFVHSU5TKSBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbnM6IE5ld2FibGU8TWFuZ29QbHVnaW4+W107XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuICAgIHByaXZhdGUgbW9kdWxlVHJlZTogVHJlZTxNb2R1bGU+O1xuICAgIHByaXZhdGUgbG9hZGVkID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnQ8VD4ocm9vdE1vZHVsZTogTmV3YWJsZTxUPikge1xuICAgICAgICBpZiAodGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgc3RhcnRpbmcgdGhlIGFwcC4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXBwQWxyZWFkeUxvYWRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnfmx3flN0YXJ0aW5nIGFwcC4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZVN0YXJ0Jyk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnfmx3flNjYW5uaW5nIG1vZHVsZSB0cmVlLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYmVmb3JlU2NhbicpO1xuICAgICAgICB0aGlzLm1vZHVsZVRyZWUgPSBhd2FpdCB0aGlzLm1vZHVsZVRyZWVTY2FubmVyLnNjYW4ocm9vdE1vZHVsZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYWZ0ZXJTY2FuJyk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnfmx3fkJpbmRpbmcgbW9kdWxlIGRlcGVuZGVuY2llcy4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZUJpbmQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2R1bGVEZXBlbmRlbmN5QmluZGVyLmJpbmQodGhpcy5tb2R1bGVUcmVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdhZnRlckJpbmQnKTtcblxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCd+bHd+TG9hZGluZyBhcHAuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdiZWZvcmVMb2FkJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwUnVudGltZS5ib290KHRoaXMubW9kdWxlVHJlZSk7XG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdhZnRlckxvYWQnKTtcblxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCd+bHd+QXBwIGxvYWRlZCcpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYWZ0ZXJTdGFydCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIHN0b3BwaW5nIHRoZSBhcHAuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkFwcE5vdExvYWRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdiZWZvcmVTdG9wJyk7XG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ35sd35TdG9wcGluZyBhcHAuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHBSdW50aW1lLnNodXRkb3duKHRoaXMubW9kdWxlVHJlZSk7XG4gICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ35sd35BcHAgc3RvcHBlZCcpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyU3RvcCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcnVuUGx1Z2luTWV0aG9kcyhtZXRob2Q6IGtleW9mIE1hbmdvUGx1Z2luKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLm1hcChhc3luYyAocCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuZ2V0KHApO1xuICAgICAgICAgICAgICAgIGlmICghcGx1Z2luW21ldGhvZF0pIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBsdWdpblttZXRob2RdISgpKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBDb250YWluZXIgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgQVBQX0VOVklST01FTlQsIElOVEVSTkFMX0FQUF9DT05UQUlORVIsIE1VTFRJUExBWUVSX1NFUlZJQ0UsIFBMVUdJTlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IE1hbmdvUGx1Z2luLCBNdWx0aXBsYXllclNlcnZpY2UgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBBcHBFbnZpcm9tZW50IH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IEFwcEJ1aWxkZXIgfSBmcm9tICcuL2FwcC1idWlsZGVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcEJ1aWxkZXI8VCBleHRlbmRzIEFwcEJ1aWxkZXI+KHtcbiAgICBlbnZpcm9tZW50LFxuICAgIHBsdWdpbnMsXG4gICAgYXBwQnVpbGRlckluaGVyaXQsXG4gICAgbXVsdGlwbGF5ZXJTZXJ2aWNlLFxufToge1xuICAgIGVudmlyb21lbnQ6IEFwcEVudmlyb21lbnQ7XG4gICAgcGx1Z2luczogTmV3YWJsZTxNYW5nb1BsdWdpbj5bXTtcbiAgICBhcHBCdWlsZGVySW5oZXJpdDogTmV3YWJsZTxUPjtcbiAgICBtdWx0aXBsYXllclNlcnZpY2U/OiBNdWx0aXBsYXllclNlcnZpY2U7XG59KSB7XG4gICAgY29uc3QgaW50ZXJuYWxBcHBDb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7XG5cbiAgICBpZiAobXVsdGlwbGF5ZXJTZXJ2aWNlKSBpbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1VTFRJUExBWUVSX1NFUlZJQ0UpLnRvQ29uc3RhbnRWYWx1ZShtdWx0aXBsYXllclNlcnZpY2UpO1xuICAgIGludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoSU5URVJOQUxfQVBQX0NPTlRBSU5FUikudG9Db25zdGFudFZhbHVlKGludGVybmFsQXBwQ29udGFpbmVyKTtcbiAgICBpbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEFQUF9FTlZJUk9NRU5UKS50b0NvbnN0YW50VmFsdWUoZW52aXJvbWVudCk7XG4gICAgaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChQTFVHSU5TKS50b0NvbnN0YW50VmFsdWUocGx1Z2lucyk7XG4gICAgaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChhcHBCdWlsZGVySW5oZXJpdCkudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgcmV0dXJuIGludGVybmFsQXBwQ29udGFpbmVyLmdldChhcHBCdWlsZGVySW5oZXJpdCk7XG59XG4iLCAiaW1wb3J0IHsgaXNOaWwsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5LCB0eXBlIEV2ZW50TWV0YWRhdGEsIHR5cGUgUGlwZWxpbmVNZXRhZGF0YSB9IGZyb20gJy4uL2FwcCc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudERlY29yYXRvcih0eXBlOiBFdmVudE1ldGFkYXRhWyd0eXBlJ10sIG5hbWU/OiBzdHJpbmcsIHdlYlZpZXdJZD86IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiA8TWV0aG9kRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwobmFtZSkgJiYgIWlzU3RyaW5nKG5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkV2ZW50TmFtZU11c3RCZVN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lID0gbmFtZSA/PyBtZXRob2Q7XG5cbiAgICAgICAgY29uc3QgZXZlbnRzID1cbiAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGE8T21pdDxFdmVudE1ldGFkYXRhLCAncGFyYW1zJyB8IGtleW9mIFBpcGVsaW5lTWV0YWRhdGE+W10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyRXZlbnRzLCB0YXJnZXQpID8/IFtdO1xuXG4gICAgICAgIGlmIChldmVudHMuc29tZSgoZXZlbnQpID0+IGV2ZW50Lm1ldGhvZCA9PT0gbWV0aG9kICYmIGV2ZW50Lm5hbWUgPT09IG5hbWUgJiYgZXZlbnQudHlwZSA9PT0gdHlwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRXZlbnROYW1lTXVzdEJlVW5pcXVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8T21pdDxFdmVudE1ldGFkYXRhLCAncGFyYW1zJyB8IGtleW9mIFBpcGVsaW5lTWV0YWRhdGE+W10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJFdmVudHMsXG4gICAgICAgICAgICBbLi4uZXZlbnRzLCB7IG1ldGhvZCwgbmFtZSwgdHlwZSwgd2ViVmlld0lkIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbkludGVybmFsKGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbkludGVybmFsJywgZXZlbnROYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25XZWJWaWV3KGlkOiBzdHJpbmcgfCBudW1iZXIsIGV2ZW50TmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVFdmVudERlY29yYXRvcignb25XZWJWaWV3JywgZXZlbnROYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uKGV2ZW50TmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVFdmVudERlY29yYXRvcignb24nLCBldmVudE5hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbmNlSW50ZXJuYWwoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uY2VJbnRlcm5hbCcsIGV2ZW50TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uY2UoZXZlbnROYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbmNlJywgZXZlbnROYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25jZVdlYlZpZXcoaWQ6IHN0cmluZyB8IG51bWJlciwgZXZlbnROYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbmNlV2ViVmlldycsIGV2ZW50TmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQm9keSguLi5waXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdKSB7XG4gICAgcmV0dXJuIDxQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgIFsuLi5wYXJhbXMsIHsgaW5kZXgsIG1ldGhvZCwgcGlwZXM6IHZhbGlkYXRlZFBpcGVzLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuQm9keSwgZGF0YTogdW5kZWZpbmVkLCBtZXRhdHlwZSB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNZXRob2RQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNZXRob2RQYXJhbVR5cGUgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gSW5kZXgoa2V5OiBudW1iZXIsIC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWlzTnVtYmVyKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW5kZXhLZXlNdXN0QmVOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlUGlwZShwaXBlKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLCB0YXJnZXQsIG1ldGhvZCkgPz8gW107XG5cbiAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5NdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IG1ldGF0eXBlID0gQXJyYXkuaXNBcnJheShwYXJhbVR5cGVzKSA/IHBhcmFtVHlwZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICBbLi4ucGFyYW1zLCB7IGluZGV4LCBtZXRob2QsIHBpcGVzOiB2YWxpZGF0ZWRQaXBlcywgdHlwZTogTWV0aG9kUGFyYW1UeXBlLkluZGV4LCBkYXRhOiBrZXksIG1ldGF0eXBlIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1ZXN0KCkge1xuICAgIHJldHVybiA8UGFyYW1ldGVyRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLCB0YXJnZXQsIG1ldGhvZCkgPz8gW107XG5cbiAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5NdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IG1ldGF0eXBlID0gQXJyYXkuaXNBcnJheShwYXJhbVR5cGVzKSA/IHBhcmFtVHlwZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICBbLi4ucGFyYW1zLCB7IGluZGV4LCBtZXRob2QsIHR5cGU6IE1ldGhvZFBhcmFtVHlwZS5SZXF1ZXN0LCBkYXRhOiB1bmRlZmluZWQsIG1ldGF0eXBlIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICApO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxKCkge1xuICAgIHJldHVybiBSZXF1ZXN0KCk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFBhcmFtKGtleTogc3RyaW5nLCAuLi5waXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdKSB7XG4gICAgcmV0dXJuIDxQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFpc1N0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLlBhcmFtS2V5TXVzdEJlU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgWy4uLnBhcmFtcywgeyBpbmRleCwgbWV0aG9kLCBkYXRhOiBrZXksIHBpcGVzOiB2YWxpZGF0ZWRQaXBlcywgdHlwZTogTWV0aG9kUGFyYW1UeXBlLlBhcmFtLCBtZXRhdHlwZSB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBNZXRob2RQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNZXRob2RQYXJhbVR5cGUgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoKSB7XG4gICAgcmV0dXJuIDxQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgIFsuLi5wYXJhbXMsIHsgaW5kZXgsIG1ldGhvZCwgdHlwZTogTWV0aG9kUGFyYW1UeXBlLlJlc3BvbnNlLCBkYXRhOiB1bmRlZmluZWQsIG1ldGF0eXBlIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICApO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzKCkge1xuICAgIHJldHVybiBSZXNwb25zZSgpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgR3VhcmQgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUd1YXJkIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VHdWFyZHMoLi4uZ3VhcmRzOiAoTmV3YWJsZTxHdWFyZD4gfCBHdWFyZClbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEd1YXJkczogKE5ld2FibGU8R3VhcmQ+IHwgR3VhcmQpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBndWFyZCBvZiBndWFyZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVHdWFyZChndWFyZCk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkR3VhcmRzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05pbChkZXNjcmlwdG9yKSAmJiAhaXNOaWwoZGVzY3JpcHRvci52YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChndWFyZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lR3VhcmRSZXF1aXJlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZEd1YXJkcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxHdWFyZD5bXT4oQ29yZU1ldGFkYXRhS2V5Lkd1YXJkcywgdGFyZ2V0LmNvbnN0cnVjdG9yLCBtZXRob2QpIHx8IFtdO1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuR3VhcmRzLCBbLi4udmFsaWRhdGVkR3VhcmRzLCAuLi5tZXRob2RHdWFyZHNdLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChndWFyZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVHdWFyZFJlcXVpcmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXNzR3VhcmRzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEd1YXJkPltdPihDb3JlTWV0YWRhdGFLZXkuR3VhcmRzLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5HdWFyZHMsIFsuLi52YWxpZGF0ZWRHdWFyZHMsIC4uLmNsYXNzR3VhcmRzXSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdG9yIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnRlcmNlcHRvciB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogKE5ld2FibGU8SW50ZXJjZXB0b3I+IHwgSW50ZXJjZXB0b3IpW10pIHtcbiAgICByZXR1cm4gPENsYXNzRGVjb3JhdG9yICYgTWV0aG9kRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZD86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRJbnRlcmNlcHRvcnM6IChOZXdhYmxlPEludGVyY2VwdG9yPiB8IEludGVyY2VwdG9yKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgaW50ZXJjZXB0b3JzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEludGVyY2VwdG9ycy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOaWwoZGVzY3JpcHRvcikgJiYgIWlzTmlsKGRlc2NyaXB0b3IudmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZUludGVyY2VwdG9yUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RJbnRlcmNlcHRvcnMgPVxuICAgICAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxJbnRlcmNlcHRvcj5bXT4oQ29yZU1ldGFkYXRhS2V5LkludGVyY2VwdG9ycywgdGFyZ2V0LmNvbnN0cnVjdG9yLCBtZXRob2QpIHx8IFtdO1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuSW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIFsuLi52YWxpZGF0ZWRJbnRlcmNlcHRvcnMsIC4uLm1ldGhvZEludGVyY2VwdG9yc10sXG4gICAgICAgICAgICAgICAgdGFyZ2V0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVJbnRlcmNlcHRvclJlcXVpcmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXNzSW50ZXJjZXB0b3JzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEludGVyY2VwdG9yPltdPihDb3JlTWV0YWRhdGFLZXkuSW50ZXJjZXB0b3JzLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5JbnRlcmNlcHRvcnMsIFsuLi52YWxpZGF0ZWRJbnRlcmNlcHRvcnMsIC4uLmNsYXNzSW50ZXJjZXB0b3JzXSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlUGlwZXMoLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlUGlwZShwaXBlKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOaWwoZGVzY3JpcHRvcikgJiYgIWlzTmlsKGRlc2NyaXB0b3IudmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAocGlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lUGlwZVJlcXVpcmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWV0aG9kUGlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8UGlwZT5bXT4oQ29yZU1ldGFkYXRhS2V5LlBpcGVzLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCkgfHwgW107XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5QaXBlcywgWy4uLnZhbGlkYXRlZFBpcGVzLCAuLi5tZXRob2RQaXBlc10sIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBpcGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lUGlwZVJlcXVpcmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXNzUGlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8UGlwZT5bXT4oQ29yZU1ldGFkYXRhS2V5LlBpcGVzLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5QaXBlcywgWy4uLnZhbGlkYXRlZFBpcGVzLCAuLi5jbGFzc1BpcGVzXSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBpc05pbCwgaXNOdW1iZXIsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5LCB0eXBlIFBpcGVsaW5lTWV0YWRhdGEsIHR5cGUgUlBDTWV0YWRhdGEgfSBmcm9tICcuLi9hcHAnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUlBDRGVjb3JhdG9yKHR5cGU6IFJQQ01ldGFkYXRhWyd0eXBlJ10sIG5hbWU/OiBzdHJpbmcsIHdlYlZpZXdJZD86IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiA8TWV0aG9kRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwod2ViVmlld0lkKSAmJiAhaXNTdHJpbmcod2ViVmlld0lkKSAmJiAhaXNOdW1iZXIod2ViVmlld0lkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5XZWJWaWV3SWRNdXN0QmVTdHJpbmdPck51bWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKG5hbWUpICYmICFpc1N0cmluZyhuYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5SUENOYW1lTXVzdEJlU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWUgPSBuYW1lID8/IG1ldGhvZDtcblxuICAgICAgICBjb25zdCBycGNzID1cbiAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGE8T21pdDxSUENNZXRhZGF0YSwgJ3BhcmFtcycgfCBrZXlvZiBQaXBlbGluZU1ldGFkYXRhPltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclJQQ3MsIHRhcmdldCkgPz8gW107XG5cbiAgICAgICAgaWYgKHJwY3Muc29tZSgocnBjKSA9PiBycGMubWV0aG9kID09PSBtZXRob2QgJiYgcnBjLm5hbWUgPT09IG5hbWUgJiYgcnBjLnR5cGUgPT09IHR5cGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLlJQQ05hbWVNdXN0QmVVbmlxdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxPbWl0PFJQQ01ldGFkYXRhLCAncGFyYW1zJyB8IGtleW9mIFBpcGVsaW5lTWV0YWRhdGE+W10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJSUENzLFxuICAgICAgICAgICAgWy4uLnJwY3MsIHsgbWV0aG9kLCBuYW1lLCB0eXBlLCB3ZWJWaWV3SWQgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlUlBDRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXJwYy1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25SZXF1ZXN0KHJwY05hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlUlBDRGVjb3JhdG9yKCdvblJlcXVlc3QnLCBycGNOYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVSUENEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtcnBjLWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbldlYlZpZXdSZXF1ZXN0KGlkOiBzdHJpbmcgfCBudW1iZXIsIHJwY05hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlUlBDRGVjb3JhdG9yKCdvbldlYlZpZXdSZXF1ZXN0JywgcnBjTmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSwgdHlwZSBUaW1lck1ldGFkYXRhIH0gZnJvbSAnLi4vYXBwJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7IGlzTmlsLCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKHR5cGU6IFRpbWVyTWV0YWRhdGFbJ3R5cGUnXSwgbmFtZT86IHN0cmluZywgb3B0aW9ucz86IFRpbWVyTWV0YWRhdGFbJ29wdGlvbnMnXSkge1xuICAgIHJldHVybiA8TWV0aG9kRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwobmFtZSkgJiYgIWlzU3RyaW5nKG5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLlRpbWVyTmFtZU11c3RCZVN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lID0gbmFtZSA/PyBtZXRob2Q7XG5cbiAgICAgICAgY29uc3QgdGltZXJzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxUaW1lck1ldGFkYXRhW10+KENvcmVNZXRhZGF0YUtleS5UaW1lcnMsIHRhcmdldCkgPz8gW107XG5cbiAgICAgICAgaWYgKHRpbWVycy5zb21lKCh0aW1lcikgPT4gdGltZXIubWV0aG9kID09PSBtZXRob2QgJiYgdGltZXIubmFtZSA9PT0gbmFtZSAmJiB0aW1lci50eXBlID09PSB0eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FdmVudE5hbWVNdXN0QmVVbmlxdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxUaW1lck1ldGFkYXRhW10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LlRpbWVycyxcbiAgICAgICAgICAgIFsuLi50aW1lcnMsIDxUaW1lck1ldGFkYXRhPnsgbWV0aG9kLCBuYW1lLCB0eXBlLCBvcHRpb25zIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgQ3Jvbk9wdGlvbnMgfSBmcm9tICdjcm9uZXInO1xuaW1wb3J0IHsgY3JlYXRlVGltZXJEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtdGltZXIuZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIENyb24ocGF0dGVybjogc3RyaW5nIHwgRGF0ZSwgb3B0aW9uczogQ3Jvbk9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBjcmVhdGVUaW1lckRlY29yYXRvcignY3JvbicsIG9wdGlvbnMubmFtZSwgeyBwYXR0ZXJuLCAuLi5vcHRpb25zIH0pO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVRpbWVyRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXRpbWVyLmRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBFdmVyeVRpY2sobmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVUaW1lckRlY29yYXRvcignZXZlcnl0aWNrJywgbmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBjcmVhdGVUaW1lckRlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS10aW1lci5kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gSW50ZXJ2YWwodGltZW91dDogbnVtYmVyKTogTWV0aG9kRGVjb3JhdG9yO1xuZXhwb3J0IGZ1bmN0aW9uIEludGVydmFsKG5hbWU6IHN0cmluZywgdGltZW91dDogbnVtYmVyKTogTWV0aG9kRGVjb3JhdG9yO1xuZXhwb3J0IGZ1bmN0aW9uIEludGVydmFsKG5hbWVPclRpbWVvdXQ6IHN0cmluZyB8IG51bWJlciwgdGltZW91dD86IG51bWJlcik6IE1ldGhvZERlY29yYXRvciB7XG4gICAgY29uc3QgW25hbWUsIGludGVydmFsVGltZW91dF0gPSBpc1N0cmluZyhuYW1lT3JUaW1lb3V0KSA/IFtuYW1lT3JUaW1lb3V0LCB0aW1lb3V0XSA6IFt1bmRlZmluZWQsIG5hbWVPclRpbWVvdXRdO1xuICAgIHJldHVybiBjcmVhdGVUaW1lckRlY29yYXRvcignaW50ZXJ2YWwnLCBuYW1lLCB7IHRpbWVvdXQ6IGludGVydmFsVGltZW91dCEgfSk7XG59XG4iLCAiaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBjcmVhdGVUaW1lckRlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS10aW1lci5kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gVGltZW91dCh0aW1lb3V0OiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3I7XG5leHBvcnQgZnVuY3Rpb24gVGltZW91dChuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3I7XG5leHBvcnQgZnVuY3Rpb24gVGltZW91dChuYW1lT3JUaW1lb3V0OiBzdHJpbmcgfCBudW1iZXIsIHRpbWVvdXQ/OiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3Ige1xuICAgIGNvbnN0IFtuYW1lLCBpbnRlcnZhbFRpbWVvdXRdID0gaXNTdHJpbmcobmFtZU9yVGltZW91dCkgPyBbbmFtZU9yVGltZW91dCwgdGltZW91dF0gOiBbdW5kZWZpbmVkLCBuYW1lT3JUaW1lb3V0XTtcbiAgICByZXR1cm4gY3JlYXRlVGltZXJEZWNvcmF0b3IoJ3RpbWVvdXQnLCBuYW1lLCB7IHRpbWVvdXQ6IGludGVydmFsVGltZW91dCEgfSk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNvcmF0b3JzOiAoQ2xhc3NEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvcilbXSkge1xuICAgIHJldHVybiA8VEZ1bmN0aW9uIGV4dGVuZHMgRnVuY3Rpb24sIFk+KFxuICAgICAgICB0YXJnZXQ6IFRGdW5jdGlvbiB8IE9iamVjdCxcbiAgICAgICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICAgICAgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8WT4sXG4gICAgKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiAhZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICg8Q2xhc3NEZWNvcmF0b3I+ZGVjb3JhdG9yKSh0YXJnZXQpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKDxNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvcj5kZWNvcmF0b3IpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQsIE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBNZXRob2RQYXJhbVR5cGUgfSBmcm9tICcuLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBpcGUgfSBmcm9tICcuLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhcmFtRGVjb3JhdG9yPFRJbnB1dCA9IHVua25vd24sIFRPdXRwdXQgPSB1bmtub3duPihmYWN0b3J5OiAoZGF0YTogVElucHV0LCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IFRPdXRwdXQpIHtcbiAgICByZXR1cm4gPFRJbnB1dCA9IHVua25vd24+KGRhdGE/OiBUSW5wdXQsIC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pID0+IHtcbiAgICAgICAgcmV0dXJuIDxQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLCB0YXJnZXQsIG1ldGhvZCkgPz8gW107XG5cbiAgICAgICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KFxuICAgICAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzOiB2YWxpZGF0ZWRQaXBlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE1ldGhvZFBhcmFtVHlwZS5DdXN0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5OiA8KGRhdGE6IHVua25vd24sIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHVua25vd24+ZmFjdG9yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IExhenlTZXJ2aWNlSWRlbnRpZmVyLCB0eXBlIGludGVyZmFjZXMgfSBmcm9tICdpbnZlcnNpZnknO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZFJlZjxUID0gdW5rbm93bj4oZm46ICgpID0+IGludGVyZmFjZXMuU2VydmljZUlkZW50aWZpZXI8VD4pIHtcbiAgICByZXR1cm4gbmV3IExhenlTZXJ2aWNlSWRlbnRpZmVyPFQ+KGZuKTtcbn1cbiIsICJpbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDcm9uLCB0eXBlIENyb25PcHRpb25zIH0gZnJvbSAnY3JvbmVyJztcbmltcG9ydCB7IE1VTFRJUExBWUVSX1NFUlZJQ0UsIHR5cGUgTXVsdGlwbGF5ZXJTZXJ2aWNlLCB0eXBlIE11bHRpcGxheWVyVGltZXIgfSBmcm9tICcuLi9hcHAnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZXJTZXJ2aWNlIHtcbiAgICBAaW5qZWN0KE1VTFRJUExBWUVSX1NFUlZJQ0UpIHByaXZhdGUgcmVhZG9ubHkgbXVsdGlwbGF5ZXJTZXJ2aWNlOiBNdWx0aXBsYXllclNlcnZpY2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSAkZXZlcnl0aWNrcyA9IG5ldyBNYXA8c3RyaW5nLCBNdWx0aXBsYXllclRpbWVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgJGludGVydmFscyA9IG5ldyBNYXA8c3RyaW5nLCBNdWx0aXBsYXllclRpbWVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgJHRpbWVvdXRzID0gbmV3IE1hcDxzdHJpbmcsIE11bHRpcGxheWVyVGltZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSAkY3JvbnMgPSBuZXcgTWFwPHN0cmluZywgQ3Jvbj4oKTtcblxuICAgIHB1YmxpYyBnZXQgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLmFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV2ZXJ5dGlja3MoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4kZXZlcnl0aWNrcy52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpbnRlcnZhbHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4kaW50ZXJ2YWxzLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpbWVvdXRzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuJHRpbWVvdXRzLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNyb25zKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuJGNyb25zLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHdhcm5pbmdUaHJlc2hvbGQodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMud2FybmluZ1RocmVzaG9sZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgd2FybmluZ1RocmVzaG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy53YXJuaW5nVGhyZXNob2xkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5zb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLnNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUNyb25Kb2IoY2FsbGJhY2s6IEZ1bmN0aW9uLCBvcHRpb25zOiBDcm9uT3B0aW9ucyAmIHsgcGF0dGVybjogc3RyaW5nIHwgRGF0ZSB9KSB7XG4gICAgICAgIGNvbnN0IHsgcGF0dGVybiwgLi4uY3Jvbk9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgY29uc3QgY3JvbiA9IENyb24ocGF0dGVybiwgY3Jvbk9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKG9wdGlvbnMubmFtZSkpIHRoaXMuJGNyb25zLnNldChvcHRpb25zLm5hbWUsIGNyb24pO1xuXG4gICAgICAgIHJldHVybiBjcm9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVJbnRlcnZhbChjYWxsYmFjazogRnVuY3Rpb24sIGludGVydmFsOiBudW1iZXIsIG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIGludGVydmFsKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKG5hbWUpKSB0aGlzLiRpbnRlcnZhbHMuc2V0KG5hbWUsIHRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVUaW1lb3V0KGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLnNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQpO1xuICAgICAgICBpZiAoaXNTdHJpbmcobmFtZSkpIHRoaXMuJHRpbWVvdXRzLnNldChuYW1lLCB0aW1lcik7XG4gICAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRXZlcnlUaWNrKGNhbGxiYWNrOiBGdW5jdGlvbiwgbmFtZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5ldmVyeVRpY2soY2FsbGJhY2spO1xuICAgICAgICBpZiAoaXNTdHJpbmcobmFtZSkpIHRoaXMuJGV2ZXJ5dGlja3Muc2V0KG5hbWUsIHRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUodHlwZTogJ2Nyb24nIHwgJ2V2ZXJ5dGljaycgfCAndGltZW91dCcgfCAnaW50ZXJ2YWwnLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjcm9uJzpcbiAgICAgICAgICAgICAgICBjb25zdCBjcm9uSm9iID0gdGhpcy4kY3JvbnMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjcm9uSm9iKSB7XG4gICAgICAgICAgICAgICAgICAgIGNyb25Kb2Iuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRjcm9ucy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXZlcnl0aWNrJzpcbiAgICAgICAgICAgICAgICBjb25zdCBldmVyeXRpY2sgPSB0aGlzLiRldmVyeXRpY2tzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlcnl0aWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGljay5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGV2ZXJ5dGlja3MuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2ludGVydmFsJzpcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMuJGludGVydmFscy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVydmFsLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kaW50ZXJ2YWxzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0aW1lb3V0JzpcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy4kdGltZW91dHMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiR0aW1lb3V0cy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJ5TmFtZSh0eXBlOiAnY3JvbicgfCAnZXZlcnl0aWNrJyB8ICd0aW1lb3V0JyB8ICdpbnRlcnZhbCcsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Nyb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRjcm9ucy5nZXQobmFtZSk7XG4gICAgICAgICAgICBjYXNlICdldmVyeXRpY2snOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRldmVyeXRpY2tzLmdldChuYW1lKTtcbiAgICAgICAgICAgIGNhc2UgJ2ludGVydmFsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kaW50ZXJ2YWxzLmdldChuYW1lKTtcbiAgICAgICAgICAgIGNhc2UgJ3RpbWVvdXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiR0aW1lb3V0cy5nZXQobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QnlJZChpZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuZ2V0QnlJRChpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRpbWUobmFtZT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLnRpbWUobmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRpbWVFbmQobmFtZT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLnRpbWVFbmQobmFtZSk7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTQSxjQUFBQSxtQkFBa0I7OztBQ0kzQixTQUFTQyxrQkFBa0I7QUFHcEIsU0FBU0MsWUFBOEJDLFNBQTJCO0FBQ3JFLFNBQU8sQ0FBQ0MsV0FBQUE7QUFDSixRQUFJQyxRQUFRQyxZQUFZQyxnQkFBZ0JMLFlBQVlFLE1BQUFBLEdBQVM7QUFDekQsWUFBTSxJQUFJSSxNQUFNQyxhQUFhQyx1QkFBdUI7SUFDeEQ7QUFFQSxVQUFNLEVBQUVDLE9BQU9DLE9BQU9DLE1BQUssSUFBS0MsMEJBQTBCWCxPQUFBQTtBQUMxRCxRQUFJLENBQUNRLE1BQU8sT0FBTSxJQUFJSCxNQUFNSyxLQUFBQTtBQUM1QlIsWUFBUVUsZUFBZVIsZ0JBQWdCTCxZQUFZVSxPQUFPUixNQUFBQTtBQUUxRCxXQUFPWSxXQUFBQSxFQUFhWixNQUFBQTtFQUN4QjtBQUNKO0FBWmdCRixPQUFBQSxhQUFBQTs7O0FDSlQsU0FBU2UsU0FBQUE7QUFDWixTQUFPLENBQUNDLFdBQUFBO0FBQ0pDLFlBQVFDLGVBQWVDLGdCQUFnQkMsY0FBYyxNQUFNSixNQUFBQTtBQUMzRCxXQUFPQTtFQUNYO0FBQ0o7QUFMZ0JEOzs7QUNIaEIsU0FBU00sY0FBYztBQU1oQixTQUFTQyxPQUFvQkMsS0FBdUI7QUFDdkQsU0FBZ0QsQ0FBQ0MsUUFBZ0JDLGFBQXFCQyxlQUFBQTtBQUNsRixRQUFJLENBQUNDLE1BQU1KLEdBQUFBLEtBQVEsQ0FB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LEtBQUs7QUFDRCxlQUFPLEtBQUsvQixPQUFPaUMsSUFBSWQsSUFBQUE7TUFDM0IsS0FBSztBQUNELGVBQU8sS0FBS3ZCLFlBQVlxQyxJQUFJZCxJQUFBQTtNQUNoQyxLQUFLO0FBQ0QsZUFBTyxLQUFLckIsV0FBV21DLElBQUlkLElBQUFBO01BQy9CLEtBQUs7QUFDRCxlQUFPLEtBQUtwQixVQUFVa0MsSUFBSWQsSUFBQUE7SUFDbEM7RUFDSjtFQUVPbUIsUUFBUUMsSUFBWTtBQUN2QixXQUFPLEtBQUs1QyxtQkFBbUJPLE9BQU9zQyxRQUFRRCxFQUFBQTtFQUNsRDtFQUVPRSxLQUFLdEIsTUFBZTtBQUN2QixXQUFPLEtBQUt4QixtQkFBbUJPLE9BQU91QyxLQUFLdEIsSUFBQUE7RUFDL0M7RUFFT3VCLFFBQVF2QixNQUFlO0FBQzFCLFdBQU8sS0FBS3hCLG1CQUFtQk8sT0FBT3dDLFFBQVF2QixJQUFBQTtFQUNsRDtBQUNKOzs7Ozs7OzsiLAogICJuYW1lcyI6IFsiaW5qZWN0YWJsZSIsICJpbmplY3RhYmxlIiwgIkNvbnRyb2xsZXIiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlQ29udHJvbGxlck9wdGlvbnMiLCAiZGVmaW5lTWV0YWRhdGEiLCAiaW5qZWN0YWJsZSIsICJHbG9iYWwiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkdsb2JhbE1vZHVsZSIsICJpbmplY3QiLCAiSW5qZWN0IiwgImtleSIsICJ0YXJnZXQiLCAicHJvcGVydHlLZXkiLCAicGFyYW1JbmRleCIsICJpc05pbCIsICJ2YWxpZGF0ZUluamVjdGlvblRva2VuIiwgInZhbGlkIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJJbnZhbGlkSW5qZWN0aW9uVG9rZW5TcGVjaWZpZWQiLCAidG9rZW4iLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJJbmplY3Rpb25Ub2tlbk5vdEZvdW5kIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIkluamVjdGFibGUiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhIiwgImRlZmluZU1ldGFkYXRhIiwgImluamVjdGFibGUiLCAiaW5qZWN0YWJsZSIsICJNb2R1bGUiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlTW9kdWxlT3B0aW9ucyIsICJkZWZpbmVNZXRhZGF0YSIsICJpbmplY3RhYmxlIiwgIm9wdGlvbmFsIiwgIk9wdGlvbmFsIiwgInRhcmdldCIsICJwcm9wZXJ0eUtleSIsICJwYXJhbUluZGV4IiwgIm9wdGlvbmFsIiwgIlNldE1ldGFkYXRhIiwgImtleSIsICJ2YWx1ZSIsICJkZWNvcmF0b3JGYWN0b3J5IiwgInRhcmdldCIsICJfbWV0aG9kIiwgImRlc2NyaXB0b3IiLCAiUmVmbGVjdCIsICJkZWZpbmVNZXRhZGF0YSIsICJLRVkiLCAiQ2F0Y2giLCAiZXhjZXB0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgImR1cGxpY2F0ZXMiLCAiZmlsdGVyIiwgImV4Y2VwdGlvbiIsICJpbmRleCIsICJpbmRleE9mIiwgImxlbmd0aCIsICJFeGNlcHRpb25IYW5kbGluZ0NvbmZsaWN0IiwgImRlZmluZU1ldGFkYXRhIiwgIlVzZUZpbHRlcnMiLCAiZmlsdGVycyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImRlc2NyaXB0b3IiLCAidmFsaWRhdGVkRmlsdGVycyIsICJmaWx0ZXIiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVFcnJvckZpbHRlciIsICJFcnJvciIsICJwdXNoIiwgImlzTmlsIiwgImxlbmd0aCIsICJFcnJvck1lc3NhZ2UiLCAiQXRMZWFzdE9uZUZpbHRlclJlcXVpcmVkIiwgIm1ldGhvZEZpbHRlcnMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3JGaWx0ZXJzIiwgImZpbmQiLCAiaW5jbHVkZXMiLCAiRHVwbGljYXRlRXJyb3JGaWx0ZXJEZXRlY3RlZCIsICJkZWZpbmVNZXRhZGF0YSIsICJjbGFzc0ZpbHRlcnMiLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAib3B0aW9uYWwiLCAiQXBwUnVudGltZSIsICJldmVudEhhbmRsZXIiLCAicnBjSGFuZGxlciIsICJnbG9iYWxHdWFyZHMiLCAiZ2xvYmFsSW50ZXJjZXB0b3JzIiwgImdsb2JhbFBpcGVzIiwgImdsb2JhbEVycm9yRmlsdGVycyIsICJsb2dnZXJTZXJ2aWNlIiwgImVuYWJsZVNodXRkb3duSG9va3MiLCAiYm9vdCIsICJyZXNvbHZlZFRyZWUiLCAiYXN5bmNUcmF2ZXJzZSIsICJub2RlIiwgInN0YXJ0VGltZSIsICJEYXRlIiwgIm5vdyIsICJtb2R1bGUiLCAidmFsdWUiLCAiaW5zdGFuY2UiLCAiY29udGFpbmVyIiwgImdldCIsICJtZXRhZGF0YSIsICJjbGFzc1JlZiIsICJjb250cm9sbGVycyIsICJmb3JFYWNoIiwgImNvbnRyb2xsZXIiLCAiaW50ZXJuYWxQcm92aWRlcnMiLCAiZXh0ZXJuYWxQcm92aWRlcnMiLCAidG9rZW4iLCAibG9nIiwgIm5hbWUiLCAicnVuTGlmZWN5Y2xlTWV0aG9kIiwgInJ1bkxpZmVjeWNsZU1ldGhvZHMiLCAidHJhdmVyc2UiLCAidGltZSIsICJyZWdpc3RlclRpbWVycyIsICJyZWdpc3Rlckxpc3RlbmVycyIsICJzaHV0ZG93biIsICJ0aW1lclNlcnZpY2UiLCAib3duZXIiLCAiVElNRVJfU0VSVklDRSIsICJldmVyeXRpY2tzIiwgInRpbWVyIiwgImRlc3Ryb3kiLCAiaW50ZXJ2YWxzIiwgInRpbWVvdXRzIiwgImNyb25zIiwgImNyb24iLCAic3RvcCIsICJldmVudEhhbmRsZXJzIiwgImhhbmRsZXIiLCAicnBjSGFuZGxlcnMiLCAiZXZlbnRzIiwgImV2ZW50IiwgImd1YXJkcyIsICJpbnRlcmNlcHRvcnMiLCAicGlwZXMiLCAibWFwcGVkRXJyb3JGaWx0ZXJzIiwgIm1hcEVycm9yRmlsdGVycyIsICJlcnJvckZpbHRlcnMiLCAicmVnaXN0ZXJFdmVudCIsICJwdXNoIiwgInJwY3MiLCAicnBjIiwgInJlZ2lzdGVyUlBDIiwgInRpbWVycyIsICJ0eXBlIiwgImNyZWF0ZUNyb25Kb2IiLCAibWV0aG9kIiwgImJpbmQiLCAib3B0aW9ucyIsICJjcmVhdGVFdmVyeVRpY2siLCAiY3JlYXRlSW50ZXJ2YWwiLCAidGltZW91dCIsICJjcmVhdGVUaW1lb3V0IiwgImZpbHRlck1hcCIsICJmaWx0ZXIiLCAiZXJyb3JzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNhdGNoIiwgImxlbmd0aCIsICJlcnJvciIsICJpc05pbCIsICJmaW5kIiwgImZpbHRlckVycm9yIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJFcnJvckFscmVhZHlIYW5kbGVkQnlGaWx0ZXIiLCAiUHJvbWlzZSIsICJhbGwiLCAibWFwIiwgImlzT2JqZWN0IiwgInByb3ZpZGVySW5zdGFuY2UiLCAiQ29udGFpbmVyIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIm9wdGlvbmFsIiwgIk1vZHVsZURlcGVuZGVuY3lCaW5kZXIiLCAiZ2xvYmFsQXBwQ29udGFpbmVyIiwgImxvZ2dlclNlcnZpY2UiLCAiY29udGFpbmVyT3B0aW9ucyIsICJiaW5kIiwgInJlc29sdmVkVHJlZSIsICJhc3luY1RyYXZlcnNlIiwgIm5vZGUiLCAic3RhcnRUaW1lIiwgIkRhdGUiLCAibm93IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJjb250YWluZXIiLCAiTW9kdWxlQ29udGFpbmVyIiwgIm1ldGFkYXRhIiwgInBhcmVudCIsICJjbGFzc1JlZiIsICJ0b1NlbGYiLCAiaW5TaW5nbGV0b25TY29wZSIsICJnbG9iYWwiLCAiXyIsICJwcm92aWRlciIsICJleHRlcm5hbFByb3ZpZGVycyIsICJiaW5kUHJvdmlkZXIiLCAidG9rZW4iLCAidG9EeW5hbWljVmFsdWUiLCAiZ2V0IiwgImltcG9ydE1vZHVsZSIsICJyZXBldGl0aXZlSW1wb3J0cyIsICJpbnRlcm5hbFByb3ZpZGVycyIsICJNT0RVTEVfQ09OVEFJTkVSIiwgInRvQ29uc3RhbnRWYWx1ZSIsICJjb250cm9sbGVycyIsICJUSU1FUl9TRVJWSUNFIiwgInRvIiwgIlRpbWVyU2VydmljZSIsICJsb2ciLCAibmFtZSIsICJwcm92aWRlIiwgInVzZVZhbHVlIiwgImJpbmRpbmciLCAiY3R4IiwgImRlcHMiLCAiaW5qZWN0IiwgIm1hcCIsICJkZXAiLCAiaXNPYmplY3QiLCAiZXJyIiwgIm9wdGlvbmFsIiwgInVuZGVmaW5lZCIsICJlcnJvciIsICJ1c2VGYWN0b3J5IiwgInNjb3BlIiwgImluVHJhbnNpZW50U2NvcGUiLCAiaW5SZXF1ZXN0U2NvcGUiLCAidXNlQ2xhc3MiLCAidG9TZXJ2aWNlIiwgInVzZUV4aXN0aW5nIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIk1vZHVsZVRyZWVTY2FubmVyIiwgIm1vZHVsZU1ldGFkYXRhUmVhZGVyIiwgImNvbnRyb2xsZXJNZXRhZGF0YVJlYWRlciIsICJsb2dnZXJTZXJ2aWNlIiwgInNjYW4iLCAiY2xhc3NSZWYiLCAic3RhcnRUaW1lIiwgIkRhdGUiLCAibm93IiwgIm1vZHVsZU1ldGFkYXRhIiwgInJlYWQiLCAibW9kdWxlIiwgIk1vZHVsZSIsICJtZXRhZGF0YSIsICJsb2ciLCAibmFtZSIsICJzY2FuQ29udHJvbGxlcnMiLCAibW9kdWxlVHJlZSIsICJUcmVlIiwgInNjYW5uZWRNb2R1bGVzIiwgIk1hcCIsICJzZXQiLCAiaW1wb3J0ZWRNb2R1bGUiLCAiaW1wb3J0cyIsICJzY2FuTW9kdWxlcyIsICJyb290IiwgInBhcmVudE5vZGUiLCAic2Nhbm5lZE1vZHVsZSIsICJnZXQiLCAiaXNOaWwiLCAidmFsdWUiLCAicmVwZXRpdGl2ZUltcG9ydHMiLCAiYWRkIiwgImNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5IiwgInBhcmVudCIsICJ0cmVlTm9kZSIsICJUcmVlTm9kZSIsICJhZGRDaGlsZCIsICJpbXBvcnRNb2R1bGUiLCAiY29udHJvbGxlcnMiLCAiY29udHJvbGxlck1ldGFkYXRhIiwgImNvbnRyb2xsZXIiLCAiQ29udHJvbGxlciIsICJvd25lciIsICJwdXNoIiwgInBhcmVudE1ldGFkYXRhIiwgImluY2x1ZGVzIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJDaXJjdWxhckRlcGVuZGVuY3lEZXRlY3RlZCIsICJSYWdlTVBTY3JpcHRFdmVudCIsICJldmVudE5hbWUiLCAibGlzdGVuZXIiLCAiZGVzdHJveSIsICJtcCIsICJldmVudHMiLCAicmVtb3ZlIiwgIlJhZ2VNUEV2ZW50RW1taXRlciIsICJlbWl0IiwgImV2ZW50TmFtZSIsICJhcmdzIiwgIm1wIiwgImV2ZW50cyIsICJjYWxsIiwgIm9uIiwgImxpc3RlbmVyIiwgImFkZCIsICJSYWdlTVBTY3JpcHRFdmVudCIsICJvbmNlIiwgIm9uY2VXcmFwcGVyIiwgInJlbW92ZSIsICJvZmYiLCAiUmFnZU1QVGltZXIiLCAibGFzdFRpY2siLCAiRGF0ZSIsICJub3ciLCAiaWQiLCAiaW50ZXJ2YWwiLCAib25jZSIsICJjYWxsYmFjayIsICJjbGVhclRpbWVyIiwgImRlc3Ryb3kiLCAiUmFnZU1QVGltZXJzIiwgInRpbWVySW5jcmVtZW50ZXIiLCAidGltZXJzIiwgIk1hcCIsICJldmVyeVRpY2tIYW5kbGVycyIsICJpc0V2ZXJ5VGlja1J1bm5pbmciLCAiZXZlcnlUaWNrTWFpbkhhbmRsZXIiLCAiYWxsIiwgInZhbHVlcyIsICJ3YXJuaW5nVGhyZXNob2xkIiwgIl92YWx1ZSIsICJzb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50IiwgImdldEJ5SUQiLCAiaWQiLCAidGltZXIiLCAiZ2V0IiwgImNyZWF0ZVRpbWVyIiwgImNsZWFyIiwgImNhbGxiYWNrIiwgImludGVydmFsIiwgIm9uY2UiLCAiYXJncyIsICJjYWxsYmFja0JpbmQiLCAiYmluZCIsICJBcnJheSIsICJpc0FycmF5IiwgInRpbWVySWQiLCAicmFnZU1QVGltZXIiLCAiUmFnZU1QVGltZXIiLCAiZGVsZXRlIiwgInNldCIsICJzZXRJbnRlcnZhbCIsICJ0aW1lIiwgImNiIiwgImNsZWFySW50ZXJ2YWwiLCAic2V0VGltZW91dCIsICJjbGVhclRpbWVvdXQiLCAiZXZlcnlUaWNrIiwgImJvdW5kIiwgImlzQ2xpZW50U2lkZSIsICJtcCIsICJicm93c2VycyIsICJoYW5kbGVyIiwgImUiLCAiY29uc29sZSIsICJsb2dFcnJvciIsICJldmVudHMiLCAiYWRkIiwgImludGVydmFsSGFuZGxlciIsICJfZXZlcnlUaWNrSW50ZXJ2YWwiLCAic2l6ZSIsICJyZW1vdmUiLCAibmV4dFRpY2siLCAiX25hbWUiLCAidGltZUVuZCIsICJSYWdlTVBNdWx0aXBsYXllclNlcnZpY2UiLCAiVGltZXJzIiwgIkV2ZW50cyIsICJSYWdlTVBFdmVudEVtbWl0ZXIiLCAiUmFnZU1QVGltZXJzIiwgInBhcnNlSW50ZXJuYWxBcmdzIiwgImFyZ3MiLCAicGxheWVyIiwgImlzT2JqZWN0IiwgInVuZGVmaW5lZCIsICJib2R5IiwgImxvZyIsICJhcmciLCAibWVzc2FnZSIsICJtYXAiLCAiYSIsICJKU09OIiwgInN0cmluZ2lmeSIsICJTdHJpbmciLCAiam9pbiIsICJtcCIsICJjb25zb2xlIiwgImxvZ0luZm8iLCAibG9nRXJyb3IiLCAibG9nV2FybmluZyIsICJsb2dEZWJ1ZyIsICJpbmplY3QiLCAiQ29udGFpbmVyIiwgImluamVjdGFibGUiLCAiQ29udGFpbmVyIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIkFwcCIsICJtb2R1bGVUcmVlU2Nhbm5lciIsICJtb2R1bGVEZXBlbmRlbmN5QmluZGVyIiwgImFwcFJ1bnRpbWUiLCAiaW50ZXJuYWxBcHBDb250YWluZXIiLCAicGx1Z2lucyIsICJsb2dnZXJTZXJ2aWNlIiwgIm1vZHVsZVRyZWUiLCAibG9hZGVkIiwgInN0YXJ0IiwgInJvb3RNb2R1bGUiLCAiZXJyb3IiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkFwcEFscmVhZHlMb2FkZWQiLCAibG9nIiwgInJ1blBsdWdpbk1ldGhvZHMiLCAic2NhbiIsICJiaW5kIiwgImJvb3QiLCAic3RvcCIsICJBcHBOb3RMb2FkZWQiLCAic2h1dGRvd24iLCAibWV0aG9kIiwgIlByb21pc2UiLCAiYWxsIiwgIm1hcCIsICJwIiwgInBsdWdpbiIsICJnZXQiLCAicmVzb2x2ZSIsICJBcHBCdWlsZGVyIiwgImVudmlyb21lbnQiLCAiaW50ZXJuYWxBcHBDb250YWluZXIiLCAibXVsdGlwbGF5ZXJTZXJ2aWNlIiwgInBsdWdpbnMiLCAiZ2xvYmFsQ29udGFpbmVyT3B0aW9ucyIsICJ1c2VHbG9iYWxHdWFyZHMiLCAiZ3VhcmRzIiwgInZhbGlkYXRlZEd1YXJkcyIsICJndWFyZCIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUd1YXJkIiwgIkVycm9yIiwgInB1c2giLCAiYmluZCIsICJHTE9CQUxfR1VBUkRTIiwgInRvQ29uc3RhbnRWYWx1ZSIsICJ1c2VHbG9iYWxJbnRlcmNlcHRvcnMiLCAiaW50ZXJjZXB0b3JzIiwgInZhbGlkYXRlZEludGVyY2VwdG9ycyIsICJpbnRlcmNlcHRvciIsICJ2YWxpZGF0ZUludGVyY2VwdG9yIiwgIkdMT0JBTF9JTlRFUkNFUFRPUlMiLCAidXNlR2xvYmFsUGlwZXMiLCAicGlwZXMiLCAidmFsaWRhdGVkUGlwZXMiLCAicGlwZSIsICJ2YWxpZGF0ZVBpcGUiLCAiR0xPQkFMX1BJUEVTIiwgInVzZUdsb2JhbEZpbHRlcnMiLCAiZmlsdGVycyIsICJ2YWxpZGF0ZWRGSWx0ZXJzIiwgImZpbHRlciIsICJ2YWxpZGF0ZUVycm9yRmlsdGVyIiwgIkdMT0JBTF9FUlJPUl9GSUxURVJTIiwgInVzZVBsdWdpbnMiLCAiZm9yRWFjaCIsICJwIiwgInRvU2VsZiIsICJpblNpbmdsZXRvblNjb3BlIiwgImludGVybmFsUGx1Z2lucyIsICJnZXQiLCAiUExVR0lOUyIsICJyZWJpbmQiLCAiZW5hYmxlU2h1dGRvd25Ib29rcyIsICJFTkFCTEVfU0hVVERPV05fSE9PS1MiLCAic2V0Q29udGFpbmVyT3B0aW9ucyIsICJvcHRpb25zIiwgIm9ubHlHbG9iYWwiLCAiQ09OVEFJTkVSX09QVElPTlMiLCAiYnVpbGQiLCAiZ2xvYmFsQXBwQ29udGFpbmVyIiwgIkNvbnRhaW5lciIsICJSRUZMRUNUT1JfU0VSVklDRSIsICJSZWZsZWN0b3JTZXJ2aWNlIiwgInRvU2VydmljZSIsICJNVUxUSVBMQVlFUl9TRVJWSUNFIiwgIkFwcCIsICJHTE9CQUxfQVBQX0NPTlRBSU5FUiIsICJNb2R1bGVUcmVlU2Nhbm5lciIsICJNb2R1bGVEZXBlbmRlbmN5QmluZGVyIiwgIkFwcFJ1bnRpbWUiLCAiUGlwZWxpbmVIYW5kbGVyIiwgIk1vZHVsZSIsICJpblRyYW5zaWVudFNjb3BlIiwgIk1vZHVsZU1ldGFkYXRhUmVhZGVyIiwgIkNvbnRyb2xsZXIiLCAiQ29udHJvbGxlck1ldGFkYXRhUmVhZGVyIiwgIkNvbnRyb2xsZXJGbG93SGFuZGxlciIsICJDb250cm9sbGVyRXZlbnRIYW5kbGVyIiwgIkNvbnRyb2xsZXJSUENIYW5kbGVyIiwgIk1hbmdvUmVxdWVzdEJhc2UiLCAiTUFOR09fUkVRVUVTVF9GQUNUT1JZIiwgInRvRmFjdG9yeSIsICJjb250ZXh0IiwgImJvZHkiLCAicGxheWVyIiwgInJlcXVlc3QiLCAiY29udGFpbmVyIiwgIiRib2R5IiwgIiRwbGF5ZXIiLCAiTWFuZ29SZXNwb25zZUJhc2UiLCAiTUFOR09fUkVTUE9OU0VfRkFDVE9SWSIsICJFeGVjdXRpb25Db250ZXh0QmFzZSIsICJFWEVDVVRJT05fQ09OVEVYVF9GQUNUT1JZIiwgInR5cGUiLCAiY2xhc3NSZWYiLCAiaGFuZGxlciIsICJyZXNwb25zZSIsICJuYW1lIiwgImV4ZWN1dGlvbkNvbnRleHQiLCAiJHR5cGUiLCAiJHJlcXVlc3QiLCAiJHJlc3BvbnNlIiwgIiRoYW5kbGVyIiwgIiRjbGFzc1JlZiIsICIkbmFtZSIsICJwbHVnaW4iLCAicGx1Z2luSW5zdGFuY2UiLCAib25CdWlsZCIsICJpc0JvdW5kIiwgIkNvbnRhaW5lciIsICJjcmVhdGVBcHBCdWlsZGVyIiwgImVudmlyb21lbnQiLCAicGx1Z2lucyIsICJhcHBCdWlsZGVySW5oZXJpdCIsICJtdWx0aXBsYXllclNlcnZpY2UiLCAiaW50ZXJuYWxBcHBDb250YWluZXIiLCAiQ29udGFpbmVyIiwgImJpbmQiLCAiTVVMVElQTEFZRVJfU0VSVklDRSIsICJ0b0NvbnN0YW50VmFsdWUiLCAiSU5URVJOQUxfQVBQX0NPTlRBSU5FUiIsICJBUFBfRU5WSVJPTUVOVCIsICJQTFVHSU5TIiwgInRvU2VsZiIsICJpblNpbmdsZXRvblNjb3BlIiwgImdldCIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJ0eXBlIiwgIm5hbWUiLCAid2ViVmlld0lkIiwgInRhcmdldCIsICJtZXRob2QiLCAiaXNOaWwiLCAiaXNTdHJpbmciLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkV2ZW50TmFtZU11c3RCZVN0cmluZyIsICJldmVudHMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlckV2ZW50cyIsICJzb21lIiwgImV2ZW50IiwgIkV2ZW50TmFtZU11c3RCZVVuaXF1ZSIsICJkZWZpbmVNZXRhZGF0YSIsICJPbkludGVybmFsIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbldlYlZpZXciLCAiaWQiLCAiZXZlbnROYW1lIiwgImNyZWF0ZUV2ZW50RGVjb3JhdG9yIiwgIk9uIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbmNlSW50ZXJuYWwiLCAiZXZlbnROYW1lIiwgImNyZWF0ZUV2ZW50RGVjb3JhdG9yIiwgIk9uY2UiLCAiZXZlbnROYW1lIiwgImNyZWF0ZUV2ZW50RGVjb3JhdG9yIiwgIk9uY2VXZWJWaWV3IiwgImlkIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJCb2R5IiwgInBpcGVzIiwgInRhcmdldCIsICJtZXRob2QiLCAiaW5kZXgiLCAidmFsaWRhdGVkUGlwZXMiLCAicGlwZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZVBpcGUiLCAiRXJyb3IiLCAicHVzaCIsICJwYXJhbXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclBhcmFtcyIsICJzb21lIiwgInBhcmFtIiwgIkVycm9yTWVzc2FnZSIsICJNdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQiLCAicGFyYW1UeXBlcyIsICJtZXRhdHlwZSIsICJBcnJheSIsICJpc0FycmF5IiwgInVuZGVmaW5lZCIsICJkZWZpbmVNZXRhZGF0YSIsICJ0eXBlIiwgIk1ldGhvZFBhcmFtVHlwZSIsICJkYXRhIiwgIkluZGV4IiwgImtleSIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgImlzTnVtYmVyIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJJbmRleEtleU11c3RCZU51bWJlciIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlUGlwZSIsICJwdXNoIiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiZGF0YSIsICJSZXF1ZXN0IiwgInRhcmdldCIsICJtZXRob2QiLCAiaW5kZXgiLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiZGF0YSIsICJSZXEiLCAiUGFyYW0iLCAia2V5IiwgInBpcGVzIiwgInRhcmdldCIsICJtZXRob2QiLCAiaW5kZXgiLCAiaXNTdHJpbmciLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIlBhcmFtS2V5TXVzdEJlU3RyaW5nIiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVQaXBlIiwgInB1c2giLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJNdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQiLCAicGFyYW1UeXBlcyIsICJtZXRhdHlwZSIsICJBcnJheSIsICJpc0FycmF5IiwgInVuZGVmaW5lZCIsICJkZWZpbmVNZXRhZGF0YSIsICJkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgIlJlc3BvbnNlIiwgInRhcmdldCIsICJtZXRob2QiLCAiaW5kZXgiLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiZGF0YSIsICJSZXMiLCAiVXNlR3VhcmRzIiwgImd1YXJkcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImRlc2NyaXB0b3IiLCAidmFsaWRhdGVkR3VhcmRzIiwgImd1YXJkIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlR3VhcmQiLCAiRXJyb3IiLCAicHVzaCIsICJpc05pbCIsICJsZW5ndGgiLCAiRXJyb3JNZXNzYWdlIiwgIkF0TGVhc3RPbmVHdWFyZFJlcXVpcmVkIiwgIm1ldGhvZEd1YXJkcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJHdWFyZHMiLCAiZGVmaW5lTWV0YWRhdGEiLCAiY2xhc3NHdWFyZHMiLCAiVXNlSW50ZXJjZXB0b3JzIiwgImludGVyY2VwdG9ycyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImRlc2NyaXB0b3IiLCAidmFsaWRhdGVkSW50ZXJjZXB0b3JzIiwgImludGVyY2VwdG9yIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlSW50ZXJjZXB0b3IiLCAiRXJyb3IiLCAicHVzaCIsICJpc05pbCIsICJsZW5ndGgiLCAiRXJyb3JNZXNzYWdlIiwgIkF0TGVhc3RPbmVJbnRlcmNlcHRvclJlcXVpcmVkIiwgIm1ldGhvZEludGVyY2VwdG9ycyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJJbnRlcmNlcHRvcnMiLCAiZGVmaW5lTWV0YWRhdGEiLCAiY2xhc3NJbnRlcmNlcHRvcnMiLCAiVXNlUGlwZXMiLCAicGlwZXMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJkZXNjcmlwdG9yIiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVQaXBlIiwgIkVycm9yIiwgInB1c2giLCAiaXNOaWwiLCAibGVuZ3RoIiwgIkVycm9yTWVzc2FnZSIsICJBdExlYXN0T25lUGlwZVJlcXVpcmVkIiwgIm1ldGhvZFBpcGVzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIlBpcGVzIiwgImRlZmluZU1ldGFkYXRhIiwgImNsYXNzUGlwZXMiLCAiY3JlYXRlUlBDRGVjb3JhdG9yIiwgInR5cGUiLCAibmFtZSIsICJ3ZWJWaWV3SWQiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpc05pbCIsICJpc1N0cmluZyIsICJpc051bWJlciIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiV2ViVmlld0lkTXVzdEJlU3RyaW5nT3JOdW1iZXIiLCAiUlBDTmFtZU11c3RCZVN0cmluZyIsICJycGNzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJSUENzIiwgInNvbWUiLCAicnBjIiwgIlJQQ05hbWVNdXN0QmVVbmlxdWUiLCAiZGVmaW5lTWV0YWRhdGEiLCAiT25SZXF1ZXN0IiwgInJwY05hbWUiLCAiY3JlYXRlUlBDRGVjb3JhdG9yIiwgIk9uV2ViVmlld1JlcXVlc3QiLCAiaWQiLCAicnBjTmFtZSIsICJjcmVhdGVSUENEZWNvcmF0b3IiLCAiY3JlYXRlVGltZXJEZWNvcmF0b3IiLCAidHlwZSIsICJuYW1lIiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpc05pbCIsICJpc1N0cmluZyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiVGltZXJOYW1lTXVzdEJlU3RyaW5nIiwgInRpbWVycyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJUaW1lcnMiLCAic29tZSIsICJ0aW1lciIsICJFdmVudE5hbWVNdXN0QmVVbmlxdWUiLCAiZGVmaW5lTWV0YWRhdGEiLCAiQ3JvbiIsICJwYXR0ZXJuIiwgIm9wdGlvbnMiLCAiY3JlYXRlVGltZXJEZWNvcmF0b3IiLCAibmFtZSIsICJFdmVyeVRpY2siLCAibmFtZSIsICJjcmVhdGVUaW1lckRlY29yYXRvciIsICJJbnRlcnZhbCIsICJuYW1lT3JUaW1lb3V0IiwgInRpbWVvdXQiLCAibmFtZSIsICJpbnRlcnZhbFRpbWVvdXQiLCAiaXNTdHJpbmciLCAidW5kZWZpbmVkIiwgImNyZWF0ZVRpbWVyRGVjb3JhdG9yIiwgIlRpbWVvdXQiLCAibmFtZU9yVGltZW91dCIsICJ0aW1lb3V0IiwgIm5hbWUiLCAiaW50ZXJ2YWxUaW1lb3V0IiwgImlzU3RyaW5nIiwgInVuZGVmaW5lZCIsICJjcmVhdGVUaW1lckRlY29yYXRvciIsICJhcHBseURlY29yYXRvcnMiLCAiZGVjb3JhdG9ycyIsICJ0YXJnZXQiLCAicHJvcGVydHlLZXkiLCAiZGVzY3JpcHRvciIsICJkZWNvcmF0b3IiLCAiRnVuY3Rpb24iLCAiY3JlYXRlUGFyYW1EZWNvcmF0b3IiLCAiZmFjdG9yeSIsICJkYXRhIiwgInBpcGVzIiwgInRhcmdldCIsICJtZXRob2QiLCAiaW5kZXgiLCAidmFsaWRhdGVkUGlwZXMiLCAicGlwZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZVBpcGUiLCAiRXJyb3IiLCAicHVzaCIsICJwYXJhbXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclBhcmFtcyIsICJzb21lIiwgInBhcmFtIiwgIkVycm9yTWVzc2FnZSIsICJNdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQiLCAicGFyYW1UeXBlcyIsICJtZXRhdHlwZSIsICJBcnJheSIsICJpc0FycmF5IiwgInVuZGVmaW5lZCIsICJkZWZpbmVNZXRhZGF0YSIsICJ0eXBlIiwgIk1ldGhvZFBhcmFtVHlwZSIsICJDdXN0b20iLCAiTGF6eVNlcnZpY2VJZGVudGlmZXIiLCAiZm9yd2FyZFJlZiIsICJmbiIsICJMYXp5U2VydmljZUlkZW50aWZlciIsICJSZWZsZWN0b3JTZXJ2aWNlIiwgImdldCIsICJtZXRhZGF0YUtleSIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJnZXRBbGwiLCAidGFyZ2V0cyIsICJtYXAiLCAiZ2V0QWxsQW5kTWVyZ2UiLCAibWV0YWRhdGFDb2xsZWN0aW9uIiwgImZpbHRlciIsICJpdGVtIiwgInVuZGVmaW5lZCIsICJpc0VtcHR5IiwgInJlZHVjZSIsICJhIiwgImIiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJjb25jYXQiLCAiaXNPYmplY3QiLCAiZ2V0QWxsQW5kT3ZlcnJpZGUiLCAicmVzdWx0IiwgImNyZWF0ZURlY29yYXRvciIsICJvcHRpb25zIiwgImtleSIsICJnZW5lcmF0ZVJhbmRvbUlkIiwgImRlY29yYXRvckZuIiwgIm1ldGFkYXRhVmFsdWUiLCAiZGVzY3JpcHRvciIsICJ2YWx1ZSIsICJ0cmFuc2Zvcm0iLCAiU2V0TWV0YWRhdGEiLCAiS0VZIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIkNyb24iLCAiVGltZXJTZXJ2aWNlIiwgIm11bHRpcGxheWVyU2VydmljZSIsICIkZXZlcnl0aWNrcyIsICJNYXAiLCAiJGludGVydmFscyIsICIkdGltZW91dHMiLCAiJGNyb25zIiwgImFsbCIsICJUaW1lcnMiLCAiZXZlcnl0aWNrcyIsICJ2YWx1ZXMiLCAiaW50ZXJ2YWxzIiwgInRpbWVvdXRzIiwgImNyb25zIiwgIndhcm5pbmdUaHJlc2hvbGQiLCAidmFsdWUiLCAic291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCIsICJjcmVhdGVDcm9uSm9iIiwgImNhbGxiYWNrIiwgIm9wdGlvbnMiLCAicGF0dGVybiIsICJjcm9uT3B0aW9ucyIsICJjcm9uIiwgIkNyb24iLCAiaXNTdHJpbmciLCAibmFtZSIsICJzZXQiLCAiY3JlYXRlSW50ZXJ2YWwiLCAiaW50ZXJ2YWwiLCAidGltZXIiLCAic2V0SW50ZXJ2YWwiLCAiY3JlYXRlVGltZW91dCIsICJ0aW1lb3V0IiwgInNldFRpbWVvdXQiLCAiY3JlYXRlRXZlcnlUaWNrIiwgImV2ZXJ5VGljayIsICJkZWxldGUiLCAidHlwZSIsICJjcm9uSm9iIiwgImdldCIsICJzdG9wIiwgImV2ZXJ5dGljayIsICJkZXN0cm95IiwgImdldEJ5TmFtZSIsICJnZXRCeUlkIiwgImlkIiwgImdldEJ5SUQiLCAidGltZSIsICJ0aW1lRW5kIl0KfQo=
|
|
1892
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NlcnZpY2VzL3JlZmxlY3Rvci5zZXJ2aWNlLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvY29udHJvbGxlci5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY29yZS9nbG9iYWwuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvaW5qZWN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL2luamVjdGFibGUuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvbW9kdWxlLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL29wdGlvbmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL3NldC1tZXRhZGF0YS5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXJyb3JzL2NhdGNoLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9lcnJvcnMvdXNlLWZpbHRlcnMuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9hcHAvbW9kdWxlLXRyZWUvYXBwLXJ1bnRpbWUudHMiLCAiLi4vc3JjL2FwcC9tb2R1bGUtdHJlZS9kZXBlbmRlbmN5LWJpbmRlci50cyIsICIuLi9zcmMvYXBwL21vZHVsZS10cmVlL21vZHVsZS10cmVlLXNjYW5uZXIudHMiLCAiLi4vc3JjL2FwcC9tdWx0aXBsYXllci9yYWdlbXAvcmFnZW1wLXNjcmlwdC1ldmVudC1oYW5kbGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1ldmVudC1lbW1pdGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC10aW1lci50cyIsICIuLi9zcmMvYXBwL211bHRpcGxheWVyL3JhZ2VtcC9yYWdlbXAtdGltZXJzLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1tdWx0aXBsYXllci5zZXJ2aWNlLnRzIiwgIi4uL3NyYy9hcHAvYXBwLWJ1aWxkZXIudHMiLCAiLi4vc3JjL2FwcC9hcHAudHMiLCAiLi4vc3JjL2FwcC9jcmVhdGUtYXBwLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLWludGVybmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb24td2Vidmlldy5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb25jZS1pbnRlcm5hbC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uY2UuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2V2ZW50cy9vbmNlLXdlYnZpZXcuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9ib2R5LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvaW5kZXguZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvcGFyYW0uZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXNwb25zZS5kZW9yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtZ3VhcmRzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtaW50ZXJjZXB0b3JzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtcGlwZXMuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ycGMtZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3JwYy9vbi1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ycGMvb24td2Vidmlldy1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jcmVhdGUtdGltZXIuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3RpbWVycy9jcm9uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvZXZlcnktdGljay5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvdGltZXJzL2ludGVydmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvdGltZW91dC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvYXBwbHktZGVjb3JhdG9yLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY3JlYXRlLXBhcmFtLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZm9yd2FyZC1yZWYudXRpbC50cyIsICIuLi9zcmMvc2VydmljZXMvdGltZXIuc2VydmljZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBTZXRNZXRhZGF0YSB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVEZWNvcmF0b3JPcHRpb25zLCBDcmVhdGVEZWNvcmF0b3JXaXRoVHJhbnNmb3JtT3B0aW9ucywgUmVmbGVjdGFibGVEZWNvcmF0b3IgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlUmFuZG9tSWQsIGlzRW1wdHksIGlzT2JqZWN0IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVmbGVjdG9yU2VydmljZSB7XG4gICAgcHVibGljIGdldDxUUmVzdWx0ID0gdW5rbm93biwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4obWV0YWRhdGFLZXk6IFRLZXksIHRhcmdldDogTmV3YWJsZSB8IEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhPFRSZXN1bHQ+KG1ldGFkYXRhS2V5LCB0YXJnZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGw8VFJlc3VsdCBleHRlbmRzIHVua25vd25bXSA9IHVua25vd25bXSwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4oXG4gICAgICAgIG1ldGFkYXRhS2V5OiBUS2V5LFxuICAgICAgICB0YXJnZXRzOiAoTmV3YWJsZSB8IEZ1bmN0aW9uKVtdLFxuICAgICkge1xuICAgICAgICByZXR1cm4gPFRSZXN1bHQ+KHRhcmdldHMgfHwgW10pLm1hcCgodGFyZ2V0KSA9PiB0aGlzLmdldChtZXRhZGF0YUtleSwgdGFyZ2V0KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbEFuZE1lcmdlPFRSZXN1bHQgZXh0ZW5kcyB1bmtub3duW10gPSB1bmtub3duW10sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgPSBzdHJpbmc+KFxuICAgICAgICBtZXRhZGF0YUtleTogVEtleSxcbiAgICAgICAgdGFyZ2V0czogKE5ld2FibGUgfCBGdW5jdGlvbilbXSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFDb2xsZWN0aW9uID0gdGhpcy5nZXRBbGw8VFJlc3VsdCwgVEtleT4obWV0YWRhdGFLZXksIHRhcmdldHMpLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBpZiAoaXNFbXB0eShtZXRhZGF0YUNvbGxlY3Rpb24pKSByZXR1cm4gPFRSZXN1bHQ+bWV0YWRhdGFDb2xsZWN0aW9uO1xuXG4gICAgICAgIHJldHVybiA8VFJlc3VsdD5tZXRhZGF0YUNvbGxlY3Rpb24ucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc09iamVjdChhKSAmJiBpc09iamVjdChiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIC4uLmIsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbYSwgYl07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxBbmRPdmVycmlkZTxUUmVzdWx0ID0gdW5rbm93biwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4obWV0YWRhdGFLZXk6IFRLZXksIHRhcmdldHM6IChOZXdhYmxlIHwgRnVuY3Rpb24pW10pIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXQobWV0YWRhdGFLZXksIHRhcmdldCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHJldHVybiA8VFJlc3VsdD5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlY29yYXRvcjxUUGFyYW0+KG9wdGlvbnM/OiBDcmVhdGVEZWNvcmF0b3JPcHRpb25zPFRQYXJhbT4pOiBSZWZsZWN0YWJsZURlY29yYXRvcjxUUGFyYW0+O1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPihcbiAgICAgICAgb3B0aW9uczogQ3JlYXRlRGVjb3JhdG9yV2l0aFRyYW5zZm9ybU9wdGlvbnM8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+LFxuICAgICk6IFJlZmxlY3RhYmxlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPjtcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlY29yYXRvcjxUUGFyYW0sIFRUcmFuc2Zvcm1lZCA9IFRQYXJhbT4oXG4gICAgICAgIG9wdGlvbnM6IENyZWF0ZURlY29yYXRvck9wdGlvbnM8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+ID0ge30sXG4gICAgKTogUmVmbGVjdGFibGVEZWNvcmF0b3I8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+IHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFLZXkgPSBvcHRpb25zLmtleSA/PyBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvckZuID0gKG1ldGFkYXRhVmFsdWU6IFRQYXJhbSkgPT4gKHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sIGtleT86IHN0cmluZyB8IHN5bWJvbCwgZGVzY3JpcHRvcj86IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnRyYW5zZm9ybSA/IG9wdGlvbnMudHJhbnNmb3JtKG1ldGFkYXRhVmFsdWUpIDogbWV0YWRhdGFWYWx1ZTtcbiAgICAgICAgICAgIFNldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB2YWx1ZSA/PyB7fSkodGFyZ2V0LCBrZXkhLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkZWNvcmF0b3JGbi5LRVkgPSBtZXRhZGF0YUtleTtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvckZuIGFzIFJlZmxlY3RhYmxlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29udHJvbGxlcjxUIGV4dGVuZHMgTmV3YWJsZT4ob3B0aW9ucz86IENvbnRyb2xsZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IFQpID0+IHtcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXIsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUNvbnRyb2xsZXJPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gR2xvYmFsPFQgZXh0ZW5kcyBOZXdhYmxlPigpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5HbG9iYWxNb2R1bGUsIHRydWUsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gSW5qZWN0PFQgPSB1bmtub3duPihrZXk/OiBJbmplY3Rpb25Ub2tlbjxUPikge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKGtleSkgJiYgIXZhbGlkYXRlSW5qZWN0aW9uVG9rZW4oa2V5KS52YWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5JbnZhbGlkSW5qZWN0aW9uVG9rZW5TcGVjaWZpZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBrZXkgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YTxJbmplY3Rpb25Ub2tlbj4oJ2Rlc2lnbjp0eXBlJywgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW5qZWN0aW9uVG9rZW5Ob3RGb3VuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtSW5kZXgpO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmplY3RhYmxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogSW5qZWN0YWJsZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBpZiAoUmVmbGVjdC5oYXNNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuSW5qZWN0YWJsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5JbmplY3RhYmxlLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kdWxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogTW9kdWxlT3B0aW9ucykge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZU1vZHVsZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvciEpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHZhbHVlLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiBpbmplY3RhYmxlKCkodGFyZ2V0KTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IG9wdGlvbmFsIH0gZnJvbSAnaW52ZXJzaWZ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIE9wdGlvbmFsKCkge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uYWwoKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbUluZGV4KTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEN1c3RvbURlY29yYXRvciB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFNldE1ldGFkYXRhPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFYgPSB1bmtub3duPihrZXk6IEssIHZhbHVlOiBWKSB7XG4gICAgY29uc3QgZGVjb3JhdG9yRmFjdG9yeSA9IDxDdXN0b21EZWNvcmF0b3I+KCh0YXJnZXQ6IG9iamVjdCwgX21ldGhvZD86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShrZXksIHZhbHVlLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoa2V5LCB2YWx1ZSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgICBkZWNvcmF0b3JGYWN0b3J5LktFWSA9IGtleTtcbiAgICByZXR1cm4gZGVjb3JhdG9yRmFjdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ2F0Y2g8VCBleHRlbmRzIE5ld2FibGU+KC4uLmV4Y2VwdGlvbnM6IHVua25vd25bXSkge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5DYXRjaCwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gZXhjZXB0aW9ucy5maWx0ZXIoKGV4Y2VwdGlvbiwgaW5kZXgpID0+IGV4Y2VwdGlvbnMuaW5kZXhPZihleGNlcHRpb24pICE9PSBpbmRleCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FeGNlcHRpb25IYW5kbGluZ0NvbmZsaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNhdGNoLCBleGNlcHRpb25zLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRmlsdGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFcnJvckZpbHRlciB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRmlsdGVycyguLi5maWx0ZXJzOiAoTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcilbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZpbHRlcnM6IChOZXdhYmxlPEVycm9yRmlsdGVyPiB8IEVycm9yRmlsdGVyKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVFcnJvckZpbHRlcihmaWx0ZXIpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEZpbHRlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RGaWx0ZXJzID1cbiAgICAgICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8RXJyb3JGaWx0ZXI+W10+KENvcmVNZXRhZGF0YUtleS5FcnJvckZpbHRlcnMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIGlmICghaXNOaWwobWV0aG9kRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVFcnJvckZpbHRlckRldGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLm1ldGhvZEZpbHRlcnNdLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NGaWx0ZXJzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEVycm9yRmlsdGVyPltdPihDb3JlTWV0YWRhdGFLZXkuRXJyb3JGaWx0ZXJzLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBpZiAoIWlzTmlsKGNsYXNzRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkR1cGxpY2F0ZUVycm9yRmlsdGVyRGV0ZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLmNsYXNzRmlsdGVyc10sIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRU5BQkxFX1NIVVRET1dOX0hPT0tTLCBHTE9CQUxfRVJST1JfRklMVEVSUywgR0xPQkFMX0dVQVJEUywgR0xPQkFMX0lOVEVSQ0VQVE9SUywgR0xPQkFMX1BJUEVTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JGaWx0ZXIsIEd1YXJkLCBJbnRlcmNlcHRvciB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSwgb3B0aW9uYWwgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgQ29udHJvbGxlckV2ZW50SGFuZGxlciwgQ29udHJvbGxlclJQQ0hhbmRsZXIgfSBmcm9tICcuLi9jb250cm9sbGVyJztcbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFLCBUSU1FUl9TRVJWSUNFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTG9nZ2VyU2VydmljZSwgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBUcmVlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBUaW1lclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBSdW50aW1lIHtcbiAgICBAaW5qZWN0KENvbnRyb2xsZXJFdmVudEhhbmRsZXIpIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyOiBDb250cm9sbGVyRXZlbnRIYW5kbGVyO1xuICAgIEBpbmplY3QoQ29udHJvbGxlclJQQ0hhbmRsZXIpIHByaXZhdGUgcmVhZG9ubHkgcnBjSGFuZGxlcjogQ29udHJvbGxlclJQQ0hhbmRsZXI7XG4gICAgQGluamVjdChHTE9CQUxfR1VBUkRTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEd1YXJkczogKE5ld2FibGU8R3VhcmQ+IHwgR3VhcmQpW107XG4gICAgQGluamVjdChHTE9CQUxfSU5URVJDRVBUT1JTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEludGVyY2VwdG9yczogKE5ld2FibGU8SW50ZXJjZXB0b3I+IHwgSW50ZXJjZXB0b3IpW107XG4gICAgQGluamVjdChHTE9CQUxfUElQRVMpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXTtcbiAgICBAaW5qZWN0KEdMT0JBTF9FUlJPUl9GSUxURVJTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEVycm9yRmlsdGVyczogKE5ld2FibGU8RXJyb3JGaWx0ZXI+IHwgRXJyb3JGaWx0ZXIpW107XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuICAgIEBpbmplY3QoRU5BQkxFX1NIVVRET1dOX0hPT0tTKSBAb3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVNodXRkb3duSG9va3M6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChyZXNvbHZlZFRyZWU6IFRyZWU8TW9kdWxlPikge1xuICAgICAgICBhd2FpdCByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbW9kdWxlLCBjb250cm9sbGVycyBhbmQgcHJvdmlkZXJzLlxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIG1vZHVsZS5pbnN0YW5jZSA9IG1vZHVsZS5jb250YWluZXIuZ2V0PHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT4obW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmKTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChjb250cm9sbGVyKSA9PiAoY29udHJvbGxlci5pbnN0YW5jZSA9IG1vZHVsZS5jb250YWluZXIuZ2V0PHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT4oY29udHJvbGxlci5tZXRhZGF0YS5jbGFzc1JlZikpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFsuLi5tb2R1bGUubWV0YWRhdGEuaW50ZXJuYWxQcm92aWRlcnMsIC4uLm1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVyc10uZm9yRWFjaCgoW3Rva2VuXSkgPT5cbiAgICAgICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmdldDxhbnk+KHRva2VuKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExvZyBtb2R1bGUgbG9hZGVkLlxuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgTW9kdWxlICR7bW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmLm5hbWV9IGxvYWRlZCAoJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zKWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2QobW9kdWxlLCAnb25Nb2R1bGVJbml0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZHMocmVzb2x2ZWRUcmVlLCAnb25Nb2R1bGVJbml0Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kcyhyZXNvbHZlZFRyZWUsICdvbkFwcEJvb3RzdHJhcCcpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGFuZCBycGMgbGlzdGVuZXJzLlxuICAgICAgICByZXNvbHZlZFRyZWUudHJhdmVyc2UoKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJUaW1lcnMoY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVycyhjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKFxuICAgICAgICAgICAgICAgICAgICBgQ29udHJvbGxlciAke2NvbnRyb2xsZXIubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gdGltZXJzIGFuZCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCAoJHtEYXRlLm5vdygpIC0gdGltZX1tcylgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKHJlc29sdmVkVHJlZTogVHJlZTxNb2R1bGU+KSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVNodXRkb3duSG9va3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kcyhyZXNvbHZlZFRyZWUsICdvbk1vZHVsZURlc3Ryb3knKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kcyhyZXNvbHZlZFRyZWUsICdiZWZvcmVBcHBTaHV0ZG93bicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcmVzb2x2ZWRUcmVlLmFzeW5jVHJhdmVyc2UoYXN5bmMgKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyU2VydmljZSA9IGNvbnRyb2xsZXIub3duZXIuY29udGFpbmVyLmdldDxUaW1lclNlcnZpY2U+KFRJTUVSX1NFUlZJQ0UpO1xuXG4gICAgICAgICAgICAgICAgLy8gRGVzdHJveSBhbGwgdGltZXJzLlxuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5ldmVyeXRpY2tzLmZvckVhY2goKHRpbWVyKSA9PiB0aW1lci5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5pbnRlcnZhbHMuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLnRpbWVvdXRzLmZvckVhY2goKHRpbWVyKSA9PiB0aW1lci5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5jcm9ucy5mb3JFYWNoKChjcm9uKSA9PiBjcm9uLnN0b3AoKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBEZXN0cm95IGFsbCBzY3JpcHQgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5ldmVudEhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IGhhbmRsZXIuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnJwY0hhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IGhhbmRsZXIuZGVzdHJveSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAvLyBEZXN0cm95IGFsbCB0aW1lcnMuXG4gICAgICAgIC8vIHRoaXMudGltZXJTZXJ2aWNlLmV2ZXJ5dGlja3MuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgIC8vIHRoaXMudGltZXJTZXJ2aWNlLmludGVydmFscy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgLy8gdGhpcy50aW1lclNlcnZpY2UudGltZW91dHMuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgIC8vIHRoaXMudGltZXJTZXJ2aWNlLmNyb25Kb2JzLmZvckVhY2goKGNyb25Kb2IpID0+IGNyb25Kb2Iuc3RvcCgpKTtcblxuICAgICAgICAvLyAvLyBEZXN0cm95IGFsbCBzY3JpcHQgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgIC8vIHRoaXMuZXZlbnRTZXJ2aWNlLiRsb2NhbEhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IGhhbmRsZXIuZGVzdHJveSgpKTtcbiAgICAgICAgLy8gdGhpcy5ldmVudFNlcnZpY2UuJGludGVybmFsSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuICAgICAgICAvLyB0aGlzLmV2ZW50U2VydmljZS4kcmVtb3RlSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVNodXRkb3duSG9va3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kcyhyZXNvbHZlZFRyZWUsICdvbkFwcFNodXRkb3duJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyTGlzdGVuZXJzKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gY29udHJvbGxlci5vd25lcjtcbiAgICAgICAgY29udHJvbGxlci5tZXRhZGF0YS5ldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGd1YXJkcyA9IFsuLi50aGlzLmdsb2JhbEd1YXJkcywgLi4ubW9kdWxlLm1ldGFkYXRhLmd1YXJkcywgLi4uY29udHJvbGxlci5tZXRhZGF0YS5ndWFyZHMsIC4uLmV2ZW50Lmd1YXJkc107XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nbG9iYWxJbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4ubW9kdWxlLm1ldGFkYXRhLmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY29uc3QgcGlwZXMgPSBbLi4udGhpcy5nbG9iYWxQaXBlcywgLi4ubW9kdWxlLm1ldGFkYXRhLnBpcGVzLCAuLi5jb250cm9sbGVyLm1ldGFkYXRhLnBpcGVzLCAuLi5ldmVudC5waXBlc107XG4gICAgICAgICAgICBjb25zdCBtYXBwZWRFcnJvckZpbHRlcnMgPSB0aGlzLm1hcEVycm9yRmlsdGVycyhbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nbG9iYWxFcnJvckZpbHRlcnMsXG4gICAgICAgICAgICAgICAgLi4ubW9kdWxlLm1ldGFkYXRhLmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5lcnJvckZpbHRlcnMsXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuZXZlbnRIYW5kbGVyLnJlZ2lzdGVyRXZlbnQoZ3VhcmRzLCBpbnRlcmNlcHRvcnMsIHBpcGVzLCBtYXBwZWRFcnJvckZpbHRlcnMsIGNvbnRyb2xsZXIsIGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXZlbnRIYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb250cm9sbGVyLm1ldGFkYXRhLnJwY3MuZm9yRWFjaChhc3luYyAocnBjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBndWFyZHMgPSBbLi4udGhpcy5nbG9iYWxHdWFyZHMsIC4uLm1vZHVsZS5tZXRhZGF0YS5ndWFyZHMsIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuZ3VhcmRzLCAuLi5ycGMuZ3VhcmRzXTtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdsb2JhbEludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5tb2R1bGUubWV0YWRhdGEuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLnJwYy5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY29uc3QgcGlwZXMgPSBbLi4udGhpcy5nbG9iYWxQaXBlcywgLi4ubW9kdWxlLm1ldGFkYXRhLnBpcGVzLCAuLi5jb250cm9sbGVyLm1ldGFkYXRhLnBpcGVzLCAuLi5ycGMucGlwZXNdO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkRXJyb3JGaWx0ZXJzID0gdGhpcy5tYXBFcnJvckZpbHRlcnMoW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2xvYmFsRXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLm1vZHVsZS5tZXRhZGF0YS5lcnJvckZpbHRlcnMsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbGxlci5tZXRhZGF0YS5lcnJvckZpbHRlcnMsXG4gICAgICAgICAgICAgICAgLi4ucnBjLmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5ycGNIYW5kbGVyLnJlZ2lzdGVyUlBDKGd1YXJkcywgaW50ZXJjZXB0b3JzLCBwaXBlcywgbWFwcGVkRXJyb3JGaWx0ZXJzLCBjb250cm9sbGVyLCBycGMpO1xuICAgICAgICAgICAgY29udHJvbGxlci5ycGNIYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJUaW1lcnMoY29udHJvbGxlcjogQ29udHJvbGxlcikge1xuICAgICAgICBjb25zdCB0aW1lclNlcnZpY2UgPSBjb250cm9sbGVyLm93bmVyLmNvbnRhaW5lci5nZXQ8VGltZXJTZXJ2aWNlPihUSU1FUl9TRVJWSUNFKTtcblxuICAgICAgICBjb250cm9sbGVyLm1ldGFkYXRhLnRpbWVycy5mb3JFYWNoKCh0aW1lcikgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbWVyLnR5cGUgPT09ICdjcm9uJykge1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5jcmVhdGVDcm9uSm9iKGNvbnRyb2xsZXIuaW5zdGFuY2VbdGltZXIubWV0aG9kXSEuYmluZChjb250cm9sbGVyLmluc3RhbmNlKSwgdGltZXIub3B0aW9ucyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVyLnR5cGUgPT09ICdldmVyeXRpY2snKSB7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmNyZWF0ZUV2ZXJ5VGljayhjb250cm9sbGVyLmluc3RhbmNlW3RpbWVyLm1ldGhvZF0hLmJpbmQoY29udHJvbGxlci5pbnN0YW5jZSksIHRpbWVyLm5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lci50eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmNyZWF0ZUludGVydmFsKFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmluc3RhbmNlW3RpbWVyLm1ldGhvZF0hLmJpbmQoY29udHJvbGxlci5pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyLm9wdGlvbnMudGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgdGltZXIubmFtZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lci50eXBlID09PSAndGltZW91dCcpIHtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuY3JlYXRlVGltZW91dChjb250cm9sbGVyLmluc3RhbmNlW3RpbWVyLm1ldGhvZF0hLmJpbmQoY29udHJvbGxlci5pbnN0YW5jZSksIHRpbWVyLm9wdGlvbnMudGltZW91dCwgdGltZXIubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFwRXJyb3JGaWx0ZXJzKGVycm9yRmlsdGVyczogKE5ld2FibGU8RXJyb3JGaWx0ZXI+IHwgRXJyb3JGaWx0ZXIpW10pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyTWFwOiBbdW5rbm93biB8ICdNQU5HT19BTllfRVJST1InLCBOZXdhYmxlPEVycm9yRmlsdGVyPiB8IEVycm9yRmlsdGVyXVtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgZXJyb3JGaWx0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPGFueVtdPihDb3JlTWV0YWRhdGFLZXkuQ2F0Y2gsIGZpbHRlcikgPz8gW107XG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKCdNQU5HT19BTllfRVJST1InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXJyb3Igb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05pbChmaWx0ZXJNYXAuZmluZCgoZmlsdGVyRXJyb3IpID0+IGZpbHRlckVycm9yWzBdID09PSBlcnJvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIG1hcCBlcnJvciBmaWx0ZXJzLicpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkVycm9yQWxyZWFkeUhhbmRsZWRCeUZpbHRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbHRlck1hcC5wdXNoKFtlcnJvciwgZmlsdGVyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsdGVyTWFwO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcnVuTGlmZWN5Y2xlTWV0aG9kcyhcbiAgICAgICAgcmVzb2x2ZWRUcmVlOiBUcmVlPE1vZHVsZT4sXG4gICAgICAgIG1ldGhvZDogJ29uTW9kdWxlSW5pdCcgfCAnb25Nb2R1bGVEZXN0cm95JyB8ICdvbkFwcEJvb3RzdHJhcCcgfCAnYmVmb3JlQXBwU2h1dGRvd24nIHwgJ29uQXBwU2h1dGRvd24nLFxuICAgICkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZWRUcmVlLmFzeW5jVHJhdmVyc2UoYXN5bmMgKG5vZGUpID0+IGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kKG5vZGUudmFsdWUsIG1ldGhvZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcnVuTGlmZWN5Y2xlTWV0aG9kKFxuICAgICAgICBtb2R1bGU6IE1vZHVsZSxcbiAgICAgICAgbWV0aG9kOiAnb25Nb2R1bGVJbml0JyB8ICdvbk1vZHVsZURlc3Ryb3knIHwgJ29uQXBwQm9vdHN0cmFwJyB8ICdiZWZvcmVBcHBTaHV0ZG93bicgfCAnb25BcHBTaHV0ZG93bicsXG4gICAgKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLm1hcChhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNPYmplY3QoY29udHJvbGxlci5pbnN0YW5jZSkgfHwgaXNOaWwoY29udHJvbGxlci5pbnN0YW5jZVttZXRob2RdKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2xsZXIuaW5zdGFuY2VbbWV0aG9kXSEoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIFsuLi5tb2R1bGUubWV0YWRhdGEuaW50ZXJuYWxQcm92aWRlcnMsIC4uLm1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVyc10ubWFwKGFzeW5jIChbdG9rZW5dKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvdmlkZXJJbnN0YW5jZSA9IDx7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uIH0+bW9kdWxlLmNvbnRhaW5lci5nZXQodG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmICghaXNPYmplY3QocHJvdmlkZXJJbnN0YW5jZSkgfHwgaXNOaWwocHJvdmlkZXJJbnN0YW5jZVttZXRob2RdKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGF3YWl0IHByb3ZpZGVySW5zdGFuY2VbbWV0aG9kXSEoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KG1vZHVsZS5pbnN0YW5jZSkgfHwgaXNOaWwobW9kdWxlLmluc3RhbmNlW21ldGhvZF0pKSByZXR1cm47XG4gICAgICAgIGF3YWl0IG1vZHVsZS5pbnN0YW5jZVttZXRob2RdISgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExvZ2dlclNlcnZpY2UsIFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENPTlRBSU5FUl9PUFRJT05TLCBHTE9CQUxfQVBQX0NPTlRBSU5FUiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBNb2R1bGUsIE1vZHVsZUNvbnRhaW5lciB9IGZyb20gJy4uL21vZHVsZSc7XG5pbXBvcnQgeyBDb250YWluZXIsIGluamVjdCwgaW5qZWN0YWJsZSwgb3B0aW9uYWwsIHR5cGUgaW50ZXJmYWNlcyB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBMT0dHRVJfU0VSVklDRSwgTU9EVUxFX0NPTlRBSU5FUiwgVElNRVJfU0VSVklDRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IFRyZWUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUaW1lclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2R1bGVEZXBlbmRlbmN5QmluZGVyIHtcbiAgICBAaW5qZWN0KEdMT0JBTF9BUFBfQ09OVEFJTkVSKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEFwcENvbnRhaW5lcjogQ29udGFpbmVyO1xuICAgIEBpbmplY3QoTE9HR0VSX1NFUlZJQ0UpIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZTogTG9nZ2VyU2VydmljZTtcbiAgICBAb3B0aW9uYWwoKSBAaW5qZWN0KENPTlRBSU5FUl9PUFRJT05TKSBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lck9wdGlvbnM/OiBpbnRlcmZhY2VzLkNvbnRhaW5lck9wdGlvbnM7XG5cbiAgICBwdWJsaWMgYXN5bmMgYmluZChyZXNvbHZlZFRyZWU6IFRyZWU8TW9kdWxlPikge1xuICAgICAgICBhd2FpdCByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIgPSBuZXcgTW9kdWxlQ29udGFpbmVyKG1vZHVsZS5tZXRhZGF0YS5jb250YWluZXIgPz8gdGhpcy5jb250YWluZXJPcHRpb25zKTtcbiAgICAgICAgICAgIC8vIEF0dGFjaCB0aGUgZ2xvYmFsIGNvbnRhaW5lciB0byB0aGUgbW9kdWxlIGNvbnRhaW5lciwgc28gaXQgY2FuIGJlIHVzZWQgdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLnBhcmVudCA9IHRoaXMuZ2xvYmFsQXBwQ29udGFpbmVyO1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxBcHBDb250YWluZXIuYmluZChtb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIG1vZHVsZSBpcyBnbG9iYWwsIHdlIHdhbnQgdG8gYmluZCBpdCB0byB0aGUgZ2xvYmFsIGNvbnRhaW5lci5cbiAgICAgICAgICAgIGlmIChtb2R1bGUubWV0YWRhdGEuZ2xvYmFsKSB7XG4gICAgICAgICAgICAgICAgLy8gQmluZCBleHRlcm5hbCBwcm92aWRlcnMgdG8gdGhlIGdsb2JhbCBjb250YWluZXIsIHNvIHRoZXkgY2FuIGJlIGluamVjdGVkIGluIG90aGVyIG1vZHVsZXMuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgcHJvdmlkZXJdIG9mIG1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRQcm92aWRlcihwcm92aWRlciwgdGhpcy5nbG9iYWxBcHBDb250YWluZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1vZHVsZSBpcyBub3QgZ2xvYmFsLCB3ZSB3YW50IHRvIGJpbmQgaXQgdG8gaXRzIG93biBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdG9rZW4sIHByb3ZpZGVyXSBvZiBtb2R1bGUubWV0YWRhdGEuZXh0ZXJuYWxQcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kUHJvdmlkZXIocHJvdmlkZXIsIG1vZHVsZS5jb250YWluZXIpO1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUucGFyZW50Py5jb250YWluZXIuYmluZCh0b2tlbikudG9EeW5hbWljVmFsdWUoKCkgPT4gbW9kdWxlLmNvbnRhaW5lci5nZXQodG9rZW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbXBvcnRNb2R1bGUgb2YgbW9kdWxlLnJlcGV0aXRpdmVJbXBvcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3Rva2VuXSBvZiBpbXBvcnRNb2R1bGUubWV0YWRhdGEuZXh0ZXJuYWxQcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIuYmluZCh0b2tlbikudG9EeW5hbWljVmFsdWUoKCkgPT4gaW1wb3J0TW9kdWxlLmNvbnRhaW5lci5nZXQodG9rZW4pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmluZCBpbnRlcm5hbCBwcm92aWRlcnMuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBwcm92aWRlcl0gb2YgbW9kdWxlLm1ldGFkYXRhLmludGVybmFsUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kUHJvdmlkZXIocHJvdmlkZXIsIG1vZHVsZS5jb250YWluZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCaW5kIGNvbnRhaW5lciB0byBpdHNlbGYgc28gaXQgY2FuIGJlIGluamVjdGVkLlxuICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lci5iaW5kKE1PRFVMRV9DT05UQUlORVIpLnRvQ29uc3RhbnRWYWx1ZShtb2R1bGUuY29udGFpbmVyKTtcblxuICAgICAgICAgICAgLy8gQmluZCBjb250cm9sbGVycyB0byB0aGUgY29udGFpbmVyLlxuICAgICAgICAgICAgZm9yIChjb25zdCBjbGFzc1JlZiBvZiBtb2R1bGUubWV0YWRhdGEuY29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmJpbmQoY2xhc3NSZWYpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmluZCBzZXJ2aWNlcyB0byB0aGUgY29udGFpbmVyLlxuICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lci5iaW5kKFRJTUVSX1NFUlZJQ0UpLnRvKFRpbWVyU2VydmljZSkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKFxuICAgICAgICAgICAgICAgIGBNb2R1bGUgJHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gZGVwZW5kZW5jaWVzIGJpbmRlZCAoJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRQcm92aWRlcihwcm92aWRlcjogRXhjbHVkZTxQcm92aWRlciwgTmV3YWJsZT4sIGNvbnRhaW5lcjogQ29udGFpbmVyKSB7XG4gICAgICAgIGlmICgndXNlVmFsdWUnIGluIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb250YWluZXIuYmluZChwcm92aWRlci5wcm92aWRlKS50b0NvbnN0YW50VmFsdWUocHJvdmlkZXIudXNlVmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKCd1c2VGYWN0b3J5JyBpbiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IGNvbnRhaW5lci5iaW5kKHByb3ZpZGVyLnByb3ZpZGUpLnRvRHluYW1pY1ZhbHVlKChjdHgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBzID1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuaW5qZWN0Py5tYXAoKGRlcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGRlcCkgJiYgJ3Rva2VuJyBpbiBkZXAgJiYgJ29wdGlvbmFsJyBpbiBkZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmNvbnRhaW5lci5nZXQoZGVwLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcC5vcHRpb25hbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVzb2x2ZSBhIGRlcGVuZGVuY3kuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmNvbnRhaW5lci5nZXQoZGVwKTtcbiAgICAgICAgICAgICAgICAgICAgfSkgPz8gW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLnVzZUZhY3RvcnkoLi4uZGVwcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlci5zY29wZSA9PT0gJ3RyYW5zaWVudCcpIGJpbmRpbmcuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIuc2NvcGUgPT09ICdyZXF1ZXN0JykgYmluZGluZy5pblJlcXVlc3RTY29wZSgpO1xuICAgICAgICAgICAgZWxzZSBiaW5kaW5nLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICgndXNlQ2xhc3MnIGluIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gY29udGFpbmVyLmJpbmQocHJvdmlkZXIucHJvdmlkZSkudG8ocHJvdmlkZXIudXNlQ2xhc3MpO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnNjb3BlID09PSAndHJhbnNpZW50JykgYmluZGluZy5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci5zY29wZSA9PT0gJ3JlcXVlc3QnKSBiaW5kaW5nLmluUmVxdWVzdFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGJpbmRpbmcuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCd1c2VFeGlzdGluZycgaW4gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5iaW5kKHByb3ZpZGVyLnByb3ZpZGUpLnRvU2VydmljZShwcm92aWRlci51c2VFeGlzdGluZyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEeW5hbWljTW9kdWxlLCBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9jb250cm9sbGVyJztcbmltcG9ydCB7IE1vZHVsZSwgTW9kdWxlTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9tb2R1bGUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IFRyZWUsIFRyZWVOb2RlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVNZXRhZGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2R1bGVUcmVlU2Nhbm5lciB7XG4gICAgQGluamVjdChNb2R1bGVNZXRhZGF0YVJlYWRlcikgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVNZXRhZGF0YVJlYWRlcjogTW9kdWxlTWV0YWRhdGFSZWFkZXI7XG4gICAgQGluamVjdChDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIpIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbGxlck1ldGFkYXRhUmVhZGVyOiBDb250cm9sbGVyTWV0YWRhdGFSZWFkZXI7XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuXG4gICAgcHVibGljIGFzeW5jIHNjYW4oY2xhc3NSZWY6IE5ld2FibGUgfCBEeW5hbWljTW9kdWxlIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPikge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBSZWFkIG1vZHVsZSBtZXRhZGF0YVxuICAgICAgICBjb25zdCBtb2R1bGVNZXRhZGF0YSA9IGF3YWl0IHRoaXMubW9kdWxlTWV0YWRhdGFSZWFkZXIucmVhZChjbGFzc1JlZik7XG4gICAgICAgIC8vIENyZWF0ZSBtb2R1bGUgaW5zdGFuY2UgYW5kIHNldCBtZXRhZGF0YSB0byBpdFxuICAgICAgICBjb25zdCBtb2R1bGUgPSBuZXcgTW9kdWxlKCk7XG4gICAgICAgIG1vZHVsZS5tZXRhZGF0YSA9IG1vZHVsZU1ldGFkYXRhO1xuICAgICAgICAvLyBMb2cgbW9kdWxlIGluZm9cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgTW9kdWxlICR7bW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmLm5hbWV9IHNjYW5uZWQgKCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgLy8gU2NhbiBjb250cm9sbGVycyBpbiBtb2R1bGVcbiAgICAgICAgYXdhaXQgdGhpcy5zY2FuQ29udHJvbGxlcnMobW9kdWxlKTtcbiAgICAgICAgLy8gU2NhbiBjb250cm9sbGVycyBpbiBtb2R1bGVcbiAgICAgICAgY29uc3QgbW9kdWxlVHJlZSA9IG5ldyBUcmVlKG1vZHVsZSk7XG4gICAgICAgIGNvbnN0IHNjYW5uZWRNb2R1bGVzID0gbmV3IE1hcDxOZXdhYmxlIHwgRHluYW1pY01vZHVsZSB8IFByb21pc2U8RHluYW1pY01vZHVsZT4sIE1vZHVsZT4oKTtcbiAgICAgICAgc2Nhbm5lZE1vZHVsZXMuc2V0KGNsYXNzUmVmLCBtb2R1bGUpO1xuICAgICAgICAvLyBTY2FuIGltcG9ydGVkIG1vZHVsZXNcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRlZE1vZHVsZSBvZiBtb2R1bGVNZXRhZGF0YS5pbXBvcnRzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNjYW5Nb2R1bGVzKG1vZHVsZVRyZWUucm9vdCwgaW1wb3J0ZWRNb2R1bGUsIHNjYW5uZWRNb2R1bGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlVHJlZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNjYW5Nb2R1bGVzKFxuICAgICAgICBwYXJlbnROb2RlOiBUcmVlTm9kZTxNb2R1bGU+LFxuICAgICAgICBjbGFzc1JlZjogTmV3YWJsZSB8IER5bmFtaWNNb2R1bGUgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+LFxuICAgICAgICBzY2FubmVkTW9kdWxlcyA9IG5ldyBNYXA8TmV3YWJsZSB8IER5bmFtaWNNb2R1bGUgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+LCBNb2R1bGU+KCksXG4gICAgKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG1vZHVsZSBpcyBhbHJlYWR5IGltcG9ydGVkXG4gICAgICAgIGNvbnN0IHNjYW5uZWRNb2R1bGUgPSBzY2FubmVkTW9kdWxlcy5nZXQoY2xhc3NSZWYpO1xuICAgICAgICBpZiAoIWlzTmlsKHNjYW5uZWRNb2R1bGUpKSB7XG4gICAgICAgICAgICBwYXJlbnROb2RlLnZhbHVlLnJlcGV0aXRpdmVJbXBvcnRzLmFkZChzY2FubmVkTW9kdWxlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gUmVhZCBtb2R1bGUgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgbW9kdWxlTWV0YWRhdGEgPSBhd2FpdCB0aGlzLm1vZHVsZU1ldGFkYXRhUmVhZGVyLnJlYWQoY2xhc3NSZWYpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgICAgICAgdGhpcy5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShwYXJlbnROb2RlLnZhbHVlLm1ldGFkYXRhLCBtb2R1bGVNZXRhZGF0YSk7XG4gICAgICAgIC8vIENyZWF0ZSBtb2R1bGUgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbW9kdWxlID0gbmV3IE1vZHVsZSgpO1xuICAgICAgICBtb2R1bGUubWV0YWRhdGEgPSBtb2R1bGVNZXRhZGF0YTtcbiAgICAgICAgbW9kdWxlLnBhcmVudCA9IHBhcmVudE5vZGUudmFsdWU7XG4gICAgICAgIC8vIExvZyBtb2R1bGUgaW5mb1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKGBNb2R1bGUgJHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gc2Nhbm5lZCAoJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zKWApO1xuICAgICAgICAvLyBTY2FuIGNvbnRyb2xsZXJzIGluIG1vZHVsZVxuICAgICAgICBhd2FpdCB0aGlzLnNjYW5Db250cm9sbGVycyhtb2R1bGUpO1xuICAgICAgICAvLyBBZGQgbW9kdWxlIHRvIHRyZWVcbiAgICAgICAgY29uc3QgdHJlZU5vZGUgPSBuZXcgVHJlZU5vZGUobW9kdWxlKTtcbiAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZCh0cmVlTm9kZSk7XG4gICAgICAgIC8vIEFkZCBtb2R1bGUgdG8gaW1wb3J0ZWQgbW9kdWxlcyBzZXQgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBzY2FubmluZ1xuICAgICAgICBzY2FubmVkTW9kdWxlcy5zZXQoY2xhc3NSZWYsIG1vZHVsZSk7XG4gICAgICAgIC8vIFNjYW4gaW1wb3J0ZWQgbW9kdWxlcyByZWN1cnNpdmVseVxuICAgICAgICBmb3IgKGNvbnN0IGltcG9ydE1vZHVsZSBvZiBtb2R1bGVNZXRhZGF0YS5pbXBvcnRzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNjYW5Nb2R1bGVzKHRyZWVOb2RlLCBpbXBvcnRNb2R1bGUsIHNjYW5uZWRNb2R1bGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2NhbkNvbnRyb2xsZXJzKG1vZHVsZTogTW9kdWxlKSB7XG4gICAgICAgIC8vIFNjYW4gY29udHJvbGxlcnNcbiAgICAgICAgZm9yIChjb25zdCBjbGFzc1JlZiBvZiBtb2R1bGUubWV0YWRhdGEuY29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyTWV0YWRhdGEgPSBhd2FpdCB0aGlzLmNvbnRyb2xsZXJNZXRhZGF0YVJlYWRlci5yZWFkKGNsYXNzUmVmKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICAgICAgICAgICAgY29udHJvbGxlci5tZXRhZGF0YSA9IGNvbnRyb2xsZXJNZXRhZGF0YTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIub3duZXIgPSBtb2R1bGU7XG4gICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMucHVzaChjb250cm9sbGVyKTtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgQ29udHJvbGxlciAke2NsYXNzUmVmLm5hbWV9IHNjYW5uZWQgKCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGFyZW50TWV0YWRhdGE6IE1vZHVsZU1ldGFkYXRhLCBtb2R1bGVNZXRhZGF0YTogTW9kdWxlTWV0YWRhdGEpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcGFyZW50IG1vZHVsZSBpcyBpbXBvcnRlZCBpbiBtb2R1bGVcbiAgICAgICAgaWYgKG1vZHVsZU1ldGFkYXRhLmltcG9ydHMuaW5jbHVkZXMocGFyZW50TWV0YWRhdGEuY2xhc3NSZWYpKSB7XG4gICAgICAgICAgICAvLyB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjYW5uaW5nIHRoZSBtb2R1bGUgdHJlZS4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQ2lyY3VsYXJEZXBlbmRlbmN5RGV0ZWN0ZWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2NyaXB0RXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBTY3JpcHRFdmVudCBpbXBsZW1lbnRzIFNjcmlwdEV2ZW50SGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCxcbiAgICApIHt9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBtcC5ldmVudHMucmVtb3ZlKHRoaXMuZXZlbnROYW1lLCB0aGlzLmxpc3RlbmVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFdmVudEVtbWl0ZXIsIFNjcmlwdEV2ZW50SGFuZGxlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmFnZU1QU2NyaXB0RXZlbnQgfSBmcm9tICcuL3JhZ2VtcC1zY3JpcHQtZXZlbnQtaGFuZGxlcic7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBFdmVudEVtbWl0ZXIgaW1wbGVtZW50cyBFdmVudEVtbWl0ZXIge1xuICAgIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIG1wLmV2ZW50cy5jYWxsKGV2ZW50TmFtZSwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgb24oZXZlbnROYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiBTY3JpcHRFdmVudEhhbmRsZXIge1xuICAgICAgICBtcC5ldmVudHMuYWRkKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gbmV3IFJhZ2VNUFNjcmlwdEV2ZW50KGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIG9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiBTY3JpcHRFdmVudEhhbmRsZXIge1xuICAgICAgICBjb25zdCBvbmNlV3JhcHBlciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgbXAuZXZlbnRzLnJlbW92ZShldmVudE5hbWUsIG9uY2VXcmFwcGVyKTtcbiAgICAgICAgICAgIGxpc3RlbmVyKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBtcC5ldmVudHMuYWRkKGV2ZW50TmFtZSwgb25jZVdyYXBwZXIpO1xuICAgICAgICByZXR1cm4gbmV3IFJhZ2VNUFNjcmlwdEV2ZW50KGV2ZW50TmFtZSwgb25jZVdyYXBwZXIpO1xuICAgIH1cblxuICAgIG9mZihldmVudE5hbWU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBtcC5ldmVudHMucmVtb3ZlKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpcGxheWVyVGltZXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNsYXNzIFJhZ2VNUFRpbWVyIGltcGxlbWVudHMgTXVsdGlwbGF5ZXJUaW1lciB7XG4gICAgcHVibGljIGxhc3RUaWNrID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGlkOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBpbnRlcnZhbDogbnVtYmVyID0gMCxcbiAgICAgICAgcHVibGljIG9uY2U6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyBjYWxsYmFjazogRnVuY3Rpb24sXG4gICAgICAgIHByaXZhdGUgY2xlYXJUaW1lcjogRnVuY3Rpb24sXG4gICAgKSB7fVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlwbGF5ZXJUaW1lciwgTXVsdGlwbGF5ZXJUaW1lcnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJhZ2VNUFRpbWVyIH0gZnJvbSAnLi9yYWdlbXAtdGltZXInO1xuXG5leHBvcnQgY2xhc3MgUmFnZU1QVGltZXJzIGltcGxlbWVudHMgTXVsdGlwbGF5ZXJUaW1lcnMge1xuICAgIHByaXZhdGUgdGltZXJJbmNyZW1lbnRlcjogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHRpbWVycyA9IG5ldyBNYXA8bnVtYmVyLCBNdWx0aXBsYXllclRpbWVyPigpO1xuICAgIHByaXZhdGUgZXZlcnlUaWNrSGFuZGxlcnMgPSBuZXcgTWFwPG51bWJlciwgeyBjYWxsYmFjazogRnVuY3Rpb247IGJvdW5kOiBGdW5jdGlvbiB9PigpO1xuICAgIHByaXZhdGUgaXNFdmVyeVRpY2tSdW5uaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBldmVyeVRpY2tNYWluSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgZ2V0IGFsbCgpOiBNdWx0aXBsYXllclRpbWVyW10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMudGltZXJzLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHdhcm5pbmdUaHJlc2hvbGQoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSB0aGlzIGZlYXR1cmVcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3YXJuaW5nVGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgdGhpcyBmZWF0dXJlXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgdGhpcyBmZWF0dXJlXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudChfdmFsdWU6IG51bWJlcikge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIHRoaXMgZmVhdHVyZVxuICAgIH1cblxuICAgIGdldEJ5SUQoaWQ6IG51bWJlcik6IE11bHRpcGxheWVyVGltZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnRpbWVycy5nZXQoaWQpO1xuICAgICAgICByZXR1cm4gdGltZXIgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRpbWVyKFxuICAgICAgICBjcmVhdGVUaW1lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBudW1iZXIsXG4gICAgICAgIGNsZWFyOiAoaWQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICAgICAgY2FsbGJhY2s6IEZ1bmN0aW9uLFxuICAgICAgICBpbnRlcnZhbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICBvbmNlOiBib29sZWFuLFxuICAgICAgICAuLi5hcmdzOiB1bmtub3duW11cbiAgICApIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tCaW5kID0gY2FsbGJhY2suYmluZCh0aGlzLCAuLi4oQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbXSkpO1xuICAgICAgICBjb25zdCB0aW1lcklkID0gdHlwZW9mIGludGVydmFsID09PSAnbnVtYmVyJyA/IGNyZWF0ZVRpbWVyKGNhbGxiYWNrQmluZCwgaW50ZXJ2YWwpIDogY3JlYXRlVGltZXIoY2FsbGJhY2tCaW5kKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpbWVySW5jcmVtZW50ZXIrKztcblxuICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgaW50ZXJ2YWwgPz8gMCwgb25jZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhcih0aW1lcklkKTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVycy5zZXQoaWQsIHJhZ2VNUFRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgIH1cblxuICAgIHNldEludGVydmFsKGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZTogbnVtYmVyLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGltZXIoXG4gICAgICAgICAgICAoY2I6IEZ1bmN0aW9uLCBpbnRlcnZhbDogbnVtYmVyKSA9PiBzZXRJbnRlcnZhbChjYiBhcyAoKSA9PiB2b2lkLCBpbnRlcnZhbCkgYXMgdW5rbm93biBhcyBudW1iZXIsXG4gICAgICAgICAgICAoaWQ6IG51bWJlcikgPT4gY2xlYXJJbnRlcnZhbChpZCksXG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIHRpbWUsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZTogbnVtYmVyLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpbWVySW5jcmVtZW50ZXIrKztcbiAgICAgICAgY29uc3QgY2FsbGJhY2tCaW5kID0gY2FsbGJhY2suYmluZCh0aGlzLCAuLi4oQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbXSkpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrQmluZCgpO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgfSwgdGltZSkgYXMgdW5rbm93biBhcyBudW1iZXI7XG5cbiAgICAgICAgY29uc3QgcmFnZU1QVGltZXIgPSBuZXcgUmFnZU1QVGltZXIoaWQsIHRpbWUsIHRydWUsIGNhbGxiYWNrQmluZCwgKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGltZXJzLnNldChpZCwgcmFnZU1QVGltZXIpO1xuICAgICAgICByZXR1cm4gcmFnZU1QVGltZXI7XG4gICAgfVxuXG4gICAgZXZlcnlUaWNrKGNhbGxiYWNrOiBGdW5jdGlvbiwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy50aW1lckluY3JlbWVudGVyKys7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrQmluZCA9IGNhbGxiYWNrLmJpbmQodGhpcywgLi4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pKTtcblxuICAgICAgICB0aGlzLmV2ZXJ5VGlja0hhbmRsZXJzLnNldChpZCwgeyBjYWxsYmFjaywgYm91bmQ6IGNhbGxiYWNrQmluZCB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvbiBjbGllbnQtc2lkZSAocmVuZGVyIGV2ZW50IGV4aXN0cykgb3Igc2VydmVyLXNpZGVcbiAgICAgICAgY29uc3QgaXNDbGllbnRTaWRlID0gdHlwZW9mIG1wICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgKG1wIGFzIGFueSkuYnJvd3NlcnMgIT09ICd1bmRlZmluZWQnO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSB0aWNrIGxvb3AgaWYgbm90IGFscmVhZHkgcnVubmluZ1xuICAgICAgICBpZiAoIXRoaXMuaXNFdmVyeVRpY2tSdW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmlzRXZlcnlUaWNrUnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChpc0NsaWVudFNpZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDbGllbnQtc2lkZTogdXNlIHJlbmRlciBldmVudCBmb3IgZnJhbWUtYWNjdXJhdGUgdGlja2luZ1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlcnlUaWNrTWFpbkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgWywgaGFuZGxlcl0gb2YgdGhpcy5ldmVyeVRpY2tIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmJvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAuY29uc29sZS5sb2dFcnJvcihgRXJyb3IgaW4gZXZlcnlUaWNrIGhhbmRsZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbXAuZXZlbnRzLmFkZCgncmVuZGVyJywgdGhpcy5ldmVyeVRpY2tNYWluSGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNlcnZlci1zaWRlOiB1c2Ugc2V0SW50ZXJ2YWwgd2l0aCBtaW5pbWFsIGRlbGF5IGFzIGFwcHJveGltYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnZhbEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgWywgaGFuZGxlcl0gb2YgdGhpcy5ldmVyeVRpY2tIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmJvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAuY29uc29sZS5sb2dFcnJvcihgRXJyb3IgaW4gZXZlcnlUaWNrIGhhbmRsZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KS5fZXZlcnlUaWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChpbnRlcnZhbEhhbmRsZXIsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFnZU1QVGltZXIgPSBuZXcgUmFnZU1QVGltZXIoaWQsIDAsIGZhbHNlLCBjYWxsYmFja0JpbmQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXZlcnlUaWNrSGFuZGxlcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgdGhlIHRpY2sgbG9vcCBpZiBubyBtb3JlIGhhbmRsZXJzXG4gICAgICAgICAgICBpZiAodGhpcy5ldmVyeVRpY2tIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2xpZW50U2lkZSAmJiB0aGlzLmV2ZXJ5VGlja01haW5IYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG1wLmV2ZW50cy5yZW1vdmUoJ3JlbmRlcicsIHRoaXMuZXZlcnlUaWNrTWFpbkhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZXJ5VGlja01haW5IYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzIGFzIGFueSkuX2V2ZXJ5VGlja0ludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoKHRoaXMgYXMgYW55KS5fZXZlcnlUaWNrSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLl9ldmVyeVRpY2tJbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNFdmVyeVRpY2tSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVycy5zZXQoaWQsIHJhZ2VNUFRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgIH1cblxuICAgIG5leHRUaWNrKGNhbGxiYWNrOiBGdW5jdGlvbiwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy50aW1lckluY3JlbWVudGVyKys7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrQmluZCA9IGNhbGxiYWNrLmJpbmQodGhpcywgLi4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvbiBjbGllbnQtc2lkZSAocmVuZGVyIGV2ZW50IGV4aXN0cykgb3Igc2VydmVyLXNpZGVcbiAgICAgICAgY29uc3QgaXNDbGllbnRTaWRlID0gdHlwZW9mIG1wICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgKG1wIGFzIGFueSkuYnJvd3NlcnMgIT09ICd1bmRlZmluZWQnO1xuXG4gICAgICAgIGxldCB0aW1lcklkOiBhbnk7XG5cbiAgICAgICAgaWYgKGlzQ2xpZW50U2lkZSkge1xuICAgICAgICAgICAgLy8gQ2xpZW50LXNpZGU6IHVzZSByZW5kZXIgZXZlbnQgZm9yIG5leHQgZnJhbWVcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tCaW5kKCk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgbXAuZXZlbnRzLnJlbW92ZSgncmVuZGVyJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1wLmV2ZW50cy5hZGQoJ3JlbmRlcicsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgMCwgdHJ1ZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbXAuZXZlbnRzLnJlbW92ZSgncmVuZGVyJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50aW1lcnMuc2V0KGlkLCByYWdlTVBUaW1lcik7XG4gICAgICAgICAgICByZXR1cm4gcmFnZU1QVGltZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXJ2ZXItc2lkZTogdXNlIHNldEltbWVkaWF0ZSBvciBzZXRUaW1lb3V0KDApIGZvciBuZXh0IHRpY2tcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0JpbmQoKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgICAgICBjb25zdCByYWdlTVBUaW1lciA9IG5ldyBSYWdlTVBUaW1lcihpZCwgMCwgdHJ1ZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLnNldChpZCwgcmFnZU1QVGltZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGltZShfbmFtZT86IHN0cmluZykge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIGNvbnNvbGUudGltZSBlcXVpdmFsZW50XG4gICAgICAgIC8vIENvdWxkIGltcGxlbWVudCBjdXN0b20gdGltaW5nIGlmIG5lZWRlZFxuICAgIH1cblxuICAgIHRpbWVFbmQoX25hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSBjb25zb2xlLnRpbWVFbmQgZXF1aXZhbGVudFxuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEV2ZW50RW1taXRlciwgTXVsdGlwbGF5ZXJTZXJ2aWNlLCBNdWx0aXBsYXllclRpbWVycyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmFnZU1QRXZlbnRFbW1pdGVyIH0gZnJvbSAnLi9yYWdlbXAtZXZlbnQtZW1taXRlcic7XG5pbXBvcnQgeyBSYWdlTVBUaW1lcnMgfSBmcm9tICcuL3JhZ2VtcC10aW1lcnMnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBNdWx0aXBsYXllclNlcnZpY2UgaW1wbGVtZW50cyBNdWx0aXBsYXllclNlcnZpY2Uge1xuICAgIHJlYWRvbmx5IFRpbWVyczogTXVsdGlwbGF5ZXJUaW1lcnM7XG4gICAgcmVhZG9ubHkgRXZlbnRzOiBFdmVudEVtbWl0ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5FdmVudHMgPSBuZXcgUmFnZU1QRXZlbnRFbW1pdGVyKCk7XG4gICAgICAgIHRoaXMuVGltZXJzID0gbmV3IFJhZ2VNUFRpbWVycygpO1xuICAgIH1cblxuICAgIHBhcnNlSW50ZXJuYWxBcmdzPFUgPSB1bmtub3duLCBUID0gdW5rbm93bj4oXG4gICAgICAgIC4uLmFyZ3M6IGFueVxuICAgICk6IHtcbiAgICAgICAgcGxheWVyPzogVTtcbiAgICAgICAgYm9keT86IFQ7XG4gICAgfSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IChpc09iamVjdChhcmdzWzBdKSA/IGFyZ3NbMF0gOiB1bmRlZmluZWQpIGFzIFU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICAgIGJvZHk6IGFyZ3MsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgbG9nKGFyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gW2FyZywgLi4uYXJnc10ubWFwKGEgPT5cbiAgICAgICAgICAgIHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGEpIDogU3RyaW5nKGEpXG4gICAgICAgICkuam9pbignICcpO1xuICAgICAgICBtcC5jb25zb2xlLmxvZ0luZm8obWVzc2FnZSk7XG4gICAgfVxuXG4gICAgbG9nRXJyb3IoYXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbYXJnLCAuLi5hcmdzXS5tYXAoYSA9PlxuICAgICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYSkgOiBTdHJpbmcoYSlcbiAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgIG1wLmNvbnNvbGUubG9nRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgbG9nV2FybmluZyhhcmc6IGFueSwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFthcmcsIC4uLmFyZ3NdLm1hcChhID0+XG4gICAgICAgICAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhKSA6IFN0cmluZyhhKVxuICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgbXAuY29uc29sZS5sb2dXYXJuaW5nKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGxvZ0RlYnVnKGFyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIGEgZGVkaWNhdGVkIGRlYnVnIGxvZywgdXNlIGluZm9cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFthcmcsIC4uLmFyZ3NdLm1hcChhID0+XG4gICAgICAgICAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhKSA6IFN0cmluZyhhKVxuICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgbXAuY29uc29sZS5sb2dJbmZvKGBbREVCVUddICR7bWVzc2FnZX1gKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgdmFsaWRhdGVFcnJvckZpbHRlciwgdmFsaWRhdGVHdWFyZCwgdmFsaWRhdGVJbnRlcmNlcHRvciwgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vc2NoZW1hcy9ldmVudHMnO1xuaW1wb3J0IHtcbiAgICBJTlRFUk5BTF9BUFBfQ09OVEFJTkVSLFxuICAgIEdMT0JBTF9FUlJPUl9GSUxURVJTLFxuICAgIEdMT0JBTF9HVUFSRFMsXG4gICAgR0xPQkFMX0lOVEVSQ0VQVE9SUyxcbiAgICBHTE9CQUxfUElQRVMsXG4gICAgRU5BQkxFX1NIVVRET1dOX0hPT0tTLFxuICAgIFBMVUdJTlMsXG4gICAgR0xPQkFMX0FQUF9DT05UQUlORVIsXG4gICAgQVBQX0VOVklST01FTlQsXG4gICAgTUFOR09fUkVRVUVTVF9GQUNUT1JZLFxuICAgIE1BTkdPX1JFU1BPTlNFX0ZBQ1RPUlksXG4gICAgRVhFQ1VUSU9OX0NPTlRFWFRfRkFDVE9SWSxcbiAgICBDT05UQUlORVJfT1BUSU9OUyxcbiAgICBNVUxUSVBMQVlFUl9TRVJWSUNFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBpbmplY3QsIENvbnRhaW5lciwgaW5qZWN0YWJsZSwgdHlwZSBpbnRlcmZhY2VzIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcbmltcG9ydCB0eXBlIHsgRXJyb3JGaWx0ZXIsIEd1YXJkLCBJbnRlcmNlcHRvciwgTWFuZ29QbHVnaW4sIE11bHRpcGxheWVyU2VydmljZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gICAgQ29udHJvbGxlckV2ZW50SGFuZGxlcixcbiAgICBDb250cm9sbGVyRmxvd0hhbmRsZXIsXG4gICAgQ29udHJvbGxlck1ldGFkYXRhUmVhZGVyLFxuICAgIENvbnRyb2xsZXJSUENIYW5kbGVyLFxuICAgIFBpcGVsaW5lSGFuZGxlcixcbn0gZnJvbSAnLi9jb250cm9sbGVyJztcbmltcG9ydCB7IE1vZHVsZSwgTW9kdWxlTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuL21vZHVsZSc7XG5pbXBvcnQgeyBBcHBSdW50aW1lLCBNb2R1bGVEZXBlbmRlbmN5QmluZGVyLCBNb2R1bGVUcmVlU2Nhbm5lciB9IGZyb20gJy4vbW9kdWxlLXRyZWUnO1xuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gJy4vY29udHJvbGxlcic7XG5pbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0QmFzZSwgTWFuZ29SZXF1ZXN0QmFzZSwgTWFuZ29SZXNwb25zZUJhc2UgfSBmcm9tICcuL3BpcGVsaW5lJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IFJFRkxFQ1RPUl9TRVJWSUNFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFJlZmxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBCdWlsZGVyPEcgZXh0ZW5kcyBHdWFyZCA9IEd1YXJkLCBJIGV4dGVuZHMgSW50ZXJjZXB0b3IgPSBJbnRlcmNlcHRvciwgRUYgZXh0ZW5kcyBFcnJvckZpbHRlciA9IEVycm9yRmlsdGVyPiB7XG4gICAgQGluamVjdChBUFBfRU5WSVJPTUVOVCkgcHJvdGVjdGVkIHJlYWRvbmx5IGVudmlyb21lbnQ6IHN0cmluZztcbiAgICBAaW5qZWN0KElOVEVSTkFMX0FQUF9DT05UQUlORVIpIHByb3RlY3RlZCByZWFkb25seSBpbnRlcm5hbEFwcENvbnRhaW5lcjogQ29udGFpbmVyO1xuICAgIEBpbmplY3QoTVVMVElQTEFZRVJfU0VSVklDRSkgcHJvdGVjdGVkIHJlYWRvbmx5IG11bHRpcGxheWVyU2VydmljZTogTXVsdGlwbGF5ZXJTZXJ2aWNlO1xuICAgIEBpbmplY3QoUExVR0lOUykgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbnM6IE5ld2FibGU8TWFuZ29QbHVnaW4+W107XG5cbiAgICBwcml2YXRlIGdsb2JhbENvbnRhaW5lck9wdGlvbnM6IGludGVyZmFjZXMuQ29udGFpbmVyT3B0aW9ucyA9IHt9O1xuXG4gICAgcHVibGljIHVzZUdsb2JhbEd1YXJkcyguLi5ndWFyZHM6IChOZXdhYmxlPEc+IHwgRylbXSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRHdWFyZHM6IChOZXdhYmxlPEc+IHwgRylbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUd1YXJkKGd1YXJkKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRHdWFyZHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0dVQVJEUykudG9Db25zdGFudFZhbHVlKHZhbGlkYXRlZEd1YXJkcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJPiB8IEkpW10pIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkSW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJPiB8IEkpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkSW50ZXJjZXB0b3JzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9JTlRFUkNFUFRPUlMpLnRvQ29uc3RhbnRWYWx1ZSh2YWxpZGF0ZWRJbnRlcmNlcHRvcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlR2xvYmFsUGlwZXMoLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX1BJUEVTKS50b0NvbnN0YW50VmFsdWUodmFsaWRhdGVkUGlwZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlR2xvYmFsRmlsdGVycyguLi5maWx0ZXJzOiAoTmV3YWJsZTxFRj4gfCBFRilbXSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGSWx0ZXJzOiAoTmV3YWJsZTxFRj4gfCBFRilbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlRXJyb3JGaWx0ZXIoZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRGSWx0ZXJzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9FUlJPUl9GSUxURVJTKS50b0NvbnN0YW50VmFsdWUodmFsaWRhdGVkRklsdGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB1c2VQbHVnaW5zKC4uLnBsdWdpbnM6IE5ld2FibGU8TWFuZ29QbHVnaW4+W10pIHtcbiAgICAgICAgcGx1Z2lucy5mb3JFYWNoKChwKSA9PiB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQocCkudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpKTtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxQbHVnaW5zID0gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQ8TmV3YWJsZTxNYW5nb1BsdWdpbj5bXT4oUExVR0lOUyk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIucmViaW5kKFBMVUdJTlMpLnRvQ29uc3RhbnRWYWx1ZShbLi4uaW50ZXJuYWxQbHVnaW5zLCAuLi5wbHVnaW5zXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmFibGVTaHV0ZG93bkhvb2tzKCkge1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoRU5BQkxFX1NIVVRET1dOX0hPT0tTKS50b0NvbnN0YW50VmFsdWUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb250YWluZXJPcHRpb25zKG9wdGlvbnM6IGludGVyZmFjZXMuQ29udGFpbmVyT3B0aW9ucywgb25seUdsb2JhbCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29udGFpbmVyT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChvbmx5R2xvYmFsKSByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENPTlRBSU5FUl9PUFRJT05TKS50b0NvbnN0YW50VmFsdWUob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsQXBwQ29udGFpbmVyID0gbmV3IENvbnRhaW5lcih0aGlzLmdsb2JhbENvbnRhaW5lck9wdGlvbnMpO1xuICAgICAgICAvLyBHTG9iYWwgc2VydmljZSBiaW5kaW5nc1xuICAgICAgICBnbG9iYWxBcHBDb250YWluZXIuYmluZChSRUZMRUNUT1JfU0VSVklDRSkudG9Db25zdGFudFZhbHVlKFJlZmxlY3RvclNlcnZpY2UpO1xuICAgICAgICBnbG9iYWxBcHBDb250YWluZXIuYmluZChSZWZsZWN0b3JTZXJ2aWNlKS50b1NlcnZpY2UoUkVGTEVDVE9SX1NFUlZJQ0UpO1xuXG4gICAgICAgIC8vIE11bHRpcGxheWVyIHNlcnZpY2UgYmluZGluZ3NcbiAgICAgICAgZ2xvYmFsQXBwQ29udGFpbmVyLmJpbmQoTVVMVElQTEFZRVJfU0VSVklDRSkudG9Db25zdGFudFZhbHVlKHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlKTtcbiBcbiAgICAgICAgLy8gQXBwIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChBcHApLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9BUFBfQ09OVEFJTkVSKS50b0NvbnN0YW50VmFsdWUoZ2xvYmFsQXBwQ29udGFpbmVyKTtcblxuICAgICAgICAvLyBNb2R1bGUgdHJlZSBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTW9kdWxlVHJlZVNjYW5uZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1vZHVsZURlcGVuZGVuY3lCaW5kZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEFwcFJ1bnRpbWUpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgICAgICAvLyBBcHAgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKFBpcGVsaW5lSGFuZGxlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgIC8vIE1vZHVsZSBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTW9kdWxlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNb2R1bGVNZXRhZGF0YVJlYWRlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgIC8vIENvbnRyb2xsZXIgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENvbnRyb2xsZXIpLnRvU2VsZigpLmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENvbnRyb2xsZXJNZXRhZGF0YVJlYWRlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQ29udHJvbGxlckZsb3dIYW5kbGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDb250cm9sbGVyRXZlbnRIYW5kbGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDb250cm9sbGVyUlBDSGFuZGxlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgIC8vIE1hbmdvIFJlcXVlc3QgYW5kIFJlc3BvbnNlIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNYW5nb1JlcXVlc3RCYXNlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNQU5HT19SRVFVRVNUX0ZBQ1RPUlkpLnRvRmFjdG9yeSgoY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChib2R5OiB1bmtub3duLCBwbGF5ZXI6IFBsYXllck1wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGNvbnRleHQuY29udGFpbmVyLmdldChNYW5nb1JlcXVlc3RCYXNlKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LiRib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LiRwbGF5ZXIgPSBwbGF5ZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1hbmdvUmVzcG9uc2VCYXNlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNQU5HT19SRVNQT05TRV9GQUNUT1JZKS50b0ZhY3RvcnkoKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbmVyLmdldChNYW5nb1Jlc3BvbnNlQmFzZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEV4ZWN1dGlvbkNvbnRleHRCYXNlKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChFWEVDVVRJT05fQ09OVEVYVF9GQUNUT1JZKS50b0ZhY3RvcnkoKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdHlwZTogRXhlY3V0aW9uQ29udGV4dFR5cGUsXG4gICAgICAgICAgICAgICAgY2xhc3NSZWY6IE5ld2FibGUsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogTWFuZ29SZXF1ZXN0QmFzZSxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogTWFuZ29SZXNwb25zZUJhc2UsXG4gICAgICAgICAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGNvbnRleHQuY29udGFpbmVyLmdldChFeGVjdXRpb25Db250ZXh0QmFzZSk7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kdHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kcmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiRoYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiRjbGFzc1JlZiA9IGNsYXNzUmVmO1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuJG5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRpb25Db250ZXh0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGx1Z2lucyBiaW5kaW5nc1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChwbHVnaW4pLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQocGx1Z2luKTtcbiAgICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2Uub25CdWlsZCkgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCBwbHVnaW5JbnN0YW5jZS5vbkJ1aWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuaXNCb3VuZChHTE9CQUxfR1VBUkRTKSkgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9HVUFSRFMpLnRvQ29uc3RhbnRWYWx1ZShbXSk7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5pc0JvdW5kKEdMT0JBTF9JTlRFUkNFUFRPUlMpKVxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9JTlRFUkNFUFRPUlMpLnRvQ29uc3RhbnRWYWx1ZShbXSk7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5pc0JvdW5kKEdMT0JBTF9QSVBFUykpIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfUElQRVMpLnRvQ29uc3RhbnRWYWx1ZShbXSk7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5pc0JvdW5kKEdMT0JBTF9FUlJPUl9GSUxURVJTKSlcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfRVJST1JfRklMVEVSUykudG9Db25zdGFudFZhbHVlKFtdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQoQXBwKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ29udGFpbmVyLCBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgTW9kdWxlRGVwZW5kZW5jeUJpbmRlciwgTW9kdWxlVHJlZVNjYW5uZXIgfSBmcm9tICcuL21vZHVsZS10cmVlJztcbmltcG9ydCB7IE1vZHVsZSB9IGZyb20gJy4vbW9kdWxlL21vZHVsZSc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBJTlRFUk5BTF9BUFBfQ09OVEFJTkVSLCBQTFVHSU5TIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXBwUnVudGltZSB9IGZyb20gJy4vbW9kdWxlLXRyZWUnO1xuaW1wb3J0IHR5cGUgeyBNYW5nb1BsdWdpbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb3JlL21hbmdvLXBsdWdpbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBUcmVlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB0eXBlIExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gICAgQGluamVjdChNb2R1bGVUcmVlU2Nhbm5lcikgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVUcmVlU2Nhbm5lcjogTW9kdWxlVHJlZVNjYW5uZXI7XG4gICAgQGluamVjdChNb2R1bGVEZXBlbmRlbmN5QmluZGVyKSBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZURlcGVuZGVuY3lCaW5kZXI6IE1vZHVsZURlcGVuZGVuY3lCaW5kZXI7XG4gICAgQGluamVjdChBcHBSdW50aW1lKSBwcml2YXRlIHJlYWRvbmx5IGFwcFJ1bnRpbWU6IEFwcFJ1bnRpbWU7XG4gICAgQGluamVjdChJTlRFUk5BTF9BUFBfQ09OVEFJTkVSKSBwcml2YXRlIHJlYWRvbmx5IGludGVybmFsQXBwQ29udGFpbmVyOiBDb250YWluZXI7XG4gICAgQGluamVjdChQTFVHSU5TKSBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbnM6IE5ld2FibGU8TWFuZ29QbHVnaW4+W107XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuICAgIHByaXZhdGUgbW9kdWxlVHJlZTogVHJlZTxNb2R1bGU+O1xuICAgIHByaXZhdGUgbG9hZGVkID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnQ8VD4ocm9vdE1vZHVsZTogTmV3YWJsZTxUPikge1xuICAgICAgICBpZiAodGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgc3RhcnRpbmcgdGhlIGFwcC4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXBwQWxyZWFkeUxvYWRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnU3RhcnRpbmcgYXBwLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYmVmb3JlU3RhcnQnKTtcblxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCdTY2FubmluZyBtb2R1bGUgdHJlZS4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZVNjYW4nKTtcbiAgICAgICAgdGhpcy5tb2R1bGVUcmVlID0gYXdhaXQgdGhpcy5tb2R1bGVUcmVlU2Nhbm5lci5zY2FuKHJvb3RNb2R1bGUpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyU2NhbicpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ0JpbmRpbmcgbW9kdWxlIGRlcGVuZGVuY2llcy4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZUJpbmQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2R1bGVEZXBlbmRlbmN5QmluZGVyLmJpbmQodGhpcy5tb2R1bGVUcmVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdhZnRlckJpbmQnKTtcblxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCdMb2FkaW5nIGFwcC4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZUxvYWQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHBSdW50aW1lLmJvb3QodGhpcy5tb2R1bGVUcmVlKTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyTG9hZCcpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ0FwcCBsb2FkZWQnKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyU3RhcnQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBzdG9wcGluZyB0aGUgYXBwLicpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BcHBOb3RMb2FkZWQpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYmVmb3JlU3RvcCcpO1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCdTdG9wcGluZyBhcHAuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHBSdW50aW1lLnNodXRkb3duKHRoaXMubW9kdWxlVHJlZSk7XG4gICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ0FwcCBzdG9wcGVkJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYWZ0ZXJTdG9wJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5QbHVnaW5NZXRob2RzKG1ldGhvZDoga2V5b2YgTWFuZ29QbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5nZXQocCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwbHVnaW5bbWV0aG9kXSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGx1Z2luW21ldGhvZF0hKCkpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBBUFBfRU5WSVJPTUVOVCwgSU5URVJOQUxfQVBQX0NPTlRBSU5FUiwgTVVMVElQTEFZRVJfU0VSVklDRSwgUExVR0lOUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWFuZ29QbHVnaW4sIE11bHRpcGxheWVyU2VydmljZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IEFwcEVudmlyb21lbnQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB0eXBlIHsgQXBwQnVpbGRlciB9IGZyb20gJy4vYXBwLWJ1aWxkZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwQnVpbGRlcjxUIGV4dGVuZHMgQXBwQnVpbGRlcj4oe1xuICAgIGVudmlyb21lbnQsXG4gICAgcGx1Z2lucyxcbiAgICBhcHBCdWlsZGVySW5oZXJpdCxcbiAgICBtdWx0aXBsYXllclNlcnZpY2UsXG59OiB7XG4gICAgZW52aXJvbWVudDogQXBwRW52aXJvbWVudDtcbiAgICBwbHVnaW5zOiBOZXdhYmxlPE1hbmdvUGx1Z2luPltdO1xuICAgIGFwcEJ1aWxkZXJJbmhlcml0OiBOZXdhYmxlPFQ+O1xuICAgIG11bHRpcGxheWVyU2VydmljZT86IE11bHRpcGxheWVyU2VydmljZTtcbn0pIHtcbiAgICBjb25zdCBpbnRlcm5hbEFwcENvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTtcblxuICAgIGlmIChtdWx0aXBsYXllclNlcnZpY2UpIGludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTVVMVElQTEFZRVJfU0VSVklDRSkudG9Db25zdGFudFZhbHVlKG11bHRpcGxheWVyU2VydmljZSk7XG4gICAgaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChJTlRFUk5BTF9BUFBfQ09OVEFJTkVSKS50b0NvbnN0YW50VmFsdWUoaW50ZXJuYWxBcHBDb250YWluZXIpO1xuICAgIGludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQVBQX0VOVklST01FTlQpLnRvQ29uc3RhbnRWYWx1ZShlbnZpcm9tZW50KTtcbiAgICBpbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKFBMVUdJTlMpLnRvQ29uc3RhbnRWYWx1ZShwbHVnaW5zKTtcbiAgICBpbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKGFwcEJ1aWxkZXJJbmhlcml0KS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICByZXR1cm4gaW50ZXJuYWxBcHBDb250YWluZXIuZ2V0KGFwcEJ1aWxkZXJJbmhlcml0KTtcbn1cbiIsICJpbXBvcnQgeyBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXksIHR5cGUgRXZlbnRNZXRhZGF0YSwgdHlwZSBQaXBlbGluZU1ldGFkYXRhIH0gZnJvbSAnLi4vYXBwJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKHR5cGU6IEV2ZW50TWV0YWRhdGFbJ3R5cGUnXSwgbmFtZT86IHN0cmluZywgd2ViVmlld0lkPzogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIDxNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbChuYW1lKSAmJiAhaXNTdHJpbmcobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRXZlbnROYW1lTXVzdEJlU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWUgPSBuYW1lID8/IG1ldGhvZDtcblxuICAgICAgICBjb25zdCBldmVudHMgPVxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YTxPbWl0PEV2ZW50TWV0YWRhdGEsICdwYXJhbXMnIHwga2V5b2YgUGlwZWxpbmVNZXRhZGF0YT5bXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJFdmVudHMsIHRhcmdldCkgPz8gW107XG5cbiAgICAgICAgaWYgKGV2ZW50cy5zb21lKChldmVudCkgPT4gZXZlbnQubWV0aG9kID09PSBtZXRob2QgJiYgZXZlbnQubmFtZSA9PT0gbmFtZSAmJiBldmVudC50eXBlID09PSB0eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FdmVudE5hbWVNdXN0QmVVbmlxdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxPbWl0PEV2ZW50TWV0YWRhdGEsICdwYXJhbXMnIHwga2V5b2YgUGlwZWxpbmVNZXRhZGF0YT5bXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlckV2ZW50cyxcbiAgICAgICAgICAgIFsuLi5ldmVudHMsIHsgbWV0aG9kLCBuYW1lLCB0eXBlLCB3ZWJWaWV3SWQgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uSW50ZXJuYWwoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uSW50ZXJuYWwnLCBldmVudE5hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbldlYlZpZXcoaWQ6IHN0cmluZyB8IG51bWJlciwgZXZlbnROYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbldlYlZpZXcnLCBldmVudE5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbicsIGV2ZW50TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uY2VJbnRlcm5hbChldmVudE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVFdmVudERlY29yYXRvcignb25jZUludGVybmFsJywgZXZlbnROYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25jZShldmVudE5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uY2UnLCBldmVudE5hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbmNlV2ViVmlldyhpZDogc3RyaW5nIHwgbnVtYmVyLCBldmVudE5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uY2VXZWJWaWV3JywgZXZlbnROYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBCb2R5KC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgWy4uLnBhcmFtcywgeyBpbmRleCwgbWV0aG9kLCBwaXBlczogdmFsaWRhdGVkUGlwZXMsIHR5cGU6IE1ldGhvZFBhcmFtVHlwZS5Cb2R5LCBkYXRhOiB1bmRlZmluZWQsIG1ldGF0eXBlIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmRleChrZXk6IG51bWJlciwgLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkge1xuICAgIHJldHVybiA8UGFyYW1ldGVyRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICghaXNOdW1iZXIoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5JbmRleEtleU11c3RCZU51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgIFsuLi5wYXJhbXMsIHsgaW5kZXgsIG1ldGhvZCwgcGlwZXM6IHZhbGlkYXRlZFBpcGVzLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuSW5kZXgsIGRhdGE6IGtleSwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIDxQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgIFsuLi5wYXJhbXMsIHsgaW5kZXgsIG1ldGhvZCwgdHlwZTogTWV0aG9kUGFyYW1UeXBlLlJlcXVlc3QsIGRhdGE6IHVuZGVmaW5lZCwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXEoKSB7XG4gICAgcmV0dXJuIFJlcXVlc3QoKTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNZXRob2RQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNZXRob2RQYXJhbVR5cGUgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gUGFyYW0oa2V5OiBzdHJpbmcsIC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWlzU3RyaW5nKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuUGFyYW1LZXlNdXN0QmVTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlUGlwZShwaXBlKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLCB0YXJnZXQsIG1ldGhvZCkgPz8gW107XG5cbiAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5NdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IG1ldGF0eXBlID0gQXJyYXkuaXNBcnJheShwYXJhbVR5cGVzKSA/IHBhcmFtVHlwZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICBbLi4ucGFyYW1zLCB7IGluZGV4LCBtZXRob2QsIGRhdGE6IGtleSwgcGlwZXM6IHZhbGlkYXRlZFBpcGVzLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuUGFyYW0sIG1ldGF0eXBlIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNwb25zZSgpIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgWy4uLnBhcmFtcywgeyBpbmRleCwgbWV0aG9kLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuUmVzcG9uc2UsIGRhdGE6IHVuZGVmaW5lZCwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXMoKSB7XG4gICAgcmV0dXJuIFJlc3BvbnNlKCk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBHdWFyZCB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlR3VhcmQgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZUd1YXJkcyguLi5ndWFyZHM6IChOZXdhYmxlPEd1YXJkPiB8IEd1YXJkKVtdKSB7XG4gICAgcmV0dXJuIDxDbGFzc0RlY29yYXRvciAmIE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q/OiBzdHJpbmcsIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkR3VhcmRzOiAoTmV3YWJsZTxHdWFyZD4gfCBHdWFyZClbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUd1YXJkKGd1YXJkKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRHdWFyZHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGd1YXJkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVHdWFyZFJlcXVpcmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWV0aG9kR3VhcmRzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEd1YXJkPltdPihDb3JlTWV0YWRhdGFLZXkuR3VhcmRzLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCkgfHwgW107XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5HdWFyZHMsIFsuLi52YWxpZGF0ZWRHdWFyZHMsIC4uLm1ldGhvZEd1YXJkc10sIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGd1YXJkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZUd1YXJkUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NHdWFyZHMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8R3VhcmQ+W10+KENvcmVNZXRhZGF0YUtleS5HdWFyZHMsIHRhcmdldCkgfHwgW107XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5Lkd1YXJkcywgWy4uLnZhbGlkYXRlZEd1YXJkcywgLi4uY2xhc3NHdWFyZHNdLCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgSW50ZXJjZXB0b3IgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUludGVyY2VwdG9yIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJbnRlcmNlcHRvcj4gfCBJbnRlcmNlcHRvcilbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEludGVyY2VwdG9yczogKE5ld2FibGU8SW50ZXJjZXB0b3I+IHwgSW50ZXJjZXB0b3IpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkSW50ZXJjZXB0b3JzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05pbChkZXNjcmlwdG9yKSAmJiAhaXNOaWwoZGVzY3JpcHRvci52YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lSW50ZXJjZXB0b3JSZXF1aXJlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZEludGVyY2VwdG9ycyA9XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEludGVyY2VwdG9yPltdPihDb3JlTWV0YWRhdGFLZXkuSW50ZXJjZXB0b3JzLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCkgfHwgW107XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5JbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgWy4uLnZhbGlkYXRlZEludGVyY2VwdG9ycywgLi4ubWV0aG9kSW50ZXJjZXB0b3JzXSxcbiAgICAgICAgICAgICAgICB0YXJnZXQuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZUludGVyY2VwdG9yUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NJbnRlcmNlcHRvcnMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8SW50ZXJjZXB0b3I+W10+KENvcmVNZXRhZGF0YUtleS5JbnRlcmNlcHRvcnMsIHRhcmdldCkgfHwgW107XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkludGVyY2VwdG9ycywgWy4uLnZhbGlkYXRlZEludGVyY2VwdG9ycywgLi4uY2xhc3NJbnRlcmNlcHRvcnNdLCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VQaXBlcyguLi5waXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdKSB7XG4gICAgcmV0dXJuIDxDbGFzc0RlY29yYXRvciAmIE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q/OiBzdHJpbmcsIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05pbChkZXNjcmlwdG9yKSAmJiAhaXNOaWwoZGVzY3JpcHRvci52YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChwaXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVQaXBlUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RQaXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxQaXBlPltdPihDb3JlTWV0YWRhdGFLZXkuUGlwZXMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LlBpcGVzLCBbLi4udmFsaWRhdGVkUGlwZXMsIC4uLm1ldGhvZFBpcGVzXSwgdGFyZ2V0LmNvbnN0cnVjdG9yLCBtZXRob2QpO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVQaXBlUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NQaXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxQaXBlPltdPihDb3JlTWV0YWRhdGFLZXkuUGlwZXMsIHRhcmdldCkgfHwgW107XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LlBpcGVzLCBbLi4udmFsaWRhdGVkUGlwZXMsIC4uLmNsYXNzUGlwZXNdLCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGlzTmlsLCBpc051bWJlciwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXksIHR5cGUgUGlwZWxpbmVNZXRhZGF0YSwgdHlwZSBSUENNZXRhZGF0YSB9IGZyb20gJy4uL2FwcCc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSUENEZWNvcmF0b3IodHlwZTogUlBDTWV0YWRhdGFbJ3R5cGUnXSwgbmFtZT86IHN0cmluZywgd2ViVmlld0lkPzogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIDxNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbCh3ZWJWaWV3SWQpICYmICFpc1N0cmluZyh3ZWJWaWV3SWQpICYmICFpc051bWJlcih3ZWJWaWV3SWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLldlYlZpZXdJZE11c3RCZVN0cmluZ09yTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOaWwobmFtZSkgJiYgIWlzU3RyaW5nKG5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLlJQQ05hbWVNdXN0QmVTdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmFtZSA9IG5hbWUgPz8gbWV0aG9kO1xuXG4gICAgICAgIGNvbnN0IHJwY3MgPVxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YTxPbWl0PFJQQ01ldGFkYXRhLCAncGFyYW1zJyB8IGtleW9mIFBpcGVsaW5lTWV0YWRhdGE+W10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUlBDcywgdGFyZ2V0KSA/PyBbXTtcblxuICAgICAgICBpZiAocnBjcy5zb21lKChycGMpID0+IHJwYy5tZXRob2QgPT09IG1ldGhvZCAmJiBycGMubmFtZSA9PT0gbmFtZSAmJiBycGMudHlwZSA9PT0gdHlwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuUlBDTmFtZU11c3RCZVVuaXF1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE9taXQ8UlBDTWV0YWRhdGEsICdwYXJhbXMnIHwga2V5b2YgUGlwZWxpbmVNZXRhZGF0YT5bXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclJQQ3MsXG4gICAgICAgICAgICBbLi4ucnBjcywgeyBtZXRob2QsIG5hbWUsIHR5cGUsIHdlYlZpZXdJZCB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVSUENEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtcnBjLWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPblJlcXVlc3QocnBjTmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVSUENEZWNvcmF0b3IoJ29uUmVxdWVzdCcsIHJwY05hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVJQQ0RlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ycGMtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uV2ViVmlld1JlcXVlc3QoaWQ6IHN0cmluZyB8IG51bWJlciwgcnBjTmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVSUENEZWNvcmF0b3IoJ29uV2ViVmlld1JlcXVlc3QnLCBycGNOYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5LCB0eXBlIFRpbWVyTWV0YWRhdGEgfSBmcm9tICcuLi9hcHAnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGltZXJEZWNvcmF0b3IodHlwZTogVGltZXJNZXRhZGF0YVsndHlwZSddLCBuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogVGltZXJNZXRhZGF0YVsnb3B0aW9ucyddKSB7XG4gICAgcmV0dXJuIDxNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbChuYW1lKSAmJiAhaXNTdHJpbmcobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuVGltZXJOYW1lTXVzdEJlU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWUgPSBuYW1lID8/IG1ldGhvZDtcblxuICAgICAgICBjb25zdCB0aW1lcnMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPFRpbWVyTWV0YWRhdGFbXT4oQ29yZU1ldGFkYXRhS2V5LlRpbWVycywgdGFyZ2V0KSA/PyBbXTtcblxuICAgICAgICBpZiAodGltZXJzLnNvbWUoKHRpbWVyKSA9PiB0aW1lci5tZXRob2QgPT09IG1ldGhvZCAmJiB0aW1lci5uYW1lID09PSBuYW1lICYmIHRpbWVyLnR5cGUgPT09IHR5cGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkV2ZW50TmFtZU11c3RCZVVuaXF1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPFRpbWVyTWV0YWRhdGFbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuVGltZXJzLFxuICAgICAgICAgICAgWy4uLnRpbWVycywgPFRpbWVyTWV0YWRhdGE+eyBtZXRob2QsIG5hbWUsIHR5cGUsIG9wdGlvbnMgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDcm9uT3B0aW9ucyB9IGZyb20gJ2Nyb25lcic7XG5pbXBvcnQgeyBjcmVhdGVUaW1lckRlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS10aW1lci5kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gQ3JvbihwYXR0ZXJuOiBzdHJpbmcgfCBEYXRlLCBvcHRpb25zOiBDcm9uT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKCdjcm9uJywgb3B0aW9ucy5uYW1lLCB7IHBhdHRlcm4sIC4uLm9wdGlvbnMgfSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlVGltZXJEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtdGltZXIuZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZXJ5VGljayhuYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKCdldmVyeXRpY2snLCBuYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVyRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXRpbWVyLmRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbnRlcnZhbCh0aW1lb3V0OiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3I7XG5leHBvcnQgZnVuY3Rpb24gSW50ZXJ2YWwobmFtZTogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3I7XG5leHBvcnQgZnVuY3Rpb24gSW50ZXJ2YWwobmFtZU9yVGltZW91dDogc3RyaW5nIHwgbnVtYmVyLCB0aW1lb3V0PzogbnVtYmVyKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICBjb25zdCBbbmFtZSwgaW50ZXJ2YWxUaW1lb3V0XSA9IGlzU3RyaW5nKG5hbWVPclRpbWVvdXQpID8gW25hbWVPclRpbWVvdXQsIHRpbWVvdXRdIDogW3VuZGVmaW5lZCwgbmFtZU9yVGltZW91dF07XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKCdpbnRlcnZhbCcsIG5hbWUsIHsgdGltZW91dDogaW50ZXJ2YWxUaW1lb3V0ISB9KTtcbn1cbiIsICJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVyRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXRpbWVyLmRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcik6IE1ldGhvZERlY29yYXRvcjtcbmV4cG9ydCBmdW5jdGlvbiBUaW1lb3V0KG5hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IE1ldGhvZERlY29yYXRvcjtcbmV4cG9ydCBmdW5jdGlvbiBUaW1lb3V0KG5hbWVPclRpbWVvdXQ6IHN0cmluZyB8IG51bWJlciwgdGltZW91dD86IG51bWJlcik6IE1ldGhvZERlY29yYXRvciB7XG4gICAgY29uc3QgW25hbWUsIGludGVydmFsVGltZW91dF0gPSBpc1N0cmluZyhuYW1lT3JUaW1lb3V0KSA/IFtuYW1lT3JUaW1lb3V0LCB0aW1lb3V0XSA6IFt1bmRlZmluZWQsIG5hbWVPclRpbWVvdXRdO1xuICAgIHJldHVybiBjcmVhdGVUaW1lckRlY29yYXRvcigndGltZW91dCcsIG5hbWUsIHsgdGltZW91dDogaW50ZXJ2YWxUaW1lb3V0ISB9KTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnM6IChDbGFzc0RlY29yYXRvciB8IE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yKVtdKSB7XG4gICAgcmV0dXJuIDxURnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiwgWT4oXG4gICAgICAgIHRhcmdldDogVEZ1bmN0aW9uIHwgT2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgICAgICBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxZPixcbiAgICApID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmICFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgKDxDbGFzc0RlY29yYXRvcj5kZWNvcmF0b3IpKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoPE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yPmRlY29yYXRvcikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCwgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VElucHV0ID0gdW5rbm93biwgVE91dHB1dCA9IHVua25vd24+KGZhY3Rvcnk6IChkYXRhOiBUSW5wdXQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4gVE91dHB1dCkge1xuICAgIHJldHVybiA8VElucHV0ID0gdW5rbm93bj4oZGF0YT86IFRJbnB1dCwgLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkgPT4ge1xuICAgICAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXM6IHZhbGlkYXRlZFBpcGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0aG9kUGFyYW1UeXBlLkN1c3RvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnk6IDwoZGF0YTogdW5rbm93biwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCkgPT4gdW5rbm93bj5mYWN0b3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF0eXBlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgTGF6eVNlcnZpY2VJZGVudGlmaWVyLCB0eXBlIGludGVyZmFjZXMgfSBmcm9tICdpbnZlcnNpZnknO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZFJlZjxUID0gdW5rbm93bj4oZm46ICgpID0+IGludGVyZmFjZXMuU2VydmljZUlkZW50aWZpZXI8VD4pIHtcbiAgICByZXR1cm4gbmV3IExhenlTZXJ2aWNlSWRlbnRpZmllcjxUPihmbik7XG59IiwgImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENyb24sIHR5cGUgQ3Jvbk9wdGlvbnMgfSBmcm9tICdjcm9uZXInO1xuaW1wb3J0IHsgTVVMVElQTEFZRVJfU0VSVklDRSwgdHlwZSBNdWx0aXBsYXllclNlcnZpY2UsIHR5cGUgTXVsdGlwbGF5ZXJUaW1lciB9IGZyb20gJy4uL2FwcCc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lclNlcnZpY2Uge1xuICAgIEBpbmplY3QoTVVMVElQTEFZRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsYXllclNlcnZpY2U6IE11bHRpcGxheWVyU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICRldmVyeXRpY2tzID0gbmV3IE1hcDxzdHJpbmcsIE11bHRpcGxheWVyVGltZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSAkaW50ZXJ2YWxzID0gbmV3IE1hcDxzdHJpbmcsIE11bHRpcGxheWVyVGltZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSAkdGltZW91dHMgPSBuZXcgTWFwPHN0cmluZywgTXVsdGlwbGF5ZXJUaW1lcj4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICRjcm9ucyA9IG5ldyBNYXA8c3RyaW5nLCBDcm9uPigpO1xuXG4gICAgcHVibGljIGdldCBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuYWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXZlcnl0aWNrcygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiRldmVyeXRpY2tzLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGludGVydmFscygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiRpbnRlcnZhbHMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGltZW91dHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4kdGltZW91dHMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3JvbnMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4kY3JvbnMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgd2FybmluZ1RocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy53YXJuaW5nVGhyZXNob2xkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB3YXJuaW5nVGhyZXNob2xkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLndhcm5pbmdUaHJlc2hvbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLnNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlQ3JvbkpvYihjYWxsYmFjazogRnVuY3Rpb24sIG9wdGlvbnM6IENyb25PcHRpb25zICYgeyBwYXR0ZXJuOiBzdHJpbmcgfCBEYXRlIH0pIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCAuLi5jcm9uT3B0aW9ucyB9ID0gb3B0aW9ucztcblxuICAgICAgICBjb25zdCBjcm9uID0gQ3JvbihwYXR0ZXJuLCBjcm9uT3B0aW9ucywgY2FsbGJhY2spO1xuICAgICAgICBpZiAoaXNTdHJpbmcob3B0aW9ucy5uYW1lKSkgdGhpcy4kY3JvbnMuc2V0KG9wdGlvbnMubmFtZSwgY3Jvbik7XG5cbiAgICAgICAgcmV0dXJuIGNyb247XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUludGVydmFsKGNhbGxiYWNrOiBGdW5jdGlvbiwgaW50ZXJ2YWw6IG51bWJlciwgbmFtZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5zZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpO1xuICAgICAgICBpZiAoaXNTdHJpbmcobmFtZSkpIHRoaXMuJGludGVydmFscy5zZXQobmFtZSwgdGltZXIpO1xuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVRpbWVvdXQoY2FsbGJhY2s6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIsIG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCk7XG4gICAgICAgIGlmIChpc1N0cmluZyhuYW1lKSkgdGhpcy4kdGltZW91dHMuc2V0KG5hbWUsIHRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVFdmVyeVRpY2soY2FsbGJhY2s6IEZ1bmN0aW9uLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLmV2ZXJ5VGljayhjYWxsYmFjayk7XG4gICAgICAgIGlmIChpc1N0cmluZyhuYW1lKSkgdGhpcy4kZXZlcnl0aWNrcy5zZXQobmFtZSwgdGltZXIpO1xuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZSh0eXBlOiAnY3JvbicgfCAnZXZlcnl0aWNrJyB8ICd0aW1lb3V0JyB8ICdpbnRlcnZhbCcsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Nyb24nOlxuICAgICAgICAgICAgICAgIGNvbnN0IGNyb25Kb2IgPSB0aGlzLiRjcm9ucy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNyb25Kb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgY3JvbkpvYi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGNyb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdldmVyeXRpY2snOlxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZXJ5dGljayA9IHRoaXMuJGV2ZXJ5dGlja3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChldmVyeXRpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlcnl0aWNrLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZXZlcnl0aWNrcy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW50ZXJ2YWwnOlxuICAgICAgICAgICAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy4kaW50ZXJ2YWxzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRpbnRlcnZhbHMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RpbWVvdXQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLiR0aW1lb3V0cy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHRpbWVvdXRzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QnlOYW1lKHR5cGU6ICdjcm9uJyB8ICdldmVyeXRpY2snIHwgJ3RpbWVvdXQnIHwgJ2ludGVydmFsJywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY3Jvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGNyb25zLmdldChuYW1lKTtcbiAgICAgICAgICAgIGNhc2UgJ2V2ZXJ5dGljayc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGV2ZXJ5dGlja3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgY2FzZSAnaW50ZXJ2YWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRpbnRlcnZhbHMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgY2FzZSAndGltZW91dCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRpbWVvdXRzLmdldChuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCeUlkKGlkOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5nZXRCeUlEKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGltZShuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMudGltZShuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGltZUVuZChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMudGltZUVuZChuYW1lKTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVNBLGNBQUFBLG1CQUFrQjs7O0FDSTNCLFNBQVNDLGtCQUFrQjtBQUdwQixTQUFTQyxZQUE4QkMsU0FBMkI7QUFDckUsU0FBTyxDQUFDQyxXQUFBQTtBQUNKLFFBQUlDLFFBQVFDLFlBQVlDLGdCQUFnQkwsWUFBWUUsTUFBQUEsR0FBUztBQUN6RCxZQUFNLElBQUlJLE1BQU1DLGFBQWFDLHVCQUF1QjtJQUN4RDtBQUVBLFVBQU0sRUFBRUMsT0FBT0MsT0FBT0MsTUFBSyxJQUFLQywwQkFBMEJYLE9BQUFBO0FBQzFELFFBQUksQ0FBQ1EsTUFBTyxPQUFNLElBQUlILE1BQU1LLEtBQUFBO0FBQzVCUixZQUFRVSxlQUFlUixnQkFBZ0JMLFlBQVlVLE9BQU9SLE1BQUFBO0FBRTFELFdBQU9ZLFdBQUFBLEVBQWFaLE1BQUFBO0VBQ3hCO0FBQ0o7QUFaZ0JGLE9BQUFBLGFBQUFBOzs7QUNKVCxTQUFTZSxTQUFBQTtBQUNaLFNBQU8sQ0FBQ0MsV0FBQUE7QUFDSkMsWUFBUUMsZUFBZUMsZ0JBQWdCQyxjQUFjLE1BQU1KLE1BQUFBO0FBQzNELFdBQU9BO0VBQ1g7QUFDSjtBQUxnQkQ7OztBQ0hoQixTQUFTTSxjQUFjO0FBTWhCLFNBQVNDLE9BQW9CQyxLQUF1QjtBQUN2RCxTQUFnRCxDQUFDQyxRQUFnQkMsYUFBcUJDLGVBQUFBO0FBQ2xGLFFBQUksQ0FBQ0MsTUFBTUosR0FBQUEsS0FBUSxDQUFDSyx1QkFBdUJMLEdBQUFBLEVBQUtNLE9BQU87QUFDbkQsWUFBTSxJQUFJQyxNQUFNQyxhQUFhQyw4QkFBOEI7SUFDL0Q7QUFFQSxVQUFNQyxRQUFRVixPQUFPVyxRQUFRQyxZQUE0QixlQUFlWCxRQUFRQyxXQUFBQTtB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O0FBQ0QsZUFBTyxLQUFLcEIsVUFBVWtDLElBQUlkLElBQUFBO0lBQ2xDO0VBQ0o7RUFFT21CLFFBQVFDLElBQVk7QUFDdkIsV0FBTyxLQUFLNUMsbUJBQW1CTyxPQUFPc0MsUUFBUUQsRUFBQUE7RUFDbEQ7RUFFT0UsS0FBS3RCLE1BQWU7QUFDdkIsV0FBTyxLQUFLeEIsbUJBQW1CTyxPQUFPdUMsS0FBS3RCLElBQUFBO0VBQy9DO0VBRU91QixRQUFRdkIsTUFBZTtBQUMxQixXQUFPLEtBQUt4QixtQkFBbUJPLE9BQU93QyxRQUFRdkIsSUFBQUE7RUFDbEQ7QUFDSjs7Ozs7Ozs7IiwKICAibmFtZXMiOiBbImluamVjdGFibGUiLCAiaW5qZWN0YWJsZSIsICJDb250cm9sbGVyIiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiaGFzTWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJEdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUNvbnRyb2xsZXJPcHRpb25zIiwgImRlZmluZU1ldGFkYXRhIiwgImluamVjdGFibGUiLCAiR2xvYmFsIiwgInRhcmdldCIsICJSZWZsZWN0IiwgImRlZmluZU1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJHbG9iYWxNb2R1bGUiLCAiaW5qZWN0IiwgIkluamVjdCIsICJrZXkiLCAidGFyZ2V0IiwgInByb3BlcnR5S2V5IiwgInBhcmFtSW5kZXgiLCAiaXNOaWwiLCAidmFsaWRhdGVJbmplY3Rpb25Ub2tlbiIsICJ2YWxpZCIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiSW52YWxpZEluamVjdGlvblRva2VuU3BlY2lmaWVkIiwgInRva2VuIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiSW5qZWN0aW9uVG9rZW5Ob3RGb3VuZCIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJJbmplY3RhYmxlIiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiaGFzTWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJEdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUluamVjdGFibGVNZXRhZGF0YSIsICJkZWZpbmVNZXRhZGF0YSIsICJpbmplY3RhYmxlIiwgImluamVjdGFibGUiLCAiTW9kdWxlIiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiaGFzTWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJEdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZU1vZHVsZU9wdGlvbnMiLCAiZGVmaW5lTWV0YWRhdGEiLCAiaW5qZWN0YWJsZSIsICJvcHRpb25hbCIsICJPcHRpb25hbCIsICJ0YXJnZXQiLCAicHJvcGVydHlLZXkiLCAicGFyYW1JbmRleCIsICJvcHRpb25hbCIsICJTZXRNZXRhZGF0YSIsICJrZXkiLCAidmFsdWUiLCAiZGVjb3JhdG9yRmFjdG9yeSIsICJ0YXJnZXQiLCAiX21ldGhvZCIsICJkZXNjcmlwdG9yIiwgIlJlZmxlY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAiS0VZIiwgIkNhdGNoIiwgImV4Y2VwdGlvbnMiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiaGFzTWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJEdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSIsICJkdXBsaWNhdGVzIiwgImZpbHRlciIsICJleGNlcHRpb24iLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJsZW5ndGgiLCAiRXhjZXB0aW9uSGFuZGxpbmdDb25mbGljdCIsICJkZWZpbmVNZXRhZGF0YSIsICJVc2VGaWx0ZXJzIiwgImZpbHRlcnMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJkZXNjcmlwdG9yIiwgInZhbGlkYXRlZEZpbHRlcnMiLCAiZmlsdGVyIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlRXJyb3JGaWx0ZXIiLCAiRXJyb3IiLCAicHVzaCIsICJpc05pbCIsICJsZW5ndGgiLCAiRXJyb3JNZXNzYWdlIiwgIkF0TGVhc3RPbmVGaWx0ZXJSZXF1aXJlZCIsICJtZXRob2RGaWx0ZXJzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkVycm9yRmlsdGVycyIsICJmaW5kIiwgImluY2x1ZGVzIiwgIkR1cGxpY2F0ZUVycm9yRmlsdGVyRGV0ZWN0ZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAiY2xhc3NGaWx0ZXJzIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIm9wdGlvbmFsIiwgIkFwcFJ1bnRpbWUiLCAiZXZlbnRIYW5kbGVyIiwgInJwY0hhbmRsZXIiLCAiZ2xvYmFsR3VhcmRzIiwgImdsb2JhbEludGVyY2VwdG9ycyIsICJnbG9iYWxQaXBlcyIsICJnbG9iYWxFcnJvckZpbHRlcnMiLCAibG9nZ2VyU2VydmljZSIsICJlbmFibGVTaHV0ZG93bkhvb2tzIiwgImJvb3QiLCAicmVzb2x2ZWRUcmVlIiwgImFzeW5jVHJhdmVyc2UiLCAibm9kZSIsICJzdGFydFRpbWUiLCAiRGF0ZSIsICJub3ciLCAibW9kdWxlIiwgInZhbHVlIiwgImluc3RhbmNlIiwgImNvbnRhaW5lciIsICJnZXQiLCAibWV0YWRhdGEiLCAiY2xhc3NSZWYiLCAiY29udHJvbGxlcnMiLCAiZm9yRWFjaCIsICJjb250cm9sbGVyIiwgImludGVybmFsUHJvdmlkZXJzIiwgImV4dGVybmFsUHJvdmlkZXJzIiwgInRva2VuIiwgImxvZyIsICJuYW1lIiwgInJ1bkxpZmVjeWNsZU1ldGhvZCIsICJydW5MaWZlY3ljbGVNZXRob2RzIiwgInRyYXZlcnNlIiwgInRpbWUiLCAicmVnaXN0ZXJUaW1lcnMiLCAicmVnaXN0ZXJMaXN0ZW5lcnMiLCAic2h1dGRvd24iLCAidGltZXJTZXJ2aWNlIiwgIm93bmVyIiwgIlRJTUVSX1NFUlZJQ0UiLCAiZXZlcnl0aWNrcyIsICJ0aW1lciIsICJkZXN0cm95IiwgImludGVydmFscyIsICJ0aW1lb3V0cyIsICJjcm9ucyIsICJjcm9uIiwgInN0b3AiLCAiZXZlbnRIYW5kbGVycyIsICJoYW5kbGVyIiwgInJwY0hhbmRsZXJzIiwgImV2ZW50cyIsICJldmVudCIsICJndWFyZHMiLCAiaW50ZXJjZXB0b3JzIiwgInBpcGVzIiwgIm1hcHBlZEVycm9yRmlsdGVycyIsICJtYXBFcnJvckZpbHRlcnMiLCAiZXJyb3JGaWx0ZXJzIiwgInJlZ2lzdGVyRXZlbnQiLCAicHVzaCIsICJycGNzIiwgInJwYyIsICJyZWdpc3RlclJQQyIsICJ0aW1lcnMiLCAidHlwZSIsICJjcmVhdGVDcm9uSm9iIiwgIm1ldGhvZCIsICJiaW5kIiwgIm9wdGlvbnMiLCAiY3JlYXRlRXZlcnlUaWNrIiwgImNyZWF0ZUludGVydmFsIiwgInRpbWVvdXQiLCAiY3JlYXRlVGltZW91dCIsICJmaWx0ZXJNYXAiLCAiZmlsdGVyIiwgImVycm9ycyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDYXRjaCIsICJsZW5ndGgiLCAiZXJyb3IiLCAiaXNOaWwiLCAiZmluZCIsICJmaWx0ZXJFcnJvciIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiRXJyb3JBbHJlYWR5SGFuZGxlZEJ5RmlsdGVyIiwgIlByb21pc2UiLCAiYWxsIiwgIm1hcCIsICJpc09iamVjdCIsICJwcm92aWRlckluc3RhbmNlIiwgIkNvbnRhaW5lciIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJvcHRpb25hbCIsICJNb2R1bGVEZXBlbmRlbmN5QmluZGVyIiwgImdsb2JhbEFwcENvbnRhaW5lciIsICJsb2dnZXJTZXJ2aWNlIiwgImNvbnRhaW5lck9wdGlvbnMiLCAiYmluZCIsICJyZXNvbHZlZFRyZWUiLCAiYXN5bmNUcmF2ZXJzZSIsICJub2RlIiwgInN0YXJ0VGltZSIsICJEYXRlIiwgIm5vdyIsICJtb2R1bGUiLCAidmFsdWUiLCAiY29udGFpbmVyIiwgIk1vZHVsZUNvbnRhaW5lciIsICJtZXRhZGF0YSIsICJwYXJlbnQiLCAiY2xhc3NSZWYiLCAidG9TZWxmIiwgImluU2luZ2xldG9uU2NvcGUiLCAiZ2xvYmFsIiwgIl8iLCAicHJvdmlkZXIiLCAiZXh0ZXJuYWxQcm92aWRlcnMiLCAiYmluZFByb3ZpZGVyIiwgInRva2VuIiwgInRvRHluYW1pY1ZhbHVlIiwgImdldCIsICJpbXBvcnRNb2R1bGUiLCAicmVwZXRpdGl2ZUltcG9ydHMiLCAiaW50ZXJuYWxQcm92aWRlcnMiLCAiTU9EVUxFX0NPTlRBSU5FUiIsICJ0b0NvbnN0YW50VmFsdWUiLCAiY29udHJvbGxlcnMiLCAiVElNRVJfU0VSVklDRSIsICJ0byIsICJUaW1lclNlcnZpY2UiLCAibG9nIiwgIm5hbWUiLCAicHJvdmlkZSIsICJ1c2VWYWx1ZSIsICJiaW5kaW5nIiwgImN0eCIsICJkZXBzIiwgImluamVjdCIsICJtYXAiLCAiZGVwIiwgImlzT2JqZWN0IiwgImVyciIsICJvcHRpb25hbCIsICJ1bmRlZmluZWQiLCAiZXJyb3IiLCAidXNlRmFjdG9yeSIsICJzY29wZSIsICJpblRyYW5zaWVudFNjb3BlIiwgImluUmVxdWVzdFNjb3BlIiwgInVzZUNsYXNzIiwgInRvU2VydmljZSIsICJ1c2VFeGlzdGluZyIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJNb2R1bGVUcmVlU2Nhbm5lciIsICJtb2R1bGVNZXRhZGF0YVJlYWRlciIsICJjb250cm9sbGVyTWV0YWRhdGFSZWFkZXIiLCAibG9nZ2VyU2VydmljZSIsICJzY2FuIiwgImNsYXNzUmVmIiwgInN0YXJ0VGltZSIsICJEYXRlIiwgIm5vdyIsICJtb2R1bGVNZXRhZGF0YSIsICJyZWFkIiwgIm1vZHVsZSIsICJNb2R1bGUiLCAibWV0YWRhdGEiLCAibG9nIiwgIm5hbWUiLCAic2NhbkNvbnRyb2xsZXJzIiwgIm1vZHVsZVRyZWUiLCAiVHJlZSIsICJzY2FubmVkTW9kdWxlcyIsICJNYXAiLCAic2V0IiwgImltcG9ydGVkTW9kdWxlIiwgImltcG9ydHMiLCAic2Nhbk1vZHVsZXMiLCAicm9vdCIsICJwYXJlbnROb2RlIiwgInNjYW5uZWRNb2R1bGUiLCAiZ2V0IiwgImlzTmlsIiwgInZhbHVlIiwgInJlcGV0aXRpdmVJbXBvcnRzIiwgImFkZCIsICJjaGVja0NpcmN1bGFyRGVwZW5kZW5jeSIsICJwYXJlbnQiLCAidHJlZU5vZGUiLCAiVHJlZU5vZGUiLCAiYWRkQ2hpbGQiLCAiaW1wb3J0TW9kdWxlIiwgImNvbnRyb2xsZXJzIiwgImNvbnRyb2xsZXJNZXRhZGF0YSIsICJjb250cm9sbGVyIiwgIkNvbnRyb2xsZXIiLCAib3duZXIiLCAicHVzaCIsICJwYXJlbnRNZXRhZGF0YSIsICJpbmNsdWRlcyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiQ2lyY3VsYXJEZXBlbmRlbmN5RGV0ZWN0ZWQiLCAiUmFnZU1QU2NyaXB0RXZlbnQiLCAiZXZlbnROYW1lIiwgImxpc3RlbmVyIiwgImRlc3Ryb3kiLCAibXAiLCAiZXZlbnRzIiwgInJlbW92ZSIsICJSYWdlTVBFdmVudEVtbWl0ZXIiLCAiZW1pdCIsICJldmVudE5hbWUiLCAiYXJncyIsICJtcCIsICJldmVudHMiLCAiY2FsbCIsICJvbiIsICJsaXN0ZW5lciIsICJhZGQiLCAiUmFnZU1QU2NyaXB0RXZlbnQiLCAib25jZSIsICJvbmNlV3JhcHBlciIsICJyZW1vdmUiLCAib2ZmIiwgIlJhZ2VNUFRpbWVyIiwgImxhc3RUaWNrIiwgIkRhdGUiLCAibm93IiwgImlkIiwgImludGVydmFsIiwgIm9uY2UiLCAiY2FsbGJhY2siLCAiY2xlYXJUaW1lciIsICJkZXN0cm95IiwgIlJhZ2VNUFRpbWVycyIsICJ0aW1lckluY3JlbWVudGVyIiwgInRpbWVycyIsICJNYXAiLCAiZXZlcnlUaWNrSGFuZGxlcnMiLCAiaXNFdmVyeVRpY2tSdW5uaW5nIiwgImV2ZXJ5VGlja01haW5IYW5kbGVyIiwgImFsbCIsICJ2YWx1ZXMiLCAid2FybmluZ1RocmVzaG9sZCIsICJfdmFsdWUiLCAic291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCIsICJnZXRCeUlEIiwgImlkIiwgInRpbWVyIiwgImdldCIsICJjcmVhdGVUaW1lciIsICJjbGVhciIsICJjYWxsYmFjayIsICJpbnRlcnZhbCIsICJvbmNlIiwgImFyZ3MiLCAiY2FsbGJhY2tCaW5kIiwgImJpbmQiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ0aW1lcklkIiwgInJhZ2VNUFRpbWVyIiwgIlJhZ2VNUFRpbWVyIiwgImRlbGV0ZSIsICJzZXQiLCAic2V0SW50ZXJ2YWwiLCAidGltZSIsICJjYiIsICJjbGVhckludGVydmFsIiwgInNldFRpbWVvdXQiLCAiY2xlYXJUaW1lb3V0IiwgImV2ZXJ5VGljayIsICJib3VuZCIsICJpc0NsaWVudFNpZGUiLCAibXAiLCAiYnJvd3NlcnMiLCAiaGFuZGxlciIsICJlIiwgImNvbnNvbGUiLCAibG9nRXJyb3IiLCAiZXZlbnRzIiwgImFkZCIsICJpbnRlcnZhbEhhbmRsZXIiLCAiX2V2ZXJ5VGlja0ludGVydmFsIiwgInNpemUiLCAicmVtb3ZlIiwgIm5leHRUaWNrIiwgIl9uYW1lIiwgInRpbWVFbmQiLCAiUmFnZU1QTXVsdGlwbGF5ZXJTZXJ2aWNlIiwgIlRpbWVycyIsICJFdmVudHMiLCAiUmFnZU1QRXZlbnRFbW1pdGVyIiwgIlJhZ2VNUFRpbWVycyIsICJwYXJzZUludGVybmFsQXJncyIsICJhcmdzIiwgInBsYXllciIsICJpc09iamVjdCIsICJ1bmRlZmluZWQiLCAiYm9keSIsICJsb2ciLCAiYXJnIiwgIm1lc3NhZ2UiLCAibWFwIiwgImEiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiU3RyaW5nIiwgImpvaW4iLCAibXAiLCAiY29uc29sZSIsICJsb2dJbmZvIiwgImxvZ0Vycm9yIiwgImxvZ1dhcm5pbmciLCAibG9nRGVidWciLCAiaW5qZWN0IiwgIkNvbnRhaW5lciIsICJpbmplY3RhYmxlIiwgIkNvbnRhaW5lciIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJBcHAiLCAibW9kdWxlVHJlZVNjYW5uZXIiLCAibW9kdWxlRGVwZW5kZW5jeUJpbmRlciIsICJhcHBSdW50aW1lIiwgImludGVybmFsQXBwQ29udGFpbmVyIiwgInBsdWdpbnMiLCAibG9nZ2VyU2VydmljZSIsICJtb2R1bGVUcmVlIiwgImxvYWRlZCIsICJzdGFydCIsICJyb290TW9kdWxlIiwgImVycm9yIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJBcHBBbHJlYWR5TG9hZGVkIiwgImxvZyIsICJydW5QbHVnaW5NZXRob2RzIiwgInNjYW4iLCAiYmluZCIsICJib290IiwgInN0b3AiLCAiQXBwTm90TG9hZGVkIiwgInNodXRkb3duIiwgIm1ldGhvZCIsICJQcm9taXNlIiwgImFsbCIsICJtYXAiLCAicCIsICJwbHVnaW4iLCAiZ2V0IiwgInJlc29sdmUiLCAiQXBwQnVpbGRlciIsICJlbnZpcm9tZW50IiwgImludGVybmFsQXBwQ29udGFpbmVyIiwgIm11bHRpcGxheWVyU2VydmljZSIsICJwbHVnaW5zIiwgImdsb2JhbENvbnRhaW5lck9wdGlvbnMiLCAidXNlR2xvYmFsR3VhcmRzIiwgImd1YXJkcyIsICJ2YWxpZGF0ZWRHdWFyZHMiLCAiZ3VhcmQiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVHdWFyZCIsICJFcnJvciIsICJwdXNoIiwgImJpbmQiLCAiR0xPQkFMX0dVQVJEUyIsICJ0b0NvbnN0YW50VmFsdWUiLCAidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwgImludGVyY2VwdG9ycyIsICJ2YWxpZGF0ZWRJbnRlcmNlcHRvcnMiLCAiaW50ZXJjZXB0b3IiLCAidmFsaWRhdGVJbnRlcmNlcHRvciIsICJHTE9CQUxfSU5URVJDRVBUT1JTIiwgInVzZUdsb2JhbFBpcGVzIiwgInBpcGVzIiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWRhdGVQaXBlIiwgIkdMT0JBTF9QSVBFUyIsICJ1c2VHbG9iYWxGaWx0ZXJzIiwgImZpbHRlcnMiLCAidmFsaWRhdGVkRklsdGVycyIsICJmaWx0ZXIiLCAidmFsaWRhdGVFcnJvckZpbHRlciIsICJHTE9CQUxfRVJST1JfRklMVEVSUyIsICJ1c2VQbHVnaW5zIiwgImZvckVhY2giLCAicCIsICJ0b1NlbGYiLCAiaW5TaW5nbGV0b25TY29wZSIsICJpbnRlcm5hbFBsdWdpbnMiLCAiZ2V0IiwgIlBMVUdJTlMiLCAicmViaW5kIiwgImVuYWJsZVNodXRkb3duSG9va3MiLCAiRU5BQkxFX1NIVVRET1dOX0hPT0tTIiwgInNldENvbnRhaW5lck9wdGlvbnMiLCAib3B0aW9ucyIsICJvbmx5R2xvYmFsIiwgIkNPTlRBSU5FUl9PUFRJT05TIiwgImJ1aWxkIiwgImdsb2JhbEFwcENvbnRhaW5lciIsICJDb250YWluZXIiLCAiUkVGTEVDVE9SX1NFUlZJQ0UiLCAiUmVmbGVjdG9yU2VydmljZSIsICJ0b1NlcnZpY2UiLCAiTVVMVElQTEFZRVJfU0VSVklDRSIsICJBcHAiLCAiR0xPQkFMX0FQUF9DT05UQUlORVIiLCAiTW9kdWxlVHJlZVNjYW5uZXIiLCAiTW9kdWxlRGVwZW5kZW5jeUJpbmRlciIsICJBcHBSdW50aW1lIiwgIlBpcGVsaW5lSGFuZGxlciIsICJNb2R1bGUiLCAiaW5UcmFuc2llbnRTY29wZSIsICJNb2R1bGVNZXRhZGF0YVJlYWRlciIsICJDb250cm9sbGVyIiwgIkNvbnRyb2xsZXJNZXRhZGF0YVJlYWRlciIsICJDb250cm9sbGVyRmxvd0hhbmRsZXIiLCAiQ29udHJvbGxlckV2ZW50SGFuZGxlciIsICJDb250cm9sbGVyUlBDSGFuZGxlciIsICJNYW5nb1JlcXVlc3RCYXNlIiwgIk1BTkdPX1JFUVVFU1RfRkFDVE9SWSIsICJ0b0ZhY3RvcnkiLCAiY29udGV4dCIsICJib2R5IiwgInBsYXllciIsICJyZXF1ZXN0IiwgImNvbnRhaW5lciIsICIkYm9keSIsICIkcGxheWVyIiwgIk1hbmdvUmVzcG9uc2VCYXNlIiwgIk1BTkdPX1JFU1BPTlNFX0ZBQ1RPUlkiLCAiRXhlY3V0aW9uQ29udGV4dEJhc2UiLCAiRVhFQ1VUSU9OX0NPTlRFWFRfRkFDVE9SWSIsICJ0eXBlIiwgImNsYXNzUmVmIiwgImhhbmRsZXIiLCAicmVzcG9uc2UiLCAibmFtZSIsICJleGVjdXRpb25Db250ZXh0IiwgIiR0eXBlIiwgIiRyZXF1ZXN0IiwgIiRyZXNwb25zZSIsICIkaGFuZGxlciIsICIkY2xhc3NSZWYiLCAiJG5hbWUiLCAicGx1Z2luIiwgInBsdWdpbkluc3RhbmNlIiwgIm9uQnVpbGQiLCAiaXNCb3VuZCIsICJDb250YWluZXIiLCAiY3JlYXRlQXBwQnVpbGRlciIsICJlbnZpcm9tZW50IiwgInBsdWdpbnMiLCAiYXBwQnVpbGRlckluaGVyaXQiLCAibXVsdGlwbGF5ZXJTZXJ2aWNlIiwgImludGVybmFsQXBwQ29udGFpbmVyIiwgIkNvbnRhaW5lciIsICJiaW5kIiwgIk1VTFRJUExBWUVSX1NFUlZJQ0UiLCAidG9Db25zdGFudFZhbHVlIiwgIklOVEVSTkFMX0FQUF9DT05UQUlORVIiLCAiQVBQX0VOVklST01FTlQiLCAiUExVR0lOUyIsICJ0b1NlbGYiLCAiaW5TaW5nbGV0b25TY29wZSIsICJnZXQiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAidHlwZSIsICJuYW1lIiwgIndlYlZpZXdJZCIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImlzTmlsIiwgImlzU3RyaW5nIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJFdmVudE5hbWVNdXN0QmVTdHJpbmciLCAiZXZlbnRzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJFdmVudHMiLCAic29tZSIsICJldmVudCIsICJFdmVudE5hbWVNdXN0QmVVbmlxdWUiLCAiZGVmaW5lTWV0YWRhdGEiLCAiT25JbnRlcm5hbCIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiT25XZWJWaWV3IiwgImlkIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbiIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiT25jZUludGVybmFsIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbmNlIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbmNlV2ViVmlldyIsICJpZCIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiQm9keSIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVQaXBlIiwgIkVycm9yIiwgInB1c2giLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJFcnJvck1lc3NhZ2UiLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiZGF0YSIsICJJbmRleCIsICJrZXkiLCAicGlwZXMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpbmRleCIsICJpc051bWJlciIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiSW5kZXhLZXlNdXN0QmVOdW1iZXIiLCAidmFsaWRhdGVkUGlwZXMiLCAicGlwZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZVBpcGUiLCAicHVzaCIsICJwYXJhbXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclBhcmFtcyIsICJzb21lIiwgInBhcmFtIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgImRhdGEiLCAiUmVxdWVzdCIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgImRhdGEiLCAiUmVxIiwgIlBhcmFtIiwgImtleSIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgImlzU3RyaW5nIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJQYXJhbUtleU11c3RCZVN0cmluZyIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlUGlwZSIsICJwdXNoIiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAiZGF0YSIsICJ0eXBlIiwgIk1ldGhvZFBhcmFtVHlwZSIsICJSZXNwb25zZSIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgImRhdGEiLCAiUmVzIiwgIlVzZUd1YXJkcyIsICJndWFyZHMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJkZXNjcmlwdG9yIiwgInZhbGlkYXRlZEd1YXJkcyIsICJndWFyZCIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUd1YXJkIiwgIkVycm9yIiwgInB1c2giLCAiaXNOaWwiLCAibGVuZ3RoIiwgIkVycm9yTWVzc2FnZSIsICJBdExlYXN0T25lR3VhcmRSZXF1aXJlZCIsICJtZXRob2RHdWFyZHMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiR3VhcmRzIiwgImRlZmluZU1ldGFkYXRhIiwgImNsYXNzR3VhcmRzIiwgIlVzZUludGVyY2VwdG9ycyIsICJpbnRlcmNlcHRvcnMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJkZXNjcmlwdG9yIiwgInZhbGlkYXRlZEludGVyY2VwdG9ycyIsICJpbnRlcmNlcHRvciIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUludGVyY2VwdG9yIiwgIkVycm9yIiwgInB1c2giLCAiaXNOaWwiLCAibGVuZ3RoIiwgIkVycm9yTWVzc2FnZSIsICJBdExlYXN0T25lSW50ZXJjZXB0b3JSZXF1aXJlZCIsICJtZXRob2RJbnRlcmNlcHRvcnMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiSW50ZXJjZXB0b3JzIiwgImRlZmluZU1ldGFkYXRhIiwgImNsYXNzSW50ZXJjZXB0b3JzIiwgIlVzZVBpcGVzIiwgInBpcGVzIiwgInRhcmdldCIsICJtZXRob2QiLCAiZGVzY3JpcHRvciIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlUGlwZSIsICJFcnJvciIsICJwdXNoIiwgImlzTmlsIiwgImxlbmd0aCIsICJFcnJvck1lc3NhZ2UiLCAiQXRMZWFzdE9uZVBpcGVSZXF1aXJlZCIsICJtZXRob2RQaXBlcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJQaXBlcyIsICJkZWZpbmVNZXRhZGF0YSIsICJjbGFzc1BpcGVzIiwgImNyZWF0ZVJQQ0RlY29yYXRvciIsICJ0eXBlIiwgIm5hbWUiLCAid2ViVmlld0lkIiwgInRhcmdldCIsICJtZXRob2QiLCAiaXNOaWwiLCAiaXNTdHJpbmciLCAiaXNOdW1iZXIiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIldlYlZpZXdJZE11c3RCZVN0cmluZ09yTnVtYmVyIiwgIlJQQ05hbWVNdXN0QmVTdHJpbmciLCAicnBjcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUlBDcyIsICJzb21lIiwgInJwYyIsICJSUENOYW1lTXVzdEJlVW5pcXVlIiwgImRlZmluZU1ldGFkYXRhIiwgIk9uUmVxdWVzdCIsICJycGNOYW1lIiwgImNyZWF0ZVJQQ0RlY29yYXRvciIsICJPbldlYlZpZXdSZXF1ZXN0IiwgImlkIiwgInJwY05hbWUiLCAiY3JlYXRlUlBDRGVjb3JhdG9yIiwgImNyZWF0ZVRpbWVyRGVjb3JhdG9yIiwgInR5cGUiLCAibmFtZSIsICJvcHRpb25zIiwgInRhcmdldCIsICJtZXRob2QiLCAiaXNOaWwiLCAiaXNTdHJpbmciLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIlRpbWVyTmFtZU11c3RCZVN0cmluZyIsICJ0aW1lcnMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiVGltZXJzIiwgInNvbWUiLCAidGltZXIiLCAiRXZlbnROYW1lTXVzdEJlVW5pcXVlIiwgImRlZmluZU1ldGFkYXRhIiwgIkNyb24iLCAicGF0dGVybiIsICJvcHRpb25zIiwgImNyZWF0ZVRpbWVyRGVjb3JhdG9yIiwgIm5hbWUiLCAiRXZlcnlUaWNrIiwgIm5hbWUiLCAiY3JlYXRlVGltZXJEZWNvcmF0b3IiLCAiSW50ZXJ2YWwiLCAibmFtZU9yVGltZW91dCIsICJ0aW1lb3V0IiwgIm5hbWUiLCAiaW50ZXJ2YWxUaW1lb3V0IiwgImlzU3RyaW5nIiwgInVuZGVmaW5lZCIsICJjcmVhdGVUaW1lckRlY29yYXRvciIsICJUaW1lb3V0IiwgIm5hbWVPclRpbWVvdXQiLCAidGltZW91dCIsICJuYW1lIiwgImludGVydmFsVGltZW91dCIsICJpc1N0cmluZyIsICJ1bmRlZmluZWQiLCAiY3JlYXRlVGltZXJEZWNvcmF0b3IiLCAiYXBwbHlEZWNvcmF0b3JzIiwgImRlY29yYXRvcnMiLCAidGFyZ2V0IiwgInByb3BlcnR5S2V5IiwgImRlc2NyaXB0b3IiLCAiZGVjb3JhdG9yIiwgIkZ1bmN0aW9uIiwgImNyZWF0ZVBhcmFtRGVjb3JhdG9yIiwgImZhY3RvcnkiLCAiZGF0YSIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVQaXBlIiwgIkVycm9yIiwgInB1c2giLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJFcnJvck1lc3NhZ2UiLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiQ3VzdG9tIiwgIkxhenlTZXJ2aWNlSWRlbnRpZmllciIsICJmb3J3YXJkUmVmIiwgImZuIiwgIkxhenlTZXJ2aWNlSWRlbnRpZmllciIsICJSZWZsZWN0b3JTZXJ2aWNlIiwgImdldCIsICJtZXRhZGF0YUtleSIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJnZXRBbGwiLCAidGFyZ2V0cyIsICJtYXAiLCAiZ2V0QWxsQW5kTWVyZ2UiLCAibWV0YWRhdGFDb2xsZWN0aW9uIiwgImZpbHRlciIsICJpdGVtIiwgInVuZGVmaW5lZCIsICJpc0VtcHR5IiwgInJlZHVjZSIsICJhIiwgImIiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJjb25jYXQiLCAiaXNPYmplY3QiLCAiZ2V0QWxsQW5kT3ZlcnJpZGUiLCAicmVzdWx0IiwgImNyZWF0ZURlY29yYXRvciIsICJvcHRpb25zIiwgImtleSIsICJnZW5lcmF0ZVJhbmRvbUlkIiwgImRlY29yYXRvckZuIiwgIm1ldGFkYXRhVmFsdWUiLCAiZGVzY3JpcHRvciIsICJ2YWx1ZSIsICJ0cmFuc2Zvcm0iLCAiU2V0TWV0YWRhdGEiLCAiS0VZIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIkNyb24iLCAiVGltZXJTZXJ2aWNlIiwgIm11bHRpcGxheWVyU2VydmljZSIsICIkZXZlcnl0aWNrcyIsICJNYXAiLCAiJGludGVydmFscyIsICIkdGltZW91dHMiLCAiJGNyb25zIiwgImFsbCIsICJUaW1lcnMiLCAiZXZlcnl0aWNrcyIsICJ2YWx1ZXMiLCAiaW50ZXJ2YWxzIiwgInRpbWVvdXRzIiwgImNyb25zIiwgIndhcm5pbmdUaHJlc2hvbGQiLCAidmFsdWUiLCAic291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCIsICJjcmVhdGVDcm9uSm9iIiwgImNhbGxiYWNrIiwgIm9wdGlvbnMiLCAicGF0dGVybiIsICJjcm9uT3B0aW9ucyIsICJjcm9uIiwgIkNyb24iLCAiaXNTdHJpbmciLCAibmFtZSIsICJzZXQiLCAiY3JlYXRlSW50ZXJ2YWwiLCAiaW50ZXJ2YWwiLCAidGltZXIiLCAic2V0SW50ZXJ2YWwiLCAiY3JlYXRlVGltZW91dCIsICJ0aW1lb3V0IiwgInNldFRpbWVvdXQiLCAiY3JlYXRlRXZlcnlUaWNrIiwgImV2ZXJ5VGljayIsICJkZWxldGUiLCAidHlwZSIsICJjcm9uSm9iIiwgImdldCIsICJzdG9wIiwgImV2ZXJ5dGljayIsICJkZXN0cm95IiwgImdldEJ5TmFtZSIsICJnZXRCeUlkIiwgImlkIiwgImdldEJ5SUQiLCAidGltZSIsICJ0aW1lRW5kIl0KfQo=
|
|
@@ -8,8 +8,7 @@ import { P as Pipe } from '../pipe-transform.interface-BlzOrUy3.js';
|
|
|
8
8
|
import { CronOptions } from 'croner';
|
|
9
9
|
import { E as ExecutionContext } from '../execution-context.interface-DpRN4oVj.js';
|
|
10
10
|
import { R as RPCMetadata } from '../rpc-metadata.interface-DS-GqgqA.js';
|
|
11
|
-
import
|
|
12
|
-
import { interfaces } from 'inversify';
|
|
11
|
+
import { interfaces, LazyServiceIdentifier } from 'inversify';
|
|
13
12
|
import '../injectable-scope.enum-CjyQMpW2.js';
|
|
14
13
|
import '../method-param-type.enum-BfrJ8zqa.js';
|
|
15
14
|
import '../execution-context-type.enum-fwYPtPvp.js';
|
|
@@ -85,6 +84,6 @@ declare function createParamDecorator<TInput = unknown, TOutput = unknown>(facto
|
|
|
85
84
|
|
|
86
85
|
declare function createRPCDecorator(type: RPCMetadata['type'], name?: string, webViewId?: string | number): MethodDecorator;
|
|
87
86
|
|
|
88
|
-
declare function forwardRef<T = unknown>(fn: () => interfaces.ServiceIdentifier<T>):
|
|
87
|
+
declare function forwardRef<T = unknown>(fn: () => interfaces.ServiceIdentifier<T>): LazyServiceIdentifier<T>;
|
|
89
88
|
|
|
90
89
|
export { Body, Catch, Controller, Cron, EveryTick, Global, Index, Inject, Injectable, Interval, Module, On, OnInternal, OnRequest, OnWebView, OnWebViewRequest, Once, OnceInternal, OnceWebView, Optional, Param, Req, Request, Res, Response, SetMetadata, Timeout, UseFilters, UseGuards, UseInterceptors, UsePipes, applyDecorators, createEventDecorator, createParamDecorator, createRPCDecorator, forwardRef };
|
package/dist/decorators/index.js
CHANGED
package/dist/index.js
CHANGED
package/dist/services/index.js
CHANGED