@cartanova/qgrid-cli 2.5.7 → 2.5.8
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 -2
- package/README.md +2 -2
- package/bundle/dist/utils/providers/openai/codex-worker.js +15 -10
- package/bundle/src/utils/providers/openai/codex-worker.test.ts +33 -0
- package/bundle/src/utils/providers/openai/codex-worker.ts +21 -13
- package/bundle/web-dist/client/assets/{index-Bm7RpZcx.js → index-oLaOO8wP.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-BrJdk9XJ.js → logs-D8U3hI1f.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-BuFCoBCr.js → monit-NKS90qFj.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-d-Fwxdg8.js → routes-BuxVmofi.js} +1 -1
- package/bundle/web-dist/client/assets/{show-Z5UX7FtU.js → show-C8Qv9_Ww.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-OA2V76xd.js → tokens-ChWIXTeL.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/decision-rationale.md +4 -3
- package/skills/qgrid/references/openai-codex-runtime.md +2 -0
- package/skills/qgrid/references/provider-runtime-differences.md +1 -1
package/README.ko.md
CHANGED
|
@@ -97,8 +97,8 @@ CLI는 실행 시 npm의 최신 버전을 확인하고 patch를 포함해 설치
|
|
|
97
97
|
|------|------|--------|
|
|
98
98
|
| `NODE_ENV` | Sonamu 실행 프로필. 원격 비프로덕션 배포에는 `staging` 사용 | `production` |
|
|
99
99
|
| `QGRID_OPENAI_AUTOSCALE` | OpenAI worker autoscaling. `false` 또는 `0`이면 고정 크기 pool 사용 | 활성 |
|
|
100
|
-
| `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최소 worker 수 | `
|
|
101
|
-
| `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최대 worker 수 | `
|
|
100
|
+
| `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최소 worker 수 | `1` |
|
|
101
|
+
| `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최대 worker 수 | `3` |
|
|
102
102
|
| `QGRID_PUBLIC_BASE_URL` | Anthropic OAuth callback 공개 베이스 URL. 원격 접속 환경에서 설정 | 미설정 시 `http://localhost:<port>/callback` |
|
|
103
103
|
| `QGRID_OPENAI_THREAD_REUSE` | `false`로 설정 시 OpenAI thread reuse(prompt cache) 비활성화 | 활성 |
|
|
104
104
|
|
package/README.md
CHANGED
|
@@ -98,8 +98,8 @@ Server behavior variables:
|
|
|
98
98
|
|------|------|--------|
|
|
99
99
|
| `NODE_ENV` | Sonamu runtime profile. Set `staging` for a remote non-production deployment | `production` |
|
|
100
100
|
| `QGRID_OPENAI_AUTOSCALE` | OpenAI worker autoscaling. Set to `false` or `0` to keep a fixed-size pool | enabled |
|
|
101
|
-
| `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | Minimum OpenAI workers per token while autoscaling | `
|
|
102
|
-
| `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | Maximum OpenAI workers per token while autoscaling | `
|
|
101
|
+
| `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | Minimum OpenAI workers per token while autoscaling | `1` |
|
|
102
|
+
| `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | Maximum OpenAI workers per token while autoscaling | `3` |
|
|
103
103
|
| `QGRID_PUBLIC_BASE_URL` | Public base URL for the Anthropic OAuth callback. Set it when the server is accessed remotely | `http://localhost:<port>/callback` when unset |
|
|
104
104
|
| `QGRID_OPENAI_THREAD_REUSE` | Set to `false` to disable OpenAI thread reuse (prompt caching) | enabled |
|
|
105
105
|
|
|
@@ -288,15 +288,20 @@ var CodexAppServerWorker = class CodexAppServerWorker {
|
|
|
288
288
|
config: threadConfig
|
|
289
289
|
});
|
|
290
290
|
const threadId = thread.id;
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
291
|
+
try {
|
|
292
|
+
if (req.history?.length) await this.rpc.request("thread/inject_items", {
|
|
293
|
+
threadId,
|
|
294
|
+
items: req.history
|
|
295
|
+
});
|
|
296
|
+
if (!req.imageGeneration) this.threadMeta.set(threadId, { lastUsedAt: Date.now() });
|
|
297
|
+
return {
|
|
298
|
+
threadId,
|
|
299
|
+
model: req.model ?? threadModel
|
|
300
|
+
};
|
|
301
|
+
} catch (error) {
|
|
302
|
+
this.evictThread(threadId);
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
300
305
|
}
|
|
301
306
|
async startTurnOnThread(threadId, req) {
|
|
302
307
|
if (!this.rpc || !this.ready) throw new Error("worker not ready");
|
|
@@ -612,4 +617,4 @@ var CodexAppServerWorker = class CodexAppServerWorker {
|
|
|
612
617
|
//#endregion
|
|
613
618
|
export { CODEX_CONFIG_TOML, CodexAppServerWorker };
|
|
614
619
|
|
|
615
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQge1xuICBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbn0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbExpc3RSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbExpc3RSZXNwb25zZVwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL01vZGVsUHJvdmlkZXJDYXBhYmlsaXRpZXNSZWFkUmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuVXNhZ2VCcmVha2Rvd24gfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVG9rZW5Vc2FnZUJyZWFrZG93blwiO1xuaW1wb3J0IHsgdHlwZSBUdXJuU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UGFyYW1zXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1R1cm5TdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFN0cmVhbUNhbGxiYWNrcyBhcyBDb21tb25TdHJlYW1DYWxsYmFja3MgfSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQgeyBDb2RleFJwY0NsaWVudCB9IGZyb20gXCIuL2NvZGV4LXJwY1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJjb2RleC13b3JrZXJcIl0pO1xuXG5jb25zdCBNQVhfUkVTVEFSVF9BVFRFTVBUUyA9IDM7XG5jb25zdCBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyA9IDFfMDAwO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQ29uZmlnIHtcbiAgdG9rZW5JZDogbnVtYmVyO1xuICB0b2tlbk5hbWU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xuICB3b3JrZXJJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVxdWVzdCB7XG4gIGlucHV0OiBUdXJuU3RhcnRQYXJhbXNbXCJpbnB1dFwiXTtcbiAgb3V0cHV0U2NoZW1hPzogVHVyblN0YXJ0UGFyYW1zW1wib3V0cHV0U2NoZW1hXCJdO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBkZXZlbG9wZXJJbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk/OiBUaHJlYWRJbmplY3RJdGVtc1BhcmFtc1tcIml0ZW1zXCJdO1xuICB2ZXJib3NpdHk/OiBzdHJpbmc7XG4gIHJlYXNvbmluZ1N1bW1hcnk/OiBzdHJpbmc7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICAvLyDsnbQgdHVybiDsl5DshJwgY29kZXgg64K07J6lIGltYWdlX2dlbmVyYXRpb24gdG9vbCDsnYQg7Lyg64ukLlxuICAvLyB0aHJlYWQg64uo7JyE66Gc66eMIO2ZnOyEse2ZlOuQmOupsCjsoITsl60gY29uZmlnIOuKlCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCksXG4gIC8vIO2UjOuemOq3uCDsl4bripQg7JqU7LKt7J2AIHRvb2wg6rWs7ISx7J20IO2YhO2WieqzvCDrj5nsnbztlZjri6QuXG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW47XG4gIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM/OiBJbWFnZUdlbmVyYXRpb25PcHRpb25zO1xufVxuXG4vLyDtlZwgdHVybiDsl5DshJwg7IOd7ISx65CcIOydtOuvuOyngCDtlZjrgpguIGNvZGV4IGltYWdlR2VuZXJhdGlvbiBpdGVtIOyXkOyEnCDtjIzsg50uXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5JbWFnZSB7XG4gIGRhdGE6IHN0cmluZzsgLy8gYmFzZTY0IGltYWdlIHBheWxvYWQgKGl0ZW0ucmVzdWx0KVxuICByZXZpc2VkUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHR0ZnRNczogbnVtYmVyIHwgbnVsbDtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7J2066+47KeAIHR1cm4g7JeQ7ISc66eMIOyxhOybjOynkC4g7JmE7ISxIOydtOuvuOyngOqwgCDsl4bsnLzrqbQg67mIIOuwsOyXtC91bmRlZmluZWQuXG4gIGltYWdlcz86IFR1cm5JbWFnZVtdO1xuICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpzsnbQg6rSA7Lih65CQ64qU7KeAKGl0ZW0vc3RhcnRlZCDrmJDripQgaGFzUmVzdWx0IOyeiOuKlCBjb21wbGV0ZWQpLlxuICAvLyDsnbTrr7jsp4AgMOqwnOydvCDrlYwg7J6s7Iuc64+EIOqwgOuKpSDsi6TtjKgoXCLsi5zrj4Qg7ZuEIOuvuOyZhOyEsVwiKeyZgCDsnqzsi5zrj4Qg66y07J21KFwidG9vbCDrr7jtmLjstpxcIinsnYQg6rWs67aELlxuICBpbWFnZUF0dGVtcHRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFN0cmVhbUNhbGxiYWNrcyA9IENvbW1vblN0cmVhbUNhbGxiYWNrczxUdXJuUmVzdWx0PjtcblxudHlwZSBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzID0gUGljazxXb3JrZXJDb25maWcsIFwiYWNjZXNzVG9rZW5cIiB8IFwiYWNjb3VudElkXCIgfCBcInBsYW5UeXBlXCI+O1xudHlwZSBBY3RpdmVUdXJuQWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuXG4vLyB0aHJlYWQvc3RhcnQg6rO17Ya1IOyYteyFmFxuY29uc3QgVEhSRUFEX0RFRkFVTFRTID0ge1xuICBzYW5kYm94OiBcInJlYWQtb25seVwiLFxuICBhcHByb3ZhbFBvbGljeTogXCJuZXZlclwiLFxuICBjb25maWc6IHtcbiAgICBhcHBzOiB7IF9kZWZhdWx0OiB7IGVuYWJsZWQ6IGZhbHNlLCBkZXN0cnVjdGl2ZV9lbmFibGVkOiBmYWxzZSwgb3Blbl93b3JsZF9lbmFibGVkOiBmYWxzZSB9IH0sXG4gIH0sXG59IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPjtcblxuY29uc3QgQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gRG8gbm90IHVzZSBhbnkgdG9vbHMgc3VjaCBhcyBzaGVsbCwgZmlsZSBvcGVyYXRpb25zLCBvciB3ZWIgc2VhcmNoLiBSZXNwb25kIHdpdGggdGV4dCBvbmx5LlwiO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIHRocmVhZCDsoITsmqkgaW5zdHJ1Y3Rpb24uIOq4sOuzuCBCQVNFX0lOU1RSVUNUSU9OUyDsnZggXCJ0ZXh0IG9ubHlcIiDsp4Dsi5zqsIBcbi8vIOyLpOyniCDslrXsoJzquLDsnbTrr4DroZwoY29kZXggaW1hZ2VfZ2VuZXJhdGlvbiBmZWF0dXJlIOuKlCBkZWZhdWx0LW9uKSwg7J2066+47KeAIOuqqOuTnOyXkOyEnOuKlFxuLy8gaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIOyCrOyaqeydhCDrqoXsi5zsoIHsnLzroZwg7ZeI7Jqp7ZWc64ukLiBzaGVsbC93ZWIg65OxIOuCmOuouOyngCB0b29sIOydgCDsl6zsoITtnogg6riI7KeALlxuY29uc3QgSU1BR0VfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gV2hlbiBhc2tlZCB0byBjcmVhdGUgYW4gaW1hZ2UsIHVzZSB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIHRvIHByb2R1Y2UgaXQuIERvIG5vdCB1c2UgYW55IG90aGVyIHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC5cIjtcblxuZnVuY3Rpb24gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYCR7SU1BR0VfQkFTRV9JTlNUUlVDVElPTlN9IFJlcXVlc3RlZCBpbWFnZSBvdXRwdXQ6IG1vZGVsICR7Q09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTH0sIHF1YWxpdHkgJHtyZXNvbHZlZC5xdWFsaXR5fSwgc2l6ZSAke3Jlc29sdmVkLnNpemV9LCBmb3JtYXQgcG5nLmA7XG59XG5cbi8vIOyLpOy4oeyDgSDsmYTro4wgaXRlbSDsnZggc3RhdHVzIOuKlCBcImdlbmVyYXRpbmdcIiDsnLzroZwg7JmA64+EIHJlc3VsdCDsl5Ag7JmE7ISxIGJhc2U2NCDqsIAg7Iuk66aw64ukLlxuLy8g65Sw65287IScIOyZhOyEsSDtjJDsoJXsnYAgc3RhdHVzIOusuOyekOyXtOydtCDslYTri4jrnbwgcmVzdWx0IOydmCDsnKDtmqjshLEo67mE7Ja07J6I7KeAIOyViuqzoCDtkZzspIAgYmFzZTY0IOyduOyngCnsnLzroZwg7ZWc64ukLlxuZnVuY3Rpb24gaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChyZXN1bHQ6IHVua25vd24pOiByZXN1bHQgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdHJpbW1lZCA9IHJlc3VsdC50cmltKCk7XG4gIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIS9eW0EtWmEtejAtOSsvXSs9ezAsMn0kLy50ZXN0KHRyaW1tZWQpIHx8IHRyaW1tZWQubGVuZ3RoICUgNCAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmV4cG9ydCBjb25zdCBDT0RFWF9DT05GSUdfVE9NTCA9IGB3ZWJfc2VhcmNoID0gXCJkaXNhYmxlZFwiXG5pbmNsdWRlX3Blcm1pc3Npb25zX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2FwcHNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfZW52aXJvbm1lbnRfY29udGV4dCA9IGZhbHNlXG5cbltmZWF0dXJlc11cbnNoZWxsX3Rvb2wgPSBmYWxzZVxudG9vbF9zZWFyY2ggPSBmYWxzZVxudG9vbF9zdWdnZXN0ID0gZmFsc2Vcbm11bHRpX2FnZW50ID0gZmFsc2VcbmltYWdlX2dlbmVyYXRpb24gPSBmYWxzZVxuYXBwcyA9IGZhbHNlXG5wbHVnaW5zID0gZmFsc2VcblxuW3Rvb2xzXVxudmlld19pbWFnZSA9IGZhbHNlXG5cbltza2lsbHNdXG5pbmNsdWRlX2luc3RydWN0aW9ucyA9IGZhbHNlXG5cbltza2lsbHMuYnVuZGxlZF1cbmVuYWJsZWQgPSBmYWxzZVxuYDtcblxuLy8g4pSA4pSAIFdvcmtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIENvZGV4QXBwU2VydmVyV29ya2VyIHtcbiAgcHJpdmF0ZSBwcm9jOiBDaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBycGM6IENvZGV4UnBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29kZXhIb21lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzdGFydEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIGJ1c3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVUdXJuQWJvcnQ/OiBBY3RpdmVUdXJuQWJvcnQ7XG4gIGFjdGl2ZSA9IHRydWU7XG4gIG9uUmVhZHk/OiAoKSA9PiB2b2lkO1xuICAvLyByZXN0YXJ0IOyLnCBycGMg6rCd7LK06rCAIOyDiOuhnCDsg53shLHrkJjrr4DroZwsIO2VuOuTpOufrOulvCDrs7TqtIDtlojri6TqsIAg66ekIHNwYXdu66eI64ukIOyerOuwlOyduOuUqe2VnOuLpC5cbiAgc2VydmVyUmVxdWVzdEhhbmRsZXI/OiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvLyB0aHJlYWQg7J6s7IKs7JqpKHByb21wdCBjYWNoZSk6IHdvcmtlciDqsIAg7IOd7ISx7ZWcIHRocmVhZCDrk6TsnZgg66mU7YOALlxuICAvLyBlcGhlbWVyYWwgdGhyZWFkIOuKlCDsnbQg7ZSE66Gc7IS47IqkIOuplOuqqOumrOyXkOunjCDsobTsnqztlZjrr4DroZwgcmVzdGFydCDsi5wg7KCE67aAIOustO2aqC5cbiAgcHJpdmF0ZSB0aHJlYWRNZXRhID0gbmV3IE1hcDxzdHJpbmcsIHsgbGFzdFVzZWRBdDogbnVtYmVyIH0+KCk7XG4gIC8vIHNwYXduIOy5tOyatO2EsC4gcmVzdGFydCDrp4jri6Qg7Kad6rCAIOKGkiBjb252IO2VuOuTpOydmCBlcG9jaCDsmYAg64yA7KGw7ZW0IHN0YWxlIHRocmVhZCDqsJDsp4AuXG4gIHByaXZhdGUgZXBvY2hDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEhSRUFEX0lETEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9USFJFQURTX1BFUl9XT1JLRVIgPSAxNjtcbiAgLy8g7J2066+47KeAIOqyjOydtO2KuCDqsoDspp3smqkg7LqQ7IucLiBzcGF3biDri6jsnITroZwg66y07Zqo7ZmUKHJlc3RhcnQg7IucIGNsZWFyKS5cbiAgLy8gY2FwYWJpbGl0eSDripQgcHJvdmlkZXIg64uo7JyEIGJvb2xlYW4sIOuqqOuNuCDrqYDti7Drqqjri6wg7Jes67aA64qUIG1vZGVsL2xpc3Qg66GcIO2ZleyduC5cbiAgcHJpdmF0ZSBjYWNoZWRDYXBhYmlsaXRpZXM/OiBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlO1xuICBwcml2YXRlIGNhY2hlZE1vZGVscz86IE1hcDxzdHJpbmcsIE1vZGVsPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gY29uZmlnLndvcmtlckluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7Y29uZmlnLndvcmtlckluZGV4fWAgOiBcIlwiO1xuICAgIHRoaXMuY29kZXhIb21lID0gam9pbih0bXBkaXIoKSwgXCJxZ3JpZC1jb2RleFwiLCBgJHtjb25maWcudG9rZW5JZH0ke3N1ZmZpeH1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIC8vIOyDiCDtlITroZzshLjsiqQg4oaSIGNhcGFiaWxpdHkvbW9kZWwg7LqQ7IucIOustO2aqCjroZzqt7jsnbgg6rOE7KCVL+uyhOyghOydtCDrsJTrgIzsl4jsnYQg7IiYIOyeiOydjCkuXG4gICAgdGhpcy5jYWNoZWRDYXBhYmlsaXRpZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYWNoZWRNb2RlbHMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3dkID0gYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGA7XG4gICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gY29kZXgg64K07J6lIHRvb2wvd2ViX3NlYXJjaC9pbnN0cnVjdGlvbiDruJTroZ0g67mE7Zmc7ISx7ZmUXG4gICAgd3JpdGVGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vY29uZmlnLnRvbWxgLCBDT0RFWF9DT05GSUdfVE9NTCk7XG5cbiAgICB0aGlzLnByb2MgPSBzcGF3bihcImNvZGV4XCIsIFtcImFwcC1zZXJ2ZXJcIiwgXCItLWxpc3RlblwiLCBcInN0ZGlvOi8vXCJdLCB7XG4gICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgY3dkLFxuICAgICAgZW52OiB7XG4gICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICBDT0RFWF9IT01FOiB0aGlzLmNvZGV4SG9tZSxcbiAgICAgICAgLy8gZW52aXJvbm1lbnQg67mE7Zmc7ISx7ZmUIOKGkiBoYXNfZW52aXJvbm1lbnQ9ZmFsc2Ug4oaSIHNoZWxsL2FwcGx5X3BhdGNoL3ZpZXdfaW1hZ2Ug7KCc6rGwXG4gICAgICAgIENPREVYX0VYRUNfU0VSVkVSX1VSTDogXCJub25lXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gZXhpdGVkIChjb2RlPSR7Y29kZX0pYCk7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKFxuICAgICAgICBuZXcgRXJyb3IoYGNvZGV4IHdvcmtlciBleGl0ZWQgd2hpbGUgdHVybiB3YXMgcnVubmluZyAoY29kZT0ke2NvZGUgPz8gXCJ1bmtub3duXCJ9KWApLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucnBjID0gbnVsbDtcbiAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ycGMgPSBuZXcgQ29kZXhScGNDbGllbnQodGhpcy5wcm9jKTtcbiAgICAvLyByZXN0YXJ0IO2bhOyXkOuPhCByZWZyZXNoIHNlcnZlci1yZXF1ZXN0IO2VuOuTpOufrOulvCDsnKDsp4AgKOyXhuycvOuptCBjb2RleCDthqDtgbAg7ZqM7KCEIOyLpO2MqCDihpIgc2Vzc2lvbiBleHBpcmVkKVxuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwiaW5pdGlhbGl6ZVwiLCB7XG4gICAgICBjbGllbnRJbmZvOiB7IG5hbWU6IFwicWdyaWRcIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0sXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgZXhwZXJpbWVudGFsQXBpOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JMb2dpbkNvbXBsZXRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvZ2luIHRpbWVvdXRcIikpLCAxMjBfMDAwKTtcbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImFjY291bnQvbG9naW4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHAuc3VjY2VzcykgcmVzb2x2ZSgpO1xuICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGxvZ2luIGZhaWxlZDogJHtwLmVycm9yID8/IFwidW5rbm93blwifWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3QoXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdEF1dGhUb2tlbnNcIixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbixcbiAgICAgIGNoYXRncHRBY2NvdW50SWQ6IHRoaXMuY29uZmlnLmFjY291bnRJZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5wbGFuVHlwZSA/IHsgY2hhdGdwdFBsYW5UeXBlOiB0aGlzLmNvbmZpZy5wbGFuVHlwZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3Q8eyBhdXRoVXJsOiBzdHJpbmcgfT4oXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdFwiLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGJyb3dzZXIgbG9naW4gc3RhcnRlZGApO1xuICAgIHJldHVybiByZXN1bHQuYXV0aFVybDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIGNvbXBsZXRlZGApO1xuICB9XG5cbiAgYXN5bmMgcmVhZE1hbmFnZWRDcmVkZW50aWFscygpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0gfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9hdXRoLmpzb25gLCBcInV0Zi04XCIpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByYXcudG9rZW5zPy5hY2Nlc3NfdG9rZW4gPz8gXCJcIixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByYXcudG9rZW5zPy5yZWZyZXNoX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIGlkVG9rZW46IHJhdy50b2tlbnM/LmlkX3Rva2VuLFxuICAgICAgICBhY2NvdW50SWQ6IHJhdy50b2tlbnM/LmFjY291bnRfaWQgPz8gXCJcIixcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5mYWlsQWN0aXZlVHVybihuZXcgRXJyb3IoXCJjb2RleCB3b3JrZXIgc3RvcHBlZFwiKSk7XG4gICAgdGhpcy5ycGM/LmRlc3Ryb3koKTtcblxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jPy5raWxsKFwiU0lHS0lMTFwiKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDNfMDAwKTtcbiAgICAgICAgdGhpcy5wcm9jIS5vbihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBybVN5bmModGhpcy5jb2RleEhvbWUsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSAmJiAhdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgfVxuICBnZXQgdG9rZW5JZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50b2tlbklkO1xuICB9XG4gIGdldCB3b3JrZXJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwO1xuICB9XG4gIGdldCB0b2tlbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5OYW1lO1xuICB9XG5cbiAgY2FuUmV1c2VGb3JUb2tlbihfdG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29uZmlnLmFjY291bnRJZCA9PT0gY3JlZGVudGlhbHMuYWNjb3VudElkICYmXG4gICAgICAodGhpcy5jb25maWcucGxhblR5cGUgPz8gdW5kZWZpbmVkKSA9PT0gKGNyZWRlbnRpYWxzLnBsYW5UeXBlID8/IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlVG9rZW5TdGF0ZSh0b2tlbk5hbWU6IHN0cmluZywgY3JlZGVudGlhbHM6IFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gPSBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPSBjcmVkZW50aWFscy5hY2NvdW50SWQ7XG4gICAgaWYgKGNyZWRlbnRpYWxzLnBsYW5UeXBlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5wbGFuVHlwZSA9IGNyZWRlbnRpYWxzLnBsYW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5jb25maWcucGxhblR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHMoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICByZXR1cm4gdGhpcy5ycGMucmVxdWVzdChcImFjY291bnQvcmF0ZUxpbWl0cy9yZWFkXCIsIHt9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbWFnZSBnZW5lcmF0aW9uIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIOydtOuvuOyngCB0b29sIOydgCBjb2RleCDsl5DshJwgKEF1dGhNb2RlOjpDaGF0Z3B0KSBBTkQgKGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSlcbiAgLy8gQU5EICjrqqjrjbgg66mA7Yuw66qo64usKSAz7KSRIOqyjOydtO2KuOuLpC4gcWdyaWQg64qUIE9BdXRoIOyghOyaqeydtOqzoCBmZWF0dXJlIOuKlCB0aHJlYWQg7JeQ7IScXG4gIC8vIOy8nOuvgOuhnCwgZGlzcGF0Y2hlciDqsIAg7IKs7KCEIOqygOymne2VoCDrgqjsnYAg7KGw6rG07J2AIGNhcGFiaWxpdHkocHJvdmlkZXIpICsg66qo6424IOupgO2LsOuqqOuLrOydtOuLpC5cblxuICBwcml2YXRlIGFzeW5jIGxvYWRDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICBpZiAoIXRoaXMuY2FjaGVkQ2FwYWJpbGl0aWVzKSB7XG4gICAgICB0aGlzLmNhY2hlZENhcGFiaWxpdGllcyA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8TW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZT4oXG4gICAgICAgIFwibW9kZWxQcm92aWRlci9jYXBhYmlsaXRpZXMvcmVhZFwiLFxuICAgICAgICB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZENhcGFiaWxpdGllcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIE1vZGVsPj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgaWYgKCF0aGlzLmNhY2hlZE1vZGVscykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxNb2RlbExpc3RSZXNwb25zZT4oXCJtb2RlbC9saXN0XCIsIHt9KTtcbiAgICAgIHRoaXMuY2FjaGVkTW9kZWxzID0gbmV3IE1hcChyZXMuZGF0YS5tYXAoKG0pID0+IFttLm1vZGVsLCBtXSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRNb2RlbHM7XG4gIH1cblxuICAvLyDso7zslrTsp4Qg66qo6424KOuvuOyngOygleydtOuptCB0aHJlYWQg6riw67O4IOuqqOuNuCnroZwg7J2066+47KeAIOyDneyEseydtCDqsIDriqXtlZzsp4Ag6rKA7KadLlxuICAvLyDrtojqsIAg7IKs7Jyg66W8IOusuOyekOyXtOuhnCDrsJjtmZjtlZjqs6AsIOqwgOuKpe2VmOuptCBudWxsIOydhCDrsJjtmZjtlZzri6QuXG4gIGFzeW5jIGNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChtb2RlbD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybiBcIndvcmtlciBub3QgcmVhZHlcIjtcbiAgICBjb25zdCBjYXBzID0gYXdhaXQgdGhpcy5sb2FkQ2FwYWJpbGl0aWVzKCk7XG4gICAgaWYgKCFjYXBzLmltYWdlR2VuZXJhdGlvbikgcmV0dXJuIFwicHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBnZW5lcmF0aW9uXCI7XG4gICAgLy8g66qo6424IOupgO2LsOuqqOuLrCDqsoDspp0uIG1vZGVsIOuvuOyngOygleydtOuptCBwcm92aWRlciBjYXBhYmlsaXR5IOunjOycvOuhnCDthrXqs7zsi5ztgqTqs6AsXG4gICAgLy8g7Iuk7KCcIOyggeyaqSDrqqjrjbjsnZgg66mA7Yuw66qo64usIOyXrOu2gOuKlCB0dXJuIOyLpO2WiSDqsrDqs7wo7J2066+47KeAIDDqsJwg4oaSIFUzIOyLpO2MqCDrtoTrpZgp6rCAIOyeoeuKlOuLpC5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMubG9hZE1vZGVscygpO1xuICAgICAgY29uc3QgaW5mbyA9IG1vZGVscy5nZXQobW9kZWwpO1xuICAgICAgaWYgKGluZm8gJiYgIWluZm8uaW5wdXRNb2RhbGl0aWVzLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgcmV0dXJuIGBtb2RlbCAke21vZGVsfSBpcyBub3QgbXVsdGltb2RhbCAobm8gaW1hZ2UgaW5wdXQgbW9kYWxpdHkpYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAvLyDsnbTrr7jsp4Ag66qo65OcOiB0aHJlYWQg64uo7JyE66Gc66eMIGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSDrpbwg7Lyg64ukLlxuICAgICAgLy8g7KCE7JetIGNvbmZpZy50b21sIOydgCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCjthY3siqTtirggdGhyZWFkIOydtOykkSDssKjri6gpLFxuICAgICAgLy8gZG90dGVkIENMSS3siqTtg4Dsnbwgb3ZlcnJpZGUg7YKk66GcIOydtCB0aHJlYWQg7JeQ7ISc66eMIO2ZnOyEse2ZlCjsi6TsuKEg7ZmV7J24KS5cbiAgICAgIC4uLihyZXEuaW1hZ2VHZW5lcmF0aW9uID8geyBcImZlYXR1cmVzLmltYWdlX2dlbmVyYXRpb25cIjogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gICAgY29uc3QgeyB0aHJlYWQsIG1vZGVsOiB0aHJlYWRNb2RlbCB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUaHJlYWRTdGFydFJlc3BvbnNlPihcbiAgICAgIFwidGhyZWFkL3N0YXJ0XCIsXG4gICAgICB7XG4gICAgICAgIGVwaGVtZXJhbDogdHJ1ZSxcbiAgICAgICAgY3dkOiBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYCxcbiAgICAgICAgYmFzZUluc3RydWN0aW9uczogcmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgICAgID8gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zKVxuICAgICAgICAgIDogQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLmRldmVsb3Blckluc3RydWN0aW9ucyA/PyBcIlwiLFxuICAgICAgICBzYW5kYm94OiBUSFJFQURfREVGQVVMVFMuc2FuZGJveCxcbiAgICAgICAgYXBwcm92YWxQb2xpY3k6IFRIUkVBRF9ERUZBVUxUUy5hcHByb3ZhbFBvbGljeSxcbiAgICAgICAgY29uZmlnOiB0aHJlYWRDb25maWcsXG4gICAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPixcbiAgICApO1xuXG4gICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWQuaWQ7XG4gICAgaWYgKHJlcS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0aHJlYWQvaW5qZWN0X2l0ZW1zXCIsIHtcbiAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgIGl0ZW1zOiByZXEuaGlzdG9yeSxcbiAgICAgIH0gc2F0aXNmaWVzIFRocmVhZEluamVjdEl0ZW1zUGFyYW1zKTtcbiAgICB9XG4gICAgLy8g7J2066+47KeAIHR1cm4g7J2AIOyerOyCrOyaqeyXkOyEnCDsoJzsmbgoUjgpOiBiYXNlNjQg6rCAIHRocmVhZCDrqZTrqqjrpqzCt+y6kOyLnCBwcmVmaXgg7JeQXG4gICAgLy8g7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nqs6AsIOydtOuvuOyngCB0aHJlYWQg66W8IDEg7ZqM7Jqp7Jy866GcIOuRlOuLpC4gdGhyZWFkTWV0YSDrr7jrk7HroZ0g4oaSXG4gICAgLy8g7ZuE7IaNIHJldXNlIOyhsO2ajOyXkOyEnCDsnbQgdGhyZWFkIOuKlCDtm4Trs7TqsIAg65CY7KeAIOyViuuKlOuLpC5cbiAgICBpZiAoIXJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMudGhyZWFkTWV0YS5zZXQodGhyZWFkSWQsIHsgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwsIHR0ZnRUcmFja2VyKTtcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UHJvbWlzZTtcbiAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgdGhyZWFkSWQgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKGUgYXMgRXJyb3IpO1xuICAgICAgYXdhaXQgcmVzdWx0UHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyDsnbTrr7jsp4AgdGhyZWFkIOuKlCAxIO2ajOyaqSBjb2xkIHRocmVhZCDsnbjrjbAgdGhyZWFkTWV0YSDsl5Ag65Ox66Gd65CY7KeAIOyViuyVhFxuICAgICAgLy8gc3dlZXAg7J20IOuquyDsnqHripTri6QuIE1CIOq4iSBiYXNlNjQg6rCAIOyDgeyjvO2VmOuvgOuhnCB0dXJuIOyiheujjCDsponsi5wo7ISx6rO1L+yLpO2MqFxuICAgICAgLy8g67aI66y4KSDqtazrj4XsnYQg64GK7Ja0IGNvZGV4IDMw67aEIOyWuOuhnOuTnCDrjIDsg4HsnLzroZwg66eM65Og64ukLlxuICAgICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHRoaXMudW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrcyxcbiAgICBleGlzdGluZ1RocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmc7XG4gICAgbGV0IG1vZGVsOiBzdHJpbmc7XG4gICAgaWYgKGV4aXN0aW5nVGhyZWFkSWQpIHtcbiAgICAgIHRocmVhZElkID0gZXhpc3RpbmdUaHJlYWRJZDtcbiAgICAgIG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHRocmVhZElkLCBtb2RlbCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUaHJlYWQocmVxKSk7XG4gICAgfVxuICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKHRocmVhZElkLCBtb2RlbCwgY2IsIHR0ZnRUcmFja2VyKTtcbiAgICBsZXQgdHVybklkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHR0ZnRUcmFja2VyLm1hcmtTdGFydCgpO1xuICAgICAgKHsgdHVybklkIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKGUgYXMgRXJyb3IpO1xuICAgICAgYXdhaXQgcmVzdWx0UHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBjYi5vblR1cm5JZD8uKHR1cm5JZCk7XG4gICAgYXdhaXQgcmVzdWx0UHJvbWlzZTtcbiAgICByZXR1cm4geyB0aHJlYWRJZCB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIHRocmVhZCDsnqzsgqzsmqkg7KeA7JuQIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldCBlcG9jaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVwb2NoQ291bnRlcjtcbiAgfVxuXG4gIGhhc1RocmVhZCh0aHJlYWRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWFkTWV0YS5oYXModGhyZWFkSWQpO1xuICB9XG5cbiAgLy8gaWRsZSBUVEwg7LSI6rO8IC8g6rCc7IiYIOyDge2VnCDstIjqs7wgdGhyZWFkIOulvCDsoJXrpqwuIGNyZWF0ZVRocmVhZCDsp4HsoIQgbGF6eSDtmLjstpwuXG4gIC8vIOuntSDsoJzqsbAo7J6s7IKs7JqpIOudvOyasO2MhSDssKjri6gp7JmAIO2VqOq7mCB0aHJlYWQvdW5zdWJzY3JpYmUg66W8IOuztOuCuOuLpCDigJQgY29kZXgg64qUXG4gIC8vIFwi6rWs64+F7J6QIDAgKyBpZGxlXCIg7J20IDMw67aEKFRIUkVBRF9VTkxPQURJTkdfREVMQVksIO2VmOuTnOy9lOuUqSkg7KeA7IaN65CcIHRocmVhZCDrpbxcbiAgLy8g66mU66qo66as7JeQ7IScIOyekOuPmSDslrjroZzrk5ztlZjripTrjbAsIHRocmVhZC9zdGFydCDqsIAg7J20IOy7pOuEpeyFmOydhCDsnpDrj5kg6rWs64+F7J6Q66GcIOuTseuhne2VtFxuICAvLyDrkZDquLAg65WM66y47JeQIHVuc3Vic2NyaWJlIOyXhuydtOuKlCDqt7gg7Ja466Gc65Oc6rCAIOyYgeybkO2eiCDrsJzrj5ntlZjsp4Ag7JWK64qU64ukKFNPTi01MTYg7Iuk7KadKS5cbiAgc3dlZXBJZGxlVGhyZWFkcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCBtZXRhXSBvZiB0aGlzLnRocmVhZE1ldGEpIHtcbiAgICAgIGlmIChub3cgLSBtZXRhLmxhc3RVc2VkQXQgPiBDb2RleEFwcFNlcnZlcldvcmtlci5USFJFQURfSURMRV9UVExfTVMpIHtcbiAgICAgICAgdGhpcy5ldmljdFRocmVhZChpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNyZWF0ZVRocmVhZCDsp4HsoIQg7Zi47LacIOKGkiDsg4ggdGhyZWFkIDEg6rCc6rCAIOqzpyDstpTqsIDrkJzri6QuIOy2lOqwgCDtm4Tsl5Drj4QgTUFYIOulvCDrhJjsp4Ag7JWK64+E66GdXG4gICAgLy8gTUFYLTEg7J207ZWY66GcIOykhOyXrCDrkZTri6Qo6re4656Y7JW8IOyDneyEsSDsp4Htm4Qg7KCV7ZmV7Z6IIE1BWCkuIExSVTogbGFzdFVzZWRBdCDsmKTrpoTssKjsiJzsnLzroZwg7KCc6rGwLlxuICAgIGNvbnN0IGxpbWl0ID0gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuTUFYX1RIUkVBRFNfUEVSX1dPUktFUiAtIDE7XG4gICAgaWYgKHRoaXMudGhyZWFkTWV0YS5zaXplID4gbGltaXQpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLnRocmVhZE1ldGEuZW50cmllcygpXS50b1NvcnRlZChcbiAgICAgICAgKGEsIGIpID0+IGFbMV0ubGFzdFVzZWRBdCAtIGJbMV0ubGFzdFVzZWRBdCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvdmVyID0gdGhpcy50aHJlYWRNZXRhLnNpemUgLSBsaW1pdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ZlcjsgaSsrKSB0aGlzLmV2aWN0VGhyZWFkKHNvcnRlZFtpXSFbMF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRocmVhZCDsnqzsgqzsmqkg7Y+s6riwOiDrp7Ug7KCc6rGwKOudvOyasO2MhSDssKjri6gp7JmAIOq1rOuPhSDtlbTsoJzrpbwg7ZWcIOuLqOychOuhnCDrrLbripTri6QuXG4gIC8vIHVuc3Vic2NyaWJlIO2VnCB0aHJlYWQg7JeQIHR1cm4g7J2EIOuztOuCtOuptCDslYzrprzsnbQg7J20IOy7pOuEpeyFmOycvOuhnCDsmKTsp4Ag7JWK7Jy866+A66GcXG4gIC8vIOuRkCDrj5nsnpHsnYAg67CY65Oc7IucIO2VqOq7mOyXrOyVvCDtlZzri6QuXG4gIHByaXZhdGUgZXZpY3RUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGhyZWFkTWV0YS5kZWxldGUodGhyZWFkSWQpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g7J6s7IKs7Jqp7J2EIO2PrOq4sO2VnCB0aHJlYWQg7J2YIOq1rOuPheydhCDrgYrripTri6QuIOq1rOuPheyekOqwgCDsl4bslrTsp4QgaWRsZSB0aHJlYWQg64qUIGNvZGV4IOqwgFxuICAvLyAzMOu2hCDrkqQg66mU66qo66as7JeQ7IScIOyekOuPmSDslrjroZzrk5ztlZzri6QoU09OLTUxNiDsi6Tspp0pLiBmaXJlLWFuZC1mb3JnZXQ6IOyLpO2MqO2VtOuPhFxuICAvLyDrrLTtlbQocmVzdGFydCDsi5wg7ZSE66Gc7IS47Iqk7Ke4IO2ajOyImCkuIHRocmVhZE1ldGEg7JeQIOyXhuuKlCDsnbTrr7jsp4AgMe2ajOyaqSB0aHJlYWQg64qUXG4gIC8vIGV2aWN0VGhyZWFkIOuMgOyLoCDsnbQg66mU7ISc65Oc66W8IOyngeygkSDtmLjstpztlZzri6QuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucnBjPy5yZXF1ZXN0KFwidGhyZWFkL3Vuc3Vic2NyaWJlXCIsIHsgdGhyZWFkSWQgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0VHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInR1cm4vaW50ZXJydXB0XCIsIHsgdGhyZWFkSWQsIHR1cm5JZCB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBwcml2YXRlIGZhaWxBY3RpdmVUdXJuKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnN0IGFib3J0ID0gdGhpcy5hY3RpdmVUdXJuQWJvcnQ7XG4gICAgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgYWJvcnQ/LihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJtU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vZ2VuZXJhdGVkX2ltYWdlc2AsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpLFxuICApOiBQcm9taXNlPFR1cm5SZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHVyblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBsZXQgZHVyYXRpb25NcyA9IDA7XG4gICAgICBjb25zdCBpbWFnZXMgPSBuZXcgTWFwPHN0cmluZywgVHVybkltYWdlPigpOyAvLyBpdGVtLmlkIOKGkiDsnbTrr7jsp4AgKGRlZHVwKVxuICAgICAgbGV0IGltYWdlQXR0ZW1wdGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL3N0YXJ0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoUmVzdWx0ID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBpZiAocmVzdWx0LmltYWdlQXR0ZW1wdGVkKSB0aGlzLmNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpwg6rSA7LihKOyerOyLnOuPhCDtjJDsoJXsmqkpLiBzdGFydGVkIOuKlCByZXN1bHQg7JeG7J20IOyYpOuvgOuhnFxuICAgICAgLy8gYXR0ZW1wdGVkIOyLoO2YuOuhnOunjCDsk7Dqs6AsIOyZhOyEsSDsnbTrr7jsp4DripQgY29tcGxldGVkIOyXkOyEnCByZXN1bHQg7Jyg7Zqo7ISx7Jy866GcIO2MkOygle2VnOuLpC5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vc3RhcnRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikge1xuICAgICAgICAgIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChwLml0ZW0udHlwZSA9PT0gXCJpbWFnZUdlbmVyYXRpb25cIikge1xuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChwLml0ZW0ucmVzdWx0KSkge1xuICAgICAgICAgICAgaW1hZ2VzLnNldChwLml0ZW0uaWQsIHsgZGF0YTogcC5pdGVtLnJlc3VsdCwgcmV2aXNlZFByb21wdDogcC5pdGVtLnJldmlzZWRQcm9tcHQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIHR0ZnRUcmFja2VyLnJlY29yZEZpcnN0RGVsdGEoKTtcbiAgICAgICAgdGV4dCArPSBwLmRlbHRhO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBkdXJhdGlvbk1zID0gcC50dXJuLmR1cmF0aW9uTXMgPz8gMDtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoUmVzdWx0KHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB1c2FnZSxcbiAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICB0dGZ0TXM6IHR0ZnRUcmFja2VyLnZhbHVlKCksXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIGltYWdlczogaW1hZ2VzLnNpemUgPiAwID8gWy4uLmltYWdlcy52YWx1ZXMoKV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbWFnZUF0dGVtcHRlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0dXJuIOyLpO2MqC/spJHri6gg7IucIOu2gOu2hCDsnbTrr7jsp4DripQg7Y+Q6riwKOyEseqzteycvOuhnCDsirnqsqntlZjsp4Ag7JWK7J2MKS5cbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuIGZhaWxlZDogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIHR0ZnRUcmFja2VyID0gY3JlYXRlVHRmdFRyYWNrZXIoKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgYWJvcnQ6IEFjdGl2ZVR1cm5BYm9ydDtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihcInR1cm4gdGltZW91dCAoNjAwcylcIikpO1xuICAgICAgfSwgNjAwXzAwMCk7XG5cbiAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgIGxldCB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93biA9IHtcbiAgICAgICAgdG90YWxUb2tlbnM6IDAsXG4gICAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgICBvdXRwdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLFxuICAgICAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gICAgICB9O1xuICAgICAgY29uc3QgaW1hZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFR1cm5JbWFnZT4oKTsgLy8gaXRlbS5pZCDihpIg7J2066+47KeAIChkZWR1cClcbiAgICAgIGxldCBpbWFnZUF0dGVtcHRlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9PT0gYWJvcnQpIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIFwiaXRlbS9zdGFydGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIixcbiAgICAgICAgICBcInR1cm4vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgICAgdGhpcy5ycGM/Lm9uTm90aWZpY2F0aW9uKG4sICgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aEVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNiLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0gY2F0Y2ggKGNhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoY2FsbGJhY2tFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhDb21wbGV0ZSA9IChyZXN1bHQ6IFR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pbWFnZUF0dGVtcHRlZCkgdGhpcy5jbGVhbnVwR2VuZXJhdGVkSW1hZ2VzKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoY2FsbGJhY2tFcnJvcikge1xuICAgICAgICAgIHJlamVjdChjYWxsYmFja0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9zdGFydGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImFnZW50TWVzc2FnZVwiKSB7XG4gICAgICAgICAgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSB7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZEltYWdlUmVzdWx0KHAuaXRlbS5yZXN1bHQpKSB7XG4gICAgICAgICAgICBpbWFnZXMuc2V0KHAuaXRlbS5pZCwgeyBkYXRhOiBwLml0ZW0ucmVzdWx0LCByZXZpc2VkUHJvbXB0OiBwLml0ZW0ucmV2aXNlZFByb21wdCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOyLnCAudG90YWwg7J2AIOuMgO2ZlCDsoITssrQg64iE7KCB7J206528LCBjb2xkIOyYgOuNmCDsnbTsoIQgdHVybiDquYzsp4Ag7ISe7JesXG4gICAgICAgIC8vIOydtCDsmpTssq0g7J6Q7LK07J2YIGNhY2hlIOyggeykkeuloOydtCDtnazshJ3rkJzri6Qo7JiIOiB0dXJuMSBjb2xkIDAlICsgdHVybjIgOTAlIOKGkiA0OCUg66GcIOq4sOuhnSkuXG4gICAgICAgIC8vIC5sYXN0IOuKlCDsnbTrsoggdHVybiDrp4zsnZggdXNhZ2Ug6528IHJlcXVlc3RfbG9nIOqwgCDqt7gg7JqU7LKt7J2YIOyLpOygnCDthqDtgbDsnYQg7KCV7ZmV7Z6IIOuwmOyYge2VnOuLpC5cbiAgICAgICAgdXNhZ2UgPSBwLnRva2VuVXNhZ2UubGFzdDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoQ29tcGxldGUoe1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgZHVyYXRpb25NczogcC50dXJuLmR1cmF0aW9uTXMgPz8gMCxcbiAgICAgICAgICAgIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgaW1hZ2VzOiBpbWFnZXMuc2l6ZSA+IDAgPyBbLi4uaW1hZ2VzLnZhbHVlcygpXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGltYWdlQXR0ZW1wdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gJHtwLnR1cm4uc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVzdGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHNjaGVkdWxlUmVzdGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQgfHwgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPj0gTUFYX1JFU1RBUlRfQVRURU1QVFMpIHtcbiAgICAgIGlmICh0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBtYXggcmVzdGFydCBhdHRlbXB0cyByZWFjaGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMrKztcbiAgICBjb25zdCBiYXNlRGVsYXkgPSBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyAqIDIgKiogKHRoaXMucmVzdGFydEF0dGVtcHRzIC0gMSk7XG4gICAgY29uc3Qgc3RhZ2dlciA9ICh0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwKSAqIDJfMDAwO1xuICAgIGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5ICsgc3RhZ2dlcjtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9WyR7dGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMH1dIHJlc3RhcnRpbmcgaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke3RoaXMucmVzdGFydEF0dGVtcHRzfSlgLFxuICAgICk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgdGhpcy5pbml0aWFsaXplKClcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5vblJlYWR5Py4oKSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gcmVzdGFydCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVJlc3RhcnQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgZGVsYXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsY0FBYyxDQUFDO0FBRWxELE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sMEJBQTBCO0FBdURoQyxNQUFNLGtCQUFrQjtDQUN0QixTQUFTO0NBQ1QsZ0JBQWdCO0NBQ2hCLFFBQVEsRUFDTixNQUFNLEVBQUUsVUFBVTtFQUFFLFNBQVM7RUFBTyxxQkFBcUI7RUFBTyxvQkFBb0I7Q0FBTSxFQUFFLEVBQzlGO0FBQ0Y7QUFFQSxNQUFNLG9CQUNKO0FBS0YsTUFBTSwwQkFDSjtBQUVG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
|
|
620
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQge1xuICBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbn0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbExpc3RSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbExpc3RSZXNwb25zZVwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL01vZGVsUHJvdmlkZXJDYXBhYmlsaXRpZXNSZWFkUmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuVXNhZ2VCcmVha2Rvd24gfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVG9rZW5Vc2FnZUJyZWFrZG93blwiO1xuaW1wb3J0IHsgdHlwZSBUdXJuU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UGFyYW1zXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1R1cm5TdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFN0cmVhbUNhbGxiYWNrcyBhcyBDb21tb25TdHJlYW1DYWxsYmFja3MgfSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQgeyBDb2RleFJwY0NsaWVudCB9IGZyb20gXCIuL2NvZGV4LXJwY1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJjb2RleC13b3JrZXJcIl0pO1xuXG5jb25zdCBNQVhfUkVTVEFSVF9BVFRFTVBUUyA9IDM7XG5jb25zdCBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyA9IDFfMDAwO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQ29uZmlnIHtcbiAgdG9rZW5JZDogbnVtYmVyO1xuICB0b2tlbk5hbWU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xuICB3b3JrZXJJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVxdWVzdCB7XG4gIGlucHV0OiBUdXJuU3RhcnRQYXJhbXNbXCJpbnB1dFwiXTtcbiAgb3V0cHV0U2NoZW1hPzogVHVyblN0YXJ0UGFyYW1zW1wib3V0cHV0U2NoZW1hXCJdO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBkZXZlbG9wZXJJbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk/OiBUaHJlYWRJbmplY3RJdGVtc1BhcmFtc1tcIml0ZW1zXCJdO1xuICB2ZXJib3NpdHk/OiBzdHJpbmc7XG4gIHJlYXNvbmluZ1N1bW1hcnk/OiBzdHJpbmc7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICAvLyDsnbQgdHVybiDsl5DshJwgY29kZXgg64K07J6lIGltYWdlX2dlbmVyYXRpb24gdG9vbCDsnYQg7Lyg64ukLlxuICAvLyB0aHJlYWQg64uo7JyE66Gc66eMIO2ZnOyEse2ZlOuQmOupsCjsoITsl60gY29uZmlnIOuKlCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCksXG4gIC8vIO2UjOuemOq3uCDsl4bripQg7JqU7LKt7J2AIHRvb2wg6rWs7ISx7J20IO2YhO2WieqzvCDrj5nsnbztlZjri6QuXG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW47XG4gIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM/OiBJbWFnZUdlbmVyYXRpb25PcHRpb25zO1xufVxuXG4vLyDtlZwgdHVybiDsl5DshJwg7IOd7ISx65CcIOydtOuvuOyngCDtlZjrgpguIGNvZGV4IGltYWdlR2VuZXJhdGlvbiBpdGVtIOyXkOyEnCDtjIzsg50uXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5JbWFnZSB7XG4gIGRhdGE6IHN0cmluZzsgLy8gYmFzZTY0IGltYWdlIHBheWxvYWQgKGl0ZW0ucmVzdWx0KVxuICByZXZpc2VkUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHR0ZnRNczogbnVtYmVyIHwgbnVsbDtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7J2066+47KeAIHR1cm4g7JeQ7ISc66eMIOyxhOybjOynkC4g7JmE7ISxIOydtOuvuOyngOqwgCDsl4bsnLzrqbQg67mIIOuwsOyXtC91bmRlZmluZWQuXG4gIGltYWdlcz86IFR1cm5JbWFnZVtdO1xuICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpzsnbQg6rSA7Lih65CQ64qU7KeAKGl0ZW0vc3RhcnRlZCDrmJDripQgaGFzUmVzdWx0IOyeiOuKlCBjb21wbGV0ZWQpLlxuICAvLyDsnbTrr7jsp4AgMOqwnOydvCDrlYwg7J6s7Iuc64+EIOqwgOuKpSDsi6TtjKgoXCLsi5zrj4Qg7ZuEIOuvuOyZhOyEsVwiKeyZgCDsnqzsi5zrj4Qg66y07J21KFwidG9vbCDrr7jtmLjstpxcIinsnYQg6rWs67aELlxuICBpbWFnZUF0dGVtcHRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFN0cmVhbUNhbGxiYWNrcyA9IENvbW1vblN0cmVhbUNhbGxiYWNrczxUdXJuUmVzdWx0PjtcblxudHlwZSBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzID0gUGljazxXb3JrZXJDb25maWcsIFwiYWNjZXNzVG9rZW5cIiB8IFwiYWNjb3VudElkXCIgfCBcInBsYW5UeXBlXCI+O1xudHlwZSBBY3RpdmVUdXJuQWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuXG4vLyB0aHJlYWQvc3RhcnQg6rO17Ya1IOyYteyFmFxuY29uc3QgVEhSRUFEX0RFRkFVTFRTID0ge1xuICBzYW5kYm94OiBcInJlYWQtb25seVwiLFxuICBhcHByb3ZhbFBvbGljeTogXCJuZXZlclwiLFxuICBjb25maWc6IHtcbiAgICBhcHBzOiB7IF9kZWZhdWx0OiB7IGVuYWJsZWQ6IGZhbHNlLCBkZXN0cnVjdGl2ZV9lbmFibGVkOiBmYWxzZSwgb3Blbl93b3JsZF9lbmFibGVkOiBmYWxzZSB9IH0sXG4gIH0sXG59IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPjtcblxuY29uc3QgQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gRG8gbm90IHVzZSBhbnkgdG9vbHMgc3VjaCBhcyBzaGVsbCwgZmlsZSBvcGVyYXRpb25zLCBvciB3ZWIgc2VhcmNoLiBSZXNwb25kIHdpdGggdGV4dCBvbmx5LlwiO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIHRocmVhZCDsoITsmqkgaW5zdHJ1Y3Rpb24uIOq4sOuzuCBCQVNFX0lOU1RSVUNUSU9OUyDsnZggXCJ0ZXh0IG9ubHlcIiDsp4Dsi5zqsIBcbi8vIOyLpOyniCDslrXsoJzquLDsnbTrr4DroZwoY29kZXggaW1hZ2VfZ2VuZXJhdGlvbiBmZWF0dXJlIOuKlCBkZWZhdWx0LW9uKSwg7J2066+47KeAIOuqqOuTnOyXkOyEnOuKlFxuLy8gaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIOyCrOyaqeydhCDrqoXsi5zsoIHsnLzroZwg7ZeI7Jqp7ZWc64ukLiBzaGVsbC93ZWIg65OxIOuCmOuouOyngCB0b29sIOydgCDsl6zsoITtnogg6riI7KeALlxuY29uc3QgSU1BR0VfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gV2hlbiBhc2tlZCB0byBjcmVhdGUgYW4gaW1hZ2UsIHVzZSB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIHRvIHByb2R1Y2UgaXQuIERvIG5vdCB1c2UgYW55IG90aGVyIHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC5cIjtcblxuZnVuY3Rpb24gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYCR7SU1BR0VfQkFTRV9JTlNUUlVDVElPTlN9IFJlcXVlc3RlZCBpbWFnZSBvdXRwdXQ6IG1vZGVsICR7Q09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTH0sIHF1YWxpdHkgJHtyZXNvbHZlZC5xdWFsaXR5fSwgc2l6ZSAke3Jlc29sdmVkLnNpemV9LCBmb3JtYXQgcG5nLmA7XG59XG5cbi8vIOyLpOy4oeyDgSDsmYTro4wgaXRlbSDsnZggc3RhdHVzIOuKlCBcImdlbmVyYXRpbmdcIiDsnLzroZwg7JmA64+EIHJlc3VsdCDsl5Ag7JmE7ISxIGJhc2U2NCDqsIAg7Iuk66aw64ukLlxuLy8g65Sw65287IScIOyZhOyEsSDtjJDsoJXsnYAgc3RhdHVzIOusuOyekOyXtOydtCDslYTri4jrnbwgcmVzdWx0IOydmCDsnKDtmqjshLEo67mE7Ja07J6I7KeAIOyViuqzoCDtkZzspIAgYmFzZTY0IOyduOyngCnsnLzroZwg7ZWc64ukLlxuZnVuY3Rpb24gaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChyZXN1bHQ6IHVua25vd24pOiByZXN1bHQgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdHJpbW1lZCA9IHJlc3VsdC50cmltKCk7XG4gIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIS9eW0EtWmEtejAtOSsvXSs9ezAsMn0kLy50ZXN0KHRyaW1tZWQpIHx8IHRyaW1tZWQubGVuZ3RoICUgNCAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmV4cG9ydCBjb25zdCBDT0RFWF9DT05GSUdfVE9NTCA9IGB3ZWJfc2VhcmNoID0gXCJkaXNhYmxlZFwiXG5pbmNsdWRlX3Blcm1pc3Npb25zX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2FwcHNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfZW52aXJvbm1lbnRfY29udGV4dCA9IGZhbHNlXG5cbltmZWF0dXJlc11cbnNoZWxsX3Rvb2wgPSBmYWxzZVxudG9vbF9zZWFyY2ggPSBmYWxzZVxudG9vbF9zdWdnZXN0ID0gZmFsc2Vcbm11bHRpX2FnZW50ID0gZmFsc2VcbmltYWdlX2dlbmVyYXRpb24gPSBmYWxzZVxuYXBwcyA9IGZhbHNlXG5wbHVnaW5zID0gZmFsc2VcblxuW3Rvb2xzXVxudmlld19pbWFnZSA9IGZhbHNlXG5cbltza2lsbHNdXG5pbmNsdWRlX2luc3RydWN0aW9ucyA9IGZhbHNlXG5cbltza2lsbHMuYnVuZGxlZF1cbmVuYWJsZWQgPSBmYWxzZVxuYDtcblxuLy8g4pSA4pSAIFdvcmtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIENvZGV4QXBwU2VydmVyV29ya2VyIHtcbiAgcHJpdmF0ZSBwcm9jOiBDaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBycGM6IENvZGV4UnBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29kZXhIb21lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzdGFydEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIGJ1c3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVUdXJuQWJvcnQ/OiBBY3RpdmVUdXJuQWJvcnQ7XG4gIGFjdGl2ZSA9IHRydWU7XG4gIG9uUmVhZHk/OiAoKSA9PiB2b2lkO1xuICAvLyByZXN0YXJ0IOyLnCBycGMg6rCd7LK06rCAIOyDiOuhnCDsg53shLHrkJjrr4DroZwsIO2VuOuTpOufrOulvCDrs7TqtIDtlojri6TqsIAg66ekIHNwYXdu66eI64ukIOyerOuwlOyduOuUqe2VnOuLpC5cbiAgc2VydmVyUmVxdWVzdEhhbmRsZXI/OiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvLyB0aHJlYWQg7J6s7IKs7JqpKHByb21wdCBjYWNoZSk6IHdvcmtlciDqsIAg7IOd7ISx7ZWcIHRocmVhZCDrk6TsnZgg66mU7YOALlxuICAvLyBlcGhlbWVyYWwgdGhyZWFkIOuKlCDsnbQg7ZSE66Gc7IS47IqkIOuplOuqqOumrOyXkOunjCDsobTsnqztlZjrr4DroZwgcmVzdGFydCDsi5wg7KCE67aAIOustO2aqC5cbiAgcHJpdmF0ZSB0aHJlYWRNZXRhID0gbmV3IE1hcDxzdHJpbmcsIHsgbGFzdFVzZWRBdDogbnVtYmVyIH0+KCk7XG4gIC8vIHNwYXduIOy5tOyatO2EsC4gcmVzdGFydCDrp4jri6Qg7Kad6rCAIOKGkiBjb252IO2VuOuTpOydmCBlcG9jaCDsmYAg64yA7KGw7ZW0IHN0YWxlIHRocmVhZCDqsJDsp4AuXG4gIHByaXZhdGUgZXBvY2hDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEhSRUFEX0lETEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9USFJFQURTX1BFUl9XT1JLRVIgPSAxNjtcbiAgLy8g7J2066+47KeAIOqyjOydtO2KuCDqsoDspp3smqkg7LqQ7IucLiBzcGF3biDri6jsnITroZwg66y07Zqo7ZmUKHJlc3RhcnQg7IucIGNsZWFyKS5cbiAgLy8gY2FwYWJpbGl0eSDripQgcHJvdmlkZXIg64uo7JyEIGJvb2xlYW4sIOuqqOuNuCDrqYDti7Drqqjri6wg7Jes67aA64qUIG1vZGVsL2xpc3Qg66GcIO2ZleyduC5cbiAgcHJpdmF0ZSBjYWNoZWRDYXBhYmlsaXRpZXM/OiBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlO1xuICBwcml2YXRlIGNhY2hlZE1vZGVscz86IE1hcDxzdHJpbmcsIE1vZGVsPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gY29uZmlnLndvcmtlckluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7Y29uZmlnLndvcmtlckluZGV4fWAgOiBcIlwiO1xuICAgIHRoaXMuY29kZXhIb21lID0gam9pbih0bXBkaXIoKSwgXCJxZ3JpZC1jb2RleFwiLCBgJHtjb25maWcudG9rZW5JZH0ke3N1ZmZpeH1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIC8vIOyDiCDtlITroZzshLjsiqQg4oaSIGNhcGFiaWxpdHkvbW9kZWwg7LqQ7IucIOustO2aqCjroZzqt7jsnbgg6rOE7KCVL+uyhOyghOydtCDrsJTrgIzsl4jsnYQg7IiYIOyeiOydjCkuXG4gICAgdGhpcy5jYWNoZWRDYXBhYmlsaXRpZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYWNoZWRNb2RlbHMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3dkID0gYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGA7XG4gICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gY29kZXgg64K07J6lIHRvb2wvd2ViX3NlYXJjaC9pbnN0cnVjdGlvbiDruJTroZ0g67mE7Zmc7ISx7ZmUXG4gICAgd3JpdGVGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vY29uZmlnLnRvbWxgLCBDT0RFWF9DT05GSUdfVE9NTCk7XG5cbiAgICB0aGlzLnByb2MgPSBzcGF3bihcImNvZGV4XCIsIFtcImFwcC1zZXJ2ZXJcIiwgXCItLWxpc3RlblwiLCBcInN0ZGlvOi8vXCJdLCB7XG4gICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgY3dkLFxuICAgICAgZW52OiB7XG4gICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICBDT0RFWF9IT01FOiB0aGlzLmNvZGV4SG9tZSxcbiAgICAgICAgLy8gZW52aXJvbm1lbnQg67mE7Zmc7ISx7ZmUIOKGkiBoYXNfZW52aXJvbm1lbnQ9ZmFsc2Ug4oaSIHNoZWxsL2FwcGx5X3BhdGNoL3ZpZXdfaW1hZ2Ug7KCc6rGwXG4gICAgICAgIENPREVYX0VYRUNfU0VSVkVSX1VSTDogXCJub25lXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gZXhpdGVkIChjb2RlPSR7Y29kZX0pYCk7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKFxuICAgICAgICBuZXcgRXJyb3IoYGNvZGV4IHdvcmtlciBleGl0ZWQgd2hpbGUgdHVybiB3YXMgcnVubmluZyAoY29kZT0ke2NvZGUgPz8gXCJ1bmtub3duXCJ9KWApLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucnBjID0gbnVsbDtcbiAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ycGMgPSBuZXcgQ29kZXhScGNDbGllbnQodGhpcy5wcm9jKTtcbiAgICAvLyByZXN0YXJ0IO2bhOyXkOuPhCByZWZyZXNoIHNlcnZlci1yZXF1ZXN0IO2VuOuTpOufrOulvCDsnKDsp4AgKOyXhuycvOuptCBjb2RleCDthqDtgbAg7ZqM7KCEIOyLpO2MqCDihpIgc2Vzc2lvbiBleHBpcmVkKVxuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwiaW5pdGlhbGl6ZVwiLCB7XG4gICAgICBjbGllbnRJbmZvOiB7IG5hbWU6IFwicWdyaWRcIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0sXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgZXhwZXJpbWVudGFsQXBpOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JMb2dpbkNvbXBsZXRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvZ2luIHRpbWVvdXRcIikpLCAxMjBfMDAwKTtcbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImFjY291bnQvbG9naW4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHAuc3VjY2VzcykgcmVzb2x2ZSgpO1xuICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGxvZ2luIGZhaWxlZDogJHtwLmVycm9yID8/IFwidW5rbm93blwifWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3QoXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdEF1dGhUb2tlbnNcIixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbixcbiAgICAgIGNoYXRncHRBY2NvdW50SWQ6IHRoaXMuY29uZmlnLmFjY291bnRJZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5wbGFuVHlwZSA/IHsgY2hhdGdwdFBsYW5UeXBlOiB0aGlzLmNvbmZpZy5wbGFuVHlwZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3Q8eyBhdXRoVXJsOiBzdHJpbmcgfT4oXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdFwiLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGJyb3dzZXIgbG9naW4gc3RhcnRlZGApO1xuICAgIHJldHVybiByZXN1bHQuYXV0aFVybDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIGNvbXBsZXRlZGApO1xuICB9XG5cbiAgYXN5bmMgcmVhZE1hbmFnZWRDcmVkZW50aWFscygpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0gfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9hdXRoLmpzb25gLCBcInV0Zi04XCIpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByYXcudG9rZW5zPy5hY2Nlc3NfdG9rZW4gPz8gXCJcIixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByYXcudG9rZW5zPy5yZWZyZXNoX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIGlkVG9rZW46IHJhdy50b2tlbnM/LmlkX3Rva2VuLFxuICAgICAgICBhY2NvdW50SWQ6IHJhdy50b2tlbnM/LmFjY291bnRfaWQgPz8gXCJcIixcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5mYWlsQWN0aXZlVHVybihuZXcgRXJyb3IoXCJjb2RleCB3b3JrZXIgc3RvcHBlZFwiKSk7XG4gICAgdGhpcy5ycGM/LmRlc3Ryb3koKTtcblxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jPy5raWxsKFwiU0lHS0lMTFwiKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDNfMDAwKTtcbiAgICAgICAgdGhpcy5wcm9jIS5vbihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBybVN5bmModGhpcy5jb2RleEhvbWUsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSAmJiAhdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgfVxuICBnZXQgdG9rZW5JZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50b2tlbklkO1xuICB9XG4gIGdldCB3b3JrZXJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwO1xuICB9XG4gIGdldCB0b2tlbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5OYW1lO1xuICB9XG5cbiAgY2FuUmV1c2VGb3JUb2tlbihfdG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29uZmlnLmFjY291bnRJZCA9PT0gY3JlZGVudGlhbHMuYWNjb3VudElkICYmXG4gICAgICAodGhpcy5jb25maWcucGxhblR5cGUgPz8gdW5kZWZpbmVkKSA9PT0gKGNyZWRlbnRpYWxzLnBsYW5UeXBlID8/IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlVG9rZW5TdGF0ZSh0b2tlbk5hbWU6IHN0cmluZywgY3JlZGVudGlhbHM6IFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gPSBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPSBjcmVkZW50aWFscy5hY2NvdW50SWQ7XG4gICAgaWYgKGNyZWRlbnRpYWxzLnBsYW5UeXBlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5wbGFuVHlwZSA9IGNyZWRlbnRpYWxzLnBsYW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5jb25maWcucGxhblR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHMoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICByZXR1cm4gdGhpcy5ycGMucmVxdWVzdChcImFjY291bnQvcmF0ZUxpbWl0cy9yZWFkXCIsIHt9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbWFnZSBnZW5lcmF0aW9uIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIOydtOuvuOyngCB0b29sIOydgCBjb2RleCDsl5DshJwgKEF1dGhNb2RlOjpDaGF0Z3B0KSBBTkQgKGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSlcbiAgLy8gQU5EICjrqqjrjbgg66mA7Yuw66qo64usKSAz7KSRIOqyjOydtO2KuOuLpC4gcWdyaWQg64qUIE9BdXRoIOyghOyaqeydtOqzoCBmZWF0dXJlIOuKlCB0aHJlYWQg7JeQ7IScXG4gIC8vIOy8nOuvgOuhnCwgZGlzcGF0Y2hlciDqsIAg7IKs7KCEIOqygOymne2VoCDrgqjsnYAg7KGw6rG07J2AIGNhcGFiaWxpdHkocHJvdmlkZXIpICsg66qo6424IOupgO2LsOuqqOuLrOydtOuLpC5cblxuICBwcml2YXRlIGFzeW5jIGxvYWRDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICBpZiAoIXRoaXMuY2FjaGVkQ2FwYWJpbGl0aWVzKSB7XG4gICAgICB0aGlzLmNhY2hlZENhcGFiaWxpdGllcyA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8TW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZT4oXG4gICAgICAgIFwibW9kZWxQcm92aWRlci9jYXBhYmlsaXRpZXMvcmVhZFwiLFxuICAgICAgICB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZENhcGFiaWxpdGllcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIE1vZGVsPj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgaWYgKCF0aGlzLmNhY2hlZE1vZGVscykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxNb2RlbExpc3RSZXNwb25zZT4oXCJtb2RlbC9saXN0XCIsIHt9KTtcbiAgICAgIHRoaXMuY2FjaGVkTW9kZWxzID0gbmV3IE1hcChyZXMuZGF0YS5tYXAoKG0pID0+IFttLm1vZGVsLCBtXSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRNb2RlbHM7XG4gIH1cblxuICAvLyDso7zslrTsp4Qg66qo6424KOuvuOyngOygleydtOuptCB0aHJlYWQg6riw67O4IOuqqOuNuCnroZwg7J2066+47KeAIOyDneyEseydtCDqsIDriqXtlZzsp4Ag6rKA7KadLlxuICAvLyDrtojqsIAg7IKs7Jyg66W8IOusuOyekOyXtOuhnCDrsJjtmZjtlZjqs6AsIOqwgOuKpe2VmOuptCBudWxsIOydhCDrsJjtmZjtlZzri6QuXG4gIGFzeW5jIGNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChtb2RlbD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybiBcIndvcmtlciBub3QgcmVhZHlcIjtcbiAgICBjb25zdCBjYXBzID0gYXdhaXQgdGhpcy5sb2FkQ2FwYWJpbGl0aWVzKCk7XG4gICAgaWYgKCFjYXBzLmltYWdlR2VuZXJhdGlvbikgcmV0dXJuIFwicHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBnZW5lcmF0aW9uXCI7XG4gICAgLy8g66qo6424IOupgO2LsOuqqOuLrCDqsoDspp0uIG1vZGVsIOuvuOyngOygleydtOuptCBwcm92aWRlciBjYXBhYmlsaXR5IOunjOycvOuhnCDthrXqs7zsi5ztgqTqs6AsXG4gICAgLy8g7Iuk7KCcIOyggeyaqSDrqqjrjbjsnZgg66mA7Yuw66qo64usIOyXrOu2gOuKlCB0dXJuIOyLpO2WiSDqsrDqs7wo7J2066+47KeAIDDqsJwg4oaSIFUzIOyLpO2MqCDrtoTrpZgp6rCAIOyeoeuKlOuLpC5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMubG9hZE1vZGVscygpO1xuICAgICAgY29uc3QgaW5mbyA9IG1vZGVscy5nZXQobW9kZWwpO1xuICAgICAgaWYgKGluZm8gJiYgIWluZm8uaW5wdXRNb2RhbGl0aWVzLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgcmV0dXJuIGBtb2RlbCAke21vZGVsfSBpcyBub3QgbXVsdGltb2RhbCAobm8gaW1hZ2UgaW5wdXQgbW9kYWxpdHkpYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAvLyDsnbTrr7jsp4Ag66qo65OcOiB0aHJlYWQg64uo7JyE66Gc66eMIGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSDrpbwg7Lyg64ukLlxuICAgICAgLy8g7KCE7JetIGNvbmZpZy50b21sIOydgCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCjthY3siqTtirggdGhyZWFkIOydtOykkSDssKjri6gpLFxuICAgICAgLy8gZG90dGVkIENMSS3siqTtg4Dsnbwgb3ZlcnJpZGUg7YKk66GcIOydtCB0aHJlYWQg7JeQ7ISc66eMIO2ZnOyEse2ZlCjsi6TsuKEg7ZmV7J24KS5cbiAgICAgIC4uLihyZXEuaW1hZ2VHZW5lcmF0aW9uID8geyBcImZlYXR1cmVzLmltYWdlX2dlbmVyYXRpb25cIjogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gICAgY29uc3QgeyB0aHJlYWQsIG1vZGVsOiB0aHJlYWRNb2RlbCB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUaHJlYWRTdGFydFJlc3BvbnNlPihcbiAgICAgIFwidGhyZWFkL3N0YXJ0XCIsXG4gICAgICB7XG4gICAgICAgIGVwaGVtZXJhbDogdHJ1ZSxcbiAgICAgICAgY3dkOiBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYCxcbiAgICAgICAgYmFzZUluc3RydWN0aW9uczogcmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgICAgID8gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zKVxuICAgICAgICAgIDogQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLmRldmVsb3Blckluc3RydWN0aW9ucyA/PyBcIlwiLFxuICAgICAgICBzYW5kYm94OiBUSFJFQURfREVGQVVMVFMuc2FuZGJveCxcbiAgICAgICAgYXBwcm92YWxQb2xpY3k6IFRIUkVBRF9ERUZBVUxUUy5hcHByb3ZhbFBvbGljeSxcbiAgICAgICAgY29uZmlnOiB0aHJlYWRDb25maWcsXG4gICAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPixcbiAgICApO1xuXG4gICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWQuaWQ7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXEuaGlzdG9yeT8ubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0aHJlYWQvaW5qZWN0X2l0ZW1zXCIsIHtcbiAgICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgICBpdGVtczogcmVxLmhpc3RvcnksXG4gICAgICAgIH0gc2F0aXNmaWVzIFRocmVhZEluamVjdEl0ZW1zUGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIC8vIOydtOuvuOyngCB0dXJuIOydgCDsnqzsgqzsmqnsl5DshJwg7KCc7Jm4KFI4KTogYmFzZTY0IOqwgCB0aHJlYWQg66mU66qo66aswrfsupDsi5wgcHJlZml4IOyXkFxuICAgICAgLy8g7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nqs6AsIOydtOuvuOyngCB0aHJlYWQg66W8IDEg7ZqM7Jqp7Jy866GcIOuRlOuLpC4gdGhyZWFkTWV0YSDrr7jrk7HroZ0g4oaSXG4gICAgICAvLyDtm4Tsho0gcmV1c2Ug7KGw7ZqM7JeQ7IScIOydtCB0aHJlYWQg64qUIO2bhOuztOqwgCDrkJjsp4Ag7JWK64qU64ukLlxuICAgICAgaWYgKCFyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMudGhyZWFkTWV0YS5zZXQodGhyZWFkSWQsIHsgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgdGhyZWFkSWQsIG1vZGVsOiByZXEubW9kZWwgPz8gdGhyZWFkTW9kZWwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gdGhyZWFkL3N0YXJ0IOuKlCDtmITsnqwgUlBDIOy7pOuEpeyFmOydhCDqtazrj4XsnpDroZwg65Ox66Gd7ZWc64ukLiDsg53shLEg7ZuEIOy0iOq4sO2ZlOqwgFxuICAgICAgLy8g64Gd64KY6riwIOyghOyXkCDsi6TtjKjtlZjrqbQgZXhlY3V0ZVR1cm4g7J2YIGZpbmFsbHkg7JmAIGxhenkgc3dlZXAg7Ja064qQIOyqveuPhCDsnbRcbiAgICAgIC8vIHRocmVhZCDrpbwg67O8IOyImCDsl4bsnLzrr4DroZwg7Jes6riw7IScIOymieyLnCDsnqzsgqzsmqkg7LCo64uo6rO8IOq1rOuPhSDtlbTsoJzrpbwg7ZWo6ruYIO2VnOuLpC5cbiAgICAgIHRoaXMuZXZpY3RUaHJlYWQodGhyZWFkSWQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwsIHR0ZnRUcmFja2VyKTtcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UHJvbWlzZTtcbiAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgdGhyZWFkSWQgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKGUgYXMgRXJyb3IpO1xuICAgICAgYXdhaXQgcmVzdWx0UHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyDsnbTrr7jsp4AgdGhyZWFkIOuKlCAxIO2ajOyaqSBjb2xkIHRocmVhZCDsnbjrjbAgdGhyZWFkTWV0YSDsl5Ag65Ox66Gd65CY7KeAIOyViuyVhFxuICAgICAgLy8gc3dlZXAg7J20IOuquyDsnqHripTri6QuIE1CIOq4iSBiYXNlNjQg6rCAIOyDgeyjvO2VmOuvgOuhnCB0dXJuIOyiheujjCDsponsi5wo7ISx6rO1L+yLpO2MqFxuICAgICAgLy8g67aI66y4KSDqtazrj4XsnYQg64GK7Ja0IGNvZGV4IDMw67aEIOyWuOuhnOuTnCDrjIDsg4HsnLzroZwg66eM65Og64ukLlxuICAgICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHRoaXMudW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrcyxcbiAgICBleGlzdGluZ1RocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmc7XG4gICAgbGV0IG1vZGVsOiBzdHJpbmc7XG4gICAgaWYgKGV4aXN0aW5nVGhyZWFkSWQpIHtcbiAgICAgIHRocmVhZElkID0gZXhpc3RpbmdUaHJlYWRJZDtcbiAgICAgIG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHRocmVhZElkLCBtb2RlbCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUaHJlYWQocmVxKSk7XG4gICAgfVxuICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKHRocmVhZElkLCBtb2RlbCwgY2IsIHR0ZnRUcmFja2VyKTtcbiAgICBsZXQgdHVybklkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHR0ZnRUcmFja2VyLm1hcmtTdGFydCgpO1xuICAgICAgKHsgdHVybklkIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKGUgYXMgRXJyb3IpO1xuICAgICAgYXdhaXQgcmVzdWx0UHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBjYi5vblR1cm5JZD8uKHR1cm5JZCk7XG4gICAgYXdhaXQgcmVzdWx0UHJvbWlzZTtcbiAgICByZXR1cm4geyB0aHJlYWRJZCB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIHRocmVhZCDsnqzsgqzsmqkg7KeA7JuQIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldCBlcG9jaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVwb2NoQ291bnRlcjtcbiAgfVxuXG4gIGhhc1RocmVhZCh0aHJlYWRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWFkTWV0YS5oYXModGhyZWFkSWQpO1xuICB9XG5cbiAgLy8gaWRsZSBUVEwg7LSI6rO8IC8g6rCc7IiYIOyDge2VnCDstIjqs7wgdGhyZWFkIOulvCDsoJXrpqwuIGNyZWF0ZVRocmVhZCDsp4HsoIQgbGF6eSDtmLjstpwuXG4gIC8vIOuntSDsoJzqsbAo7J6s7IKs7JqpIOudvOyasO2MhSDssKjri6gp7JmAIO2VqOq7mCB0aHJlYWQvdW5zdWJzY3JpYmUg66W8IOuztOuCuOuLpCDigJQgY29kZXgg64qUXG4gIC8vIFwi6rWs64+F7J6QIDAgKyBpZGxlXCIg7J20IDMw67aEKFRIUkVBRF9VTkxPQURJTkdfREVMQVksIO2VmOuTnOy9lOuUqSkg7KeA7IaN65CcIHRocmVhZCDrpbxcbiAgLy8g66mU66qo66as7JeQ7IScIOyekOuPmSDslrjroZzrk5ztlZjripTrjbAsIHRocmVhZC9zdGFydCDqsIAg7J20IOy7pOuEpeyFmOydhCDsnpDrj5kg6rWs64+F7J6Q66GcIOuTseuhne2VtFxuICAvLyDrkZDquLAg65WM66y47JeQIHVuc3Vic2NyaWJlIOyXhuydtOuKlCDqt7gg7Ja466Gc65Oc6rCAIOyYgeybkO2eiCDrsJzrj5ntlZjsp4Ag7JWK64qU64ukKFNPTi01MTYg7Iuk7KadKS5cbiAgc3dlZXBJZGxlVGhyZWFkcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCBtZXRhXSBvZiB0aGlzLnRocmVhZE1ldGEpIHtcbiAgICAgIGlmIChub3cgLSBtZXRhLmxhc3RVc2VkQXQgPiBDb2RleEFwcFNlcnZlcldvcmtlci5USFJFQURfSURMRV9UVExfTVMpIHtcbiAgICAgICAgdGhpcy5ldmljdFRocmVhZChpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNyZWF0ZVRocmVhZCDsp4HsoIQg7Zi47LacIOKGkiDsg4ggdGhyZWFkIDEg6rCc6rCAIOqzpyDstpTqsIDrkJzri6QuIOy2lOqwgCDtm4Tsl5Drj4QgTUFYIOulvCDrhJjsp4Ag7JWK64+E66GdXG4gICAgLy8gTUFYLTEg7J207ZWY66GcIOykhOyXrCDrkZTri6Qo6re4656Y7JW8IOyDneyEsSDsp4Htm4Qg7KCV7ZmV7Z6IIE1BWCkuIExSVTogbGFzdFVzZWRBdCDsmKTrpoTssKjsiJzsnLzroZwg7KCc6rGwLlxuICAgIGNvbnN0IGxpbWl0ID0gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuTUFYX1RIUkVBRFNfUEVSX1dPUktFUiAtIDE7XG4gICAgaWYgKHRoaXMudGhyZWFkTWV0YS5zaXplID4gbGltaXQpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLnRocmVhZE1ldGEuZW50cmllcygpXS50b1NvcnRlZChcbiAgICAgICAgKGEsIGIpID0+IGFbMV0ubGFzdFVzZWRBdCAtIGJbMV0ubGFzdFVzZWRBdCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvdmVyID0gdGhpcy50aHJlYWRNZXRhLnNpemUgLSBsaW1pdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ZlcjsgaSsrKSB0aGlzLmV2aWN0VGhyZWFkKHNvcnRlZFtpXSFbMF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRocmVhZCDsnqzsgqzsmqkg7Y+s6riwOiDrp7Ug7KCc6rGwKOudvOyasO2MhSDssKjri6gp7JmAIOq1rOuPhSDtlbTsoJzrpbwg7ZWcIOuLqOychOuhnCDrrLbripTri6QuXG4gIC8vIHVuc3Vic2NyaWJlIO2VnCB0aHJlYWQg7JeQIHR1cm4g7J2EIOuztOuCtOuptCDslYzrprzsnbQg7J20IOy7pOuEpeyFmOycvOuhnCDsmKTsp4Ag7JWK7Jy866+A66GcXG4gIC8vIOuRkCDrj5nsnpHsnYAg67CY65Oc7IucIO2VqOq7mOyXrOyVvCDtlZzri6QuXG4gIHByaXZhdGUgZXZpY3RUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGhyZWFkTWV0YS5kZWxldGUodGhyZWFkSWQpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g7J6s7IKs7Jqp7J2EIO2PrOq4sO2VnCB0aHJlYWQg7J2YIOq1rOuPheydhCDrgYrripTri6QuIOq1rOuPheyekOqwgCDsl4bslrTsp4QgaWRsZSB0aHJlYWQg64qUIGNvZGV4IOqwgFxuICAvLyAzMOu2hCDrkqQg66mU66qo66as7JeQ7IScIOyekOuPmSDslrjroZzrk5ztlZzri6QoU09OLTUxNiDsi6Tspp0pLiBmaXJlLWFuZC1mb3JnZXQ6IOyLpO2MqO2VtOuPhFxuICAvLyDrrLTtlbQocmVzdGFydCDsi5wg7ZSE66Gc7IS47Iqk7Ke4IO2ajOyImCkuIHRocmVhZE1ldGEg7JeQIOyXhuuKlCDsnbTrr7jsp4AgMe2ajOyaqSB0aHJlYWQg64qUXG4gIC8vIGV2aWN0VGhyZWFkIOuMgOyLoCDsnbQg66mU7ISc65Oc66W8IOyngeygkSDtmLjstpztlZzri6QuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucnBjPy5yZXF1ZXN0KFwidGhyZWFkL3Vuc3Vic2NyaWJlXCIsIHsgdGhyZWFkSWQgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0VHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInR1cm4vaW50ZXJydXB0XCIsIHsgdGhyZWFkSWQsIHR1cm5JZCB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBwcml2YXRlIGZhaWxBY3RpdmVUdXJuKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnN0IGFib3J0ID0gdGhpcy5hY3RpdmVUdXJuQWJvcnQ7XG4gICAgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgYWJvcnQ/LihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJtU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vZ2VuZXJhdGVkX2ltYWdlc2AsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpLFxuICApOiBQcm9taXNlPFR1cm5SZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHVyblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBsZXQgZHVyYXRpb25NcyA9IDA7XG4gICAgICBjb25zdCBpbWFnZXMgPSBuZXcgTWFwPHN0cmluZywgVHVybkltYWdlPigpOyAvLyBpdGVtLmlkIOKGkiDsnbTrr7jsp4AgKGRlZHVwKVxuICAgICAgbGV0IGltYWdlQXR0ZW1wdGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL3N0YXJ0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoUmVzdWx0ID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBpZiAocmVzdWx0LmltYWdlQXR0ZW1wdGVkKSB0aGlzLmNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpwg6rSA7LihKOyerOyLnOuPhCDtjJDsoJXsmqkpLiBzdGFydGVkIOuKlCByZXN1bHQg7JeG7J20IOyYpOuvgOuhnFxuICAgICAgLy8gYXR0ZW1wdGVkIOyLoO2YuOuhnOunjCDsk7Dqs6AsIOyZhOyEsSDsnbTrr7jsp4DripQgY29tcGxldGVkIOyXkOyEnCByZXN1bHQg7Jyg7Zqo7ISx7Jy866GcIO2MkOygle2VnOuLpC5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vc3RhcnRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikge1xuICAgICAgICAgIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChwLml0ZW0udHlwZSA9PT0gXCJpbWFnZUdlbmVyYXRpb25cIikge1xuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChwLml0ZW0ucmVzdWx0KSkge1xuICAgICAgICAgICAgaW1hZ2VzLnNldChwLml0ZW0uaWQsIHsgZGF0YTogcC5pdGVtLnJlc3VsdCwgcmV2aXNlZFByb21wdDogcC5pdGVtLnJldmlzZWRQcm9tcHQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIHR0ZnRUcmFja2VyLnJlY29yZEZpcnN0RGVsdGEoKTtcbiAgICAgICAgdGV4dCArPSBwLmRlbHRhO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBkdXJhdGlvbk1zID0gcC50dXJuLmR1cmF0aW9uTXMgPz8gMDtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoUmVzdWx0KHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB1c2FnZSxcbiAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICB0dGZ0TXM6IHR0ZnRUcmFja2VyLnZhbHVlKCksXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIGltYWdlczogaW1hZ2VzLnNpemUgPiAwID8gWy4uLmltYWdlcy52YWx1ZXMoKV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbWFnZUF0dGVtcHRlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0dXJuIOyLpO2MqC/spJHri6gg7IucIOu2gOu2hCDsnbTrr7jsp4DripQg7Y+Q6riwKOyEseqzteycvOuhnCDsirnqsqntlZjsp4Ag7JWK7J2MKS5cbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuIGZhaWxlZDogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIHR0ZnRUcmFja2VyID0gY3JlYXRlVHRmdFRyYWNrZXIoKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgYWJvcnQ6IEFjdGl2ZVR1cm5BYm9ydDtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihcInR1cm4gdGltZW91dCAoNjAwcylcIikpO1xuICAgICAgfSwgNjAwXzAwMCk7XG5cbiAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgIGxldCB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93biA9IHtcbiAgICAgICAgdG90YWxUb2tlbnM6IDAsXG4gICAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgICBvdXRwdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLFxuICAgICAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gICAgICB9O1xuICAgICAgY29uc3QgaW1hZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFR1cm5JbWFnZT4oKTsgLy8gaXRlbS5pZCDihpIg7J2066+47KeAIChkZWR1cClcbiAgICAgIGxldCBpbWFnZUF0dGVtcHRlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9PT0gYWJvcnQpIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIFwiaXRlbS9zdGFydGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIixcbiAgICAgICAgICBcInR1cm4vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgICAgdGhpcy5ycGM/Lm9uTm90aWZpY2F0aW9uKG4sICgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aEVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNiLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0gY2F0Y2ggKGNhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoY2FsbGJhY2tFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhDb21wbGV0ZSA9IChyZXN1bHQ6IFR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pbWFnZUF0dGVtcHRlZCkgdGhpcy5jbGVhbnVwR2VuZXJhdGVkSW1hZ2VzKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoY2FsbGJhY2tFcnJvcikge1xuICAgICAgICAgIHJlamVjdChjYWxsYmFja0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9zdGFydGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImFnZW50TWVzc2FnZVwiKSB7XG4gICAgICAgICAgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSB7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZEltYWdlUmVzdWx0KHAuaXRlbS5yZXN1bHQpKSB7XG4gICAgICAgICAgICBpbWFnZXMuc2V0KHAuaXRlbS5pZCwgeyBkYXRhOiBwLml0ZW0ucmVzdWx0LCByZXZpc2VkUHJvbXB0OiBwLml0ZW0ucmV2aXNlZFByb21wdCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOyLnCAudG90YWwg7J2AIOuMgO2ZlCDsoITssrQg64iE7KCB7J206528LCBjb2xkIOyYgOuNmCDsnbTsoIQgdHVybiDquYzsp4Ag7ISe7JesXG4gICAgICAgIC8vIOydtCDsmpTssq0g7J6Q7LK07J2YIGNhY2hlIOyggeykkeuloOydtCDtnazshJ3rkJzri6Qo7JiIOiB0dXJuMSBjb2xkIDAlICsgdHVybjIgOTAlIOKGkiA0OCUg66GcIOq4sOuhnSkuXG4gICAgICAgIC8vIC5sYXN0IOuKlCDsnbTrsoggdHVybiDrp4zsnZggdXNhZ2Ug6528IHJlcXVlc3RfbG9nIOqwgCDqt7gg7JqU7LKt7J2YIOyLpOygnCDthqDtgbDsnYQg7KCV7ZmV7Z6IIOuwmOyYge2VnOuLpC5cbiAgICAgICAgdXNhZ2UgPSBwLnRva2VuVXNhZ2UubGFzdDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoQ29tcGxldGUoe1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgZHVyYXRpb25NczogcC50dXJuLmR1cmF0aW9uTXMgPz8gMCxcbiAgICAgICAgICAgIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgaW1hZ2VzOiBpbWFnZXMuc2l6ZSA+IDAgPyBbLi4uaW1hZ2VzLnZhbHVlcygpXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGltYWdlQXR0ZW1wdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gJHtwLnR1cm4uc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVzdGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHNjaGVkdWxlUmVzdGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQgfHwgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPj0gTUFYX1JFU1RBUlRfQVRURU1QVFMpIHtcbiAgICAgIGlmICh0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBtYXggcmVzdGFydCBhdHRlbXB0cyByZWFjaGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMrKztcbiAgICBjb25zdCBiYXNlRGVsYXkgPSBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyAqIDIgKiogKHRoaXMucmVzdGFydEF0dGVtcHRzIC0gMSk7XG4gICAgY29uc3Qgc3RhZ2dlciA9ICh0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwKSAqIDJfMDAwO1xuICAgIGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5ICsgc3RhZ2dlcjtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9WyR7dGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMH1dIHJlc3RhcnRpbmcgaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke3RoaXMucmVzdGFydEF0dGVtcHRzfSlgLFxuICAgICk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgdGhpcy5pbml0aWFsaXplKClcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5vblJlYWR5Py4oKSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gcmVzdGFydCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVJlc3RhcnQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgZGVsYXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsY0FBYyxDQUFDO0FBRWxELE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sMEJBQTBCO0FBdURoQyxNQUFNLGtCQUFrQjtDQUN0QixTQUFTO0NBQ1QsZ0JBQWdCO0NBQ2hCLFFBQVEsRUFDTixNQUFNLEVBQUUsVUFBVTtFQUFFLFNBQVM7RUFBTyxxQkFBcUI7RUFBTyxvQkFBb0I7Q0FBTSxFQUFFLEVBQzlGO0FBQ0Y7QUFFQSxNQUFNLG9CQUNKO0FBS0YsTUFBTSwwQkFDSjtBQUVGLFNBQVMsc0JBQXNCLFNBQXFEO0NBQ2xGLE1BQU0sV0FBVyw4QkFBOEIsT0FBTztDQUN0RCxPQUFPLEdBQUcsd0JBQXdCLGlDQUFpQyw2QkFBNkIsWUFBWSxTQUFTLFFBQVEsU0FBUyxTQUFTLEtBQUs7QUFDdEo7QUFJQSxTQUFTLHVCQUF1QixRQUFtQztDQUNqRSxJQUFJLE9BQU8sV0FBVyxVQUFVLE9BQU87Q0FDdkMsTUFBTSxVQUFVLE9BQU8sS0FBSztDQUM1QixJQUFJLFFBQVEsV0FBVyxLQUFLLFFBQVEsV0FBVyxPQUFPLEdBQUcsT0FBTztDQUNoRSxJQUFJLENBQUMseUJBQXlCLEtBQUssT0FBTyxLQUFLLFFBQVEsU0FBUyxNQUFNLEdBQUcsT0FBTztDQUNoRixPQUFPO0FBQ1Q7QUFNQSxNQUFhLG9CQUFvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQmpDLElBQWEsdUJBQWIsTUFBYSxxQkFBcUI7Q0EwQlo7Q0F6QnBCLE9BQW9DO0NBQ3BDLE1BQXFDO0NBQ3JDO0NBQ0Esa0JBQTBCO0NBQzFCLFFBQWdCO0NBQ2hCLFlB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
|
|
@@ -661,6 +661,39 @@ function unsubscribedIds(request: ReturnType<typeof vi.fn>): string[] {
|
|
|
661
661
|
.map(([, params]) => (params as { threadId: string }).threadId);
|
|
662
662
|
}
|
|
663
663
|
|
|
664
|
+
describe("CodexAppServerWorker partial thread creation cleanup", () => {
|
|
665
|
+
it.each([
|
|
666
|
+
["text", false],
|
|
667
|
+
["image", true],
|
|
668
|
+
])("unsubscribes an untracked %s thread when history injection fails", async (_, imageGeneration) => {
|
|
669
|
+
const { worker, request } = createWorkerWithNotificationRpc(async (method) => {
|
|
670
|
+
if (method === "thread/start") {
|
|
671
|
+
return { thread: { id: "partially-created" }, model: "gpt-test" };
|
|
672
|
+
}
|
|
673
|
+
if (method === "thread/inject_items") throw new Error("history injection failed");
|
|
674
|
+
if (method === "thread/unsubscribe") return {};
|
|
675
|
+
throw new Error(`unexpected request: ${method}`);
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
await expect(
|
|
679
|
+
worker.createThread({
|
|
680
|
+
input: [{ type: "text", text: "current", text_elements: [] }],
|
|
681
|
+
history: [{ type: "text", text: "previous", text_elements: [] }],
|
|
682
|
+
imageGeneration,
|
|
683
|
+
}),
|
|
684
|
+
).rejects.toThrow("history injection failed");
|
|
685
|
+
|
|
686
|
+
expect(unsubscribedIds(request)).toEqual(["partially-created"]);
|
|
687
|
+
expect(
|
|
688
|
+
(
|
|
689
|
+
worker as unknown as {
|
|
690
|
+
threadMeta: Map<string, { lastUsedAt: number }>;
|
|
691
|
+
}
|
|
692
|
+
).threadMeta.has("partially-created"),
|
|
693
|
+
).toBe(false);
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
|
|
664
697
|
describe("CodexAppServerWorker thread unsubscribe on eviction", () => {
|
|
665
698
|
type ThreadMetaInternals = {
|
|
666
699
|
threadMeta: Map<string, { lastUsedAt: number }>;
|
|
@@ -453,20 +453,28 @@ export class CodexAppServerWorker {
|
|
|
453
453
|
);
|
|
454
454
|
|
|
455
455
|
const threadId = thread.id;
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
456
|
+
try {
|
|
457
|
+
if (req.history?.length) {
|
|
458
|
+
await this.rpc.request("thread/inject_items", {
|
|
459
|
+
threadId,
|
|
460
|
+
items: req.history,
|
|
461
|
+
} satisfies ThreadInjectItemsParams);
|
|
462
|
+
}
|
|
463
|
+
// 이미지 turn 은 재사용에서 제외(R8): base64 가 thread 메모리·캐시 prefix 에
|
|
464
|
+
// 상주하는 것을 막고, 이미지 thread 를 1 회용으로 둔다. threadMeta 미등록 →
|
|
465
|
+
// 후속 reuse 조회에서 이 thread 는 후보가 되지 않는다.
|
|
466
|
+
if (!req.imageGeneration) {
|
|
467
|
+
this.threadMeta.set(threadId, { lastUsedAt: Date.now() });
|
|
468
|
+
}
|
|
468
469
|
|
|
469
|
-
|
|
470
|
+
return { threadId, model: req.model ?? threadModel };
|
|
471
|
+
} catch (error) {
|
|
472
|
+
// thread/start 는 현재 RPC 커넥션을 구독자로 등록한다. 생성 후 초기화가
|
|
473
|
+
// 끝나기 전에 실패하면 executeTurn 의 finally 와 lazy sweep 어느 쪽도 이
|
|
474
|
+
// thread 를 볼 수 없으므로 여기서 즉시 재사용 차단과 구독 해제를 함께 한다.
|
|
475
|
+
this.evictThread(threadId);
|
|
476
|
+
throw error;
|
|
477
|
+
}
|
|
470
478
|
}
|
|
471
479
|
|
|
472
480
|
// 기존 thread 에 turn 만 실행 (inject 없음). conversation_id 유지 → prompt cache 적중.
|