@cartanova/qgrid-cli 2.5.9 → 2.5.10
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/README.ko.md +2 -8
- package/README.md +2 -8
- package/bundle/dist/utils/providers/openai/codex-worker.js +23 -14
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +5 -1
- package/bundle/src/utils/providers/openai/codex-worker.test.ts +100 -2
- package/bundle/src/utils/providers/openai/codex-worker.ts +30 -17
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +41 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +9 -0
- package/bundle/web-dist/client/assets/{index-CkBeqjBm.js → index-SdI2T3b8.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-d9HdibiE.js → logs-O-8hGStp.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-C8qYvOMj.js → monit-DA8MAY-d.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-DT0AY2Lq.js → routes-COPjkgNr.js} +1 -1
- package/bundle/web-dist/client/assets/{show-DPG1oKpW.js → show-ClG4e0BP.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-Dz7hmKFm.js → tokens-Cc5frn5f.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +1 -1
- package/skills/qgrid/references/ai-sdk-provider-contract.md +1 -1
- package/skills/qgrid/references/cli-env-and-server-boot.md +1 -1
- package/skills/qgrid/references/openai-codex-runtime.md +3 -1
|
@@ -487,6 +487,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
487
487
|
}
|
|
488
488
|
async evaluateAutoscaling() {
|
|
489
489
|
if (this.stopped) return;
|
|
490
|
+
this.sweepIdleWorkerThreads();
|
|
490
491
|
const minimumDeficitTokenIds = await this.ensureMinimumWorkersOneStep();
|
|
491
492
|
if (!this.poolConfig.autoscale || this.stopped) return;
|
|
492
493
|
if (this.queue.length > 0) {
|
|
@@ -562,6 +563,9 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
562
563
|
for (let index = 0; index < this.poolConfig.maxWorkersPerToken; index++) if (!used.has(index)) return index;
|
|
563
564
|
return this.poolConfig.maxWorkersPerToken;
|
|
564
565
|
}
|
|
566
|
+
sweepIdleWorkerThreads() {
|
|
567
|
+
for (const worker of [...this.workerPool.values()].flat()) if (worker.isReady && worker.hasCapacity) worker.sweepIdleThreads();
|
|
568
|
+
}
|
|
565
569
|
async spawnAndCommitWorker(tokenId, metadata, respectQuotaBlock) {
|
|
566
570
|
const expectedWorkers = this.workerPool.get(tokenId);
|
|
567
571
|
const workerIndex = this.nextAvailableWorkerIndex(expectedWorkers ?? []);
|
|
@@ -857,4 +861,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
857
861
|
//#endregion
|
|
858
862
|
export { ImageGenerationError, OpenAIDispatcher, makeOpenAIWorkerId };
|
|
859
863
|
|
|
860
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBDb2RleEFwcFNlcnZlcldvcmtlciDsnpDrj5kg7ZmV7J6lICjquLDrs7ggMX4zLCBoYXJkIGNhcCAyMClcbiAqIC0gaWRsZSB3b3JrZXIgcm91bmQtcm9iaW4g7ISg7YOdICsg7YGQIOuMgOq4sCAo7KCE67aAIGJ1c3kg7IucKVxuICogLSBUb2tlblN1YnNjcmliZXIg7J2067Kk7Yq466GcIHdvcmtlciBwb29sIOuPmeq4sO2ZlFxuICogLSBiYWNrcHJlc3N1cmU6IO2BkCBmdWxsIOuYkOuKlCB0aW1lb3V0IOyLnCBTRVJWRVJfQlVTWVxuICovXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgZnJlZW1lbSB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvciB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL0dldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLCB0eXBlIFR1cm5SZXF1ZXN0IH0gZnJvbSBcIi4vY29kZXgtd29ya2VyXCI7XG5pbXBvcnQge1xuICByZWFkT3BlbkFJUXVvdGFVc2FnZSxcbiAgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0LFxuICB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSxcbn0gZnJvbSBcIi4vb3BlbmFpLXF1b3RhXCI7XG5pbXBvcnQgeyBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2ggfSBmcm9tIFwiLi9vcGVuYWktcmVmcmVzaFwiO1xuaW1wb3J0IHtcbiAgZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIsXG4gIHR5cGUgT3BlbkFJV29ya2VyUG9vbENvbmZpZyxcbiAgcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcsXG59IGZyb20gXCIuL29wZW5haS13b3JrZXItcG9vbC1jb25maWdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib3BlbmFpLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIOyalOyyreydtCDqsozsnbTtirgv7IOd7ISx7JeQIOyLpO2MqO2WiOydhCDrlYzsnZgg6rWs67aE7J6QLlxuLy8gLSBcImdhdGVcIjog7IKs7KCEIOqygOymnSDsi6TtjKgoY2FwYWJpbGl0eS/rqqjrjbgg66mA7Yuw66qo64usIOu2iOy2qeyhsSkg4oCUIHR1cm4g66+47Iuk7ZaJLlxuLy8gLSBcIm5vdF9jYWxsZWRcIjogdHVybiDsnYAg7ISx6rO17ZaI7Jy864KYIOuqqOuNuOydtCBpbWFnZSB0b29sIOydhCDtmLjstpwg7JWIIO2VqCDigJQg7J6s7Iuc64+EIOustOydtSjtlITroaztlITtirgg66y47KCcKS5cbi8vIC0gXCJpbmNvbXBsZXRlXCI6IHRvb2wg7Iuc64+E65CQ7Jy864KYIOyZhOyEsSDsnbTrr7jsp4Ag66+464+E7LCpIOKAlCDsnqzsi5zrj4Qg7ZuE67O0KOyEnOuyhOy4oSDsi6TtjKgv6rGw67aAKS5cbmV4cG9ydCB0eXBlIEltYWdlRmFpbHVyZUtpbmQgPSBcImdhdGVcIiB8IFwibm90X2NhbGxlZFwiIHwgXCJpbmNvbXBsZXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUdlbmVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkga2luZDogSW1hZ2VGYWlsdXJlS2luZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiSW1hZ2VHZW5lcmF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5jb25zdCBERUZBVUxUX0VGRk9SVCA9IFwibG93XCI7XG5jb25zdCBRVUVVRV9USU1FT1VUX01TID0gNjBfMDAwO1xuY29uc3QgTUFYX1FVRVVFX1NJWkUgPSA1MDtcbmNvbnN0IFNQQVdOX0lOVEVSVkFMX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZWFkSG9zdEF2YWlsYWJsZUdpQigpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVhZEZpbGVTeW5jKFwiL3Byb2MvbWVtaW5mb1wiLCBcInV0ZjhcIikubWF0Y2goL15NZW1BdmFpbGFibGU6XFxzKyhcXGQrKVxccytrQiQvbSk7XG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pIC8gMTAyNCAvIDEwMjQ7XG4gIH0gY2F0Y2gge31cbiAgcmV0dXJuIGZyZWVtZW0oKSAvIDEwMjQgLyAxMDI0IC8gMTAyNDtcbn1cblxuLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUg6rOg7KCVKS4g64GE66m0IOq4sOyhtCBcIuunpCB0dXJuIOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdFwiIOuPmeyekS5cbmNvbnN0IFRIUkVBRF9SRVVTRV9FTkFCTEVEID0gcHJvY2Vzcy5lbnYuUUdSSURfT1BFTkFJX1RIUkVBRF9SRVVTRSAhPT0gXCJmYWxzZVwiO1xuLy8g7KKM7ZGcIHdvcmtlciDqsIAgYnVzeSDsnbwg65WMIGZyZWUg66W8IOq4sOuLpOumrOuKlCDstZzrjIAg7Iuc6rCELiDstIjqs7wg7IucIOyDiCB0aHJlYWQg66GcIO2PtOuwsS5cbmNvbnN0IFJFVVNFX1dPUktFUl9XQUlUX01TID0gNV8wMDA7XG5jb25zdCBSRVVTRV9XT1JLRVJfUE9MTF9NUyA9IDUwO1xuXG4vLyB3b3JrZXJJZCDtlanshLE6IHRva2VuSWQg7JmAIHdvcmtlckluZGV4KDAuLjE5KSDrpbwg7ZWY64KY7J2YIOyViOyglSDsiKvsnpDroZwg7J247L2U65SpLlxuY29uc3QgT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgPSAxMDA7XG5leHBvcnQgZnVuY3Rpb24gbWFrZU9wZW5BSVdvcmtlcklkKHRva2VuSWQ6IG51bWJlciwgd29ya2VySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0b2tlbklkICogT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgKyB3b3JrZXJJbmRleDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24gcXVvdGFUaHJlc2hvbGRFeGNlZWRlZE1lc3NhZ2UoXG4gIHByb3ZpZGVyOiBzdHJpbmcsXG4gIHRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZXRhaWxzID0gdG9rZW5zXG4gICAgLm1hcCgodG9rZW4pID0+IGAke3Rva2VuLnRva2VuTmFtZX0gKHRocmVzaG9sZCAke3Rva2VuLnRocmVzaG9sZH0lKWApXG4gICAgLmpvaW4oXCIsIFwiKTtcbiAgcmV0dXJuIGRldGFpbHMubGVuZ3RoID4gMFxuICAgID8gYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkOiAke2RldGFpbHN9YFxuICAgIDogYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkYDtcbn1cblxudHlwZSBRdWV1ZUl0ZW0gPSB7XG4gIHJlc29sdmU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgYWJvcnRDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj47XG59O1xuXG50eXBlIFRva2VuTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xuICBhY3RpdmU6IGJvb2xlYW47XG59O1xuXG50eXBlIFRva2VuRWxpZ2liaWxpdHkgPSB7XG4gIHJlYWR5QWN0aXZlVG9rZW5JZHM6IFNldDxudW1iZXI+O1xuICBlbGlnaWJsZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT47XG4gIHRocmVzaG9sZGVkVG9rZW5Db3VudDogbnVtYmVyO1xufTtcblxudHlwZSBSYXRlTGltaXRzQ2FjaGVFbnRyeSA9IE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSAmIHtcbiAgZ2VuZXJhdGlvbjogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB3b3JrZXJQb29sID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gIHRva2VuTWV0YWRhdGEgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5NZXRhZGF0YT4oKTtcbiAgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG4gIHJlYWRvbmx5IHBvb2xDb25maWc6IE9wZW5BSVdvcmtlclBvb2xDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVvdGFCbG9ja2VkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFydGluZ1Rva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlckN1cnNvckJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEhvc3RBdmFpbGFibGVHaUI6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY2FsZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdG9wcGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9vbENvbmZpZzogT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnKCksXG4gICAgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyID0gcmVhZEhvc3RBdmFpbGFibGVHaUIsXG4gICkge1xuICAgIHRoaXMucG9vbENvbmZpZyA9IHBvb2xDb25maWc7XG4gICAgdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCID0gZ2V0SG9zdEF2YWlsYWJsZUdpQjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZVxuICAgICAgICA/IGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7dGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbn0tJHt0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gsIGF1dG9zY2FsZSlgXG4gICAgICAgIDogYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhcbiAgICAgICAgICB0LmlkLFxuICAgICAgICAgIHQubmFtZSxcbiAgICAgICAgICB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICAgIHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHQud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBhdXRvc2NhbGUgb2Zm64+EIGZpeGVkIG1pbuydmCBoZWFsdGggbWFpbnRlbmFuY2XripQg6rOE7IaNIO2VhOyalO2VmOuLpC5cbiAgICB0aGlzLnNjYWxlclRpbWVyID0gc2V0SW50ZXJ2YWwoXG4gICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICB0aGlzLnBvb2xDb25maWcuc2NhbGVJbnRlcnZhbE1zLFxuICAgICk7XG4gICAgdGhpcy5zY2FsZXJUaW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NhbGVyVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY2FsZXJUaW1lcik7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZT8uY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmNsZWFyKCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5kZWxldGUoaWQpO1xuICAgIHRoaXMuaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZShpZCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh3b3JrZXJzLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQ6ICR7bGFiZWx9ICgke3dvcmtlcnMubGVuZ3RofSlgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdGhyZXNob2xkQ2hhbmdlZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoaWQpICE9PSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAodGhyZXNob2xkQ2hhbmdlZCkgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuXG4gICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlOiAke25hbWV9YCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGV4aXN0aW5nLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlbkRlYWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdG9rZW5OYW1lID0gd29ya2Vyc1swXT8udG9rZW5OYW1lO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKG1ldGFkYXRhPy5hY3RpdmUpIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHsgLi4ubWV0YWRhdGEsIGFjdGl2ZTogZmFsc2UgfSk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gd29ya2VyLmFjdGl2ZSk7XG4gICAgd29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdW90YU1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAhd29ya2VyLmFjdGl2ZSB8fFxuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCkgIT09IHF1b3RhTWV0YWRhdGEgfHxcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmIChcbiAgICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAgICF3b3JrZXIuYWN0aXZlIHx8XG4gICAgICAgIHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHxcbiAgICAgICAgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpIHx8XG4gICAgICAgIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQod29ya2VyLnRva2VuSWQpICE9PSBxdW90YU1ldGFkYXRhIHx8XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkpIHtcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VPcGVuQUlXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKFxuICAgICAgZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplID09PSAwICYmXG4gICAgICAhdGhpcy5oYXNBY3RpdmVUb2tlbkNhbmRpZGF0ZShleGNsdWRlZFRva2VuSWRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPiAwICYmIGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPj0gTUFYX1FVRVVFX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBRdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHJlc29sdmU6ICh3b3JrZXIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgZXhlY3V0ZSkpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lcjogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUoaXRlbSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICAgICAgfSwgUVVFVUVfVElNRU9VVF9NUyksXG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM6IG5ldyBTZXQoZXhjbHVkZWRUb2tlbklkcyksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goaXRlbSk7XG4gICAgICAvLyBlbGlnaWJpbGl0eSDtmZXsnbjqs7wgcXVldWUg7IK97J6FIOyCrOydtOyXkCB3b3JrZXLqsIAgcmVhZHkvaWRsZeydtCDrkJwg6rK97Jqw7J2YIGxvc3Qgd2FrZS11cOydhFxuICAgICAgLy8g64ur64qU64ukLiBmaXhlZCBtb2Rl7JeQ7ISc64+EIGlkbGUgd29ya2Vy6rCAIOymieyLnCBxdWV1ZeulvCDqsIDsoLjqsIDslbwg7ZWc64ukLlxuICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRnJvbVF1ZXVlKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5xdWV1ZS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggIT09IC0xKSB0aGlzLnF1ZXVlLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgcmVqZWN0QWxsUXVldWVkKHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICBpdGVtLnJlamVjdChlcnIpO1xuICAgIH0pO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFzeW5jIGRyYWluUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZHJhaW5pbmcpIHtcbiAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgdGhpcy5kcmFpbkFnYWluID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJhaW5RdWV1ZU9uY2UoKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMuZHJhaW5BZ2Fpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpblF1ZXVlT25jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZVswXSE7XG4gICAgICBsZXQgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKG5leHQuZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIG5leHQucmVqZWN0KGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoIXdvcmtlcikgYnJlYWs7XG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXVzZVRocmVhZElkIOqwgCDsnojsnLzrqbQg6riw7KG0IHRocmVhZCDsl5AgZGVsdGEocmV1c2VJbnB1dCnrp4wsIOyXhuycvOuptCDsg4ggdGhyZWFkIOyXkCDsoITssrRcbiAgLy8gcHJvbXB0KGNvbGRJbnB1dCkgKyBoaXN0b3J5IGluamVjdC4gcmV1c2Ug6rCAIGRpc3BhdGNoZXIg64uo7JeQ7IScIO2PtOuwseuQmOuptCDtm4TsnpDroZwg65ao7Ja07KeE64ukLlxuICBwcml2YXRlIGJ1aWxkVHVyblJlcXVlc3QocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcpOiBUdXJuUmVxdWVzdCB7XG4gICAgY29uc3QgcmV1c2luZyA9IHJldXNlVGhyZWFkSWQgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHJldXNpbmcgJiYgcmVxLnJldXNlSW5wdXQgPyByZXEucmV1c2VJbnB1dCA6IHJlcS5jb2xkSW5wdXQsXG4gICAgICBoaXN0b3J5OiByZXVzaW5nID8gdW5kZWZpbmVkIDogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgb3V0cHV0U2NoZW1hOiByZXEub3V0cHV0U2NoZW1hLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgICAgbW9kZWw6IHJlcS5tb2RlbCxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICAgIGltYWdlR2VuZXJhdGlvbjogcmVxLmltYWdlR2VuZXJhdGlvbixcbiAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKtIOyCrOyghCDqsozsnbTtirgoUjUpOiDrsLDsoJXrkJwgd29ya2VyIOydmCBjYXBhYmlsaXR5ICsg7KCB7JqpIOuqqOuNuCDrqYDti7Drqqjri6wuXG4gICAgLy8g67aI7Lap7KGx7J2066m0IHR1cm4g7J2EIOyLpO2Wie2VmOyngCDslYrqs6Ag66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgY29uc3QgcmVhc29uID0gYXdhaXQgd29ya2VyLmNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChyZXEubW9kZWwpO1xuICAgICAgaWYgKHJlYXNvbikgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiZ2F0ZVwiLCByZWFzb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHR1cm5SZXEgPSB0aGlzLmJ1aWxkVHVyblJlcXVlc3QocmVxLCByZXVzZVRocmVhZElkKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIuZXhlY3V0ZVR1cm4odHVyblJlcSwgcmV1c2VUaHJlYWRJZCk7XG5cbiAgICAvLyDsnbTrr7jsp4AgMOqwnCDsi6TtjKgg67aE66WYKFI2KTogdG9vbCDrr7jtmLjstpwo7J6s7Iuc64+EIOustOydtSkgdnMg7Iuc64+EIO2bhCDrr7jsmYTshLEo7J6s7Iuc64+EIO2bhOuztCkuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24gJiYgKCFyZXN1bHQuaW1hZ2VzIHx8IHJlc3VsdC5pbWFnZXMubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgcmVzdWx0LmltYWdlQXR0ZW1wdGVkXG4gICAgICAgID8gbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcImltYWdlIHRvb2wgcmFuIGJ1dCBwcm9kdWNlZCBubyBjb21wbGV0ZWQgaW1hZ2VcIilcbiAgICAgICAgOiBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJub3RfY2FsbGVkXCIsIFwibW9kZWwgZGlkIG5vdCBjYWxsIHRoZSBpbWFnZV9nZW5lcmF0aW9uIHRvb2xcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgdXNhZ2U6IHJlc3VsdC51c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgdHRmdE1zOiByZXN1bHQudHRmdE1zLFxuICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgIHRocmVhZElkOiByZXN1bHQudGhyZWFkSWQsXG4gICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICB9LFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgLy8gd29ya2VyIOydmCBUdXJuUmVzdWx0IOyXkCB0b2tlbk5hbWUvdGhyZWFkQ29vcmQg66W8IOu2meyXrCDsg4HsnIQoR2VuZXJhdGVSZXN1bHQp66GcIOyYrOumsOuLpC5cbiAgICAvLyB0aHJlYWRJZCDripQg7IOIIHRocmVhZCDrqbQgb25UaHJlYWRJZCDroZwg7ZmV7KCV65CY66+A66GcIOuvuOumrCDrs7TqtIDtlbQg65GQ6rOgIG9uQ29tcGxldGUg65WMIOydveuKlOuLpC5cbiAgICBsZXQgcmVzb2x2ZWRUaHJlYWRJZCA9IHJldXNlVGhyZWFkSWQgPz8gXCJcIjtcbiAgICBjb25zdCB3cmFwcGVkQ2I6IFN0cmVhbUNhbGxiYWNrcyA9IHtcbiAgICAgIC4uLmNiLFxuICAgICAgb25UaHJlYWRJZDogKHRocmVhZElkKSA9PiB7XG4gICAgICAgIHJlc29sdmVkVGhyZWFkSWQgPSB0aHJlYWRJZDtcbiAgICAgICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoe1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVzb2x2ZWRUaHJlYWRJZCxcbiAgICAgICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuU3RyZWFtKHR1cm5SZXEsIHdyYXBwZWRDYiwgcmV1c2VUaHJlYWRJZCk7XG4gIH1cblxuICAvLyDilIDilIAgU3Bhd24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgc3Bhd25Xb3JrZXJzKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuaGFzKHRva2VuSWQpKSByZXR1cm47XG4gICAgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcih0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBpKTtcbiAgICAgICAgaWYgKHdvcmtlcikgd29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc3RvcHBlZCAmJlxuICAgICAgICBleHBlY3RlZE1ldGFkYXRhPy5hY3RpdmUgJiZcbiAgICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSA9PT0gZXhwZWN0ZWRNZXRhZGF0YSAmJlxuICAgICAgICAhdGhpcy53b3JrZXJQb29sLmhhcyh0b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIHRoaXMud29ya2VyUG9vbC5zZXQodG9rZW5JZCwgd29ya2Vycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLmtpbGwoKSkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB3b3JrZXIub25UZXJtaW5hbEZhaWx1cmUgPSAoKSA9PiB7XG4gICAgICB2b2lkIHRoaXMuaGFuZGxlV29ya2VyVGVybWluYWxGYWlsdXJlKHdvcmtlcikuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGB0ZXJtaW5hbCB3b3JrZXIgY2xlYW51cCBmYWlsZWQ6ICR7dG9rZW5OYW1lfVske3dvcmtlckluZGV4fV06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXZhbHVhdGVBdXRvc2NhbGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgY29uc3QgbWluaW11bURlZmljaXRUb2tlbklkcyA9IGF3YWl0IHRoaXMuZW5zdXJlTWluaW11bVdvcmtlcnNPbmVTdGVwKCk7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIGJhc2VsaW5lIOuzteq1rOulvCDsi5zrj4TtlZwgdG9rZW7rp4wg6rCZ7J2AIGV2YWx1YXRpb27snZggZGVtYW5kIGV4cGFuc2lvbuyXkOyEnCDsoJzsmbjtlZzri6QuXG4gICAgICAvLyDri6Trpbgg7KCV7IOBIHRva2Vu7J2YIO2Zleyepeq5jOyngCDrp4nsp4DripQg7JWK64qU64ukLlxuICAgICAgYXdhaXQgdGhpcy5zY2FsZVVwT25lU3RlcChtaW5pbXVtRGVmaWNpdFRva2VuSWRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RSZXF1ZXN0QXQgPj0gdGhpcy5wb29sQ29uZmlnLnNjYWxlRG93bklkbGVNcykge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsZURvd25PbmVTdGVwKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2NhbGVVcE9uZVN0ZXAoZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMucnVuU2NhbGluZyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldLmZpbHRlcigoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIW1ldGFkYXRhLmFjdGl2ZSB8fFxuICAgICAgICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5oYXModG9rZW5JZCkgfHxcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSB8fFxuICAgICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwcm9qZWN0ZWRXb3JrZXJDb3VudCA9IHRoaXMud29ya2VyQ291bnQgKyBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHByb2plY3RlZFJzc0dpQiA9IGVzdGltYXRlT3BlbkFJV29ya2VyUnNzR2lCKHByb2plY3RlZFdvcmtlckNvdW50KTtcbiAgICAgIGlmIChwcm9qZWN0ZWRSc3NHaUIgPiB0aGlzLnBvb2xDb25maWcubWF4RXN0aW1hdGVkUnNzR2lCKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIGJsb2NrZWQ6IGVzdGltYXRlZCBSU1MgJHtwcm9qZWN0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUIgZXhjZWVkcyAke3RoaXMucG9vbENvbmZpZy5tYXhFc3RpbWF0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3RBdmFpbGFibGVHaUIgPSB0aGlzLmdldEhvc3RBdmFpbGFibGVHaUIoKTtcbiAgICAgIGlmIChob3N0QXZhaWxhYmxlR2lCIDwgdGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgYmxvY2tlZDogaG9zdCBhdmFpbGFibGUgJHtob3N0QXZhaWxhYmxlR2lCLnRvRml4ZWQoMil9R2lCIGJlbG93ICR7dGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwYXduZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2FuZGlkYXRlcy5tYXAoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHRoaXMuc3Bhd25BbmRDb21taXRXb3JrZXIodG9rZW5JZCwgbWV0YWRhdGEsIHRydWUpKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFkZGVkID0gc3Bhd25lZC5maWx0ZXIoKHdvcmtlcikgPT4gd29ya2VyICE9PSBudWxsKS5sZW5ndGg7XG4gICAgICBpZiAoYWRkZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIHVwOiArJHthZGRlZH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbCwgcXVldWUgJHt0aGlzLnF1ZXVlLmxlbmd0aH0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpLFxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcywgMV8wMDApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGltZXIudW5yZWY/LigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbnN1cmVNaW5pbXVtV29ya2Vyc09uZVN0ZXAoKTogUHJvbWlzZTxTZXQ8bnVtYmVyPj4ge1xuICAgIGNvbnN0IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm4gbWluaW11bURlZmljaXRUb2tlbklkcztcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5maWx0ZXIoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHtcbiAgICAgICAgaWYgKCFtZXRhZGF0YS5hY3RpdmUgfHwgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmhhcyh0b2tlbklkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgY2FuZGlkYXRlcy5mb3JFYWNoKChbdG9rZW5JZF0pID0+IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMuYWRkKHRva2VuSWQpKTtcblxuICAgICAgY29uc3Qgc3Bhd25lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYW5kaWRhdGVzLm1hcCgoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT5cbiAgICAgICAgICB0aGlzLnNwYXduQW5kQ29tbWl0V29ya2VyKHRva2VuSWQsIG1ldGFkYXRhLCBmYWxzZSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29uc3QgYWRkZWQgPSBzcGF3bmVkLmZpbHRlcigod29ya2VyKSA9PiB3b3JrZXIgIT09IG51bGwpLmxlbmd0aDtcbiAgICAgIGlmIChhZGRlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYG9wZW5haSB3b3JrZXIgcG9vbCByZXBhaXJlZDogKyR7YWRkZWR9IHdvcmtlcnMgKCR7dGhpcy53b3JrZXJDb3VudH0gdG90YWwpYCk7XG4gICAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKSxcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMucG9vbENvbmZpZy5zY2FsZUludGVydmFsTXMsIDFfMDAwKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRpbWVyLnVucmVmPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtaW5pbXVtRGVmaWNpdFRva2VuSWRzO1xuICB9XG5cbiAgYXN5bmMgc2NhbGVEb3duT25lU3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5ydW5TY2FsaW5nKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZWQ6IENvZGV4QXBwU2VydmVyV29ya2VyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdG9rZW5JZCBvZiB0aGlzLnRva2VuTWV0YWRhdGEua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdO1xuICAgICAgICBpZiAod29ya2Vycy5sZW5ndGggPD0gdGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1xuICAgICAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYi53b3JrZXJJbmRleCAtIGEud29ya2VySW5kZXgpXG4gICAgICAgICAgLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5oYXNDYXBhY2l0eSk7XG4gICAgICAgIGlmICghd29ya2VyKSBjb250aW51ZTtcblxuICAgICAgICB0aGlzLndvcmtlclBvb2wuc2V0KFxuICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgd29ya2Vycy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gd29ya2VyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmVtb3ZlZC5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHJlbW92ZWQubWFwKCh3b3JrZXIpID0+IHdvcmtlci5raWxsKCkpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBvcGVuYWkgYXV0b3NjYWxlIGRvd246IC0ke3JlbW92ZWQubGVuZ3RofSB3b3JrZXJzICgke3RoaXMud29ya2VyQ291bnR9IHRvdGFsKWApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0QXZhaWxhYmxlV29ya2VySW5kZXgod29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgdXNlZCA9IG5ldyBTZXQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLndvcmtlckluZGV4KSk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47IGluZGV4KyspIHtcbiAgICAgIGlmICghdXNlZC5oYXMoaW5kZXgpKSByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZENvbW1pdFdvcmtlcihcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgbWV0YWRhdGE6IFRva2VuTWV0YWRhdGEsXG4gICAgcmVzcGVjdFF1b3RhQmxvY2s6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZXhwZWN0ZWRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKTtcbiAgICBjb25zdCB3b3JrZXJJbmRleCA9IHRoaXMubmV4dEF2YWlsYWJsZVdvcmtlckluZGV4KGV4cGVjdGVkV29ya2VycyA/PyBbXSk7XG4gICAgaWYgKHdvcmtlckluZGV4ID49IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW4pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcihcbiAgICAgIHRva2VuSWQsXG4gICAgICBtZXRhZGF0YS5uYW1lLFxuICAgICAgbWV0YWRhdGEuY3JlZGVudGlhbHMsXG4gICAgICB3b3JrZXJJbmRleCxcbiAgICApO1xuICAgIGlmICghd29ya2VyKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGN1cnJlbnRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgY29uc3QgY3VycmVudFdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChcbiAgICAgICFjdXJyZW50TWV0YWRhdGE/LmFjdGl2ZSB8fFxuICAgICAgY3VycmVudE1ldGFkYXRhICE9PSBtZXRhZGF0YSB8fFxuICAgICAgY3VycmVudFdvcmtlcnMgIT09IGV4cGVjdGVkV29ya2VycyB8fFxuICAgICAgKHJlc3BlY3RRdW90YUJsb2NrICYmIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSB8fFxuICAgICAgY3VycmVudFdvcmtlcnM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS53b3JrZXJJbmRleCA9PT0gd29ya2VySW5kZXgpXG4gICAgKSB7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRXb3JrZXJzID0gY3VycmVudFdvcmtlcnMgPz8gW107XG4gICAgbmV4dFdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgIG5leHRXb3JrZXJzLnNvcnQoKGEsIGIpID0+IGEud29ya2VySW5kZXggLSBiLndvcmtlckluZGV4KTtcbiAgICBpZiAoIWN1cnJlbnRXb3JrZXJzKSB0aGlzLndvcmtlclBvb2wuc2V0KHRva2VuSWQsIG5leHRXb3JrZXJzKTtcbiAgICByZXR1cm4gd29ya2VyO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlV29ya2VyVGVybWluYWxGYWlsdXJlKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCF3b3JrZXJzPy5pbmNsdWRlcyh3b3JrZXIpKSByZXR1cm47XG5cbiAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCFjdXJyZW50V29ya2Vycz8uaW5jbHVkZXMod29ya2VyKSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGN1cnJlbnRXb3JrZXJzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSB3b3JrZXIpO1xuICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy53b3JrZXJQb29sLnNldCh3b3JrZXIudG9rZW5JZCwgcmVtYWluaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZSh3b3JrZXIudG9rZW5JZCk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYHRlcm1pbmFsIHdvcmtlciByZW1vdmVkOiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLndvcmtlckluZGV4fV0gKCR7cmVtYWluaW5nLmxlbmd0aH0gcmVtYWluaW5nKWAsXG4gICAgKTtcbiAgICB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICB2b2lkIHRoaXMuZXZhbHVhdGVBdXRvc2NhbGluZygpLmNhdGNoKChlKSA9PlxuICAgICAgbG9nZ2VyLndhcm4oYG9wZW5haSBhdXRvc2NhbGUgZXZhbHVhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2NhbGluZyh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2NhbGluZ1Byb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGluZ1Byb21pc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxpbmcgPSB0YXNrKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zY2FsaW5nUHJvbWlzZSA9PT0gc2NhbGluZykgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG4gICAgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IHNjYWxpbmc7XG4gICAgYXdhaXQgc2NhbGluZztcbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgUmF0ZUxpbWl0c0NhY2hlRW50cnk+KCk7XG4gIHN0YXRpYyByZWFkb25seSBSQVRFX0xJTUlUU19DQUNIRV9UVEwgPSA2MF8wMDA7XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4ge1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5nZXQodG9rZW5JZCkgPz8gMDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJhdGVMaW1pdHNDYWNoZS5nZXQodG9rZW5JZCk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkICYmXG4gICAgICBjYWNoZWQuZ2VuZXJhdGlvbiA9PT0gZ2VuZXJhdGlvbiAmJlxuICAgICAgRGF0ZS5ub3coKSAtIGNhY2hlZC5jYWNoZWRBdCA8IE9wZW5BSURpc3BhdGNoZXIuUkFURV9MSU1JVFNfQ0FDSEVfVFRMXG4gICAgKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiBjYWNoZWQuZGF0YSwgY2FjaGVkQXQ6IGNhY2hlZC5jYWNoZWRBdCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9ICh0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdKS5maW5kKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGlmICghd29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJubyByZWFkeSBvcGVuYWkgd29ya2Vyc1wiKTtcbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHdvcmtlci5nZXRSYXRlTGltaXRzKCkpIGFzIEdldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2U7XG4gICAgY29uc3QgZW50cnk6IFJhdGVMaW1pdHNDYWNoZUVudHJ5ID0geyBkYXRhLCBjYWNoZWRBdDogRGF0ZS5ub3coKSwgZ2VuZXJhdGlvbiB9O1xuICAgIGlmICgodGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uZ2V0KHRva2VuSWQpID8/IDApID09PSBnZW5lcmF0aW9uKSB7XG4gICAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5zZXQodG9rZW5JZCwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhOiBlbnRyeS5kYXRhLCBjYWNoZWRBdDogZW50cnkuY2FjaGVkQXQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdERyYWluUXVldWUoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmRyYWluUXVldWUoKS5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZSh0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5kZWxldGUodG9rZW5JZCk7XG4gICAgdGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uc2V0KFxuICAgICAgdG9rZW5JZCxcbiAgICAgICh0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5nZXQodG9rZW5JZCkgPz8gMCkgKyAxLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldFRva2VuTWV0YWRhdGEoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIHdlaWdodDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuc2V0KGlkLCB7XG4gICAgICBuYW1lLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgICBxdW90YVRocmVzaG9sZCxcbiAgICAgIHdlaWdodCxcbiAgICAgIGFjdGl2ZTogdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk/LmFjdGl2ZSA/PyB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUoZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldLnNvbWUoXG4gICAgICAoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4gbWV0YWRhdGEuYWN0aXZlICYmICFleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdW90YVRocmVzaG9sZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKT8ucXVvdGFUaHJlc2hvbGQ7XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgcmV0dXJuIHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj4pOiBQcm9taXNlPFRva2VuRWxpZ2liaWxpdHk+IHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBjb25zdCBieVRva2VuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB3b3JrZXJzKSB7XG4gICAgICBpZiAoIWJ5VG9rZW4uaGFzKHdvcmtlci50b2tlbklkKSkgYnlUb2tlbi5zZXQod29ya2VyLnRva2VuSWQsIHdvcmtlci50b2tlbk5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWR5QWN0aXZlVG9rZW5JZHMgPSBuZXcgU2V0KGJ5VG9rZW4ua2V5cygpKTtcbiAgICBjb25zdCBlbGlnaWJsZVRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgdGhyZXNob2xkZWRUb2tlbkNvdW50ID0gMDtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKGJ5VG9rZW4uZW50cmllcygpKTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBlbnRyaWVzLm1hcChhc3luYyAoW3Rva2VuSWQsIHRva2VuTmFtZV0pID0+IHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSB7XG4gICAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuIHsgdG9rZW5JZCwgdG9rZW5OYW1lLCBlbGlnaWJsZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZCkpIHtcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgZWxpZ2libGU6IGF3YWl0IHRoaXMuaXNUb2tlblF1b3RhRWxpZ2libGUodG9rZW5JZCwgdG9rZW5OYW1lKSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgIGlmIChjaGVjay52YWx1ZS5lbGlnaWJsZSkge1xuICAgICAgICAgIGVsaWdpYmxlVG9rZW5JZHMuYWRkKGNoZWNrLnZhbHVlLnRva2VuSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgICAgaWYgKHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiBjaGVjay52YWx1ZS50b2tlbk5hbWUsIHRocmVzaG9sZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGNvbnN0IFt0b2tlbklkLCB0b2tlbk5hbWVdID0gZW50cnk7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkLCB0b2tlbk5hbWUsIFN0cmluZyhjaGVjay5yZWFzb24pKTtcbiAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQodG9rZW5JZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyByZWFkeUFjdGl2ZVRva2VuSWRzLCBlbGlnaWJsZVRva2VuSWRzLCBvdmVyVGhyZXNob2xkVG9rZW5zLCB0aHJlc2hvbGRlZFRva2VuQ291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNUb2tlblF1b3RhRWxpZ2libGUoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHM/OiBTZXQ8bnVtYmVyPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgdG9rZW5NZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0b2tlbk1ldGFkYXRhPy5xdW90YVRocmVzaG9sZDtcbiAgICAgIGlmICghdG9rZW5NZXRhZGF0YT8uYWN0aXZlIHx8IHRocmVzaG9sZCA9PT0gdW5kZWZpbmVkIHx8IHRocmVzaG9sZCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXN1bHQ6IE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSgoKSA9PiB0aGlzLmdldFJhdGVMaW1pdHNCeVRva2VuSWQodG9rZW5JZCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSAhPT0gdG9rZW5NZXRhZGF0YSkgY29udGludWU7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCkgIT09IHRva2VuTWV0YWRhdGEpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRocmVzaG9sZCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uZWQgPSAhdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5oYXModG9rZW5JZCk7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuYWRkKHRva2VuSWQpO1xuICAgICAgICBpZiAodHJhbnNpdGlvbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2dRdW90YU92ZXJUaHJlc2hvbGQodG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgdGhyZXNob2xkLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUodG9rZW5JZCkpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YVJlY292ZXJlZCh0b2tlbklkLCB0b2tlbk1ldGFkYXRhLm5hbWUgPz8gdG9rZW5OYW1lLCB0aHJlc2hvbGQsIHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhT3ZlclRocmVzaG9sZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGQgJHt0b2tlbk5hbWV9WyR7dG9rZW5JZH1dICgke3Jlc3VsdC51dGlsaXphdGlvblBjdH0lID49ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJvdmVyX3RocmVzaG9sZFwiLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YVJlY292ZXJlZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogcmVjb3ZlcmVkICR7dG9rZW5OYW1lfVske3Rva2VuSWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA8ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJyZWNvdmVyZWRcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIE1vbml0IO2RnOyLnOyaqSDigJQg7Yag7YGw67OEIO2YhOyerCDsm4zsu6Qg7IiYIOyKpOuDheyDtyAo7J2066aE7IicIOygleugrClcbiAgZ2V0IHdvcmtlckNvdW50c0J5VG9rZW4oKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFt0b2tlbklkLCB3b3JrZXJzXSkgPT4gKHtcbiAgICAgICAgbmFtZTogd29ya2Vyc1swXT8udG9rZW5OYW1lID8/IGB0b2tlbiAke3Rva2VuSWR9YCxcbiAgICAgICAgY291bnQ6IHdvcmtlcnMubGVuZ3RoLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuY291bnQgPiAwKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxtQkFBbUIsQ0FBQztBQVF2RCxJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FFbkM7Q0FEWCxZQUNFLE1BQ0EsU0FDQTtFQUNBLE1BQU0sT0FBTztFQUhKLEtBQUEsT0FBQTtFQUlULEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFFQSxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG9CQUFvQjtBQUUxQixTQUFTLHVCQUErQjtDQUN0QyxJQUFJO0VBQ0YsTUFBTSxRQUFRLGFBQWEsaUJBQWlCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sK0JBQStCO0VBQ3pGLElBQUksUUFBUSxJQUFJLE9BQU8sT0FBTyxNQUFNLEVB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
|
|
864
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBDb2RleEFwcFNlcnZlcldvcmtlciDsnpDrj5kg7ZmV7J6lICjquLDrs7ggMX4zLCBoYXJkIGNhcCAyMClcbiAqIC0gaWRsZSB3b3JrZXIgcm91bmQtcm9iaW4g7ISg7YOdICsg7YGQIOuMgOq4sCAo7KCE67aAIGJ1c3kg7IucKVxuICogLSBUb2tlblN1YnNjcmliZXIg7J2067Kk7Yq466GcIHdvcmtlciBwb29sIOuPmeq4sO2ZlFxuICogLSBiYWNrcHJlc3N1cmU6IO2BkCBmdWxsIOuYkOuKlCB0aW1lb3V0IOyLnCBTRVJWRVJfQlVTWVxuICovXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgZnJlZW1lbSB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvciB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL0dldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLCB0eXBlIFR1cm5SZXF1ZXN0IH0gZnJvbSBcIi4vY29kZXgtd29ya2VyXCI7XG5pbXBvcnQge1xuICByZWFkT3BlbkFJUXVvdGFVc2FnZSxcbiAgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0LFxuICB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSxcbn0gZnJvbSBcIi4vb3BlbmFpLXF1b3RhXCI7XG5pbXBvcnQgeyBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2ggfSBmcm9tIFwiLi9vcGVuYWktcmVmcmVzaFwiO1xuaW1wb3J0IHtcbiAgZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIsXG4gIHR5cGUgT3BlbkFJV29ya2VyUG9vbENvbmZpZyxcbiAgcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcsXG59IGZyb20gXCIuL29wZW5haS13b3JrZXItcG9vbC1jb25maWdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib3BlbmFpLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIOyalOyyreydtCDqsozsnbTtirgv7IOd7ISx7JeQIOyLpO2MqO2WiOydhCDrlYzsnZgg6rWs67aE7J6QLlxuLy8gLSBcImdhdGVcIjog7IKs7KCEIOqygOymnSDsi6TtjKgoY2FwYWJpbGl0eS/rqqjrjbgg66mA7Yuw66qo64usIOu2iOy2qeyhsSkg4oCUIHR1cm4g66+47Iuk7ZaJLlxuLy8gLSBcIm5vdF9jYWxsZWRcIjogdHVybiDsnYAg7ISx6rO17ZaI7Jy864KYIOuqqOuNuOydtCBpbWFnZSB0b29sIOydhCDtmLjstpwg7JWIIO2VqCDigJQg7J6s7Iuc64+EIOustOydtSjtlITroaztlITtirgg66y47KCcKS5cbi8vIC0gXCJpbmNvbXBsZXRlXCI6IHRvb2wg7Iuc64+E65CQ7Jy864KYIOyZhOyEsSDsnbTrr7jsp4Ag66+464+E7LCpIOKAlCDsnqzsi5zrj4Qg7ZuE67O0KOyEnOuyhOy4oSDsi6TtjKgv6rGw67aAKS5cbmV4cG9ydCB0eXBlIEltYWdlRmFpbHVyZUtpbmQgPSBcImdhdGVcIiB8IFwibm90X2NhbGxlZFwiIHwgXCJpbmNvbXBsZXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUdlbmVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkga2luZDogSW1hZ2VGYWlsdXJlS2luZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiSW1hZ2VHZW5lcmF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5jb25zdCBERUZBVUxUX0VGRk9SVCA9IFwibG93XCI7XG5jb25zdCBRVUVVRV9USU1FT1VUX01TID0gNjBfMDAwO1xuY29uc3QgTUFYX1FVRVVFX1NJWkUgPSA1MDtcbmNvbnN0IFNQQVdOX0lOVEVSVkFMX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZWFkSG9zdEF2YWlsYWJsZUdpQigpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVhZEZpbGVTeW5jKFwiL3Byb2MvbWVtaW5mb1wiLCBcInV0ZjhcIikubWF0Y2goL15NZW1BdmFpbGFibGU6XFxzKyhcXGQrKVxccytrQiQvbSk7XG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pIC8gMTAyNCAvIDEwMjQ7XG4gIH0gY2F0Y2gge31cbiAgcmV0dXJuIGZyZWVtZW0oKSAvIDEwMjQgLyAxMDI0IC8gMTAyNDtcbn1cblxuLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUg6rOg7KCVKS4g64GE66m0IOq4sOyhtCBcIuunpCB0dXJuIOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdFwiIOuPmeyekS5cbmNvbnN0IFRIUkVBRF9SRVVTRV9FTkFCTEVEID0gcHJvY2Vzcy5lbnYuUUdSSURfT1BFTkFJX1RIUkVBRF9SRVVTRSAhPT0gXCJmYWxzZVwiO1xuLy8g7KKM7ZGcIHdvcmtlciDqsIAgYnVzeSDsnbwg65WMIGZyZWUg66W8IOq4sOuLpOumrOuKlCDstZzrjIAg7Iuc6rCELiDstIjqs7wg7IucIOyDiCB0aHJlYWQg66GcIO2PtOuwsS5cbmNvbnN0IFJFVVNFX1dPUktFUl9XQUlUX01TID0gNV8wMDA7XG5jb25zdCBSRVVTRV9XT1JLRVJfUE9MTF9NUyA9IDUwO1xuXG4vLyB3b3JrZXJJZCDtlanshLE6IHRva2VuSWQg7JmAIHdvcmtlckluZGV4KDAuLjE5KSDrpbwg7ZWY64KY7J2YIOyViOyglSDsiKvsnpDroZwg7J247L2U65SpLlxuY29uc3QgT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgPSAxMDA7XG5leHBvcnQgZnVuY3Rpb24gbWFrZU9wZW5BSVdvcmtlcklkKHRva2VuSWQ6IG51bWJlciwgd29ya2VySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0b2tlbklkICogT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgKyB3b3JrZXJJbmRleDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24gcXVvdGFUaHJlc2hvbGRFeGNlZWRlZE1lc3NhZ2UoXG4gIHByb3ZpZGVyOiBzdHJpbmcsXG4gIHRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZXRhaWxzID0gdG9rZW5zXG4gICAgLm1hcCgodG9rZW4pID0+IGAke3Rva2VuLnRva2VuTmFtZX0gKHRocmVzaG9sZCAke3Rva2VuLnRocmVzaG9sZH0lKWApXG4gICAgLmpvaW4oXCIsIFwiKTtcbiAgcmV0dXJuIGRldGFpbHMubGVuZ3RoID4gMFxuICAgID8gYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkOiAke2RldGFpbHN9YFxuICAgIDogYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkYDtcbn1cblxudHlwZSBRdWV1ZUl0ZW0gPSB7XG4gIHJlc29sdmU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgYWJvcnRDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj47XG59O1xuXG50eXBlIFRva2VuTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xuICBhY3RpdmU6IGJvb2xlYW47XG59O1xuXG50eXBlIFRva2VuRWxpZ2liaWxpdHkgPSB7XG4gIHJlYWR5QWN0aXZlVG9rZW5JZHM6IFNldDxudW1iZXI+O1xuICBlbGlnaWJsZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT47XG4gIHRocmVzaG9sZGVkVG9rZW5Db3VudDogbnVtYmVyO1xufTtcblxudHlwZSBSYXRlTGltaXRzQ2FjaGVFbnRyeSA9IE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSAmIHtcbiAgZ2VuZXJhdGlvbjogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB3b3JrZXJQb29sID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gIHRva2VuTWV0YWRhdGEgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5NZXRhZGF0YT4oKTtcbiAgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG4gIHJlYWRvbmx5IHBvb2xDb25maWc6IE9wZW5BSVdvcmtlclBvb2xDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVvdGFCbG9ja2VkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFydGluZ1Rva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlckN1cnNvckJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEhvc3RBdmFpbGFibGVHaUI6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY2FsZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdG9wcGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9vbENvbmZpZzogT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnKCksXG4gICAgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyID0gcmVhZEhvc3RBdmFpbGFibGVHaUIsXG4gICkge1xuICAgIHRoaXMucG9vbENvbmZpZyA9IHBvb2xDb25maWc7XG4gICAgdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCID0gZ2V0SG9zdEF2YWlsYWJsZUdpQjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZVxuICAgICAgICA/IGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7dGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbn0tJHt0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gsIGF1dG9zY2FsZSlgXG4gICAgICAgIDogYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhcbiAgICAgICAgICB0LmlkLFxuICAgICAgICAgIHQubmFtZSxcbiAgICAgICAgICB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICAgIHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHQud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBhdXRvc2NhbGUgb2Zm64+EIGZpeGVkIG1pbuydmCBoZWFsdGggbWFpbnRlbmFuY2XripQg6rOE7IaNIO2VhOyalO2VmOuLpC5cbiAgICB0aGlzLnNjYWxlclRpbWVyID0gc2V0SW50ZXJ2YWwoXG4gICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICB0aGlzLnBvb2xDb25maWcuc2NhbGVJbnRlcnZhbE1zLFxuICAgICk7XG4gICAgdGhpcy5zY2FsZXJUaW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NhbGVyVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY2FsZXJUaW1lcik7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZT8uY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmNsZWFyKCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5kZWxldGUoaWQpO1xuICAgIHRoaXMuaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZShpZCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh3b3JrZXJzLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQ6ICR7bGFiZWx9ICgke3dvcmtlcnMubGVuZ3RofSlgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdGhyZXNob2xkQ2hhbmdlZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoaWQpICE9PSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAodGhyZXNob2xkQ2hhbmdlZCkgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuXG4gICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlOiAke25hbWV9YCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGV4aXN0aW5nLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlbkRlYWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdG9rZW5OYW1lID0gd29ya2Vyc1swXT8udG9rZW5OYW1lO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKG1ldGFkYXRhPy5hY3RpdmUpIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHsgLi4ubWV0YWRhdGEsIGFjdGl2ZTogZmFsc2UgfSk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gd29ya2VyLmFjdGl2ZSk7XG4gICAgd29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdW90YU1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAhd29ya2VyLmFjdGl2ZSB8fFxuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCkgIT09IHF1b3RhTWV0YWRhdGEgfHxcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmIChcbiAgICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAgICF3b3JrZXIuYWN0aXZlIHx8XG4gICAgICAgIHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHxcbiAgICAgICAgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpIHx8XG4gICAgICAgIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQod29ya2VyLnRva2VuSWQpICE9PSBxdW90YU1ldGFkYXRhIHx8XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkpIHtcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VPcGVuQUlXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKFxuICAgICAgZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplID09PSAwICYmXG4gICAgICAhdGhpcy5oYXNBY3RpdmVUb2tlbkNhbmRpZGF0ZShleGNsdWRlZFRva2VuSWRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPiAwICYmIGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPj0gTUFYX1FVRVVFX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBRdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHJlc29sdmU6ICh3b3JrZXIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgZXhlY3V0ZSkpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lcjogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUoaXRlbSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICAgICAgfSwgUVVFVUVfVElNRU9VVF9NUyksXG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM6IG5ldyBTZXQoZXhjbHVkZWRUb2tlbklkcyksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goaXRlbSk7XG4gICAgICAvLyBlbGlnaWJpbGl0eSDtmZXsnbjqs7wgcXVldWUg7IK97J6FIOyCrOydtOyXkCB3b3JrZXLqsIAgcmVhZHkvaWRsZeydtCDrkJwg6rK97Jqw7J2YIGxvc3Qgd2FrZS11cOydhFxuICAgICAgLy8g64ur64qU64ukLiBmaXhlZCBtb2Rl7JeQ7ISc64+EIGlkbGUgd29ya2Vy6rCAIOymieyLnCBxdWV1ZeulvCDqsIDsoLjqsIDslbwg7ZWc64ukLlxuICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRnJvbVF1ZXVlKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5xdWV1ZS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggIT09IC0xKSB0aGlzLnF1ZXVlLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgcmVqZWN0QWxsUXVldWVkKHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICBpdGVtLnJlamVjdChlcnIpO1xuICAgIH0pO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFzeW5jIGRyYWluUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZHJhaW5pbmcpIHtcbiAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgdGhpcy5kcmFpbkFnYWluID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJhaW5RdWV1ZU9uY2UoKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMuZHJhaW5BZ2Fpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpblF1ZXVlT25jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZVswXSE7XG4gICAgICBsZXQgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKG5leHQuZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIG5leHQucmVqZWN0KGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoIXdvcmtlcikgYnJlYWs7XG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXVzZVRocmVhZElkIOqwgCDsnojsnLzrqbQg6riw7KG0IHRocmVhZCDsl5AgZGVsdGEocmV1c2VJbnB1dCnrp4wsIOyXhuycvOuptCDsg4ggdGhyZWFkIOyXkCDsoITssrRcbiAgLy8gcHJvbXB0KGNvbGRJbnB1dCkgKyBoaXN0b3J5IGluamVjdC4gcmV1c2Ug6rCAIGRpc3BhdGNoZXIg64uo7JeQ7IScIO2PtOuwseuQmOuptCDtm4TsnpDroZwg65ao7Ja07KeE64ukLlxuICBwcml2YXRlIGJ1aWxkVHVyblJlcXVlc3QocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcpOiBUdXJuUmVxdWVzdCB7XG4gICAgY29uc3QgcmV1c2luZyA9IHJldXNlVGhyZWFkSWQgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHJldXNpbmcgJiYgcmVxLnJldXNlSW5wdXQgPyByZXEucmV1c2VJbnB1dCA6IHJlcS5jb2xkSW5wdXQsXG4gICAgICBoaXN0b3J5OiByZXVzaW5nID8gdW5kZWZpbmVkIDogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgb3V0cHV0U2NoZW1hOiByZXEub3V0cHV0U2NoZW1hLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgICAgbW9kZWw6IHJlcS5tb2RlbCxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICAgIGltYWdlR2VuZXJhdGlvbjogcmVxLmltYWdlR2VuZXJhdGlvbixcbiAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKtIOyCrOyghCDqsozsnbTtirgoUjUpOiDrsLDsoJXrkJwgd29ya2VyIOydmCBjYXBhYmlsaXR5ICsg7KCB7JqpIOuqqOuNuCDrqYDti7Drqqjri6wuXG4gICAgLy8g67aI7Lap7KGx7J2066m0IHR1cm4g7J2EIOyLpO2Wie2VmOyngCDslYrqs6Ag66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgY29uc3QgcmVhc29uID0gYXdhaXQgd29ya2VyLmNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChyZXEubW9kZWwpO1xuICAgICAgaWYgKHJlYXNvbikgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiZ2F0ZVwiLCByZWFzb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHR1cm5SZXEgPSB0aGlzLmJ1aWxkVHVyblJlcXVlc3QocmVxLCByZXVzZVRocmVhZElkKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIuZXhlY3V0ZVR1cm4odHVyblJlcSwgcmV1c2VUaHJlYWRJZCk7XG5cbiAgICAvLyDsnbTrr7jsp4AgMOqwnCDsi6TtjKgg67aE66WYKFI2KTogdG9vbCDrr7jtmLjstpwo7J6s7Iuc64+EIOustOydtSkgdnMg7Iuc64+EIO2bhCDrr7jsmYTshLEo7J6s7Iuc64+EIO2bhOuztCkuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24gJiYgKCFyZXN1bHQuaW1hZ2VzIHx8IHJlc3VsdC5pbWFnZXMubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgcmVzdWx0LmltYWdlQXR0ZW1wdGVkXG4gICAgICAgID8gbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcImltYWdlIHRvb2wgcmFuIGJ1dCBwcm9kdWNlZCBubyBjb21wbGV0ZWQgaW1hZ2VcIilcbiAgICAgICAgOiBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJub3RfY2FsbGVkXCIsIFwibW9kZWwgZGlkIG5vdCBjYWxsIHRoZSBpbWFnZV9nZW5lcmF0aW9uIHRvb2xcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgdXNhZ2U6IHJlc3VsdC51c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgdHRmdE1zOiByZXN1bHQudHRmdE1zLFxuICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgIHRocmVhZElkOiByZXN1bHQudGhyZWFkSWQsXG4gICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICB9LFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgLy8gd29ya2VyIOydmCBUdXJuUmVzdWx0IOyXkCB0b2tlbk5hbWUvdGhyZWFkQ29vcmQg66W8IOu2meyXrCDsg4HsnIQoR2VuZXJhdGVSZXN1bHQp66GcIOyYrOumsOuLpC5cbiAgICAvLyB0aHJlYWRJZCDripQg7IOIIHRocmVhZCDrqbQgb25UaHJlYWRJZCDroZwg7ZmV7KCV65CY66+A66GcIOuvuOumrCDrs7TqtIDtlbQg65GQ6rOgIG9uQ29tcGxldGUg65WMIOydveuKlOuLpC5cbiAgICBsZXQgcmVzb2x2ZWRUaHJlYWRJZCA9IHJldXNlVGhyZWFkSWQgPz8gXCJcIjtcbiAgICBjb25zdCB3cmFwcGVkQ2I6IFN0cmVhbUNhbGxiYWNrcyA9IHtcbiAgICAgIC4uLmNiLFxuICAgICAgb25UaHJlYWRJZDogKHRocmVhZElkKSA9PiB7XG4gICAgICAgIHJlc29sdmVkVGhyZWFkSWQgPSB0aHJlYWRJZDtcbiAgICAgICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoe1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVzb2x2ZWRUaHJlYWRJZCxcbiAgICAgICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuU3RyZWFtKHR1cm5SZXEsIHdyYXBwZWRDYiwgcmV1c2VUaHJlYWRJZCk7XG4gIH1cblxuICAvLyDilIDilIAgU3Bhd24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgc3Bhd25Xb3JrZXJzKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuaGFzKHRva2VuSWQpKSByZXR1cm47XG4gICAgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcih0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBpKTtcbiAgICAgICAgaWYgKHdvcmtlcikgd29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc3RvcHBlZCAmJlxuICAgICAgICBleHBlY3RlZE1ldGFkYXRhPy5hY3RpdmUgJiZcbiAgICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSA9PT0gZXhwZWN0ZWRNZXRhZGF0YSAmJlxuICAgICAgICAhdGhpcy53b3JrZXJQb29sLmhhcyh0b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIHRoaXMud29ya2VyUG9vbC5zZXQodG9rZW5JZCwgd29ya2Vycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLmtpbGwoKSkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB3b3JrZXIub25UZXJtaW5hbEZhaWx1cmUgPSAoKSA9PiB7XG4gICAgICB2b2lkIHRoaXMuaGFuZGxlV29ya2VyVGVybWluYWxGYWlsdXJlKHdvcmtlcikuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGB0ZXJtaW5hbCB3b3JrZXIgY2xlYW51cCBmYWlsZWQ6ICR7dG9rZW5OYW1lfVske3dvcmtlckluZGV4fV06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXZhbHVhdGVBdXRvc2NhbGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgdGhpcy5zd2VlcElkbGVXb3JrZXJUaHJlYWRzKCk7XG4gICAgY29uc3QgbWluaW11bURlZmljaXRUb2tlbklkcyA9IGF3YWl0IHRoaXMuZW5zdXJlTWluaW11bVdvcmtlcnNPbmVTdGVwKCk7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIGJhc2VsaW5lIOuzteq1rOulvCDsi5zrj4TtlZwgdG9rZW7rp4wg6rCZ7J2AIGV2YWx1YXRpb27snZggZGVtYW5kIGV4cGFuc2lvbuyXkOyEnCDsoJzsmbjtlZzri6QuXG4gICAgICAvLyDri6Trpbgg7KCV7IOBIHRva2Vu7J2YIO2Zleyepeq5jOyngCDrp4nsp4DripQg7JWK64qU64ukLlxuICAgICAgYXdhaXQgdGhpcy5zY2FsZVVwT25lU3RlcChtaW5pbXVtRGVmaWNpdFRva2VuSWRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RSZXF1ZXN0QXQgPj0gdGhpcy5wb29sQ29uZmlnLnNjYWxlRG93bklkbGVNcykge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsZURvd25PbmVTdGVwKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2NhbGVVcE9uZVN0ZXAoZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMucnVuU2NhbGluZyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldLmZpbHRlcigoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIW1ldGFkYXRhLmFjdGl2ZSB8fFxuICAgICAgICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5oYXModG9rZW5JZCkgfHxcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSB8fFxuICAgICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwcm9qZWN0ZWRXb3JrZXJDb3VudCA9IHRoaXMud29ya2VyQ291bnQgKyBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHByb2plY3RlZFJzc0dpQiA9IGVzdGltYXRlT3BlbkFJV29ya2VyUnNzR2lCKHByb2plY3RlZFdvcmtlckNvdW50KTtcbiAgICAgIGlmIChwcm9qZWN0ZWRSc3NHaUIgPiB0aGlzLnBvb2xDb25maWcubWF4RXN0aW1hdGVkUnNzR2lCKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIGJsb2NrZWQ6IGVzdGltYXRlZCBSU1MgJHtwcm9qZWN0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUIgZXhjZWVkcyAke3RoaXMucG9vbENvbmZpZy5tYXhFc3RpbWF0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3RBdmFpbGFibGVHaUIgPSB0aGlzLmdldEhvc3RBdmFpbGFibGVHaUIoKTtcbiAgICAgIGlmIChob3N0QXZhaWxhYmxlR2lCIDwgdGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgYmxvY2tlZDogaG9zdCBhdmFpbGFibGUgJHtob3N0QXZhaWxhYmxlR2lCLnRvRml4ZWQoMil9R2lCIGJlbG93ICR7dGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwYXduZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2FuZGlkYXRlcy5tYXAoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHRoaXMuc3Bhd25BbmRDb21taXRXb3JrZXIodG9rZW5JZCwgbWV0YWRhdGEsIHRydWUpKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFkZGVkID0gc3Bhd25lZC5maWx0ZXIoKHdvcmtlcikgPT4gd29ya2VyICE9PSBudWxsKS5sZW5ndGg7XG4gICAgICBpZiAoYWRkZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIHVwOiArJHthZGRlZH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbCwgcXVldWUgJHt0aGlzLnF1ZXVlLmxlbmd0aH0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpLFxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcywgMV8wMDApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGltZXIudW5yZWY/LigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbnN1cmVNaW5pbXVtV29ya2Vyc09uZVN0ZXAoKTogUHJvbWlzZTxTZXQ8bnVtYmVyPj4ge1xuICAgIGNvbnN0IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm4gbWluaW11bURlZmljaXRUb2tlbklkcztcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5maWx0ZXIoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHtcbiAgICAgICAgaWYgKCFtZXRhZGF0YS5hY3RpdmUgfHwgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmhhcyh0b2tlbklkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgY2FuZGlkYXRlcy5mb3JFYWNoKChbdG9rZW5JZF0pID0+IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMuYWRkKHRva2VuSWQpKTtcblxuICAgICAgY29uc3Qgc3Bhd25lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYW5kaWRhdGVzLm1hcCgoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT5cbiAgICAgICAgICB0aGlzLnNwYXduQW5kQ29tbWl0V29ya2VyKHRva2VuSWQsIG1ldGFkYXRhLCBmYWxzZSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29uc3QgYWRkZWQgPSBzcGF3bmVkLmZpbHRlcigod29ya2VyKSA9PiB3b3JrZXIgIT09IG51bGwpLmxlbmd0aDtcbiAgICAgIGlmIChhZGRlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYG9wZW5haSB3b3JrZXIgcG9vbCByZXBhaXJlZDogKyR7YWRkZWR9IHdvcmtlcnMgKCR7dGhpcy53b3JrZXJDb3VudH0gdG90YWwpYCk7XG4gICAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKSxcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMucG9vbENvbmZpZy5zY2FsZUludGVydmFsTXMsIDFfMDAwKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRpbWVyLnVucmVmPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtaW5pbXVtRGVmaWNpdFRva2VuSWRzO1xuICB9XG5cbiAgYXN5bmMgc2NhbGVEb3duT25lU3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5ydW5TY2FsaW5nKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZWQ6IENvZGV4QXBwU2VydmVyV29ya2VyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdG9rZW5JZCBvZiB0aGlzLnRva2VuTWV0YWRhdGEua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdO1xuICAgICAgICBpZiAod29ya2Vycy5sZW5ndGggPD0gdGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1xuICAgICAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYi53b3JrZXJJbmRleCAtIGEud29ya2VySW5kZXgpXG4gICAgICAgICAgLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5oYXNDYXBhY2l0eSk7XG4gICAgICAgIGlmICghd29ya2VyKSBjb250aW51ZTtcblxuICAgICAgICB0aGlzLndvcmtlclBvb2wuc2V0KFxuICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgd29ya2Vycy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gd29ya2VyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmVtb3ZlZC5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHJlbW92ZWQubWFwKCh3b3JrZXIpID0+IHdvcmtlci5raWxsKCkpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBvcGVuYWkgYXV0b3NjYWxlIGRvd246IC0ke3JlbW92ZWQubGVuZ3RofSB3b3JrZXJzICgke3RoaXMud29ya2VyQ291bnR9IHRvdGFsKWApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0QXZhaWxhYmxlV29ya2VySW5kZXgod29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgdXNlZCA9IG5ldyBTZXQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLndvcmtlckluZGV4KSk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47IGluZGV4KyspIHtcbiAgICAgIGlmICghdXNlZC5oYXMoaW5kZXgpKSByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBzd2VlcElkbGVXb3JrZXJUaHJlYWRzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgd29ya2VyIG9mIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKSkge1xuICAgICAgLy8gdHVybiDspJEgdW5zdWJzY3JpYmXtlZjrqbQg7ZW064u5IGNvbm5lY3Rpb27snLzroZwgbm90aWZpY2F0aW9u7J20IOuNlCDsmKTsp4Ag7JWK7JWEXG4gICAgICAvLyDsi6Ttlokg7KSRIOyalOyyreydtCB0aW1lb3V065CgIOyImCDsnojri6QuIHJlYWR5ICsgaWRsZSB3b3JrZXLrp4wgc3dlZXDtlZzri6QuXG4gICAgICBpZiAod29ya2VyLmlzUmVhZHkgJiYgd29ya2VyLmhhc0NhcGFjaXR5KSB3b3JrZXIuc3dlZXBJZGxlVGhyZWFkcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3Bhd25BbmRDb21taXRXb3JrZXIoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIG1ldGFkYXRhOiBUb2tlbk1ldGFkYXRhLFxuICAgIHJlc3BlY3RRdW90YUJsb2NrOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIGNvbnN0IGV4cGVjdGVkV29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk7XG4gICAgY29uc3Qgd29ya2VySW5kZXggPSB0aGlzLm5leHRBdmFpbGFibGVXb3JrZXJJbmRleChleHBlY3RlZFdvcmtlcnMgPz8gW10pO1xuICAgIGlmICh3b3JrZXJJbmRleCA+PSB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIoXG4gICAgICB0b2tlbklkLFxuICAgICAgbWV0YWRhdGEubmFtZSxcbiAgICAgIG1ldGFkYXRhLmNyZWRlbnRpYWxzLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgKTtcbiAgICBpZiAoIXdvcmtlcikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKTtcbiAgICBpZiAoXG4gICAgICAhY3VycmVudE1ldGFkYXRhPy5hY3RpdmUgfHxcbiAgICAgIGN1cnJlbnRNZXRhZGF0YSAhPT0gbWV0YWRhdGEgfHxcbiAgICAgIGN1cnJlbnRXb3JrZXJzICE9PSBleHBlY3RlZFdvcmtlcnMgfHxcbiAgICAgIChyZXNwZWN0UXVvdGFCbG9jayAmJiB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh0b2tlbklkKSkgfHxcbiAgICAgIGN1cnJlbnRXb3JrZXJzPy5zb21lKChlbnRyeSkgPT4gZW50cnkud29ya2VySW5kZXggPT09IHdvcmtlckluZGV4KVxuICAgICkge1xuICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0V29ya2VycyA9IGN1cnJlbnRXb3JrZXJzID8/IFtdO1xuICAgIG5leHRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICBuZXh0V29ya2Vycy5zb3J0KChhLCBiKSA9PiBhLndvcmtlckluZGV4IC0gYi53b3JrZXJJbmRleCk7XG4gICAgaWYgKCFjdXJyZW50V29ya2VycykgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCBuZXh0V29ya2Vycyk7XG4gICAgcmV0dXJuIHdvcmtlcjtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVdvcmtlclRlcm1pbmFsRmFpbHVyZSh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQod29ya2VyLnRva2VuSWQpO1xuICAgIGlmICghd29ya2Vycz8uaW5jbHVkZXMod29ya2VyKSkgcmV0dXJuO1xuXG4gICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBjdXJyZW50V29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQod29ya2VyLnRva2VuSWQpO1xuICAgIGlmICghY3VycmVudFdvcmtlcnM/LmluY2x1ZGVzKHdvcmtlcikpIHJldHVybjtcbiAgICBjb25zdCByZW1haW5pbmcgPSBjdXJyZW50V29ya2Vycy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gd29ya2VyKTtcbiAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMud29ya2VyUG9vbC5zZXQod29ya2VyLnRva2VuSWQsIHJlbWFpbmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29ya2VyUG9vbC5kZWxldGUod29ya2VyLnRva2VuSWQpO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcbiAgICAgIGB0ZXJtaW5hbCB3b3JrZXIgcmVtb3ZlZDogJHt3b3JrZXIudG9rZW5OYW1lfVske3dvcmtlci53b3JrZXJJbmRleH1dICgke3JlbWFpbmluZy5sZW5ndGh9IHJlbWFpbmluZylgLFxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLmV2YWx1YXRlQXV0b3NjYWxpbmcoKS5jYXRjaCgoZSkgPT5cbiAgICAgIGxvZ2dlci53YXJuKGBvcGVuYWkgYXV0b3NjYWxlIGV2YWx1YXRpb24gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNjYWxpbmcodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNjYWxpbmdQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNjYWxpbmdQcm9taXNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsaW5nID0gdGFzaygpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2NhbGluZ1Byb21pc2UgPT09IHNjYWxpbmcpIHRoaXMuc2NhbGluZ1Byb21pc2UgPSBudWxsO1xuICAgIH0pO1xuICAgIHRoaXMuc2NhbGluZ1Byb21pc2UgPSBzY2FsaW5nO1xuICAgIGF3YWl0IHNjYWxpbmc7XG4gIH1cblxuICAvLyDilIDilIAgUmF0ZSBsaW1pdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcmF0ZUxpbWl0c0NhY2hlID0gbmV3IE1hcDxudW1iZXIsIFJhdGVMaW1pdHNDYWNoZUVudHJ5PigpO1xuICBzdGF0aWMgcmVhZG9ubHkgUkFURV9MSU1JVFNfQ0FDSEVfVFRMID0gNjBfMDAwO1xuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHNCeVRva2VuSWQodG9rZW5JZDogbnVtYmVyKTogUHJvbWlzZTxPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGE+IHtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uZ2V0KHRva2VuSWQpID8/IDA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChcbiAgICAgIGNhY2hlZCAmJlxuICAgICAgY2FjaGVkLmdlbmVyYXRpb24gPT09IGdlbmVyYXRpb24gJiZcbiAgICAgIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTFxuICAgICkge1xuICAgICAgcmV0dXJuIHsgZGF0YTogY2FjaGVkLmRhdGEsIGNhY2hlZEF0OiBjYWNoZWQuY2FjaGVkQXQgfTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXIgPSAodGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKSA/PyBbXSkuZmluZCgodykgPT4gdy5pc1JlYWR5KTtcbiAgICBpZiAoIXdvcmtlcikgdGhyb3cgbmV3IEVycm9yKFwibm8gcmVhZHkgb3BlbmFpIHdvcmtlcnNcIik7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCB3b3JrZXIuZ2V0UmF0ZUxpbWl0cygpKSBhcyBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlO1xuICAgIGNvbnN0IGVudHJ5OiBSYXRlTGltaXRzQ2FjaGVFbnRyeSA9IHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCksIGdlbmVyYXRpb24gfTtcbiAgICBpZiAoKHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwKSA9PT0gZ2VuZXJhdGlvbikge1xuICAgICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuc2V0KHRva2VuSWQsIGVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGF0YTogZW50cnkuZGF0YSwgY2FjaGVkQXQ6IGVudHJ5LmNhY2hlZEF0IH07XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3REcmFpblF1ZXVlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5kcmFpblF1ZXVlKCkuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBkcmFpblF1ZXVlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUodG9rZW5JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKHRva2VuSWQpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLnNldChcbiAgICAgIHRva2VuSWQsXG4gICAgICAodGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uZ2V0KHRva2VuSWQpID8/IDApICsgMSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUb2tlbk1ldGFkYXRhKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwge1xuICAgICAgbmFtZSxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICB3ZWlnaHQsXG4gICAgICBhY3RpdmU6IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpPy5hY3RpdmUgPz8gdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0FjdGl2ZVRva2VuQ2FuZGlkYXRlKGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5zb21lKFxuICAgICAgKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IG1ldGFkYXRhLmFjdGl2ZSAmJiAhZXhjbHVkZWRUb2tlbklkcy5oYXModG9rZW5JZCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk/LnF1b3RhVGhyZXNob2xkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNRdW90YVRocmVzaG9sZCh0b2tlbklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQpO1xuICAgIHJldHVybiB0aHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0aHJlc2hvbGQgIT09IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+KTogUHJvbWlzZTxUb2tlbkVsaWdpYmlsaXR5PiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk7XG4gICAgY29uc3QgYnlUb2tlbiA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2Ygd29ya2Vycykge1xuICAgICAgaWYgKCFieVRva2VuLmhhcyh3b3JrZXIudG9rZW5JZCkpIGJ5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXIudG9rZW5OYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkeUFjdGl2ZVRva2VuSWRzID0gbmV3IFNldChieVRva2VuLmtleXMoKSk7XG4gICAgY29uc3QgZWxpZ2libGVUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGNvbnN0IG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IHRocmVzaG9sZGVkVG9rZW5Db3VudCA9IDA7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbShieVRva2VuLmVudHJpZXMoKSk7XG4gICAgY29uc3QgY2hlY2tzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgZW50cmllcy5tYXAoYXN5bmMgKFt0b2tlbklkLCB0b2tlbk5hbWVdKSA9PiB7XG4gICAgICAgIGlmIChleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSkge1xuICAgICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudCsrO1xuICAgICAgICAgIHJldHVybiB7IHRva2VuSWQsIHRva2VuTmFtZSwgZWxpZ2libGU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuSWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdG9rZW5JZCwgdG9rZW5OYW1lLCBlbGlnaWJsZTogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudCsrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgIGVsaWdpYmxlOiBhd2FpdCB0aGlzLmlzVG9rZW5RdW90YUVsaWdpYmxlKHRva2VuSWQsIHRva2VuTmFtZSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY2hlY2tzLmZvckVhY2goKGNoZWNrLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGNoZWNrLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICBpZiAoY2hlY2sudmFsdWUuZWxpZ2libGUpIHtcbiAgICAgICAgICBlbGlnaWJsZVRva2VuSWRzLmFkZChjaGVjay52YWx1ZS50b2tlbklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKGNoZWNrLnZhbHVlLnRva2VuSWQpO1xuICAgICAgICAgIGlmICh0aHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0aHJlc2hvbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnMucHVzaCh7IHRva2VuTmFtZTogY2hlY2sudmFsdWUudG9rZW5OYW1lLCB0aHJlc2hvbGQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCBbdG9rZW5JZCwgdG9rZW5OYW1lXSA9IGVudHJ5O1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCBTdHJpbmcoY2hlY2sucmVhc29uKSk7XG4gICAgICAgIGVsaWdpYmxlVG9rZW5JZHMuYWRkKHRva2VuSWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgcmVhZHlBY3RpdmVUb2tlbklkcywgZWxpZ2libGVUb2tlbklkcywgb3ZlclRocmVzaG9sZFRva2VucywgdGhyZXNob2xkZWRUb2tlbkNvdW50IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGlzVG9rZW5RdW90YUVsaWdpYmxlKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBleGNsdWRlZFRva2VuSWRzPzogU2V0PG51bWJlcj4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHRva2VuTWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gdG9rZW5NZXRhZGF0YT8ucXVvdGFUaHJlc2hvbGQ7XG4gICAgICBpZiAoIXRva2VuTWV0YWRhdGE/LmFjdGl2ZSB8fCB0aHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCB0aHJlc2hvbGQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUodG9rZW5JZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmVzdWx0OiBPcGVuQUlRdW90YVVzYWdlUmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZE9wZW5BSVF1b3RhVXNhZ2UoKCkgPT4gdGhpcy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCkgIT09IHRva2VuTWV0YWRhdGEpIGNvbnRpbnVlO1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuSWQsIHRva2VuTWV0YWRhdGEubmFtZSA/PyB0b2tlbk5hbWUsIChlIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpICE9PSB0b2tlbk1ldGFkYXRhKSBjb250aW51ZTtcblxuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikge1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuSWQsIHRva2VuTWV0YWRhdGEubmFtZSA/PyB0b2tlbk5hbWUsIHJlc3VsdC5yZWFzb24pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbmVkID0gIXRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpO1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICAgICAgaWYgKHRyYW5zaXRpb25lZCkge1xuICAgICAgICAgIHRoaXMubG9nUXVvdGFPdmVyVGhyZXNob2xkKHRva2VuSWQsIHRva2VuTWV0YWRhdGEubmFtZSA/PyB0b2tlbk5hbWUsIHRocmVzaG9sZCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBleGNsdWRlZFRva2VuSWRzPy5hZGQodG9rZW5JZCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFSZWNvdmVyZWQodG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgdGhyZXNob2xkLCByZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YU92ZXJUaHJlc2hvbGQoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIHJlc3VsdDogRXh0cmFjdDxPcGVuQUlRdW90YVVzYWdlUmVzdWx0LCB7IGtpbmQ6IFwib2tcIiB9PixcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkICR7dG9rZW5OYW1lfVske3Rva2VuSWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA+PSAke3RocmVzaG9sZH0lKWAsXG4gICAgICB7XG4gICAgICAgIHRva2VuSWQsXG4gICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgY2FjaGVkVXRpbGl6YXRpb246IHJlc3VsdC51dGlsaXphdGlvblBjdCxcbiAgICAgICAgY2FjaGVBZ2U6IHJlc3VsdC5jYWNoZUFnZU1zLFxuICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJlc3VsdC53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgIHJlc2V0c0F0OiByZXN1bHQucmVzZXRzQXQsXG4gICAgICAgIGxpbWl0SWQ6IHJlc3VsdC5saW1pdElkLFxuICAgICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFSZWNvdmVyZWQoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIHJlc3VsdDogRXh0cmFjdDxPcGVuQUlRdW90YVVzYWdlUmVzdWx0LCB7IGtpbmQ6IFwib2tcIiB9PixcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IHJlY292ZXJlZCAke3Rva2VuTmFtZX1bJHt0b2tlbklkfV0gKCR7cmVzdWx0LnV0aWxpemF0aW9uUGN0fSUgPCAke3RocmVzaG9sZH0lKWAsXG4gICAgICB7XG4gICAgICAgIHRva2VuSWQsXG4gICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgY2FjaGVkVXRpbGl6YXRpb246IHJlc3VsdC51dGlsaXphdGlvblBjdCxcbiAgICAgICAgY2FjaGVBZ2U6IHJlc3VsdC5jYWNoZUFnZU1zLFxuICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJlc3VsdC53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgIHJlc2V0c0F0OiByZXN1bHQucmVzZXRzQXQsXG4gICAgICAgIGxpbWl0SWQ6IHJlc3VsdC5saW1pdElkLFxuICAgICAgICByZWFzb246IFwicmVjb3ZlcmVkXCIsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZDogbnVtYmVyLCB0b2tlbk5hbWU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQpO1xuICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGxvb2t1cF9mYWlsX29wZW5cIiwge1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgcmVhc29uOiBcImxvb2t1cF9mYWlsX29wZW5cIixcbiAgICAgIGxvb2t1cFJlYXNvbjogcmVhc29uLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHk6IFRva2VuRWxpZ2liaWxpdHkpOiBuZXZlciB7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogYWxsX2V4Y2VlZGVkXCIsIHtcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgdG9rZW5Db3VudDogZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplLFxuICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50OiBlbGlnaWJpbGl0eS50aHJlc2hvbGRlZFRva2VuQ291bnQsXG4gICAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBlbGlnaWJpbGl0eS5vdmVyVGhyZXNob2xkVG9rZW5zLFxuICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgIH0pO1xuICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IoXG4gICAgICBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcIm9wZW5haVwiLCBlbGlnaWJpbGl0eS5vdmVyVGhyZXNob2xkVG9rZW5zKSxcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIEJyb3dzZXIgbG9naW4gZmxvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwZW5kaW5nTG9naW46IHtcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgYXV0aFVybDogc3RyaW5nIH0+IHtcbiAgICBpZiAodGhpcy5wZW5kaW5nTG9naW4pIHtcbiAgICAgIHRoaXMucGVuZGluZ0xvZ2luLndvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ0xvZ2luLnRpbWVyKTtcbiAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wSWQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBDb2RleEFwcFNlcnZlcldvcmtlcih7XG4gICAgICB0b2tlbklkOiB0ZW1wSWQsXG4gICAgICB0b2tlbk5hbWU6IG5hbWUsXG4gICAgICBhY2Nlc3NUb2tlbjogXCJcIixcbiAgICAgIGFjY291bnRJZDogXCJcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IGF1dGhVcmwgPSBhd2FpdCB3b3JrZXIuc3RhcnRCcm93c2VyTG9naW4oKTtcblxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nTG9naW4/LndvcmtlciA9PT0gd29ya2VyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBicm93c2VyIGxvZ2luIHRpbWVvdXQgZm9yICR7bmFtZX0sIGtpbGxpbmcgd29ya2VyYCk7XG4gICAgICAgIHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICB9XG4gICAgfSwgMzAwXzAwMCk7XG5cbiAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IHsgd29ya2VyLCBuYW1lLCB0aW1lciB9O1xuICAgIHJldHVybiB7IGF1dGhVcmwgfTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nTG9naW5OYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmdMb2dpbj8ubmFtZSA/PyBudWxsO1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVCcm93c2VyTG9naW4oKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nO1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICB9PiB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdMb2dpbikgdGhyb3cgbmV3IEVycm9yKFwibm8gcGVuZGluZyBsb2dpblwiKTtcbiAgICBjb25zdCB7IHdvcmtlciwgdGltZXIgfSA9IHRoaXMucGVuZGluZ0xvZ2luO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmtlci53YWl0Rm9yQnJvd3NlckxvZ2luQ29tcGxldGUoKTtcbiAgICAgIGNvbnN0IGNyZWRzID0gYXdhaXQgd29ya2VyLnJlYWRNYW5hZ2VkQ3JlZGVudGlhbHMoKTtcbiAgICAgIGlmICghY3JlZHMpIHRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byByZWFkIGNyZWRlbnRpYWxzIGFmdGVyIGxvZ2luXCIpO1xuICAgICAgcmV0dXJuIGNyZWRzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFN0YXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldCB3b3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHJlYWR5V29ya2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gWy4uLnRoaXMud29ya2VyUG9vbC52YWx1ZXMoKV0uZmxhdCgpLmZpbHRlcigodykgPT4gdy5pc1JlYWR5KS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcXVldWVMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5sZW5ndGg7XG4gIH1cblxuICAvLyBNb25pdCDtkZzsi5zsmqkg4oCUIO2GoO2BsOuzhCDtmITsnqwg7JuM7LukIOyImCDsiqTrg4Xsg7cgKOydtOumhOyInCDsoJXroKwpXG4gIGdldCB3b3JrZXJDb3VudHNCeVRva2VuKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMud29ya2VyUG9vbC5lbnRyaWVzKCldXG4gICAgICAubWFwKChbdG9rZW5JZCwgd29ya2Vyc10pID0+ICh7XG4gICAgICAgIG5hbWU6IHdvcmtlcnNbMF0/LnRva2VuTmFtZSA/PyBgdG9rZW4gJHt0b2tlbklkfWAsXG4gICAgICAgIGNvdW50OiB3b3JrZXJzLmxlbmd0aCxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmNvdW50ID4gMClcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFDQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsbUJBQW1CLENBQUM7QUFRdkQsSUFBYSx1QkFBYixjQUEwQyxNQUFNO0NBRW5DO0NBRFgsWUFDRSxNQUNBLFNBQ0E7RUFDQSxNQUFNLE9BQU87RUFISixLQUFBLE9BQUE7RUFJVCxLQUFLLE9BQU87Q0FDZDtBQUNGO0FBRUEsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxvQkFBb0I7QUFFMUIsU0FBUyx1QkFBK0I7Q0FDdEMsSUFBSTtFQUNGLE1BQU0sUUFBUSxhQUFhLGlCQUFpQixNQUFNLENBQUMsQ0FBQyxNQUFNLCtCQUErQjtFQUN6RixJQUFJLFFBQVEsSUFBSSxPQUFPLE9BQU8sTUFBTSxFQUFFLElBQUksT0FBTztDQUNuRCxRQUFRLENBQUM7Q0FDVCxPQUFPLFFBQVEsSUFBSSxPQUFPLE9BQU87QUFDbkM7QUFHQSxNQUFNLHVCQUF1QixRQUFRLElBQUksOEJBQThCO0FBRXZFLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sdUJBQXVCO0FBRzdCLE1BQU0sMEJBQTBCO0FBQ2hDLFNBQWdCLG1CQUFtQixTQUFpQixhQUE2QjtDQUMvRSxPQUFPLFVBQVUsMEJBQTBCO0FBQzdDO0FBRUEsU0FBUyxNQUFNLElBQTJCO0NBQ3hDLE9BQU8sSUFBSSxTQUFTLFlBQVksV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUN6RDtBQUVBLFNBQVMsOEJBQ1AsVUFDQSxRQUNRO0NBQ1IsTUFBTSxVQUFVLE9BQ2IsS0FBSyxVQUFVLEdBQUcsTUFBTSxVQUFVLGNBQWMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUNwRSxLQUFLLElBQUk7Q0FDWixPQUFPLFFBQVEsU0FBUyxJQUNwQixPQUFPLFNBQVMsb0NBQW9DLFlBQ3BELE9BQU8sU0FBUztBQUN0QjtBQTZCQSxJQUFhLG1CQUFiLE1BQWEsaUJBQStDO0NBQzFELDZCQUFhLElBQUksSUFBb0M7Q0FDckQsZ0NBQWdCLElBQUksSUFBMkI7Q0FDL0MsUUFBcUIsQ0FBQztDQUN0QjtDQUNBLHVDQUF3QyxJQUFJLElBQVk7Q0FDeEQsbUNBQW9DLElBQUksSUFBWTtDQUNwRCw4Q0FBK0MsSUFBSSxJQUFvQjtDQUN2RSxtQkFBb0MsSUFBSSx5QkFBeUI7Q0FDakUsc0NBQXVDLElBQUksSUFBb0I7Q0FDL0Q7Q0FDQSxXQUFtQjtDQUNuQixhQUFxQjtDQUNyQixjQUE2RDtDQUM3RCxpQkFBK0M7Q0FDL0MsZ0JBQXdCLEtBQUssSUFBSTtDQUNqQyxVQUFrQjtDQUVsQixZQUNFLGFBQXFDLDhCQUE4QixHQUNuRSxzQkFBb0Msc0JBQ3BDO0VBQ0EsS0FBSyxhQUFhO0VBQ2xCLEtBQUssc0JBQXNCO0NBQzdCO0NBRUEsTUFBTSxRQUF1QjtFQUMzQixLQUFLLFVBQVU7RUFDZixNQUFNLEVBQUUsU0FBUyxNQUFNLFdBQVcsU0FBUyxHQUFHO0VBQzlDLE1BQU0sZUFBZSxLQUFLLFFBQVEsTUFBTSxFQUFFLGFBQWEsUUFBUTtFQUMvRCxPQUFPLEtBQ0wsS0FBSyxXQUFXLFlBQ1osWUFBWSxhQUFhLE9BQU8sa0JBQWtCLEtBQUssV0FBVyxtQkFBbUIsR0FBRyxLQUFLLFdBQVcsbUJBQW1CLDZCQUMzSCxZQUFZLGFBQWEsT0FBTyxrQkFBa0IsS0FBSyxXQUFXLG1CQUFtQixlQUMzRjtFQUVBLE1BQU0sUUFBUSxXQUNaLGFBQWEsSUFBSSxPQUFPLE1BQU07R0FDNUIsTUFBTSxLQUFLLGFBQ1QsRUFBRSxJQUNGLEVBQUUsTUFDRixFQUFFLGFBQ0YsRUFBRSxpQkFDRixFQUFFLE1BQ0o7R0FDQSxJQUFJLENBQUMsRUFBRSxRQUFRLEtBQUssbUJBQW1CLEVBQUUsRUFBRTtFQUM3QyxDQUFDLENBQ0g7RUFHQSxLQUFLLGNBQWMsa0JBQ1gsS0FBSywyQkFBMkIsR0FDdEMsS0FBSyxXQUFXLGVBQ2xCO0VBQ0EsS0FBSyxZQUFZLFFBQVE7Q0FDM0I7Q0FFQSxNQUFNLE9BQXNCO0VBQzFCLEtBQUssVUFBVTtFQUNmLElBQUksS0FBSyxhQUFhO0dBQ3BCLGNBQWMsS0FBSyxXQUFXO0dBQzlCLEtBQUssY0FBYztFQUNyQjtFQUNBLE1BQU0sS0FBSyxnQkFBZ0IsWUFBWSxDQUFDLENBQUM7RUFDekMsS0FBSyxnQkFBZ0IscUJBQXFCO0VBQzFDLE1BQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsS0FBSyxDQUFDO0VBQ3RFLE1BQU0sUUFBUSxXQUFXLEtBQUs7RUFDOUIsS0FBSyxNQUFNLE1BQU0sS0FBSyxjQUFjLEtBQUssR0FBRyxLQUFLLGlCQUFpQixZQUFZLEVBQUU7RUFDaEYsS0FBSyxXQUFXLE1BQU07RUFDdEIsS0FBSyxjQUFjLE1BQU07RUFDekIsS0FBSyxvQkFBb0IsTUFBTTtFQUMvQixLQUFLLGlCQUFpQixZQUFZO0VBQ2xDLEtBQUssZ0JBQWdCLE1BQU07RUFDM0IsS0FBSyw0QkFBNEIsTUFBTTtFQUN2QyxLQUFLLHFCQUFxQixNQUFNO0VBQ2hDLEtBQUssaUJBQWlCLE1BQU07Q0FDOUI7Q0FJQSxNQUFNLGFBQ0osSUFDQSxNQUNBLGFBQ0EsZ0JBQ0EsU0FBUyxHQUNNO0VBQ2YsS0FBSyxxQkFBcUIsT0FBTyxFQUFFO0VBQ25DLEtBQUssMEJBQTBCLEVBQUU7RUFDakMsS0FBSyxpQkFBaUIsSUFBSSxNQUFNLGFBQWEsZ0JBQWdCLE1BQU07RUFDbkUsSUFBSSxLQUFLLFdBQVcsSUFBSSxFQUFFLEdBQUc7RUFDN0IsTUFBTSxLQUFLLGFBQWEsSUFBSSxNQUFNLGFBQWEsZ0JBQWdCLE1BQU07Q0FDdkU7Q0FFQSxNQUFNLGVBQWUsSUFBMkI7RUFDOUMsTUFBTSxVQUFVLEtBQUssV0FBVyxJQUFJLEVBQUUsS0FBSyxDQUFDO0VBQzVDLE1BQU0sWUFBWSxRQUFRLEVBQUUsRUFBRTtFQUM5QixLQUFLLFdBQVcsT0FBTyxFQUFFO0VBQ3pCLEtBQUssY0FBYyxPQUFPLEVBQUU7RUFDNUIsS0FBSyxpQkFBaUIsWUFBWSxFQUFFO0VBQ3BDLEtBQUssb0JBQW9CLE9BQU8sRUFBRTtFQUNsQyxLQUFLLDBCQUEwQixFQUFFO0VBQ2pDLEtBQUsscUJBQXFCLE9BQU8sRUFBRTtFQUNuQyxNQUFNLFFBQVEsV0FBVyxRQUFRLEtBQUssTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0VBQ3JELElBQUksQ0FBQyxLQUFLLHdDQUF3QixJQUFJLElBQUksQ0FBQyxHQUN6QyxLQUFLLGdCQUFnQixtQkFBbUI7RUFFMUMsSUFBSSxRQUFRLFNBQVMsR0FBRztHQUN0QixNQUFNLFFBQVEsYUFBYSxTQUFTO0dBQ3BDLE9BQU8sS0FBSyxvQkFBb0IsTUFBTSxJQUFJLFFBQVEsT0FBTyxFQUFFO0VBQzdEO0NBQ0Y7Q0FFQSxNQUFNLGVBQ0osSUFDQSxNQUNBLGFBQ0EsZ0JBQ0EsU0FBUyxHQUNNO0VBQ2YsTUFBTSxXQUFXLEtBQUssV0FBVyxJQUFJLEVBQUUsS0FBSyxDQUFDO0VBRTdDLElBRHlCLEtBQUssa0JBQWtCLEVBQUUsTUFBTSxnQkFDbEMsS0FBSyxxQkFBcUIsT0FBTyxFQUFFO0VBQ3pELEtBQUssaUJBQWlCLElBQUksTUFBTSxhQUFhLGdCQUFnQixNQUFNO0VBRW5FLElBQUksU0FBUyxXQUFXLEdBQUc7R0FDekIsS0FBSywwQkFBMEIsRUFBRTtHQUNqQyxNQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sYUFBYSxnQkFBZ0IsTUFBTTtHQUNyRTtFQUNGO0VBRUEsSUFBSSxTQUFTLE9BQU8sTUFBTSxFQUFFLGlCQUFpQixNQUFNLFdBQVcsQ0FBQyxHQUFHO0dBQ2hFLFNBQVMsU0FBUyxNQUFNLEVBQUUsaUJBQWlCLE1BQU0sV0FBVyxDQUFDO0dBQzdELE9BQU8sS0FBSyw2QkFBNkIsTUFBTTtHQUMvQyxLQUFLLGtCQUFrQjtHQUN2QjtFQUNGO0VBRUEsS0FBSyxXQUFXLE9BQU8sRUFBRTtFQUN6QixLQUFLLDBCQUEwQixFQUFFO0VBQ2pDLEtBQUsscUJBQXFCLE9BQU8sRUFBRTtFQUNuQyxNQUFNLFFBQVEsV0FBVyxTQUFTLEtBQUssTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0VBQ3RELE1BQU0sS0FBSyxhQUFhLElBQUksTUFBTSxhQUFhLGdCQUFnQixNQUFNO0NBQ3ZFO0NBRUEsbUJBQW1CLElBQWtCO0VBQ25DLE1BQU0sVUFBVSxLQUFLLFdBQVcsSUFBSSxFQUFFLEtBQUssQ0FBQztFQUM1QyxNQUFNLFlBQVksUUFBUSxFQUFFLEVBQUU7RUFDOUIsTUFBTSxXQUFXLEtBQUssY0FBYyxJQUFJLEVBQUU7RUFDMUMsSUFBSSxVQUFVLFFBQVEsS0FBSyxjQUFjLElBQUksSUFBSTtHQUFFLEdBQUc7R0FBVSxRQUFRO0VBQU0sQ0FBQztFQUMvRSxLQUFLLHFCQUFxQixPQUFPLEVBQUU7RUFDbkMsTUFBTSxVQUFVLFFBQVEsTUFBTSxXQUFXLE9BQU8sTUFBTTtFQUN0RCxRQUFRLFNBQVMsTUFBTTtHQUNyQixFQUFFLFNBQVM7RUFDYixDQUFDO0VBQ0QsSUFBSSxTQUFTLEtBQUssaUJBQWlCLFlBQVk7RUFDL0MsSUFBSSxDQUFDLEtBQUssd0NBQXdCLElBQUksSUFBSSxDQUFDLEdBQ3pDLEtBQUssZ0JBQWdCLG1CQUFtQjtFQUUxQyxNQUFNLFFBQVEsYUFBYSxTQUFTO0VBQ3BDLE9BQU8sS0FBSyx3QkFBd0IsT0FBTztDQUM3QztDQUVBLGlCQUFpQixJQUFrQjtFQUNqQyxNQUFNLFVBQVUsS0FBSyxXQUFXLElBQUksRUFBRSxLQUFLLENBQUM7RUFDNUMsTUFBTSxZQUFZLFFBQVEsRUFBRSxFQUFFO0VBQzlCLE1BQU0sV0FBVyxLQUFLLGNBQWMsSUFBSSxFQUFFO0VBQzFDLElBQUksWUFBWSxDQUFDLFNBQVMsUUFBUSxLQUFLLGNBQWMsSUFBSSxJQUFJO0dBQUUsR0FBRztHQUFVLFFBQVE7RUFBSyxDQUFDO0VBQzFGLE1BQU0sVUFBVSxRQUFRLE1BQU0sV0FBVyxDQUFDLE9BQU8sTUFBTTtFQUN2RCxRQUFRLFNBQVMsTUFBTTtHQUNyQixFQUFFLFNBQVM7RUFDYixDQUFDO0VBQ0QsSUFBSSxTQUFTLEtBQUssaUJBQWlCLFlBQVk7RUFDL0MsS0FBSyxrQkFBa0I7RUFDdkIsTUFBTSxRQUFRLGFBQWEsU0FBUztFQUNwQyxPQUFPLEtBQUssc0JBQXNCLE9BQU87Q0FDM0M7Q0FFQSxNQUFNLGNBQ0osTUFPZTtFQUNmLE1BQU0sT0FBTyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRSxFQUFFLENBQUM7RUFDMUMsS0FBSyxNQUFNLE1BQU0sTUFBTSxLQUFLLEtBQUssV0FBVyxLQUFLLENBQUMsR0FDaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLGVBQWUsRUFBRTtFQUdqRCxLQUFLLE1BQU0sT0FBTyxNQUFNO0dBQ3RCLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxFQUFFLEdBQzVCLE1BQU0sS0FBSyxlQUNULElBQUksSUFDSixJQUFJLE1BQ0osSUFBSSxhQUNKLElBQUksZ0JBQ0osSUFBSSxNQUNOO1FBRUEsTUFBTSxLQUFLLGFBQWEsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLGFBQWEsSUFBSSxnQkFBZ0IsSUFBSSxNQUFNO0dBRTNGLEtBQUssaUJBQWlCLElBQUksRUFBRTtFQUM5QjtDQUNGO0NBSUEsTUFBTSxTQUFTLEtBQStDO0VBQzVELEtBQUssZ0JBQWdCLEtBQUssSUFBSTtFQUM5QixNQUFNLG1DQUFtQixJQUFJLElBQVk7RUFFekMsTUFBTSxjQUFjLE1BQU0sS0FBSyxtQkFBbUIsS0FBSyxnQkFBZ0I7RUFDdkUsSUFBSSxhQUFhO0dBQ2YsT0FBTyxLQUNMLEtBQUssWUFBWSxVQUFVLEdBQUcsWUFBWSxRQUFRLG1CQUFtQixJQUFJLE1BQU0sRUFDakY7R0FDQSxPQUFPLEtBQUssa0JBQWtCLGNBQWMsTUFDMUMsS0FBSyxZQUFZLEdBQUcsS0FBSyxJQUFJLE1BQU8sUUFBUSxDQUM5QztFQUNGO0VBRUEsTUFBTSxTQUFTLE1BQU0sS0FBSyxrQkFBa0IsZ0JBQWdCO0VBQzVELElBQUksUUFBUTtHQUNWLE9BQU8sS0FBSyxLQUFLLE9BQU8sVUFBVSxHQUFHLE9BQU8sUUFBUSxZQUFZLElBQUksTUFBTSxFQUFFO0dBQzVFLE9BQU8sS0FBSyxrQkFBa0IsU0FBUyxNQUFNLEtBQUssWUFBWSxHQUFHLEdBQUcsQ0FBQztFQUN2RTtFQUNBLE9BQU8sS0FBSyxTQUFTLE1BQU07R0FDekIsT0FBTyxLQUFLLEtBQUssRUFBRSxVQUFVLEdBQUcsRUFBRSxRQUFRLFlBQVksSUFBSSxNQUFNLFVBQVU7R0FDMUUsT0FBTyxLQUFLLFlBQVksR0FBRyxHQUFHO0VBQ2hDLEdBQUcsZ0JBQWdCO0NBQ3JCO0NBRUEsTUFBTSxlQUFlLEtBQXNCLElBQTRDO0VBQ3JGLEtBQUssZ0JBQWdCLEtBQUssSUFBSTtFQUc5QixJQUFJLElBQUksaUJBQ04sTUFBTSxJQUFJLHFCQUNSLFFBQ0EseURBQ0Y7RUFFRixNQUFNLG1DQUFtQixJQUFJLElBQVk7RUFDekMsTUFBTSxjQUFjLE1BQU0sS0FBSyxtQkFBbUIsS0FBSyxnQkFBZ0I7RUFDdkUsSUFBSSxhQUFhO0dBQ2YsT0FBTyxLQUFLLEtBQUssWUFBWSxVQUFVLEdBQUcsWUFBWSxRQUFRLDJCQUEyQjtHQUN6RixPQUFPLEtBQUssa0JBQWtCLGNBQWMsTUFDMUMsS0FBSyxrQkFBa0IsR0FBRyxLQUFLLElBQUksSUFBSSxNQUFPLFFBQVEsQ0FDeEQ7RUFDRjtFQUVBLE1BQU0sU0FBUyxNQUFNLEtBQUssa0JBQWtCLGdCQUFnQjtFQUM1RCxJQUFJLFFBQVE7R0FDVixPQUFPLEtBQUssS0FBSyxPQUFPLFVBQVUsR0FBRyxPQUFPLFFBQVEsWUFBWSxJQUFJLE1BQU0sWUFBWTtHQUN0RixPQUFPLEtBQUssa0JBQWtCLFNBQVMsTUFBTSxLQUFLLGtCQUFrQixHQUFHLEtBQUssRUFBRSxDQUFDO0VBQ2pGO0VBQ0EsT0FBTyxLQUFLLFNBQVMsTUFBTTtHQUN6QixPQUFPLEtBQUssS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFLFFBQVEsWUFBWSxJQUFJLE1BQU0sb0JBQW9CO0dBQ3BGLE9BQU8sS0FBSyxrQkFBa0IsR0FBRyxLQUFLLEVBQUU7RUFDMUMsR0FBRyxnQkFBZ0I7Q0FDckI7Q0FLQSxNQUFNLG1CQUNKLEtBQ0EsbUNBQW1CLElBQUksSUFBWSxHQUNHO0VBR3RDLElBQUksSUFBSSxpQkFBaUIsT0FBTztFQUNoQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxPQUFPLE9BQU87RUFDaEQsTUFBTSxFQUFFLFVBQVUsVUFBVSxVQUFVLElBQUk7RUFFMUMsTUFBTSxTQUFTLEtBQUssZUFBZSxRQUFRO0VBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxXQUFXLENBQUMsT0FBTyxRQUFRLE9BQU87RUFDekQsSUFBSSxPQUFPLFVBQVUsT0FBTyxPQUFPO0VBQ25DLElBQUksQ0FBQyxPQUFPLFVBQVUsUUFBUSxHQUFHLE9BQU87RUFDeEMsTUFBTSxnQkFBZ0IsS0FBSyxjQUFjLElBQUksT0FBTyxPQUFPO0VBQzNELElBQUksQ0FBRSxNQUFNLEtBQUsscUJBQXFCLE9BQU8sU0FBUyxPQUFPLFdBQVcsZ0JBQWdCLEdBQ3RGLE9BQU87RUFFVCxJQUNFLENBQUMsT0FBTyxXQUNSLENBQUMsT0FBTyxVQUNSLEtBQUssY0FBYyxJQUFJLE9BQU8sT0FBTyxNQUFNLGlCQUMzQyxLQUFLLHFCQUFxQixJQUFJLE9BQU8sT0FBTyxHQUM1QztHQUNBLElBQUksS0FBSyxxQkFBcUIsSUFBSSxPQUFPLE9BQU8sR0FDOUMsaUJBQWlCLElBQUksT0FBTyxPQUFPO0dBRXJDLE9BQU87RUFDVDtFQUVBLE1BQU0sV0FBVyxLQUFLLElBQUksSUFBSTtFQUM5QixTQUFTO0dBRVAsSUFDRSxDQUFDLE9BQU8sV0FDUixDQUFDLE9BQU8sVUFDUixPQUFPLFVBQVUsU0FDakIsQ0FBQyxPQUFPLFVBQVUsUUFBUSxLQUMxQixLQUFLLGNBQWMsSUFBSSxPQUFPLE9BQU8sTUFBTSxpQkFDM0MsS0FBSyxxQkFBcUIsSUFBSSxPQUFPLE9BQU8sR0FDNUM7SUFDQSxJQUFJLEtBQUsscUJBQXFCLElBQUksT0FBTyxPQUFPLEdBQzlDLGlCQUFpQixJQUFJLE9BQU8sT0FBTztJQUVyQyxPQUFPO0dBQ1Q7R0FDQSxJQUFJLE9BQU8sZUFBZSxHQUFHLE9BQU87R0FDcEMsSUFBSSxLQUFLLElBQUksS0FBSyxVQUFVLE9BQU87R0FDbkMsTUFBTSxNQUFNLG9CQUFvQjtFQUNsQztDQUNGO0NBRUEsZUFBZSxVQUErQztFQUM1RCxLQUFLLE1BQU0sV0FBVyxLQUFLLFdBQVcsT0FBTyxHQUMzQyxLQUFLLE1BQU0sS0FBSyxTQUNkLElBQUksbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFdBQVcsTUFBTSxVQUFVLE9BQU87RUFHMUUsT0FBTztDQUNUO0NBRUEsTUFBTSxvQkFBb0IsVUFBa0IsUUFBK0I7RUFDekUsTUFBTSxhQUFhLENBQUMsR0FBRyxLQUFLLFdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLE1BQU0sRUFBRSxPQUFPO0VBQy9FLE1BQU0sUUFBUSxXQUFXLFdBQVcsS0FBSyxNQUFNLEVBQUUsY0FBYyxVQUFVLE1BQU0sQ0FBQyxDQUFDO0NBQ25GO0NBSUEsTUFBTSxrQkFDSixtQ0FBbUIsSUFBSSxJQUFZLEdBQ0c7RUFDdEMsTUFBTSxjQUFjLE1BQU0sS0FBSyx3QkFBd0IsZ0JBQWdCO0VBQ3ZFLElBQUksWUFBWSxvQkFBb0IsU0FBUyxHQUFHLE9BQU87RUFDdkQsSUFBSSxZQUFZLGlCQUFpQixTQUFTLEdBQUcsS0FBSyw0QkFBNEIsV0FBVztFQUV6RixNQUFNLGlDQUFpQixJQUFJLElBQW9DO0VBQy9ELEtBQUssTUFBTSxVQUFVLEtBQUsseUJBQXlCLEdBQUc7R0FDcEQsSUFBSSxDQUFDLFlBQVksaUJBQWlCLElBQUksT0FBTyxPQUFPLEtBQUssQ0FBQyxPQUFPLGFBQWE7R0FDOUUsTUFBTSxVQUFVLGVBQWUsSUFBSSxPQUFPLE9BQU8sS0FBSyxDQUFDO0dBQ3ZELFFBQVEsS0FBSyxNQUFNO0dBQ25CLGVBQWUsSUFBSSxPQUFPLFNBQVMsT0FBTztFQUM1QztFQUVBLE1BQU0sa0JBQWtCLEtBQUssaUJBQWlCLE9BQU8sSUFBSSxJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUM7RUFDbkYsSUFBSSxvQkFBb0IsTUFBTSxPQUFPO0VBQ3JDLE1BQU0sVUFBVSxlQUFlLElBQUksZUFBZTtFQUNsRCxNQUFNLFNBQVMsS0FBSyxvQkFBb0IsSUFBSSxlQUFlLEtBQUs7RUFDaEUsS0FBSyxJQUFJLFNBQVMsR0FBRyxTQUFTLFFBQVEsUUFBUSxVQUFVO0dBQ3RELE1BQU0sU0FBUyxTQUFTLFVBQVUsUUFBUTtHQUMxQyxNQUFNLFNBQVMsUUFBUTtHQUN2QixJQUFJLE9BQU8sZUFBZSxHQUFHO0lBQzNCLEtBQUssb0JBQW9CLElBQUksa0JBQWtCLFFBQVEsS0FBSyxRQUFRLE1BQU07SUFDMUUsT0FBTztHQUNUO0VBQ0Y7RUFDQSxNQUFNLElBQUksTUFDUixrQkFBa0IsZ0JBQWdCLCtDQUNwQztDQUNGO0NBRUEsMkJBQW1EO0VBQ2pELE9BQU8sQ0FBQyxHQUFHLEtBQUssV0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNO0NBQ2pGO0NBSUEsTUFBTSxRQUNKLFNBQ0EsbUNBQW1CLElBQUksSUFBWSxHQUN2QjtFQUNaLE1BQU0sY0FBYyxNQUFNLEtBQUssd0JBQXdCLGdCQUFnQjtFQUN2RSxJQUNFLFlBQVksb0JBQW9CLFNBQVMsS0FDekMsQ0FBQyxLQUFLLHdCQUF3QixnQkFBZ0IsR0FFOUMsTUFBTSxJQUFJLE1BQU0sbUJBQW1CO0VBRXJDLElBQUksWUFBWSxvQkFBb0IsT0FBTyxLQUFLLFlBQVksaUJBQWlCLFNBQVMsR0FDcEYsS0FBSyw0QkFBNEIsV0FBVztFQUU5QyxJQUFJLEtBQUssTUFBTSxVQUFVLGdCQUN2QixNQUFNLElBQUksTUFBTSxhQUFhO0VBRy9CLE9BQU8sSUFBSSxTQUFZLFNBQVMsV0FBVztHQUN6QyxNQUFNLE9BQWtCO0lBQ3RCLFVBQVUsV0FBVztLQUNuQixhQUFhLEtBQUssS0FBSztLQUN2QixLQUFLLGVBQWU7S0FDcEIsUUFBUSxRQUFRLENBQUMsQ0FDZCxXQUFXLEtBQUssa0JBQWtCLFFBQVEsT0FBTyxDQUFDLENBQUMsQ0FDbkQsS0FBSyxTQUFTLE1BQU07SUFDekI7SUFDQSxTQUFTLFFBQVE7S0FDZixhQUFhLEtBQUssS0FBSztLQUN2QixLQUFLLGVBQWU7S0FDcEIsT0FBTyxHQUFHO0lBQ1o7SUFDQSxPQUFPLGlCQUFpQjtLQUN0QixLQUFLLGdCQUFnQixJQUFJO0tBQ3pCLHVCQUFPLElBQUksTUFBTSxhQUFhLENBQUM7SUFDakMsR0FBRyxnQkFBZ0I7SUFDbkIsa0JBQWtCLElBQUksSUFBSSxnQkFBZ0I7R0FDNUM7R0FFQSxLQUFLLE1BQU0sS0FBSyxJQUFJO0dBR3BCLEtBQUssa0JBQWtCO0dBQ3ZCLEtBQUssMkJBQTJCO0VBQ2xDLENBQUM7Q0FDSDtDQUVBLGdCQUFnQixNQUF1QjtFQUNyQyxhQUFhLEtBQUssS0FBSztFQUN2QixLQUFLLGVBQWU7RUFDcEIsTUFBTSxNQUFNLEtBQUssTUFBTSxRQUFRLElBQUk7RUFDbkMsSUFBSSxRQUFRLElBQUksS0FBSyxNQUFNLE9BQU8sS0FBSyxDQUFDO0NBQzFDO0NBRUEsZ0JBQWdCLFFBQXNCO0VBQ3BDLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTTtFQUM1QixLQUFLLE1BQU0sU0FBUyxTQUFTO0dBQzNCLGFBQWEsS0FBSyxLQUFLO0dBQ3ZCLEtBQUssZUFBZTtHQUNwQixLQUFLLE9BQU8sR0FBRztFQUNqQixDQUFDO0VBQ0QsS0FBSyxRQUFRLENBQUM7Q0FDaEI7Q0FFQSxNQUFNLGFBQTRCO0VBQ2hDLElBQUksS0FBSyxVQUFVO0dBQ2pCLEtBQUssYUFBYTtHQUNsQjtFQUNGO0VBRUEsS0FBSyxXQUFXO0VBQ2hCLElBQUk7R0FDRixHQUFHO0lBQ0QsS0FBSyxhQUFhO0lBQ2xCLE1BQU0sS0FBSyxlQUFlO0dBQzVCLFNBQVMsS0FBSztFQUNoQixTQUFTLEdBQUc7R0FDVixPQUFPLEtBQUssc0JBQXVCLEVBQVksU0FBUztFQUMxRCxVQUFVO0dBQ1IsS0FBSyxXQUFXO0VBQ2xCO0NBQ0Y7Q0FFQSxNQUFjLGlCQUFnQztFQUM1QyxPQUFPLEtBQUssTUFBTSxTQUFTLEdBQUc7R0FDNUIsTUFBTSxPQUFPLEtBQUssTUFBTTtHQUN4QixJQUFJO0dBQ0osSUFBSTtJQUNGLFNBQVMsTUFBTSxLQUFLLGtCQUFrQixLQUFLLGdCQUFnQjtHQUM3RCxTQUFTLEdBQUc7SUFDVixJQUFJLGFBQWEsNkJBQTZCO0tBQzVDLEtBQUssTUFBTSxNQUFNO0tBQ2pCLEtBQUssT0FBTyxDQUFDO0tBQ2I7SUFDRjtJQUNBLE1BQU07R0FDUjtHQUNBLElBQUksQ0FBQyxRQUFRO0dBQ2IsS0FBSyxNQUFNLE1BQU07R0FDakIsS0FBSyxRQUFRLE1BQU07RUFDckI7Q0FDRjtDQUlBLE1BQU0sa0JBQ0osUUFDQSxTQUNZO0VBQ1osSUFBSTtHQUNGLE9BQU8sTUFBTSxRQUFRLE1BQU07RUFDN0IsVUFBVTtHQUNSLE9BQU8sWUFBWTtHQUNuQixLQUFLLGtCQUFrQjtFQUN6QjtDQUNGO0NBSUEsaUJBQXlCLEtBQXNCLGVBQXFDO0VBQ2xGLE1BQU0sVUFBVSxrQkFBa0I7RUFDbEMsT0FBTztHQUNMLE9BQU8sV0FBVyxJQUFJLGFBQWEsSUFBSSxhQUFhLElBQUk7R0FDeEQsU0FBUyxVQUFVLFNBQVksSUFBSTtHQUNuQyx1QkFBdUIsSUFBSTtHQUMzQixjQUFjLElBQUk7R0FDbEIsUUFBUSxJQUFJLFVBQVU7R0FDdEIsT0FBTyxJQUFJO0dBQ1gsV0FBVyxJQUFJO0dBQ2Ysa0JBQWtCLElBQUk7R0FDdEIsYUFBYSxJQUFJO0dBQ2pCLGlCQUFpQixJQUFJO0dBQ3JCLHdCQUF3QixJQUFJO0VBQzlCO0NBQ0Y7Q0FFQSxNQUFNLFlBQ0osUUFDQSxLQUNBLGVBQ3lCO0VBR3pCLElBQUksSUFBSSxpQkFBaUI7R0FDdkIsTUFBTSxTQUFTLE1BQU0sT0FBTyw0QkFBNEIsSUFBSSxLQUFLO0dBQ2pFLElBQUksUUFBUSxNQUFNLElBQUkscUJBQXFCLFFBQVEsTUFBTTtFQUMzRDtFQUVBLE1BQU0sVUFBVSxLQUFLLGlCQUFpQixLQUFLLGFBQWE7RUFDeEQsTUFBTSxTQUFTLE1BQU0sT0FBTyxZQUFZLFNBQVMsYUFBYTtFQUc5RCxJQUFJLElBQUksb0JBQW9CLENBQUMsT0FBTyxVQUFVLE9BQU8sT0FBTyxXQUFXLElBQ3JFLE1BQU0sT0FBTyxpQkFDVCxJQUFJLHFCQUFxQixjQUFjLGdEQUFnRCxJQUN2RixJQUFJLHFCQUFxQixjQUFjLDhDQUE4QztFQUczRixPQUFPO0dBQ0wsTUFBTSxPQUFPO0dBQ2IsV0FBVyxPQUFPO0dBQ2xCLE9BQU8sT0FBTztHQUNkLFlBQVksT0FBTztHQUNuQixRQUFRLE9BQU87R0FDZixPQUFPLE9BQU87R0FDZCxhQUFhO0lBQ1gsVUFBVSxtQkFBbUIsT0FBTyxTQUFTLE9BQU8sV0FBVztJQUMvRCxVQUFVLE9BQU87SUFDakIsT0FBTyxPQUFPO0dBQ2hCO0dBQ0EsUUFBUSxPQUFPO0VBQ2pCO0NBQ0Y7Q0FFQSxNQUFNLGtCQUNKLFFBQ0EsS0FDQSxJQUNBLGVBQ2U7RUFDZixNQUFNLFVBQVUsS0FBSyxpQkFBaUIsS0FBSyxhQUFhO0VBR3hELElBQUksbUJBQW1CLGlCQUFpQjtFQUN4QyxNQUFNLFlBQTZCO0dBQ2pDLEdBQUc7R0FDSCxhQUFhLGFBQWE7SUFDeEIsbUJBQW1CO0lBQ25CLEdBQUcsYUFBYSxRQUFRO0dBQzFCO0dBQ0EsYUFBYSxXQUFXO0lBQ3RCLEdBQUcsV0FBVztLQUNaLEdBQUc7S0FDSCxXQUFXLE9BQU87S0FDbEIsYUFBYTtNQUNYLFVBQVUsbUJBQW1CLE9BQU8sU0FBUyxPQUFPLFdBQVc7TUFDL0QsVUFBVTtNQUNWLE9BQU8sT0FBTztLQUNoQjtJQUNGLENBQUM7R0FDSDtFQUNGO0VBQ0EsTUFBTSxPQUFPLGtCQUFrQixTQUFTLFdBQVcsYUFBYTtDQUNsRTtDQUlBLE1BQU0sYUFDSixTQUNBLFdBQ0EsYUFDQSxnQkFDQSxTQUFTLEdBQ007RUFDZixJQUFJLEtBQUssaUJBQWlCLElBQUksT0FBTyxHQUFHO0VBQ3hDLEtBQUssaUJBQWlCLElBQUksT0FBTztFQUNqQyxLQUFLLGlCQUFpQixTQUFTLFdBQVcsYUFBYSxnQkFBZ0IsTUFBTTtFQUM3RSxNQUFNLG1CQUFtQixLQUFLLGNBQWMsSUFBSSxPQUFPO0VBQ3ZELE1BQU0sVUFBa0MsQ0FBQztFQUN6QyxJQUFJO0dBQ0YsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssV0FBVyxvQkFBb0IsS0FBSztJQUMzRCxJQUFJLElBQUksR0FBRyxNQUFNLE1BQU0saUJBQWlCO0lBQ3hDLE1BQU0sU0FBUyxNQUFNLEtBQUssa0JBQWtCLFNBQVMsV0FBVyxhQUFhLENBQUM7SUFDOUUsSUFBSSxRQUFRLFFBQVEsS0FBSyxNQUFNO0dBQ2pDO0dBRUEsSUFDRSxDQUFDLEtBQUssV0FDTixrQkFBa0IsVUFDbEIsS0FBSyxjQUFjLElBQUksT0FBTyxNQUFNLG9CQUNwQyxDQUFDLEtBQUssV0FBVyxJQUFJLE9BQU8sR0FFNUI7UUFBSSxRQUFRLFNBQVMsR0FBRyxLQUFLLFdBQVcsSUFBSSxTQUFTLE9BQU87R0FBQSxPQUU1RCxNQUFNLFFBQVEsV0FBVyxRQUFRLEtBQUssV0FBVyxPQUFPLEtBQUssQ0FBQyxDQUFDO0VBRW5FLFVBQVU7R0FDUixLQUFLLGlCQUFpQixPQUFPLE9BQU87RUFDdEM7Q0FDRjtDQUVBLE1BQU0sa0JBQ0osU0FDQSxXQUNBLGFBQ0EsYUFDc0M7RUFDdEMsTUFBTSxTQUFTLElBQUkscUJBQXFCO0dBQ3RDO0dBQ0E7R0FDQSxhQUFhLFlBQVk7R0FDekIsV0FBVyxZQUFZO0dBQ3ZCLFVBQVUsWUFBWTtHQUN0QjtFQUNGLENBQUM7RUFFRCxPQUFPLGdCQUFnQixLQUFLLGtCQUFrQjtFQUM5QyxPQUFPLDBCQUEwQjtHQUMvQixBQUFLLEtBQUssNEJBQTRCLE1BQU0sQ0FBQyxDQUFDLE9BQU8sTUFDbkQsT0FBTyxLQUNMLG1DQUFtQyxVQUFVLEdBQUcsWUFBWSxLQUFNLEVBQVksU0FDaEYsQ0FDRjtFQUNGO0VBRUEsT0FBTyx3QkFBd0IsT0FBTyxXQUFXO0dBQy9DLElBQUksV0FBVyxxQ0FDYixPQUFPLCtCQUErQixPQUFPO0dBRS9DLE1BQU0sSUFBSSxNQUFNLDZCQUE2QixRQUFRO0VBQ3ZELENBQUM7RUFFRCxJQUFJO0dBQ0YsTUFBTSxPQUFPLFdBQVc7R0FDeEIsT0FBTyxLQUFLLG1CQUFtQixVQUFVLEdBQUcsWUFBWSxFQUFFO0dBQzFELE9BQU87RUFDVCxTQUFTLEdBQUc7R0FDVixPQUFPLEtBQUssd0JBQXdCLFVBQVUsR0FBRyxZQUFZLEtBQU0sRUFBWSxTQUFTO0dBQ3hGLE1BQU0sT0FBTyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztHQUNsQyxPQUFPO0VBQ1Q7Q0FDRjtDQUVBLE1BQU0sc0JBQXFDO0VBQ3pDLElBQUksS0FBSyxTQUFTO0VBQ2xCLEtBQUssdUJBQXVCO0VBQzVCLE1BQU0seUJBQXlCLE1BQU0sS0FBSyw0QkFBNEI7RUFDdEUsSUFBSSxDQUFDLEtBQUssV0FBVyxhQUFhLEtBQUssU0FBUztFQUNoRCxJQUFJLEtBQUssTUFBTSxTQUFTLEdBQUc7R0FHekIsTUFBTSxLQUFLLGVBQWUsc0JBQXNCO0dBQ2hEO0VBQ0Y7RUFDQSxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssaUJBQWlCLEtBQUssV0FBVyxpQkFDckQsTUFBTSxLQUFLLGlCQUFpQjtDQUVoQztDQUVBLE1BQU0sZUFBZSxtQ0FBbUIsSUFBSSxJQUFZLEdBQWtCO0VBQ3hFLElBQUksQ0FBQyxLQUFLLFdBQVcsYUFBYSxLQUFLLFNBQVM7RUFDaEQsTUFBTSxLQUFLLFdBQVcsWUFBWTtHQUNoQyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEtBQUssY0FBYyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLGNBQWM7SUFDbkYsSUFDRSxDQUFDLFNBQVMsVUFDVixLQUFLLGlCQUFpQixJQUFJLE9BQU8sS0FDakMsaUJBQWlCLElBQUksT0FBTyxLQUM1QixLQUFLLHFCQUFxQixJQUFJLE9BQU8sR0FFckMsT0FBTztJQUVULFFBQVEsS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLEVBQUUsVUFBVSxLQUFLLEtBQUssV0FBVztHQUN2RSxDQUFDO0dBQ0QsSUFBSSxXQUFXLFdBQVcsR0FBRztHQUc3QixNQUFNLGtCQUFrQiwyQkFESyxLQUFLLGNBQWMsV0FBVyxNQUNZO0dBQ3ZFLElBQUksa0JBQWtCLEtBQUssV0FBVyxvQkFBb0I7SUFDeEQsT0FBTyxLQUNMLDJDQUEyQyxnQkFBZ0IsUUFBUSxDQUFDLEVBQUUsY0FBYyxLQUFLLFdBQVcsbUJBQW1CLFFBQVEsQ0FBQyxFQUFFLElBQ3BJO0lBQ0E7R0FDRjtHQUVBLE1BQU0sbUJBQW1CLEtBQUssb0JBQW9CO0dBQ2xELElBQUksbUJBQW1CLEtBQUssV0FBVyxxQkFBcUI7SUFDMUQsT0FBTyxLQUNMLDRDQUE0QyxpQkFBaUIsUUFBUSxDQUFDLEVBQUUsWUFBWSxLQUFLLFdBQVcsb0JBQW9CLFFBQVEsQ0FBQyxFQUFFLElBQ3JJO0lBQ0E7R0FDRjtHQU1BLE1BQU0sU0FBUSxNQUpRLFFBQVEsSUFDNUIsV0FBVyxLQUFLLENBQUMsU0FBUyxjQUFjLEtBQUsscUJBQXFCLFNBQVMsVUFBVSxJQUFJLENBQUMsQ0FDNUYsRUFFYyxDQUFRLFFBQVEsV0FBVyxXQUFXLElBQUksQ0FBQyxDQUFDO0dBQzFELElBQUksUUFBUSxHQUFHO0lBQ2IsT0FBTyxLQUNMLHlCQUF5QixNQUFNLFlBQVksS0FBSyxZQUFZLGdCQUFnQixLQUFLLE1BQU0sT0FBTyxFQUNoRztJQUNBLEtBQUssa0JBQWtCO0lBQ3ZCLElBQUksS0FBSyxNQUFNLFNBQVMsR0FLdEIsQUFKYyxpQkFDTixLQUFLLDJCQUEyQixHQUN0QyxLQUFLLElBQUksS0FBSyxXQUFXLGlCQUFpQixHQUFLLENBRWpELENBQUEsQ0FBTSxRQUFRO0dBRWxCO0VBQ0YsQ0FBQztDQUNIO0NBRUEsTUFBTSw4QkFBb0Q7RUFDeEQsTUFBTSx5Q0FBeUIsSUFBSSxJQUFZO0VBQy9DLElBQUksS0FBSyxTQUFTLE9BQU87RUFDekIsTUFBTSxLQUFLLFdBQVcsWUFBWTtHQUNoQyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEtBQUssY0FBYyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLGNBQWM7SUFDbkYsSUFBSSxDQUFDLFNBQVMsVUFBVSxLQUFLLGlCQUFpQixJQUFJLE9BQU8sR0FBRyxPQUFPO0lBQ25FLFFBQVEsS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLEVBQUUsVUFBVSxLQUFLLEtBQUssV0FBVztHQUN2RSxDQUFDO0dBQ0QsSUFBSSxXQUFXLFdBQVcsR0FBRztHQUM3QixXQUFXLFNBQVMsQ0FBQyxhQUFhLHVCQUF1QixJQUFJLE9BQU8sQ0FBQztHQU9yRSxNQUFNLFNBQVEsTUFMUSxRQUFRLElBQzVCLFdBQVcsS0FBSyxDQUFDLFNBQVMsY0FDeEIsS0FBSyxxQkFBcUIsU0FBUyxVQUFVLEtBQUssQ0FDcEQsQ0FDRixFQUNjLENBQVEsUUFBUSxXQUFXLFdBQVcsSUFBSSxDQUFDLENBQUM7R0FDMUQsSUFBSSxRQUFRLEdBQUc7SUFDYixPQUFPLEtBQUssaUNBQWlDLE1BQU0sWUFBWSxLQUFLLFlBQVksUUFBUTtJQUN4RixLQUFLLGtCQUFrQjtJQUN2QixJQUFJLEtBQUssTUFBTSxTQUFTLEdBS3RCLEFBSmMsaUJBQ04sS0FBSywyQkFBMkIsR0FDdEMsS0FBSyxJQUFJLEtBQUssV0FBVyxpQkFBaUIsR0FBSyxDQUVqRCxDQUFBLENBQU0sUUFBUTtHQUVsQjtFQUNGLENBQUM7RUFDRCxPQUFPO0NBQ1Q7Q0FFQSxNQUFNLG1CQUFrQztFQUN0QyxJQUFJLENBQUMsS0FBSyxXQUFXLGFBQWEsS0FBSyxTQUFTO0VBQ2hELE1BQU0sS0FBSyxXQUFXLFlBQVk7R0FDaEMsTUFBTSxVQUFrQyxDQUFDO0dBQ3pDLEtBQUssTUFBTSxXQUFXLEtBQUssY0FBYyxLQUFLLEdBQUc7SUFDL0MsTUFBTSxVQUFVLEtBQUssV0FBVyxJQUFJLE9BQU8sS0FBSyxDQUFDO0lBQ2pELElBQUksUUFBUSxVQUFVLEtBQUssV0FBVyxvQkFBb0I7SUFFMUQsTUFBTSxTQUFTLFFBQ1osVUFBVSxHQUFHLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQ2pELE1BQU0sVUFBVSxNQUFNLFdBQVc7SUFDcEMsSUFBSSxDQUFDLFFBQVE7SUFFYixLQUFLLFdBQVcsSUFDZCxTQUNBLFFBQVEsUUFBUSxVQUFVLFVBQVUsTUFBTSxDQUM1QztJQUNBLFFBQVEsS0FBSyxNQUFNO0dBQ3JCO0dBRUEsSUFBSSxRQUFRLFdBQVcsR0FBRztHQUMxQixNQUFNLFFBQVEsV0FBVyxRQUFRLEtBQUssV0FBVyxPQUFPLEtBQUssQ0FBQyxDQUFDO0dBQy9ELE9BQU8sS0FBSywyQkFBMkIsUUFBUSxPQUFPLFlBQVksS0FBSyxZQUFZLFFBQVE7RUFDN0YsQ0FBQztDQUNIO0NBRUEseUJBQWlDLFNBQXlDO0VBQ3hFLE1BQU0sT0FBTyxJQUFJLElBQUksUUFBUSxLQUFLLFdBQVcsT0FBTyxXQUFXLENBQUM7RUFDaEUsS0FBSyxJQUFJLFFBQVEsR0FBRyxRQUFRLEtBQUssV0FBVyxvQkFBb0IsU0FDOUQsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEdBQUcsT0FBTztFQUUvQixPQUFPLEtBQUssV0FBVztDQUN6QjtDQUVBLHlCQUF1QztFQUNyQyxLQUFLLE1BQU0sVUFBVSxDQUFDLEdBQUcsS0FBSyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUd0RCxJQUFJLE9BQU8sV0FBVyxPQUFPLGFBQWEsT0FBTyxpQkFBaUI7Q0FFdEU7Q0FFQSxNQUFjLHFCQUNaLFNBQ0EsVUFDQSxtQkFDc0M7RUFDdEMsTUFBTSxrQkFBa0IsS0FBSyxXQUFXLElBQUksT0FBTztFQUNuRCxNQUFNLGNBQWMsS0FBSyx5QkFBeUIsbUJBQW1CLENBQUMsQ0FBQztFQUN2RSxJQUFJLGVBQWUsS0FBSyxXQUFXLG9CQUFvQixPQUFPO0VBRTlELE1BQU0sU0FBUyxNQUFNLEtBQUssa0JBQ3hCLFNBQ0EsU0FBUyxNQUNULFNBQVMsYUFDVCxXQUNGO0VBQ0EsSUFBSSxDQUFDLFFBQVEsT0FBTztFQUVwQixNQUFNLGtCQUFrQixLQUFLLGNBQWMsSUFBSSxPQUFPO0VBQ3RELE1BQU0saUJBQWlCLEtBQUssV0FBVyxJQUFJLE9BQU87RUFDbEQsSUFDRSxDQUFDLGlCQUFpQixVQUNsQixvQkFBb0IsWUFDcEIsbUJBQW1CLG1CQUNsQixxQkFBcUIsS0FBSyxxQkFBcUIsSUFBSSxPQUFPLEtBQzNELGdCQUFnQixNQUFNLFVBQVUsTUFBTSxnQkFBZ0IsV0FBVyxHQUNqRTtHQUNBLE1BQU0sT0FBTyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztHQUNsQyxPQUFPO0VBQ1Q7RUFFQSxNQUFNLGNBQWMsa0JBQWtCLENBQUM7RUFDdkMsWUFBWSxLQUFLLE1BQU07RUFDdkIsWUFBWSxNQUFNLEdBQUcsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXO0VBQ3hELElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxXQUFXLElBQUksU0FBUyxXQUFXO0VBQzdELE9BQU87Q0FDVDtDQUVBLE1BQU0sNEJBQTRCLFFBQTZDO0VBRTdFLElBQUksQ0FEWSxLQUFLLFdBQVcsSUFBSSxPQUFPLE9BQ3RDLENBQUEsRUFBUyxTQUFTLE1BQU0sR0FBRztFQUVoQyxNQUFNLE9BQU8sS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7RUFFbEMsTUFBTSxpQkFBaUIsS0FBSyxXQUFXLElBQUksT0FBTyxPQUFPO0VBQ3pELElBQUksQ0FBQyxnQkFBZ0IsU0FBUyxNQUFNLEdBQUc7RUFDdkMsTUFBTSxZQUFZLGVBQWUsUUFBUSxVQUFVLFVBQVUsTUFBTTtFQUNuRSxJQUFJLFVBQVUsU0FBUyxHQUNyQixLQUFLLFdBQVcsSUFBSSxPQUFPLFNBQVMsU0FBUztPQUU3QyxLQUFLLFdBQVcsT0FBTyxPQUFPLE9BQU87RUFFdkMsT0FBTyxLQUNMLDRCQUE0QixPQUFPLFVBQVUsR0FBRyxPQUFPLFlBQVksS0FBSyxVQUFVLE9BQU8sWUFDM0Y7RUFDQSxLQUFLLDJCQUEyQjtDQUNsQztDQUVBLDZCQUEyQztFQUN6QyxJQUFJLEtBQUssU0FBUztFQUNsQixBQUFLLEtBQUssb0JBQW9CLENBQUMsQ0FBQyxPQUFPLE1BQ3JDLE9BQU8sS0FBSyx1Q0FBd0MsRUFBWSxTQUFTLENBQzNFO0NBQ0Y7Q0FFQSxNQUFjLFdBQVcsTUFBMEM7RUFDakUsSUFBSSxLQUFLLGdCQUFnQjtHQUN2QixNQUFNLEtBQUs7R0FDWDtFQUNGO0VBQ0EsTUFBTSxVQUFVLEtBQUssQ0FBQyxDQUFDLGNBQWM7R0FDbkMsSUFBSSxLQUFLLG1CQUFtQixTQUFTLEtBQUssaUJBQWlCO0VBQzdELENBQUM7RUFDRCxLQUFLLGlCQUFpQjtFQUN0QixNQUFNO0NBQ1I7Q0FJQSxrQ0FBa0IsSUFBSSxJQUFrQztDQUN4RCxPQUFnQix3QkFBd0I7Q0FFeEMsTUFBTSx1QkFBdUIsU0FBb0Q7RUFDL0UsTUFBTSxhQUFhLEtBQUssNEJBQTRCLElBQUksT0FBTyxLQUFLO0VBQ3BFLE1BQU0sU0FBUyxLQUFLLGdCQUFnQixJQUFJLE9BQU87RUFDL0MsSUFDRSxVQUNBLE9BQU8sZUFBZSxjQUN0QixLQUFLLElBQUksSUFBSSxPQUFPLFdBQVcsaUJBQWlCLHVCQUVoRCxPQUFPO0dBQUUsTUFBTSxPQUFPO0dBQU0sVUFBVSxPQUFPO0VBQVM7RUFHeEQsTUFBTSxVQUFVLEtBQUssV0FBVyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUEsQ0FBRyxNQUFNLE1BQU0sRUFBRSxPQUFPO0VBQ3pFLElBQUksQ0FBQyxRQUFRLE1BQU0sSUFBSSxNQUFNLHlCQUF5QjtFQUV0RCxNQUFNLFFBQThCO0dBQUUsWUFEbEIsT0FBTyxjQUFjO0dBQ0csVUFBVSxLQUFLLElBQUk7R0FBRztFQUFXO0VBQzdFLEtBQUssS0FBSyw0QkFBNEIsSUFBSSxPQUFPLEtBQUssT0FBTyxZQUMzRCxLQUFLLGdCQUFnQixJQUFJLFNBQVMsS0FBSztFQUV6QyxPQUFPO0dBQUUsTUFBTSxNQUFNO0dBQU0sVUFBVSxNQUFNO0VBQVM7Q0FDdEQ7Q0FFQSxvQkFBa0M7RUFDaEMsQUFBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLE9BQU8sTUFBTSxPQUFPLEtBQUssc0JBQXVCLEVBQVksU0FBUyxDQUFDO0NBQy9GO0NBRUEsMEJBQWtDLFNBQXVCO0VBQ3ZELEtBQUssZ0JBQWdCLE9BQU8sT0FBTztFQUNuQyxLQUFLLDRCQUE0QixJQUMvQixVQUNDLEtBQUssNEJBQTRCLElBQUksT0FBTyxLQUFLLEtBQUssQ0FDekQ7Q0FDRjtDQUVBLGlCQUNFLElBQ0EsTUFDQSxhQUNBLGdCQUNBLFFBQ007RUFDTixLQUFLLGNBQWMsSUFBSSxJQUFJO0dBQ3pCO0dBQ0E7R0FDQTtHQUNBO0dBQ0EsUUFBUSxLQUFLLGNBQWMsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVO0VBQ2hELENBQUM7RUFDRCxLQUFLLGlCQUFpQixTQUFTLElBQUksTUFBTTtDQUMzQztDQUVBLHdCQUFnQyxrQkFBd0M7RUFDdEUsT0FBTyxDQUFDLEdBQUcsS0FBSyxjQUFjLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFDdEMsQ0FBQyxTQUFTLGNBQWMsU0FBUyxVQUFVLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUMzRTtDQUNGO0NBRUEsa0JBQTBCLFNBQTRDO0VBQ3BFLE9BQU8sS0FBSyxjQUFjLElBQUksT0FBTyxDQUFDLEVBQUU7Q0FDMUM7Q0FFQSxrQkFBMEIsU0FBMEI7RUFDbEQsTUFBTSxZQUFZLEtBQUssa0JBQWtCLE9BQU87RUFDaEQsT0FBTyxjQUFjLFVBQWEsY0FBYztDQUNsRDtDQUVBLE1BQWMsd0JBQXdCLGtCQUEwRDtFQUM5RixNQUFNLFVBQVUsS0FBSyx5QkFBeUI7RUFDOUMsTUFBTSwwQkFBVSxJQUFJLElBQW9CO0VBQ3hDLEtBQUssTUFBTSxVQUFVLFNBQ25CLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxPQUFPLEdBQUcsUUFBUSxJQUFJLE9BQU8sU0FBUyxPQUFPLFNBQVM7RUFHaEYsTUFBTSxzQkFBc0IsSUFBSSxJQUFJLFFBQVEsS0FBSyxDQUFDO0VBQ2xELE1BQU0sbUNBQW1CLElBQUksSUFBWTtFQUN6QyxNQUFNLHNCQUF1RSxDQUFDO0VBQzlFLElBQUksd0JBQXdCO0VBRTVCLE1BQU0sVUFBVSxNQUFNLEtBQUssUUFBUSxRQUFRLENBQUM7RUFtQjVDLE9BbEJxQixRQUFRLFdBQzNCLFFBQVEsSUFBSSxPQUFPLENBQUMsU0FBUyxlQUFlO0dBQzFDLElBQUksaUJBQWlCLElBQUksT0FBTyxHQUFHO0lBQ2pDO0lBQ0EsT0FBTztLQUFFO0tBQVM7S0FBVyxVQUFVO0lBQU07R0FDL0M7R0FDQSxJQUFJLENBQUMsS0FBSyxrQkFBa0IsT0FBTyxHQUNqQyxPQUFPO0lBQUU7SUFBUztJQUFXLFVBQVU7R0FBSztHQUU5QztHQUNBLE9BQU87SUFDTDtJQUNBO0lBQ0EsVUFBVSxNQUFNLEtBQUsscUJBQXFCLFNBQVMsU0FBUztHQUM5RDtFQUNGLENBQUMsQ0FDSCxFQUVBLENBQU8sU0FBUyxPQUFPLFVBQVU7R0FDL0IsSUFBSSxNQUFNLFdBQVcsYUFBYTtJQUNoQyxJQUFJLE1BQU0sTUFBTSxVQUNkLGlCQUFpQixJQUFJLE1BQU0sTUFBTSxPQUFPO1NBQ25DO0tBQ0wsTUFBTSxZQUFZLEtBQUssa0JBQWtCLE1BQU0sTUFBTSxPQUFPO0tBQzVELElBQUksY0FBYyxVQUFhLGNBQWMsTUFDM0Msb0JBQW9CLEtBQUs7TUFBRSxXQUFXLE1BQU0sTUFBTTtNQUFXO0tBQVUsQ0FBQztJQUU1RTtJQUNBO0dBQ0Y7R0FFQSxNQUFNLFFBQVEsUUFBUTtHQUN0QixJQUFJLE9BQU87SUFDVCxNQUFNLENBQUMsU0FBUyxhQUFhO0lBQzdCLEtBQUssdUJBQXVCLFNBQVMsV0FBVyxPQUFPLE1BQU0sTUFBTSxDQUFDO0lBQ3BFLGlCQUFpQixJQUFJLE9BQU87R0FDOUI7RUFDRixDQUFDO0VBRUQsT0FBTztHQUFFO0dBQXFCO0dBQWtCO0dBQXFCO0VBQXNCO0NBQzdGO0NBRUEsTUFBYyxxQkFDWixTQUNBLFdBQ0Esa0JBQ2tCO0VBQ2xCLFNBQVM7R0FDUCxNQUFNLGdCQUFnQixLQUFLLGNBQWMsSUFBSSxPQUFPO0dBQ3BELE1BQU0sWUFBWSxlQUFlO0dBQ2pDLElBQUksQ0FBQyxlQUFlLFVBQVUsY0FBYyxVQUFhLGNBQWMsTUFBTTtJQUMzRSxLQUFLLHFCQUFxQixPQUFPLE9BQU87SUFDeEMsT0FBTztHQUNUO0dBRUEsSUFBSTtHQUNKLElBQUk7SUFDRixTQUFTLE1BQU0sMkJBQTJCLEtBQUssdUJBQXVCLE9BQU8sQ0FBQztHQUNoRixTQUFTLEdBQUc7SUFDVixJQUFJLEtBQUssY0FBYyxJQUFJLE9BQU8sTUFBTSxlQUFlO0lBQ3ZELEtBQUsscUJBQXFCLE9BQU8sT0FBTztJQUN4QyxLQUFLLHVCQUF1QixTQUFTLGNBQWMsUUFBUSxXQUFZLEVBQVksT0FBTztJQUMxRixPQUFPO0dBQ1Q7R0FFQSxJQUFJLEtBQUssY0FBYyxJQUFJLE9BQU8sTUFBTSxlQUFlO0dBRXZELElBQUksT0FBTyxTQUFTLGlCQUFpQjtJQUNuQyxLQUFLLHFCQUFxQixPQUFPLE9BQU87SUFDeEMsS0FBSyx1QkFBdUIsU0FBUyxjQUFjLFFBQVEsV0FBVyxPQUFPLE1BQU07SUFDbkYsT0FBTztHQUNUO0dBRUEsSUFBSSxPQUFPLGtCQUFrQixXQUFXO0lBQ3RDLE1BQU0sZUFBZSxDQUFDLEtBQUsscUJBQXFCLElBQUksT0FBTztJQUMzRCxLQUFLLHFCQUFxQixJQUFJLE9BQU87SUFDckMsSUFBSSxjQUNGLEtBQUssc0JBQXNCLFNBQVMsY0FBYyxRQUFRLFdBQVcsV0FBVyxNQUFNO0lBRXhGLGtCQUFrQixJQUFJLE9BQU87SUFDN0IsT0FBTztHQUNUO0dBRUEsSUFBSSxLQUFLLHFCQUFxQixPQUFPLE9BQU8sR0FDMUMsS0FBSyxrQkFBa0IsU0FBUyxjQUFjLFFBQVEsV0FBVyxXQUFXLE1BQU07R0FFcEYsT0FBTztFQUNUO0NBQ0Y7Q0FFQSxzQkFDRSxTQUNBLFdBQ0EsV0FDQSxRQUNNO0VBQ04sT0FBTyxLQUNMLHdDQUF3QyxVQUFVLEdBQUcsUUFBUSxLQUFLLE9BQU8sZUFBZSxPQUFPLFVBQVUsS0FDekc7R0FDRTtHQUNBO0dBQ0EsVUFBVTtHQUNWO0dBQ0EsbUJBQW1CLE9BQU87R0FDMUIsVUFBVSxPQUFPO0dBQ2pCLG9CQUFvQixPQUFPO0dBQzNCLFVBQVUsT0FBTztHQUNqQixTQUFTLE9BQU87R0FDaEIsUUFBUTtFQUNWLENBQ0Y7Q0FDRjtDQUVBLGtCQUNFLFNBQ0EsV0FDQSxXQUNBLFFBQ007RUFDTixPQUFPLEtBQ0wsbUNBQW1DLFVBQVUsR0FBRyxRQUFRLEtBQUssT0FBTyxlQUFlLE1BQU0sVUFBVSxLQUNuRztHQUNFO0dBQ0E7R0FDQSxVQUFVO0dBQ1Y7R0FDQSxtQkFBbUIsT0FBTztHQUMxQixVQUFVLE9BQU87R0FDakIsb0JBQW9CLE9BQU87R0FDM0IsVUFBVSxPQUFPO0dBQ2pCLFNBQVMsT0FBTztHQUNoQixRQUFRO0VBQ1YsQ0FDRjtDQUNGO0NBRUEsdUJBQStCLFNBQWlCLFdBQW1CLFFBQXNCO0VBQ3ZGLE1BQU0sWUFBWSxLQUFLLGtCQUFrQixPQUFPO0VBQ2hELE9BQU8sS0FBSywwQ0FBMEM7R0FDcEQ7R0FDQTtHQUNBLFVBQVU7R0FDVjtHQUNBLFFBQVE7R0FDUixjQUFjO0VBQ2hCLENBQUM7Q0FDSDtDQUVBLDRCQUFvQyxhQUFzQztFQUN4RSxPQUFPLEtBQUssc0NBQXNDO0dBQ2hELFVBQVU7R0FDVixZQUFZLFlBQVksb0JBQW9CO0dBQzVDLHVCQUF1QixZQUFZO0dBQ25DLHFCQUFxQixZQUFZO0dBQ2pDLFFBQVE7RUFDVixDQUFDO0VBQ0QsTUFBTSxJQUFJLDRCQUNSLDhCQUE4QixVQUFVLFlBQVksbUJBQW1CLENBQ3pFO0NBQ0Y7Q0FJQSxlQUlXO0NBRVgsTUFBTSxrQkFBa0IsTUFBNEM7RUFDbEUsSUFBSSxLQUFLLGNBQWM7R0FDckIsS0FBSyxhQUFhLE9BQU8sS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7R0FDOUMsYUFBYSxLQUFLLGFBQWEsS0FBSztHQUNwQyxLQUFLLGVBQWU7RUFDdEI7RUFHQSxNQUFNLFNBQVMsSUFBSSxxQkFBcUI7R0FDdEMsU0FGYSxLQUFLLElBRVQ7R0FDVCxXQUFXO0dBQ1gsYUFBYTtHQUNiLFdBQVc7RUFDYixDQUFDO0VBRUQsTUFBTSxVQUFVLE1BQU0sT0FBTyxrQkFBa0I7RUFFL0MsTUFBTSxRQUFRLGlCQUFpQjtHQUM3QixJQUFJLEtBQUssY0FBYyxXQUFXLFFBQVE7SUFDeEMsT0FBTyxLQUFLLDZCQUE2QixLQUFLLGlCQUFpQjtJQUMvRCxPQUFPLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzVCLEtBQUssZUFBZTtHQUN0QjtFQUNGLEdBQUcsR0FBTztFQUVWLEtBQUssZUFBZTtHQUFFO0dBQVE7R0FBTTtFQUFNO0VBQzFDLE9BQU8sRUFBRSxRQUFRO0NBQ25CO0NBRUEsSUFBSSxtQkFBa0M7RUFDcEMsT0FBTyxLQUFLLGNBQWMsUUFBUTtDQUNwQztDQUVBLE1BQU0sdUJBS0g7RUFDRCxJQUFJLENBQUMsS0FBSyxjQUFjLE1BQU0sSUFBSSxNQUFNLGtCQUFrQjtFQUMxRCxNQUFNLEVBQUUsUUFBUSxVQUFVLEtBQUs7RUFFL0IsSUFBSTtHQUNGLE1BQU0sT0FBTyw0QkFBNEI7R0FDekMsTUFBTSxRQUFRLE1BQU0sT0FBTyx1QkFBdUI7R0FDbEQsSUFBSSxDQUFDLE9BQU8sTUFBTSxJQUFJLE1BQU0sd0NBQXdDO0dBQ3BFLE9BQU87RUFDVCxVQUFVO0dBQ1IsYUFBYSxLQUFLO0dBQ2xCLEtBQUssZUFBZTtHQUNwQixNQUFNLE9BQU8sS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7RUFDcEM7Q0FDRjtDQUlBLElBQUksY0FBc0I7RUFDeEIsT0FBTyxDQUFDLEdBQUcsS0FBSyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDOUM7Q0FFQSxJQUFJLG1CQUEyQjtFQUM3QixPQUFPLENBQUMsR0FBRyxLQUFLLFdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztDQUN2RTtDQUVBLElBQUksY0FBc0I7RUFDeEIsT0FBTyxLQUFLLE1BQU07Q0FDcEI7Q0FHQSxJQUFJLHNCQUE4RDtFQUNoRSxPQUFPLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsQ0FDbEMsS0FBSyxDQUFDLFNBQVMsY0FBYztHQUM1QixNQUFNLFFBQVEsRUFBRSxFQUFFLGFBQWEsU0FBUztHQUN4QyxPQUFPLFFBQVE7RUFDakIsRUFBRSxDQUFDLENBQ0YsUUFBUSxVQUFVLE1BQU0sUUFBUSxDQUFDLENBQUMsQ0FDbEMsVUFBVSxHQUFHLE1BQU0sRUFBRSxLQUFLLGNBQWMsRUFBRSxJQUFJLENBQUM7Q0FDcEQ7QUFDRiJ9
|
|
@@ -382,6 +382,92 @@ describe("CodexAppServerWorker TTFT", () => {
|
|
|
382
382
|
});
|
|
383
383
|
});
|
|
384
384
|
|
|
385
|
+
describe("CodexAppServerWorker thread activity timestamps", () => {
|
|
386
|
+
type ThreadMetaInternals = {
|
|
387
|
+
threadMeta: Map<string, { lastUsedAt: number }>;
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
it("records non-stream thread activity at turn completion", async () => {
|
|
391
|
+
let now = 1_000;
|
|
392
|
+
const nowSpy = vi.spyOn(Date, "now").mockImplementation(() => now);
|
|
393
|
+
const { worker, request, handlers } = createWorkerWithNotificationRpc(
|
|
394
|
+
async (method, _params) => {
|
|
395
|
+
if (method === "thread/start") {
|
|
396
|
+
return { thread: { id: "thread-1" }, model: "gpt-test" };
|
|
397
|
+
}
|
|
398
|
+
if (method === "turn/start") return { turn: { id: "turn-1" } };
|
|
399
|
+
throw new Error(`unexpected request: ${method}`);
|
|
400
|
+
},
|
|
401
|
+
);
|
|
402
|
+
|
|
403
|
+
try {
|
|
404
|
+
const turn = worker.executeTurn({
|
|
405
|
+
input: [{ type: "text", text: "hi", text_elements: [] }],
|
|
406
|
+
});
|
|
407
|
+
await vi.waitFor(() =>
|
|
408
|
+
expect(request).toHaveBeenCalledWith("turn/start", expect.anything()),
|
|
409
|
+
);
|
|
410
|
+
now = 700_000;
|
|
411
|
+
handlers.get("turn/completed")?.({
|
|
412
|
+
threadId: "thread-1",
|
|
413
|
+
turn: { status: "completed", durationMs: 699_000 },
|
|
414
|
+
} as never);
|
|
415
|
+
|
|
416
|
+
await turn;
|
|
417
|
+
|
|
418
|
+
expect(
|
|
419
|
+
(worker as unknown as ThreadMetaInternals).threadMeta.get("thread-1")?.lastUsedAt,
|
|
420
|
+
).toBe(700_000);
|
|
421
|
+
} finally {
|
|
422
|
+
nowSpy.mockRestore();
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
it("records streaming thread activity at turn completion", async () => {
|
|
427
|
+
let now = 2_000;
|
|
428
|
+
const nowSpy = vi.spyOn(Date, "now").mockImplementation(() => now);
|
|
429
|
+
const { worker, request, handlers } = createWorkerWithNotificationRpc(
|
|
430
|
+
async (method, _params) => {
|
|
431
|
+
if (method === "thread/start") {
|
|
432
|
+
return { thread: { id: "thread-1" }, model: "gpt-test" };
|
|
433
|
+
}
|
|
434
|
+
if (method === "turn/start") return { turn: { id: "turn-1" } };
|
|
435
|
+
throw new Error(`unexpected request: ${method}`);
|
|
436
|
+
},
|
|
437
|
+
);
|
|
438
|
+
const callbacks: StreamCallbacks = {
|
|
439
|
+
onDelta: vi.fn(),
|
|
440
|
+
onComplete: vi.fn(),
|
|
441
|
+
onError: vi.fn(),
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
try {
|
|
445
|
+
const turn = worker.executeTurnStream(
|
|
446
|
+
{
|
|
447
|
+
input: [{ type: "text", text: "hi", text_elements: [] }],
|
|
448
|
+
},
|
|
449
|
+
callbacks,
|
|
450
|
+
);
|
|
451
|
+
await vi.waitFor(() =>
|
|
452
|
+
expect(request).toHaveBeenCalledWith("turn/start", expect.anything()),
|
|
453
|
+
);
|
|
454
|
+
now = 800_000;
|
|
455
|
+
handlers.get("turn/completed")?.({
|
|
456
|
+
threadId: "thread-1",
|
|
457
|
+
turn: { status: "completed", durationMs: 798_000 },
|
|
458
|
+
} as never);
|
|
459
|
+
|
|
460
|
+
await turn;
|
|
461
|
+
|
|
462
|
+
expect(
|
|
463
|
+
(worker as unknown as ThreadMetaInternals).threadMeta.get("thread-1")?.lastUsedAt,
|
|
464
|
+
).toBe(800_000);
|
|
465
|
+
} finally {
|
|
466
|
+
nowSpy.mockRestore();
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
|
|
385
471
|
describe("CodexAppServerWorker prompt prefix", () => {
|
|
386
472
|
it("uses the same base instructions with and without an output schema", async () => {
|
|
387
473
|
type WorkerInternals = {
|
|
@@ -800,7 +886,7 @@ describe("CodexAppServerWorker thread unsubscribe on eviction", () => {
|
|
|
800
886
|
expect(unsubscribedIds(request).toSorted()).toEqual(["stale-1", "stale-2"]);
|
|
801
887
|
});
|
|
802
888
|
|
|
803
|
-
it("
|
|
889
|
+
it("caps periodic LRU cleanup at the configured maximum", () => {
|
|
804
890
|
const { worker, request, meta } = createWorkerWithUnsubscribeSpy();
|
|
805
891
|
const now = Date.now();
|
|
806
892
|
for (let i = 0; i < 17; i++) {
|
|
@@ -809,7 +895,19 @@ describe("CodexAppServerWorker thread unsubscribe on eviction", () => {
|
|
|
809
895
|
|
|
810
896
|
worker.sweepIdleThreads();
|
|
811
897
|
|
|
812
|
-
|
|
898
|
+
expect(meta.size).toBe(16);
|
|
899
|
+
expect(unsubscribedIds(request)).toEqual(["t-0"]);
|
|
900
|
+
});
|
|
901
|
+
|
|
902
|
+
it("reserves one LRU slot before creating a new thread", () => {
|
|
903
|
+
const { worker, request, meta } = createWorkerWithUnsubscribeSpy();
|
|
904
|
+
const now = Date.now();
|
|
905
|
+
for (let i = 0; i < 17; i++) {
|
|
906
|
+
meta.set(`t-${i}`, { lastUsedAt: now - (17 - i) * 1_000 });
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
worker.sweepIdleThreads(true);
|
|
910
|
+
|
|
813
911
|
expect(meta.size).toBe(15);
|
|
814
912
|
expect(unsubscribedIds(request).toSorted()).toEqual(["t-0", "t-1"]);
|
|
815
913
|
});
|