@cartanova/qgrid-cli 2.5.3 → 2.5.5
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 +7 -2
- package/README.md +7 -2
- package/bundle/dist/application/monit/monit.frame.js +3 -3
- package/bundle/dist/application/qgrid/oauth.js +1 -1
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +36 -14
- package/bundle/dist/application/qgrid/qgrid.frame.js +19 -5
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +93 -0
- package/bundle/dist/application/qgrid/tool-emulation.js +116 -96
- package/bundle/dist/application/request-log/request-log.model.js +3 -3
- package/bundle/dist/application/request-log-step/request-log-step.model.js +2 -2
- package/bundle/dist/application/token/token.model.js +2 -2
- package/bundle/dist/server-error-handler.js +15 -0
- package/bundle/dist/sonamu.config.js +4 -7
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +4 -3
- package/bundle/dist/utils/providers/anthropic/claude-session.js +7 -5
- package/bundle/dist/utils/providers/common/json-schema-keywords.js +77 -0
- package/bundle/dist/utils/providers/common/schema-validation.js +178 -0
- package/bundle/dist/utils/providers/common/strictifier.js +332 -42
- package/bundle/dist/utils/providers/openai/codex-worker.js +16 -8
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +5 -37
- package/bundle/dist/utils/providers/openai/openai-worker-pool-config.js +37 -0
- package/bundle/src/application/monit/monit.frame.ts +1 -1
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +103 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +337 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +45 -25
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +580 -8
- package/bundle/src/application/qgrid/qgrid.frame.ts +28 -1
- package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +188 -0
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +177 -0
- package/bundle/src/application/qgrid/tool-emulation.test.ts +285 -67
- package/bundle/src/application/qgrid/tool-emulation.ts +199 -102
- package/bundle/src/server-error-handler.ts +22 -0
- package/bundle/src/sonamu.config.test.ts +37 -0
- package/bundle/src/sonamu.config.ts +2 -5
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +44 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +2 -2
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +10 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +6 -1
- package/bundle/src/utils/providers/common/json-schema-keywords.ts +72 -0
- package/bundle/src/utils/providers/common/schema-validation.test.ts +284 -0
- package/bundle/src/utils/providers/common/schema-validation.ts +308 -0
- package/bundle/src/utils/providers/common/strictifier.test.ts +746 -0
- package/bundle/src/utils/providers/common/strictifier.ts +520 -52
- package/bundle/src/utils/providers/openai/codex-worker.test.ts +31 -0
- package/bundle/src/utils/providers/openai/codex-worker.ts +12 -4
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +6 -4
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +6 -79
- package/bundle/src/utils/providers/openai/openai-worker-pool-config.ts +80 -0
- package/bundle/web-dist/client/assets/{index-DXdGBfB8.js → index-CN_kMswh.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-D_j1yxC4.js → logs-6nYj9OKL.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-CIToyoxW.js → monit-CaPH9Uwc.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-Dd21A-wi.js → routes-Dh5HPi-b.js} +1 -1
- package/bundle/web-dist/client/assets/{show-DfePWRbc.js → show-Be_LVd9d.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-B4MV2fdk.js → tokens-CAi3zu_0.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +1 -1
- package/skills/qgrid/references/ai-sdk-provider-contract.md +34 -2
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +3 -0
- package/skills/qgrid/references/cli-env-and-server-boot.md +1 -1
- package/skills/qgrid/references/decision-rationale.md +10 -1
- package/skills/qgrid/references/docs-workflow.md +9 -0
- package/skills/qgrid/references/repo-map.md +2 -1
- package/skills/qgrid/references/tool-calling-and-multiturn.md +145 -6
- package/skills/qgrid/references/verification-and-debugging.md +16 -1
package/README.ko.md
CHANGED
|
@@ -96,10 +96,15 @@ CLI는 실행 시 npm의 최신 버전을 확인하고 patch를 포함해 설치
|
|
|
96
96
|
| 변수 | 설명 | 기본값 |
|
|
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 수 | `5` |
|
|
101
|
+
| `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최대 worker 수 | `15` |
|
|
102
|
+
| `QGRID_WORKERS_PER_TOKEN` | OpenAI 최소/고정 worker 수의 legacy fallback | `5` |
|
|
100
103
|
| `QGRID_PUBLIC_BASE_URL` | Anthropic OAuth callback 공개 베이스 URL. 원격 접속 환경에서 설정 | 미설정 시 `http://localhost:<port>/callback` |
|
|
101
104
|
| `QGRID_OPENAI_THREAD_REUSE` | `false`로 설정 시 OpenAI thread reuse(prompt cache) 비활성화 | 활성 |
|
|
102
105
|
|
|
106
|
+
OpenAI worker 수는 토큰당 hard cap 20으로 제한됨. autoscaling을 끄면 pool은 설정된 최소 worker 수로 고정됨.
|
|
107
|
+
|
|
103
108
|
## 사전 요구사항
|
|
104
109
|
|
|
105
110
|
- Node.js >= 20
|
|
@@ -115,7 +120,7 @@ CLI는 Sonamu 기반 서버를 내장 번들로 포함. 실행 시:
|
|
|
115
120
|
1. DB 연결 확인
|
|
116
121
|
2. 서버 시작 (API + 대시보드 웹 UI)
|
|
117
122
|
3. DB의 등록된 토큰 로드. 이후 토큰 등록/변경은 PostgreSQL LISTEN/NOTIFY로 실행 중인 서버에 실시간 반영
|
|
118
|
-
4. **OpenAI 토큰**: 토큰당 persistent codex app-server
|
|
123
|
+
4. **OpenAI 토큰**: 토큰당 persistent codex app-server 프로세스를 5개에서 15개까지 autoscale (hard cap 20). JSON-RPC로 통신. 요청은 idle worker에 round-robin 라우팅, 전부 busy면 큐 대기 (최대 60초). `sessionKey` 멀티턴 요청은 같은 thread로 재라우팅되어 prompt cache 적중
|
|
119
124
|
5. **Anthropic 토큰**: 요청마다 격리된 claude 프로세스를 fresh spawn (`stream-json` 입출력). 토큰은 least-used 우선으로 선택. OAuth 토큰 자동 refresh
|
|
120
125
|
6. 토큰별 quota threshold(기본 80%)를 넘은 토큰은 라우팅에서 제외 (사용률 조회 실패 시에는 fail-open으로 통과)
|
|
121
126
|
|
package/README.md
CHANGED
|
@@ -97,10 +97,15 @@ Server behavior variables:
|
|
|
97
97
|
| Variable | Description | Default |
|
|
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 | `5` |
|
|
102
|
+
| `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | Maximum OpenAI workers per token while autoscaling | `15` |
|
|
103
|
+
| `QGRID_WORKERS_PER_TOKEN` | Legacy fallback for the OpenAI minimum/fixed worker count | `5` |
|
|
101
104
|
| `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 |
|
|
102
105
|
| `QGRID_OPENAI_THREAD_REUSE` | Set to `false` to disable OpenAI thread reuse (prompt caching) | enabled |
|
|
103
106
|
|
|
107
|
+
OpenAI worker counts are clamped to a hard cap of 20 per token. With autoscaling disabled, the pool stays at the configured minimum.
|
|
108
|
+
|
|
104
109
|
## Prerequisites
|
|
105
110
|
|
|
106
111
|
- Node.js >= 20
|
|
@@ -116,7 +121,7 @@ The CLI ships the Sonamu-based server as a built-in bundle. On launch:
|
|
|
116
121
|
1. Verify the DB connection
|
|
117
122
|
2. Start the server (API + dashboard web UI)
|
|
118
123
|
3. Load registered tokens from the DB. Later token additions/changes propagate to the running server in real time via PostgreSQL LISTEN/NOTIFY
|
|
119
|
-
4. **OpenAI tokens**:
|
|
124
|
+
4. **OpenAI tokens**: autoscale persistent codex app-server processes per token from 5 to 15 (hard cap 20), communicating over JSON-RPC. Requests are routed round-robin across idle workers; when all are busy they queue (up to 60 seconds). Multi-turn requests carrying a `sessionKey` are routed back to the same thread for prompt-cache hits
|
|
120
125
|
5. **Anthropic tokens**: spawn a fresh, isolated claude process per request (`stream-json` in/out). Tokens are selected least-used-first. OAuth tokens are refreshed automatically
|
|
121
126
|
6. Tokens over their quota threshold (default 80%) are excluded from routing (usage-lookup failures fail open)
|
|
122
127
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { monitLogBuffer } from "./log-buffer.js";
|
|
2
|
+
import { resolveOpenAIWorkerPoolConfig } from "../../utils/providers/openai/openai-worker-pool-config.js";
|
|
3
|
+
import { QgridDispatcher } from "../qgrid/qgrid.dispatcher.js";
|
|
2
4
|
import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
|
|
3
5
|
import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
|
|
4
|
-
import { resolveOpenAIWorkerPoolConfig } from "../../utils/providers/openai/openai-dispatcher.js";
|
|
5
|
-
import { QgridDispatcher } from "../qgrid/qgrid.dispatcher.js";
|
|
6
6
|
import { BaseFrameClass, DB, api } from "sonamu";
|
|
7
7
|
//#region src/application/monit/monit.frame.ts
|
|
8
8
|
/**
|
|
@@ -82,4 +82,4 @@ const MonitFrame = new MonitFrameClass();
|
|
|
82
82
|
//#endregion
|
|
83
83
|
export { MonitFrame };
|
|
84
84
|
|
|
85
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL21vbml0L21vbml0LmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9uaXQg4oCUIOuMgOyLnOuztOuTnCBNb25pdCDtg63smqkg7ZSE66Gc7IS47IqkIOuhnOq3uCDqtIDsuKEgQVBJLlxuICpcbiAqIOydveq4sCDsoITsmqkuIHJpbmcgYnVmZmVyIOulvCDslofqsowg7KeB7KCRIOydveycvOupsCjrspTsmqkg7L+
|
|
85
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL21vbml0L21vbml0LmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9uaXQg4oCUIOuMgOyLnOuztOuTnCBNb25pdCDtg63smqkg7ZSE66Gc7IS47IqkIOuhnOq3uCDqtIDsuKEgQVBJLlxuICpcbiAqIOydveq4sCDsoITsmqkuIHJpbmcgYnVmZmVyIOulvCDslofqsowg7KeB7KCRIOydveycvOupsCjrspTsmqkg7L+866asIOq4sOqzhCDsl4bsnbQpLFxuICogcmVxdWVzdCBsb2cg66W8IOuCqOq4sOyngCDslYrripTri6QuIOygkeq3vCDqsr3qs4TripQg64uk66W4IOuMgOyLnOuztOuTnCBBUEkg7JmAIOuPmeydvO2VmOuLpC5cbiAqL1xuaW1wb3J0IHsgYXBpLCBCYXNlRnJhbWVDbGFzcywgREIgfSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLXdvcmtlci1wb29sLWNvbmZpZ1wiO1xuaW1wb3J0IHsgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IG1vbml0TG9nQnVmZmVyIH0gZnJvbSBcIi4vbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHsgdHlwZSBNb25pdExvZ0NodW5rLCB0eXBlIE1vbml0U2VydmVySW5mbywgdHlwZSBNb25pdFZpdGFscyB9IGZyb20gXCIuL21vbml0LnR5cGVzXCI7XG5cbi8vIOydkeuLteuLuSDsl5Ttirjrpqwg7IOB7ZWcIOKAlCDtj7Trp4Eg7YG065287J207Ja47Yq464qUIOuLpOydjCDtj7Tsl5DshJwg7J207Ja07IScIOuUsOudvOyeoeuKlOuLpC5cbmNvbnN0IFJFU1BPTlNFX0VOVFJZX0xJTUlUID0gMV8wMDA7XG5cbmNsYXNzIE1vbml0RnJhbWVDbGFzcyBleHRlbmRzIEJhc2VGcmFtZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJNb25pdFwiKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIG1vbml0TG9ncyhjdXJzb3I/OiBudW1iZXIpOiBQcm9taXNlPE1vbml0TG9nQ2h1bms+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc1N0YXJ0ZWRBdDogbW9uaXRMb2dCdWZmZXIucHJvY2Vzc1N0YXJ0ZWRBdCxcbiAgICAgIC4uLm1vbml0TG9nQnVmZmVyLmFmdGVyKGN1cnNvciwgUkVTUE9OU0VfRU5UUllfTElNSVQpLFxuICAgICAgdml0YWxzOiBjdXJyZW50Vml0YWxzKCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIO2UhOuhnOyEuOyKpCDsoJXsoIEg7KCV67O0IOKAlCDtj7Trp4Eg67aI7ZWE7JqULCDtjpjsnbTsp4Dri7kgMe2ajCDsobDtmowuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIG1vbml0SW5mbygpOiBQcm9taXNlPE1vbml0U2VydmVySW5mbz4ge1xuICAgIGNvbnN0IHBvb2wgPSByZXNvbHZlT3BlbkFJV29ya2VyUG9vbENvbmZpZygpO1xuICAgIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5IT1NUID8/IFwibG9jYWxob3N0XCI7XG4gICAgY29uc3QgcG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICAgIGNvbnN0IGNvbm4gPSBhY3RpdmVEYkNvbm5lY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VydmVyVXJsOiBgaHR0cDovLyR7aG9zdH06JHtwb3J0fWAsXG4gICAgICBkYkhvc3Q6IGNvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwiLFxuICAgICAgZGJOYW1lOiBjb25uLmRhdGFiYXNlID8/IFwicWdyaWRcIixcbiAgICAgIG9wZW5haToge1xuICAgICAgICBtaW5Xb3JrZXJzUGVyVG9rZW46IHBvb2wubWluV29ya2Vyc1BlclRva2VuLFxuICAgICAgICBtYXhXb3JrZXJzUGVyVG9rZW46IHBvb2wubWF4V29ya2Vyc1BlclRva2VuLFxuICAgICAgICBhdXRvc2NhbGU6IHBvb2wuYXV0b3NjYWxlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8vIGRpc3BhdGNoZXIg66+47LSI6riw7ZmUKOu2gO2MhSDsp4Htm4QpIOyLnCAwIOycvOuhnCDsnZHri7XtlZzri6Qg4oCUIOqwgOuyvOyatCDsiqTrg4Xsg7fsnbTrnbwg7Jik66WY66GcIOunjOuTpOyngCDslYrripTri6QuXG5mdW5jdGlvbiBjdXJyZW50Vml0YWxzKCk6IE1vbml0Vml0YWxzIHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuYWlXb3JrZXJDb3VudDogUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LndvcmtlckNvdW50ID8/IDAsXG4gICAgb3BlbmFpUmVhZHlXb3JrZXJDb3VudDogUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnJlYWR5V29ya2VyQ291bnQgPz8gMCxcbiAgICBvcGVuYWlRdWV1ZUxlbmd0aDogUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnF1ZXVlTGVuZ3RoID8/IDAsXG4gICAgb3BlbmFpV29ya2Vyc0J5VG9rZW46IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy53b3JrZXJDb3VudHNCeVRva2VuID8/IFtdLFxuICAgIGFudGhyb3BpY1Rva2VuQ291bnQ6IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDAsXG4gICAgYW50aHJvcGljVG9rZW5OYW1lczogUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnRva2VuTmFtZXMgPz8gW10sXG4gIH07XG59XG5cbi8vIOyLpOygnCDtmZzshLEga25leCDsl7DqsrDsl5DshJwg7J2964qU64ukIOKAlCBkZXYg7ISc67KE7J2YIO2Gte2VqSDthYzsiqTtirgg65+s64SI6rCAIHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FIOydhFxuLy8g7YWM7Iqk7Yq4IERCIOydtOumhOycvOuhnCDrja7slrTsk7Drr4DroZwgZW52IOuKlCDsi6DrorDtlaAg7IiYIOyXhuuLpC4gREIg66+47LSI6riw7ZmUKOu2gO2MhSDsoIQpIOyLnOyXkOunjCBlbnYg7Y+067CxLlxuZnVuY3Rpb24gYWN0aXZlRGJDb25uZWN0aW9uKCk6IHsgaG9zdD86IHN0cmluZzsgZGF0YWJhc2U/OiBzdHJpbmcgfSB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IERCLmdldERCQ29uZmlnKFwid1wiKS5jb25uZWN0aW9uO1xuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbiA9PT0gXCJvYmplY3RcIiAmJiBjb25uZWN0aW9uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmc7IGRhdGFiYXNlPzogc3RyaW5nIH07XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBEQiBjb25maWcg66+47LSI6riw7ZmUIOKAlCBlbnYg7Y+067Cx7Jy866GcIOynhO2WiVxuICB9XG4gIHJldHVybiB7IGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NULCBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX05BTUUgfTtcbn1cblxuZXhwb3J0IGNvbnN0IE1vbml0RnJhbWUgPSBuZXcgTW9uaXRGcmFtZUNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFjQSxNQUFNLHVCQUF1QjtBQUU3QixJQUFNLGtCQUFOLGNBQThCLGVBQWU7Q0FDM0MsY0FBYztFQUNaLE1BQU0sT0FBTztDQUNmO0NBRUEsTUFDTSxVQUFVLFFBQXlDO0VBQ3ZELE9BQU87R0FDTCxrQkFBa0IsZUFBZTtHQUNqQyxHQUFHLGVBQWUsTUFBTSxRQUFRLG9CQUFvQjtHQUNwRCxRQUFRLGNBQWM7RUFDeEI7Q0FDRjtDQUdBLE1BQ00sWUFBc0M7RUFDMUMsTUFBTSxPQUFPLDhCQUE4QjtFQUMzQyxNQUFNLE9BQU8sUUFBUSxJQUFJLFFBQVE7RUFDakMsTUFBTSxPQUFPLFFBQVEsSUFBSSxRQUFRO0VBQ2pDLE1BQU0sT0FBTyxtQkFBbUI7RUFDaEMsT0FBTztHQUNMLFdBQVcsVUFBVSxLQUFLLEdBQUc7R0FDN0IsUUFBUSxLQUFLLFFBQVE7R0FDckIsUUFBUSxLQUFLLFlBQVk7R0FDekIsUUFBUTtJQUNOLG9CQUFvQixLQUFLO0lBQ3pCLG9CQUFvQixLQUFLO0lBQ3pCLFdBQVcsS0FBSztHQUNsQjtFQUNGO0NBQ0Y7QUFDRjs7Q0EzQkcsSUFBSTtFQUFFLFlBQVk7RUFBTyxTQUFTLENBQUMsU0FBUyxnQkFBZ0I7Q0FBRSxDQUFDOzs7Ozs7Q0FVL0QsSUFBSTtFQUFFLFlBQVk7RUFBTyxTQUFTLENBQUMsU0FBUyxnQkFBZ0I7Q0FBRSxDQUFDOzs7OztBQW9CbEUsU0FBUyxnQkFBNkI7Q0FDcEMsT0FBTztFQUNMLG1CQUFtQixnQkFBZ0Isa0JBQWtCLGVBQWU7RUFDcEUsd0JBQXdCLGdCQUFnQixrQkFBa0Isb0JBQW9CO0VBQzlFLG1CQUFtQixnQkFBZ0Isa0JBQWtCLGVBQWU7RUFDcEUsc0JBQXNCLGdCQUFnQixrQkFBa0IsdUJBQXVCLENBQUM7RUFDaEYscUJBQXFCLGdCQUFnQixxQkFBcUIsY0FBYztFQUN4RSxxQkFBcUIsZ0JBQWdCLHFCQUFxQixjQUFjLENBQUM7Q0FDM0U7QUFDRjtBQUlBLFNBQVMscUJBQTJEO0NBQ2xFLElBQUk7RUFDRixNQUFNLGFBQWEsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZDLElBQUksT0FBTyxlQUFlLFlBQVksZUFBZSxNQUNuRCxPQUFPO0NBRVgsUUFBUSxDQUVSO0NBQ0EsT0FBTztFQUFFLE1BQU0sUUFBUSxJQUFJO0VBQWdCLFVBQVUsUUFBUSxJQUFJO0NBQWU7QUFDbEY7QUFFQSxNQUFhLGFBQWEsSUFBSSxnQkFBZ0IifQ==
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { ProcessError, QuotaError, maskToken } from "./qgrid.types.js";
|
|
2
1
|
import { getAccessToken } from "../../utils/providers/common/credentials.js";
|
|
3
2
|
import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
|
|
3
|
+
import { parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema } from "../../utils/providers/common/schema-validation.js";
|
|
4
4
|
import { strictify } from "../../utils/providers/common/strictifier.js";
|
|
5
5
|
import { decideConvRouting, issueConvContext } from "./conv-routing.js";
|
|
6
|
-
import {
|
|
6
|
+
import { ProcessError, QuotaError, maskToken } from "./qgrid.types.js";
|
|
7
|
+
import { applyToolCallEmulation } from "./tool-emulation.js";
|
|
8
|
+
import { buildToolCallSchema } from "./tool-emulation-schema.js";
|
|
7
9
|
//#region src/application/qgrid/qgrid.dispatcher.ts
|
|
8
10
|
var QgridDispatcherClass = class {
|
|
9
11
|
tokens = /* @__PURE__ */ new Map();
|
|
@@ -32,9 +34,9 @@ var QgridDispatcherClass = class {
|
|
|
32
34
|
}));
|
|
33
35
|
}
|
|
34
36
|
async query(input, abortSignal) {
|
|
35
|
-
if (input.tools?.length && input.jsonSchema) throw new ProcessError("tools and jsonSchema cannot be used together");
|
|
36
37
|
const route = parseProviderRoute(input.model);
|
|
37
|
-
const outputSchema =
|
|
38
|
+
const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
|
|
39
|
+
const answerMode = input.jsonSchema ? "structured" : "legacy";
|
|
38
40
|
if (route.provider === "openai") {
|
|
39
41
|
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
40
42
|
const decision = decideConvRouting(input);
|
|
@@ -55,7 +57,11 @@ var QgridDispatcherClass = class {
|
|
|
55
57
|
imageGenerationOptions: input.imageGenerationOptions
|
|
56
58
|
});
|
|
57
59
|
const coord = input.imageGeneration ? void 0 : issueConvContext(result.threadCoord, decision);
|
|
58
|
-
return applyToolCallEmulation(toEmulationResult(result), input.tools,
|
|
60
|
+
return applyToolCallEmulation(toEmulationResult(result), input.tools, {
|
|
61
|
+
threadCoord: coord,
|
|
62
|
+
images: result.images,
|
|
63
|
+
answerMode
|
|
64
|
+
});
|
|
59
65
|
} else if (route.provider === "anthropic") {
|
|
60
66
|
if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
|
|
61
67
|
const decision = decideConvRouting(input);
|
|
@@ -71,13 +77,17 @@ var QgridDispatcherClass = class {
|
|
|
71
77
|
imageGeneration: input.imageGeneration,
|
|
72
78
|
imageGenerationOptions: input.imageGenerationOptions
|
|
73
79
|
});
|
|
74
|
-
return applyToolCallEmulation(toEmulationResult(result), input.tools,
|
|
80
|
+
return applyToolCallEmulation(toEmulationResult(result), input.tools, {
|
|
81
|
+
threadCoord: issueConvContext(result.threadCoord, decision),
|
|
82
|
+
answerMode
|
|
83
|
+
});
|
|
75
84
|
}
|
|
76
85
|
throw directLlmApiFallbackNotImplemented(input);
|
|
77
86
|
}
|
|
78
87
|
async queryStream(input, cb, abortSignal) {
|
|
79
88
|
const route = parseProviderRoute(input.model);
|
|
80
|
-
const outputSchema =
|
|
89
|
+
const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
|
|
90
|
+
const answerMode = input.jsonSchema ? "structured" : "legacy";
|
|
81
91
|
if (route.provider === "openai") {
|
|
82
92
|
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
83
93
|
const decision = decideConvRouting(input);
|
|
@@ -101,7 +111,10 @@ var QgridDispatcherClass = class {
|
|
|
101
111
|
onThreadId: cb.onThreadId,
|
|
102
112
|
onTurnId: cb.onTurnId,
|
|
103
113
|
onComplete: (turnResult) => {
|
|
104
|
-
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools,
|
|
114
|
+
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
|
|
115
|
+
threadCoord: issueConvContext(turnResult.threadCoord, decision),
|
|
116
|
+
answerMode
|
|
117
|
+
}));
|
|
105
118
|
},
|
|
106
119
|
onError: cb.onError
|
|
107
120
|
});
|
|
@@ -125,7 +138,10 @@ var QgridDispatcherClass = class {
|
|
|
125
138
|
onThreadId: cb.onThreadId,
|
|
126
139
|
onComplete: (turnResult) => {
|
|
127
140
|
const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
|
|
128
|
-
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools,
|
|
141
|
+
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
|
|
142
|
+
threadCoord: issuedCoord,
|
|
143
|
+
answerMode
|
|
144
|
+
}));
|
|
129
145
|
},
|
|
130
146
|
onError: cb.onError
|
|
131
147
|
});
|
|
@@ -146,12 +162,18 @@ function parseProviderRoute(model) {
|
|
|
146
162
|
function directLlmApiFallbackNotImplemented(input) {
|
|
147
163
|
return new ProcessError(`Direct LLM API fallback not implemented for model: ${input.model ?? "<default>"}`);
|
|
148
164
|
}
|
|
149
|
-
function buildStrictOutputSchema(input) {
|
|
165
|
+
function buildStrictOutputSchema(input, provider) {
|
|
150
166
|
const outputSchema = buildRawOutputSchema(input);
|
|
151
|
-
return outputSchema ? strictify(outputSchema) : void 0;
|
|
167
|
+
return outputSchema ? strictify(outputSchema, { provider }) : void 0;
|
|
168
|
+
}
|
|
169
|
+
function buildAndValidateStrictOutputSchema(input, provider = parseProviderRoute(input.model).provider) {
|
|
170
|
+
const outputSchema = buildStrictOutputSchema(input, provider);
|
|
171
|
+
serializeAndValidateDispatchSchema(outputSchema, provider);
|
|
172
|
+
return outputSchema;
|
|
152
173
|
}
|
|
153
174
|
function buildRawOutputSchema(input) {
|
|
154
|
-
|
|
175
|
+
const callerOutputSchema = parseAndValidateCallerSchemas(input);
|
|
176
|
+
return input.tools?.length ? buildToolCallSchema(input.tools, callerOutputSchema) : callerOutputSchema;
|
|
155
177
|
}
|
|
156
178
|
function toEmulationResult(result) {
|
|
157
179
|
const hasProviderCost = result.costUsd !== void 0 && result.costUsd > 0;
|
|
@@ -184,6 +206,6 @@ function toEmulationResult(result) {
|
|
|
184
206
|
}
|
|
185
207
|
const QgridDispatcher = new QgridDispatcherClass();
|
|
186
208
|
//#endregion
|
|
187
|
-
export { QgridDispatcher, QgridDispatcherClass, buildStrictOutputSchema };
|
|
209
|
+
export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema };
|
|
188
210
|
|
|
189
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiwgYnVpbGRUb29sQ2FsbFNjaGVtYSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgaWYgKGlucHV0LnRvb2xzPy5sZW5ndGggJiYgaW5wdXQuanNvblNjaGVtYSkge1xuICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInRvb2xzIGFuZCBqc29uU2NoZW1hIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywgY29vcmQsIHJlc3VsdC5pbWFnZXMpO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFudGhyb3BpYyBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgdG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSxcbiAgICAgICAgaW5wdXQudG9vbHMsXG4gICAgICAgIGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIC8vIOydtOuvuOyngCDtlIzrnpjqt7jrpbwg7KCE64us7ZW07JW8IGdlbmVyYXRlU3RyZWFtIOydmCBub24tc3RyZWFtIOyghOyaqSDqsbDrtoAoUjIp6rCAIOuwnOuPme2VnOuLpC5cbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgICAgICAgICB0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSxcbiAgICAgICAgICAgICAgICBpbnB1dC50b29scyxcbiAgICAgICAgICAgICAgICBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBwcm92aWRlcj86IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9IHtcbiAgaWYgKCFtb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsID8/IFwiXCIgfTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgcm91dGVkTW9kZWxdID0gbW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlbDogcm91dGVkTW9kZWwgfTtcbn1cblxuLy8gcWdyaWQgcHJvdmlkZXIgZGlzcGF0Y2hlciDsl5DshJwg7LKY66as7ZWY7KeAIOyViuuKlCDrqqjrjbjsnYAg7Zal7ZuEIOyngeygkSBMTE0gQVBJIO2YuOy2nCDsp4DsoJDsnLzroZwg67O064K464ukLlxuZnVuY3Rpb24gZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dDogUXVlcnlJbnB1dCk6IFByb2Nlc3NFcnJvciB7XG4gIHJldHVybiBuZXcgUHJvY2Vzc0Vycm9yKFxuICAgIGBEaXJlY3QgTExNIEFQSSBmYWxsYmFjayBub3QgaW1wbGVtZW50ZWQgZm9yIG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IFwiPGRlZmF1bHQ+XCJ9YCxcbiAgKTtcbn1cblxuLy8g66qo65OgIHByb3ZpZGVyKE9wZW5BSS9BbnRocm9waWMp6rCAIOuPmeydvO2VmOqyjCBzdHJpY3Qgb3V0cHV0IHNjaGVtYSDrpbwg7JO064ukLlxuLy9cbi8vIFNPTi00OTUg6rWQ7ZuIOiDtlZzrlYwgQW50aHJvcGljIHJvdXRlIOunjCByZXF1aXJlZCDrpbwg7KCc6rGwKG9wdGlvbmFsaXplKe2VtCBwYXJ0aWFsL3JlamVjdGVkIGF0dGVtcHQg6rCAXG4vLyDshJ7sl6zrj4Qg7Ya16rO87ZWY6rKMIO2WiOycvOuCmCwg7Iuk7LihIOqysOqzvCDqt7jqsowg7Jik7Z6I66CkIFwi66qo64247J20IOu5hOuKlCDtlYTrk5zrpbwg7YKk7Ke4IOyDneuetVwi7ZWY64+E66GdIOycoOuPhO2WiOuLpFxuLy8gKHJlcXVpcmVkIOyCtOumsCBzY2hlbWEg64qUIOuIhOudvSAwLCBsb29zZSDripQg64iE6529IOuLpOuwnCkuIHN0cmljdCDroZwg65GQ66m0IOuqqOuNuOydtCDruaDsp5Dsl4bsnbQg7LGE7Jqw6rOgLFxuLy8g65Oc66y86rKMIOyWtOqyqOuPhCByZXRyeT0xICsg67mE7KCV7IOBIOyiheujjOuKlCDsoJXsp4HtlZwg7JeQ65+sKHN0cmVhbS1qc29uLWFkYXB0ZXIp66GcIOuwm+yVhOykgOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSYXdPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzKVxuICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgPyAoSlNPTi5wYXJzZShpbnB1dC5qc29uU2NoZW1hKSBhcyBKc29uVmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBwcm92aWRlciDqsIAg7KSAIOqwkuydhCDsmrDshKAg7IKs7Jqp7ZWY6rOgLCDsl4bsnLzrqbQg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID0gcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDA7XG4gIHJldHVybiB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdE1zOiByZXN1bHQudHRmdE1zID8/IDAsXG4gICAgY29zdFVzZDogaGFzUHJvdmlkZXJDb3N0XG4gICAgICA/IHJlc3VsdC5jb3N0VXNkIVxuICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSxcbiAgICBjb3N0U291cmNlOiBoYXNQcm92aWRlckNvc3QgPyBcInByb3ZpZGVyXCIgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBeUJBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELFFBQVEsTUFBc0I7RUFDNUIsT0FBTyxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUs7Q0FDekM7Q0FHQSxZQUFZLElBQVksS0FBeUI7RUFDL0MsS0FBSyxPQUFPLElBQUksSUFBSSxHQUFHO0NBQ3pCO0NBRUEsWUFBWSxJQUFrQjtFQUM1QixLQUFLLE9BQU8sT0FBTyxFQUFFO0NBQ3ZCO0NBRUEsYUFBYSxNQUE0QjtFQUN2QyxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ2xEO0NBRUEsV0FBeUI7RUFDdkIsT0FBTyxDQUFDLEdBQUcsS0FBSyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPO0dBQzNDLE9BQU8sVUFBVSxlQUFlLEVBQUUsV0FBVyxDQUFDO0dBQzlDLE1BQU0sRUFBRTtHQUNSLFVBQVUsRUFBRTtHQUNaLFVBQVUsS0FBSyxRQUFRLEVBQUUsSUFBSTtFQUMvQixFQUFFO0NBQ0o7Q0FFQSxNQUFNLE1BQU0sT0FBbUIsYUFBaUQ7RUFDOUUsSUFBSSxNQUFNLE9BQU8sVUFBVSxNQUFNLFlBQy9CLE1BQU0s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
|
|
211
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzLFxuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFF1ZXJ5T3V0cHV0LCB0eXBlIFRva2VuU3RhdHMgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgbWFza1Rva2VuLCBQcm9jZXNzRXJyb3IsIFF1b3RhRXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyBUb2tlblN0YXRzIHNoYXBlIOuztOyhtOyaqS4g7Iuk7KCcIHByb3ZpZGVyIOyalOyyrSDsubTsmrTtjIXsnYAg6rCBIGRpc3BhdGNoZXIg66GcIOydtOuPme2WiOuLpC5cbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBjb3VudE9mKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmNvdW50T2Yoci5uYW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIC8vIHRvb2xzK2pzb25TY2hlbWEg7ZWp7ISxIOyLnCBzdHJ1Y3R1cmVkIGVudmVsb3BlIOuUlOy9lOuNlOulvCDsk7Tri6QuIDTqsJwg67Cp7LacIOyngOygkOydtCDqs7XsnKDtlZjripQg64uo7J28IO2MkOyglS5cbiAgICBjb25zdCBhbnN3ZXJNb2RlID0gaW5wdXQuanNvblNjaGVtYSA/IChcInN0cnVjdHVyZWRcIiBhcyBjb25zdCkgOiAoXCJsZWdhY3lcIiBhcyBjb25zdCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogY29vcmQsXG4gICAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICAgICAgYW5zd2VyTW9kZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFudGhyb3BpYyBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyTW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyB0b29scytqc29uU2NoZW1hIO2VqeyEsSDsi5wgc3RydWN0dXJlZCBlbnZlbG9wZSDrlJTsvZTrjZTrpbwg7JO064ukLiA06rCcIOuwqey2nCDsp4DsoJDsnbQg6rO17Jyg7ZWY64qUIOuLqOydvCDtjJDsoJUuXG4gICAgY29uc3QgYW5zd2VyTW9kZSA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJzdHJ1Y3R1cmVkXCIgYXMgY29uc3QpIDogKFwibGVnYWN5XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgLy8g7J2066+47KeAIO2UjOuemOq3uOulvCDsoITri6ztlbTslbwgZ2VuZXJhdGVTdHJlYW0g7J2YIG5vbi1zdHJlYW0g7KCE7JqpIOqxsOu2gChSMinqsIAg67Cc64+Z7ZWc64ukLlxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25UdXJuSWQ6IGNiLm9uVHVybklkLFxuICAgICAgICAgIG9uQ29tcGxldGU6ICh0dXJuUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJNb2RlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZWRDb29yZCxcbiAgICAgICAgICAgICAgICBhbnN3ZXJNb2RlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3ZpZGVyUm91dGUobW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcHJvdmlkZXI/OiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgaWYgKCFwcm92aWRlciB8fCAhcm91dGVkTW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICByZXR1cm4geyBwcm92aWRlciwgbW9kZWw6IHJvdXRlZE1vZGVsIH07XG59XG5cbi8vIHFncmlkIHByb3ZpZGVyIGRpc3BhdGNoZXIg7JeQ7IScIOyymOumrO2VmOyngCDslYrripQg66qo64247J2AIO2Wpe2bhCDsp4HsoJEgTExNIEFQSSDtmLjstpwg7KeA7KCQ7Jy866GcIOuztOuCuOuLpC5cbmZ1bmN0aW9uIGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBQcm9jZXNzRXJyb3Ige1xuICByZXR1cm4gbmV3IFByb2Nlc3NFcnJvcihcbiAgICBgRGlyZWN0IExMTSBBUEkgZmFsbGJhY2sgbm90IGltcGxlbWVudGVkIGZvciBtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBcIjxkZWZhdWx0PlwifWAsXG4gICk7XG59XG5cbi8vIOuqqOuToCBwcm92aWRlcihPcGVuQUkvQW50aHJvcGljKeqwgCDrj5nsnbztlZjqsowgc3RyaWN0IG91dHB1dCBzY2hlbWEg66W8IOyTtOuLpC5cbi8vXG4vLyBTT04tNDk1IOq1kO2biDog7ZWc65WMIEFudGhyb3BpYyByb3V0ZSDrp4wgcmVxdWlyZWQg66W8IOygnOqxsChvcHRpb25hbGl6ZSntlbQgcGFydGlhbC9yZWplY3RlZCBhdHRlbXB0IOqwgFxuLy8g7ISe7Jes64+EIO2GteqzvO2VmOqyjCDtlojsnLzrgpgsIOyLpOy4oSDqsrDqs7wg6re46rKMIOyYpO2eiOugpCBcIuuqqOuNuOydtCDruYTripQg7ZWE65Oc66W8IO2CpOynuCDsg53rnrVcIu2VmOuPhOuhnSDsnKDrj4Ttlojri6Rcbi8vIChyZXF1aXJlZCDsgrTrprAgc2NoZW1hIOuKlCDriITrnb0gMCwgbG9vc2Ug64qUIOuIhOudvSDri6TrsJwpLiBzdHJpY3Qg66GcIOuRkOuptCDrqqjrjbjsnbQg67mg7KeQ7JeG7J20IOyxhOyasOqzoCxcbi8vIOuTnOusvOqyjCDslrTqsqggcHJvdmlkZXIgcmV0cnkg7JiI7IKw7J2EIOyGjOynhO2VnCDruYTsoJXsg4Eg7KKF66OM64+EIOygleynge2VnCDsl5Drn6zroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhd091dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FsbGVyT3V0cHV0U2NoZW1hID0gcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuXG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzLCBjYWxsZXJPdXRwdXRTY2hlbWEpXG4gICAgOiBjYWxsZXJPdXRwdXRTY2hlbWE7XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgcHJvdmlkZXIg6rCAIOykgCDqsJLsnYQg7Jqw7ISgIOyCrOyaqe2VmOqzoCwg7JeG7Jy866m0IOqzte2GtSBjb3N0IO2VqOyImOulvCDsk7Tri6QuXG5mdW5jdGlvbiB0b0VtdWxhdGlvblJlc3VsdChcbiAgcmVzdWx0OiBHZW5lcmF0ZVJlc3VsdCxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIGNvbnN0IGhhc1Byb3ZpZGVyQ29zdCA9IHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwO1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHJlcXVlc3RlZE1vZGVsOiByZXN1bHQucmVxdWVzdGVkTW9kZWwsXG4gICAgbW9kZWxGYWxsYmFja3M6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcyxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gXCJwcm92aWRlclwiIDogXCJwcmljaW5nX3RhYmxlXCIsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBOEJBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELFFBQVEsTUFBc0I7RUFDNUIsT0FBTyxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUs7Q0FDekM7Q0FHQSxZQUFZLElBQVksS0FBeUI7RUFDL0MsS0FBSyxPQUFPLElBQUksSUFBSSxHQUFHO0NBQ3pCO0NBRUEsWUFBWSxJQUFrQjtFQUM1QixLQUFLLE9BQU8sT0FBTyxFQUFFO0NBQ3ZCO0NBRUEsYUFBYSxNQUE0QjtFQUN2QyxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ2xEO0NBRUEsV0FBeUI7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
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
+
import { getAccessToken, getExpiresAt, getRefreshToken } from "../../utils/providers/common/credentials.js";
|
|
2
|
+
import { CallerSchemaValidationError } from "../../utils/providers/common/schema-validation.js";
|
|
1
3
|
import { StreamEvents } from "./qgrid.types.js";
|
|
4
|
+
import { ToolSchemaCompositionError } from "./tool-emulation-schema.js";
|
|
5
|
+
import { QgridDispatcher, buildAndValidateStrictOutputSchema } from "./qgrid.dispatcher.js";
|
|
2
6
|
import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
|
|
3
7
|
import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
|
|
4
|
-
import { TokenModel } from "../token/token.model.js";
|
|
5
|
-
import { getAccessToken, getExpiresAt, getRefreshToken } from "../../utils/providers/common/credentials.js";
|
|
6
|
-
import { QgridDispatcher } from "./qgrid.dispatcher.js";
|
|
7
8
|
import { buildAuthUrl, exchangeCodeForTokens, fetchUsage, generatePKCE, refreshAccessToken } from "./oauth.js";
|
|
8
9
|
import { MICRO_USD, RequestLogModel } from "../request-log/request-log.model.js";
|
|
9
10
|
import { afterQuery, beforeQuery, finishRunAborted, finishRunWithError } from "./qgrid-run-lifecycle.js";
|
|
11
|
+
import { TokenModel } from "../token/token.model.js";
|
|
10
12
|
import { TokenCredentials } from "../token/token.types.js";
|
|
11
13
|
import { BadRequestException, BaseFrameClass, Sonamu, api, stream } from "sonamu";
|
|
12
|
-
import { getLogger } from "@logtape/logtape";
|
|
13
14
|
import crypto from "node:crypto";
|
|
15
|
+
import { getLogger } from "@logtape/logtape";
|
|
14
16
|
import { getCacheManagerRef } from "sonamu/cache";
|
|
15
17
|
//#region src/application/qgrid/qgrid.frame.ts
|
|
16
18
|
const pendingStreams = /* @__PURE__ */ new Map();
|
|
@@ -53,6 +55,16 @@ function rejectLegacyLogMode(args) {
|
|
|
53
55
|
if (!Object.hasOwn(args, "logMode")) return;
|
|
54
56
|
throw new BadRequestException("qgrid: logMode is no longer supported; use logger: false to disable request logging.");
|
|
55
57
|
}
|
|
58
|
+
function rejectInvalidCallerSchemas(args) {
|
|
59
|
+
if (args.jsonSchema === void 0 && !args.tools?.length) return;
|
|
60
|
+
try {
|
|
61
|
+
buildAndValidateStrictOutputSchema(args);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (error instanceof CallerSchemaValidationError || error instanceof ToolSchemaCompositionError) throw new BadRequestException(error.message);
|
|
64
|
+
if (error instanceof Error) throw new BadRequestException(`qgrid: caller schema cannot be normalized: ${error.message}`);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
56
68
|
function createHttpDisconnectHandle() {
|
|
57
69
|
const abortController = new AbortController();
|
|
58
70
|
let requestRaw;
|
|
@@ -85,6 +97,7 @@ var QgridFrameClass = class extends BaseFrameClass {
|
|
|
85
97
|
}
|
|
86
98
|
async query(args) {
|
|
87
99
|
rejectLegacyLogMode(args);
|
|
100
|
+
rejectInvalidCallerSchemas(args);
|
|
88
101
|
const disconnect = createHttpDisconnectHandle();
|
|
89
102
|
try {
|
|
90
103
|
if (args.logger === false) return await QgridDispatcher.query(args, disconnect.signal);
|
|
@@ -122,6 +135,7 @@ var QgridFrameClass = class extends BaseFrameClass {
|
|
|
122
135
|
async prepareStream(args) {
|
|
123
136
|
rejectLegacyLogMode(args);
|
|
124
137
|
rejectImageGenerationStream(args);
|
|
138
|
+
rejectInvalidCallerSchemas(args);
|
|
125
139
|
const streamId = crypto.randomUUID();
|
|
126
140
|
pendingStreams.set(streamId, args);
|
|
127
141
|
setTimeout(() => pendingStreams.delete(streamId), 3e4).unref?.();
|
|
@@ -646,4 +660,4 @@ function convertAnthropicUsage(raw) {
|
|
|
646
660
|
//#endregion
|
|
647
661
|
export { QgridFrame };
|
|
648
662
|
|
|
649
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsLCB0eXBlIFRva2VuVXBkYXRlRmllbGRzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEFudGhyb3BpY1VzYWdlUmF3LFxuICBidWlsZEF1dGhVcmwsXG4gIGV4Y2hhbmdlQ29kZUZvclRva2VucyxcbiAgZmV0Y2hVc2FnZSxcbiAgZ2VuZXJhdGVQS0NFLFxuICByZWZyZXNoQWNjZXNzVG9rZW4sXG59IGZyb20gXCIuL29hdXRoXCI7XG5pbXBvcnQge1xuICBhZnRlclF1ZXJ5LFxuICBiZWZvcmVRdWVyeSxcbiAgZmluaXNoUnVuQWJvcnRlZCxcbiAgZmluaXNoUnVuV2l0aEVycm9yLFxufSBmcm9tIFwiLi9xZ3JpZC1ydW4tbGlmZWN5Y2xlXCI7XG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgQXBwZW5kU3RlcElucHV0LFxuICB0eXBlIENyZWF0ZVJ1bklucHV0LFxuICB0eXBlIEZpbmlzaFJ1bklucHV0LFxuICB0eXBlIEhlYWx0aFJlc3BvbnNlLFxuICB0eXBlIE9BdXRoU3RhcnRSZXN1bHQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICBTdHJlYW1FdmVudHMsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbiAgdHlwZSBVc2FnZVJlc3BvbnNlLFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBwZW5kaW5nU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBRdWVyeUlucHV0PigpO1xuXG50eXBlIFBlbmRpbmdPQXV0aCA9IHsgY29kZVZlcmlmaWVyOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgcmVkaXJlY3RVcmk6IHN0cmluZyB9O1xuY29uc3QgT0FVVEhfU1RBVEVfUFJFRklYID0gXCJvYXV0aDpzdGF0ZTpcIjtcbmNvbnN0IE9BVVRIX1NUQVRFX1RUTCA9IFwiNW1cIjtcblxuZnVuY3Rpb24gdW5peFNlY29uZHNUb0lzbyhzZWNvbmRzOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2Ygc2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IG5ldyBEYXRlKHNlY29uZHMgKiAxMDAwKS50b0lTT1N0cmluZygpIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0T0F1dGhTdGF0ZShzdGF0ZTogc3RyaW5nLCBkYXRhOiBQZW5kaW5nT0F1dGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgdGhyb3cgbmV3IEVycm9yKFwiQ2FjaGVNYW5hZ2VyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgYXdhaXQgY2FjaGUuc2V0KHtcbiAgICBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAsXG4gICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgIHR0bDogT0FVVEhfU1RBVEVfVFRMLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T0F1dGhTdGF0ZShzdGF0ZTogc3RyaW5nKTogUHJvbWlzZTxQZW5kaW5nT0F1dGggfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgdGhyb3cgbmV3IEVycm9yKFwiQ2FjaGVNYW5hZ2VyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgY29uc3QgcmF3ID0gYXdhaXQgY2FjaGUuZ2V0PHN0cmluZz4oeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIFBlbmRpbmdPQXV0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHJldHVybjtcbiAgYXdhaXQgY2FjaGUuZGVsZXRlKHsga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPQXV0aFJlZGlyZWN0VXJpKCk6IHN0cmluZyB7XG4gIGNvbnN0IHB1YmxpY0Jhc2VVcmwgPSBwcm9jZXNzLmVudi5RR1JJRF9QVUJMSUNfQkFTRV9VUkw/LnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIGlmIChwdWJsaWNCYXNlVXJsKSByZXR1cm4gYCR7cHVibGljQmFzZVVybH0vY2FsbGJhY2tgO1xuXG4gIGNvbnN0IHNlcnZlclBvcnQgPSBwcm9jZXNzLmVudi5QT1JUID8/IFwiNDQ5MDBcIjtcbiAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7c2VydmVyUG9ydH0vY2FsbGJhY2tgO1xufVxuXG5mdW5jdGlvbiByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIWFyZ3MuaW1hZ2VHZW5lcmF0aW9uKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGltYWdlR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RyZWFtaW5nOyB1c2UgcXVlcnkvZ2VuZXJhdGVUZXh0IGluc3RlYWQuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RMZWdhY3lMb2dNb2RlKGFyZ3M6IFF1ZXJ5SW5wdXQpOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGFyZ3MsIFwibG9nTW9kZVwiKSkgcmV0dXJuO1xuICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICBcInFncmlkOiBsb2dNb2RlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQ7IHVzZSBsb2dnZXI6IGZhbHNlIHRvIGRpc2FibGUgcmVxdWVzdCBsb2dnaW5nLlwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKToge1xuICBzaWduYWw6IEFib3J0U2lnbmFsO1xuICBkaXNwb3NlOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgbGV0IHJlcXVlc3RSYXc6IEZhc3RpZnlSZXF1ZXN0W1wicmF3XCJdIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVzcG9uc2VSYXc6IEZhc3RpZnlSZXBseVtcInJhd1wiXSB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmVxdWVzdFJhdyA9IGN0eC5yZXF1ZXN0Py5yYXc7XG4gICAgaWYgKGN0eC50cmFuc3BvcnQgPT09IFwiaHR0cFwiKSByZXNwb25zZVJhdyA9IGN0eC5yZXBseS5yYXc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIERpcmVjdCBmcmFtZSBjYWxscyAoZm9yIGV4YW1wbGUgdW5pdCB0ZXN0cykgZG8gbm90IGhhdmUgYW4gSFRUUCBjb250ZXh0LlxuICB9XG5cbiAgY29uc3QgYWJvcnQgPSAoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgY29uc3QgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlID0gKCkgPT4ge1xuICAgIGlmICghcmVzcG9uc2VSYXc/LndyaXRhYmxlRW5kZWQpIGFib3J0KCk7XG4gIH07XG5cbiAgcmVxdWVzdFJhdz8ub25jZShcImFib3J0ZWRcIiwgYWJvcnQpO1xuICByZXNwb25zZVJhdz8ub25jZShcImNsb3NlXCIsIGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSk7XG5cbiAgaWYgKHJlcXVlc3RSYXc/LmFib3J0ZWQgfHwgKHJlc3BvbnNlUmF3Py5kZXN0cm95ZWQgJiYgIXJlc3BvbnNlUmF3LndyaXRhYmxlRW5kZWQpKSB7XG4gICAgYWJvcnQoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIHJlcXVlc3RSYXc/LnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRlZFwiLCBhYm9ydCk7XG4gICAgICByZXNwb25zZVJhdz8ucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgcmVqZWN0TGVnYWN5TG9nTW9kZShhcmdzKTtcbiAgICBjb25zdCBkaXNjb25uZWN0ID0gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGFyZ3MubG9nZ2VyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KGFyZ3MsIGRpc2Nvbm5lY3Quc2lnbmFsKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9ID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgICBsZXQgcmVzdWx0OiBRdWVyeU91dHB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShhcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4LCBhcmdzLCByZXN1bHQpO1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0b29sLWNhbGwgcmVxdWVzdExvZ0lk7JmAIHByb3ZpZGVyIHRocmVhZENvb3Jk64qUIOyEnOuhnCDrj4Xrpr3soIHsnLzroZwg7Jyg7KeA7ZWc64ukLlxuICAgICAgICBjb25zdCB0aHJlYWRDb29yZCA9IHJlc3VsdC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcbiAgICAgICAgY29uc3QgcnVuQ29udGV4dCA9XG4gICAgICAgICAgbGlmZWN5Y2xlLnJ1bkNvbnRleHQgfHwgdGhyZWFkQ29vcmRcbiAgICAgICAgICAgID8geyAuLi5saWZlY3ljbGUucnVuQ29udGV4dCwgLi4uKHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDoge30pIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi5yZXN1bHQsIHJ1bkNvbnRleHQgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBxdWVyeSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHByb3ZpZGVyIOydkeuLteydgCDshLHqs7XtlojsnLzrr4DroZwg66Gc6rmFIOyepeyVoOqwgCDsg53shLEg6rKw6rO866W8IOuNruyWtOyTsOyngCDslYrripTri6QuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc2Nvbm5lY3QuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBwcmVwYXJlU3RyZWFtKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHsgc3RyZWFtSWQ6IHN0cmluZyB9PiB7XG4gICAgcmVqZWN0TGVnYWN5TG9nTW9kZShhcmdzKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIHBlbmRpbmdTdHJlYW1zLnNldChzdHJlYW1JZCwgYXJncyk7XG4gICAgY29uc3QgZXhwaXJ5ID0gc2V0VGltZW91dCgoKSA9PiBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpLCAzMF8wMDApO1xuICAgIGV4cGlyeS51bnJlZj8uKCk7XG4gICAgcmV0dXJuIHsgc3RyZWFtSWQgfTtcbiAgfVxuXG4gIEBzdHJlYW0oeyB0eXBlOiBcInNzZVwiLCBldmVudHM6IFN0cmVhbUV2ZW50cyB9KVxuICBhc3luYyBxdWVyeVN0cmVhbShzdHJlYW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXJncyA9IHBlbmRpbmdTdHJlYW1zLmdldChzdHJlYW1JZCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKTtcbiAgICBpZiAoIWFyZ3MpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3IgZXhwaXJlZCBzdHJlYW1JZFwiKTtcbiAgICByZWplY3RMZWdhY3lMb2dNb2RlKGFyZ3MpO1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcblxuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3NlID0gY3R4LmNyZWF0ZVNTRShTdHJlYW1FdmVudHMpO1xuICAgIGxldCB0aHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtUmVzdWx0OiBRdWVyeU91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCBjbGllbnRDbG9zZWQgPSBmYWxzZTtcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBjb25zdCBpbnRlcnJ1cHRPcGVuQUkgPSAoKSA9PiB7XG4gICAgICBpZiAodGhyZWFkSWQgJiYgdHVybklkKSB7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5pbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkLCB0dXJuSWQpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3NlLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgY2xpZW50Q2xvc2VkID0gdHJ1ZTtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcnVuSW5mbzogeyByZXF1ZXN0TG9nSWQ6IG51bWJlcjsgc3RlcEluZGV4OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sb2dnZXIgIT09IGZhbHNlKSB7XG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCEIHJ1bm5pbmcgcm93IOyDneyEseyXkCDsi6TtjKjtlZjrqbQgbG9nZ2VkIOyalOyyreycvOuhnCDsp4TtlontlZjsp4Ag7JWK64qU64ukLlxuICAgICAgcnVuSW5mbyA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgIH1cblxuICAgIC8vIGJlZm9yZVF1ZXJ5IERCIOyekeyXhSDspJEgY2xvc2Xrpbwg64aT7LmY7KeAIOyViuqzoCBwcm92aWRlciDsi6Ttlokg7KCE7JeQIOuniOqwkO2VnOuLpC5cbiAgICBpZiAoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5U3RyZWFtKFxuICAgICAgICBhcmdzLFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogKHRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImRlbHRhXCIsIHsgdGV4dCB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IChpZCkgPT4ge1xuICAgICAgICAgICAgdGhyZWFkSWQgPSBpZDtcbiAgICAgICAgICAgIGlmICgoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpICYmIHR1cm5JZCkge1xuICAgICAgICAgICAgICBpbnRlcnJ1cHRPcGVuQUkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVHVybklkOiAoaWQpID0+IHtcbiAgICAgICAgICAgIHR1cm5JZCA9IGlkO1xuICAgICAgICAgICAgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgdGhyZWFkSWQpIHtcbiAgICAgICAgICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1FcnJvciA9IGVycjtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdHJlYW1FcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgfVxuXG4gICAgLy8gcHJvdmlkZXIg6rKw6rO86rCAIOyXhuuKlCBjbG9zZeuKlCDsponsi5wgYWJvcnRlZOuhnCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCAmJiAhc3RyZWFtUmVzdWx0KSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZGlzcGF0Y2hlciDsmYTro4wg7ZuEIGxpZmVjeWNsZSDsspjrpqwgKGF3YWl0IOyViOyghClcbiAgICBpZiAoc3RyZWFtUmVzdWx0KSB7XG4gICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsi6TsnYAgdGhyZWFkIOyerOyCrOyaqSDsooztkZzripQgbG9nZ2VyIOyEpOygleqzvCDrrLTqtIDtlZjqsowg7ZqM7Iah7ZWc64ukLlxuICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSBzdHJlYW1SZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICBsZXQgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhyZWFkQ29vcmQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gY2xvc2Ug7ZuEIOuPhOywqe2VnCDqsrDqs7zrj4Qgc3RlcC91c2FnZeuKlCDrgqjquLDrkJgsIOyVhOuemOyXkOyEnCDstZzsooUgc3RhdHVz66W8IGFib3J0ZWTroZwg642u7Ja07JO064ukLlxuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkoXG4gICAgICAgICAgICBydW5JbmZvLnJlcXVlc3RMb2dJZCxcbiAgICAgICAgICAgIHJ1bkluZm8uc3RlcEluZGV4LFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkNvbnRleHQgPVxuICAgICAgICAgICAgbGlmZWN5Y2xlLnJ1bkNvbnRleHQgfHwgdGhyZWFkQ29vcmRcbiAgICAgICAgICAgICAgPyB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCAuLi4odGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB7fSkgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIC8vIGFmdGVyUXVlcnnqsIAg7KeE7ZaJ65CY64qUIOyCrOydtCBjbGllbnTqsIAg64ur7Z6MIOqyveyasCDsmYTro4wg7IOB7YOc66W8IGFib3J0ZWTroZwg65CY64+M66aw64ukLlxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgc3RyZWFtIGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihydW5JbmZvLnJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuXG4gICAgICAgICAgaWYgKGNsaWVudENsb3NlZCkge1xuICAgICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkb25lXCIsIHsgLi4uc3RyZWFtUmVzdWx0LCBydW5Db250ZXh0IH0pO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyb3IpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIHN0cmVhbUVycm9yLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZXJyb3JcIiwgeyBtZXNzYWdlOiBzdHJlYW1FcnJvci5tZXNzYWdlIH0pO1xuICAgIH0gZWxzZSBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiBydW5JbmZvKSB7XG4gICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzc2UuZW5kKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgY3JlYXRlUnVuKGlucHV0OiBDcmVhdGVSdW5JbnB1dCk6IFByb21pc2U8eyByZXF1ZXN0TG9nSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogaW5wdXQudXNlclByb21wdCxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogaW5wdXQucHJvamVjdE5hbWUsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBpbnB1dC5zeXN0ZW1Qcm9tcHQsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0LnJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBpbnB1dC5mYWxsYmFja0NvdW50LFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjFoVG9rZW5zLFxuICAgICAgY29zdF91c2Q6IGlucHV0LmNvc3RVc2QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGgucm91bmQoaW5wdXQuY29zdFVzZCAqIE1JQ1JPX1VTRCksXG4gICAgICBjb3N0X3NvdXJjZTogaW5wdXQuY29zdFNvdXJjZSxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QodG9rZW5OYW1lPzogc3RyaW5nKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QoeyB0b2tlbl9uYW1lOiB0b2tlbk5hbWUgfSkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHByb2plY3ROYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0UHJvamVjdE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0PzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgdXBkYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKFxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihxdW90YVRocmVzaG9sZCkgfHwgcXVvdGFUaHJlc2hvbGQgPCAxIHx8IHF1b3RhVGhyZXNob2xkID4gMTAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwicXVvdGFUaHJlc2hvbGQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwLCBvciBudWxsXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpIHx8IHdlaWdodCA8IDEgfHwgd2VpZ2h0ID4gMTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuVXBkYXRlRmllbGRzID0ge307XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcGF0Y2gubmFtZSA9IG5hbWU7XG4gICAgaWYgKHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHBhdGNoLnF1b3RhX3RocmVzaG9sZCA9IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCkgcGF0Y2gud2VpZ2h0ID0gd2VpZ2h0O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID09PSAwKSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IFRva2VuTW9kZWwudXBkYXRlRmllbGRzKGlkLCBwYXRjaCk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdXBkYXRlZCA+IDAgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgcmV0dXJuIHsgcmVtb3ZlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2GoO2BsCDtmZzshLHtmZQv67mE7Zmc7ISx7ZmUIO2GoOq4gCBEQuydmCBhY3RpdmUg7ZWE65OcIOyXheuNsOydtO2KuFxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHRvZ2dsZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgYWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG5cbiAgICBjb25zdCBuZXdBY3RpdmUgPSAhZW50cnkuYWN0aXZlO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBlbnRyeS5jcmVkZW50aWFscyxcbiAgICAgICAgYWN0aXZlOiBuZXdBY3RpdmUsXG4gICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFjdGl2ZTogbmV3QWN0aXZlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlUEtDRSgpO1xuXG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSBnZXRPQXV0aFJlZGlyZWN0VXJpKCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrOiBpbnZhbGlkX3N0YXRlXCIpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249aW52YWxpZF9zdGF0ZVwiKTtcbiAgICB9XG4gICAgYXdhaXQgZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICAgICAgICBjb2RlLFxuICAgICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBlbmRpbmcucmVkaXJlY3RVcmksXG4gICAgICApO1xuXG4gICAgICBpZiAodG9rZW5zLmFjY291bnRVdWlkKSB7XG4gICAgICAgIGNvbnN0IG9sZEVudHJpZXMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeUFjY291bnRJZGVudGlmaWVyKFxuICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgIFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgdG9rZW5zLmFjY291bnRVdWlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHRva2Vucy5leHBpcmVzQXQgPz8gMCxcbiAgICAgICAgICAgIGFjY291bnRVdWlkOiB0b2tlbnMuYWNjb3VudFV1aWQgPz8gXCJcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IHBlbmRpbmcubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnRPcGVuQUkobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgaWYgKCFRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IEVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIGNvbnN0IHsgYXV0aFVybCB9ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RhcnRCcm93c2VyTG9naW4obmFtZSk7XG5cbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQ6IGNvZGV4IGxvZ2luIOyZhOujjCDrjIDquLAg4oaSIO2GoO2BsCDsoIDsnqVcbiAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgLmNvbXBsZXRlQnJvd3NlckxvZ2luKClcbiAgICAgIC50aGVuKGFzeW5jIChjcmVkcykgPT4ge1xuICAgICAgICBpZiAoY3JlZHMuYWNjb3VudElkKSB7XG4gICAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgICBcIkFcIixcbiAgICAgICAgICAgIFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgaWRUb2tlbjogY3JlZHMuaWRUb2tlbixcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IERhdGUubm93KCkgKyAxMCAqIDI0ICogMzYwMCAqIDEwMDAsXG4gICAgICAgICAgICAgIGFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7bmFtZX1gKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE9wZW5BSSBicm93c2VyIGxvZ2luIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdXNhZ2UodG9rZW5JZD86IG51bWJlcik6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcm93czogYWxsVG9rZW5zIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBlbnRyeSA9IHRva2VuSWRcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUuaWQgPT09IHRva2VuSWQpXG4gICAgICA6IGFsbFRva2Vucy5maW5kTGFzdCgoZSkgPT4gZS5hY3RpdmUgJiYgZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIik7XG5cbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBlcnJvcjogXCJOT1RfRk9VTkRcIiB9O1xuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIWVudHJ5LmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlcjogXCJvcGVuYWlcIiwgZml2ZUhvdXI6IG51bGwsIHNldmVuRGF5OiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKGVudHJ5LmlkKTtcbiAgICAgICAgY29uc3QgcmwgPSByYXc/LmRhdGEucmF0ZUxpbWl0cztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBmaXZlSG91cjogcmw/LnByaW1hcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5wcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnByaW1hcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwucHJpbWFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZXZlbkRheTogcmw/LnNlY29uZGFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnNlY29uZGFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5zZWNvbmRhcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwuc2Vjb25kYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE9wZW5BSSB1c2FnZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5wcm92aWRlciAhPT0gXCJhbnRocm9waWNcIikge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGB1c2FnZSBBUEkgbm90IHN1cHBvcnRlZCBmb3IgcHJvdmlkZXI6ICR7ZW50cnkucHJvdmlkZXJ9YCB9O1xuICAgIH1cblxuICAgIGxldCBhY2Nlc3NUb2tlbiA9IGdldEFjY2Vzc1Rva2VuKGVudHJ5LmNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBnZXRFeHBpcmVzQXQoZW50cnkuY3JlZGVudGlhbHMpIDwgRGF0ZS5ub3coKTtcblxuICAgIGlmIChpc0V4cGlyZWQgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgaWYgKHJhdy5lcnJvciAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgICAgY29uc3QgcmV0cmllZCA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAocmV0cmllZC5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJldHJpZWQuZXJyb3IgfTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyZXRyaWVkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJhdy5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJhdy5lcnJvciB9O1xuICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hUb2tlbih0b2tlbjogVG9rZW5TdWJzZXRBKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjcmVkcyA9IHRva2VuLmNyZWRlbnRpYWxzO1xuICAgIGNvbnN0IHJ0ID0gZ2V0UmVmcmVzaFRva2VuKGNyZWRzKTtcbiAgICBpZiAoIXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWZyZXNoIHRva2VuXCIpO1xuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgY29uc3QgdXBkYXRlZCA9IFRva2VuQ3JlZGVudGlhbHMucGFyc2Uoe1xuICAgICAgLi4uY3JlZHMsXG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkLmFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoZWQucmVmcmVzaFRva2VuLFxuICAgICAgZXhwaXJlc0F0OiByZWZyZXNoZWQuZXhwaXJlc0F0LFxuICAgIH0pO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgcHJvdmlkZXI6IHRva2VuLnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogdXBkYXRlZCxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlZnJlc2hlZC5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIGhlYWx0aCgpOiBQcm9taXNlPEhlYWx0aFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgYWN0aXZlVG9rZW5zOiBRZ3JpZERpc3BhdGNoZXIudG9rZW5zLnNpemUsXG4gICAgICBzdWJzY3JpYmVyOiBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcj8uc3RhdHVzKCkgPz8gbnVsbCxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZEZyYW1lID0gbmV3IFFncmlkRnJhbWVDbGFzcygpO1xuXG5mdW5jdGlvbiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3OiBBbnRocm9waWNVc2FnZVJhdyk6IFVzYWdlUmVzcG9uc2Uge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgIGZpdmVIb3VyOiByYXcuZml2ZV9ob3VyXG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5maXZlX2hvdXIudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuZml2ZV9ob3VyLnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gICAgc2V2ZW5EYXk6IHJhdy5zZXZlbl9kYXlcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LnNldmVuX2RheS51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5zZXZlbl9kYXkucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBOENBLE1BQU0saUNBQWlCLElBQUksSUFBd0I7QUFHbkQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsU0FBUyxpQkFBaUIsU0FBbUQ7Q0FDM0UsT0FBTyxPQUFPLFlBQVksNEJBQVcsSUFBSSxLQUFLLFVBQVUsR0FBSSxFQUFDLENBQUMsWUFBWSxJQUFJO0FBQ2hGO0FBRUEsZUFBZSxjQUFjLE9BQWUsTUFBbUM7Q0FDN0UsTUFBTSxRQUFRLG1CQUFtQjtDQUNqQyxJQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSw4QkFBOEI7Q0FDMUQsTUFBTSxNQUFNLElBQUk7RUFDZCxLQUFLLEdBQUcscUJBQXFCO0VBQzdCLE9BQU8sS0FBSyxVQUFVLElBQUk7RUFDMUIsS0FBSztDQUNQLENBQUM7QUFDSDtBQUVBLGVBQWUsY0FBYyxPQUFrRDtDQUM3RSxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLDhCQUE4QjtDQUMxRCxNQUFNLE1BQU0sTUFBTSxNQUFNLElBQVksRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztDQUM1RSxJQUFJLENBQUMsS0FBSyxPQUFPO0NBQ2pCLE9BQU8sS0FBSyxNQUFNLEdBQUc7QUFDdkI7QUFFQSxlQUFlLGlCQUFpQixPQUE4QjtDQUM1RCxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPO0NBQ1osTUFBTSxNQUFNLE9BQU8sRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztBQUM3RDtBQUVBLFNBQVMsc0JBQThCO0NBQ3JDLE1BQU0sZ0JBQWdCLFFBQVEsSUFBSSx1QkFBdUIsUUFBUSxRQUFRLEVBQUU7Q0FDM0UsSUFBSSxlQUFlLE9BQU8sR0FBRyxjQUFjO0NBRzNDLE9BQU8s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
|
|
663
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNSUNST19VU0QsIFJlcXVlc3RMb2dNb2RlbCB9IGZyb20gXCIuLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCwgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgVG9rZW5DcmVkZW50aWFscyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHtcbiAgYWZ0ZXJRdWVyeSxcbiAgYmVmb3JlUXVlcnksXG4gIGZpbmlzaFJ1bkFib3J0ZWQsXG4gIGZpbmlzaFJ1bldpdGhFcnJvcixcbn0gZnJvbSBcIi4vcWdyaWQtcnVuLWxpZmVjeWNsZVwiO1xuaW1wb3J0IHsgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYSwgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBRdWVyeUlucHV0LFxuICB0eXBlIEFwcGVuZFN0ZXBJbnB1dCxcbiAgdHlwZSBDcmVhdGVSdW5JbnB1dCxcbiAgdHlwZSBGaW5pc2hSdW5JbnB1dCxcbiAgdHlwZSBIZWFsdGhSZXNwb25zZSxcbiAgdHlwZSBPQXV0aFN0YXJ0UmVzdWx0LFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxuICB0eXBlIFFncmlkUnVuQ29udGV4dCxcbiAgU3RyZWFtRXZlbnRzLFxuICB0eXBlIFRva2VuU3RhdHMsXG4gIHR5cGUgVXNhZ2VSZXNwb25zZSxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmNvbnN0IHBlbmRpbmdTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5SW5wdXQ+KCk7XG5cbnR5cGUgUGVuZGluZ09BdXRoID0geyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nOyByZWRpcmVjdFVyaTogc3RyaW5nIH07XG5jb25zdCBPQVVUSF9TVEFURV9QUkVGSVggPSBcIm9hdXRoOnN0YXRlOlwiO1xuY29uc3QgT0FVVEhfU1RBVEVfVFRMID0gXCI1bVwiO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9BdXRoUmVkaXJlY3RVcmkoKTogc3RyaW5nIHtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IHByb2Nlc3MuZW52LlFHUklEX1BVQkxJQ19CQVNFX1VSTD8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHB1YmxpY0Jhc2VVcmwpIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS9jYWxsYmFja2A7XG5cbiAgY29uc3Qgc2VydmVyUG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXJQb3J0fS9jYWxsYmFja2A7XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlamVjdExlZ2FjeUxvZ01vZGUoYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYXJncywgXCJsb2dNb2RlXCIpKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGxvZ01vZGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZDsgdXNlIGxvZ2dlcjogZmFsc2UgdG8gZGlzYWJsZSByZXF1ZXN0IGxvZ2dpbmcuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RJbnZhbGlkQ2FsbGVyU2NoZW1hcyhhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmIChhcmdzLmpzb25TY2hlbWEgPT09IHVuZGVmaW5lZCAmJiAhYXJncy50b29scz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGFyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yIHx8XG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlcnJvci5tZXNzYWdlIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuICAgIC8vIOyemOuqu+uQnCBrZXl3b3JkIO2Yle2DnChhbnlPZiDrpbwg6rCd7LK066GcIOuztOuCtOuKlCDrk7Ep64qUIO2MjOydtO2UhOudvOyduOyXkOyEnCB1bnR5cGVkIOyYpOulmOuhnCDrgpjsmKTrr4DroZwsXG4gICAgLy8g7YOA7J6FIOyige2eiOq4sCDrjIDsi6AgRXJyb3Ig7KCE7LK066W8IGNhbGxlci1mYXVsdCA0MDAg7Jy866GcIOunpO2Vke2VnOuLpCjqs4Tslb0g7YWM7Iqk7Yq466GcIOqzoOygleuQqCkuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgcWdyaWQ6IGNhbGxlciBzY2hlbWEgY2Fubm90IGJlIG5vcm1hbGl6ZWQ6ICR7ZXJyb3IubWVzc2FnZX1gIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk6IHtcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgZGlzcG9zZTogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCByZXF1ZXN0UmF3OiBGYXN0aWZ5UmVxdWVzdFtcInJhd1wiXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmF3OiBGYXN0aWZ5UmVwbHlbXCJyYXdcIl0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJlcXVlc3RSYXcgPSBjdHgucmVxdWVzdD8ucmF3O1xuICAgIGlmIChjdHgudHJhbnNwb3J0ID09PSBcImh0dHBcIikgcmVzcG9uc2VSYXcgPSBjdHgucmVwbHkucmF3O1xuICB9IGNhdGNoIHtcbiAgICAvLyBEaXJlY3QgZnJhbWUgY2FsbHMgKGZvciBleGFtcGxlIHVuaXQgdGVzdHMpIGRvIG5vdCBoYXZlIGFuIEhUVFAgY29udGV4dC5cbiAgfVxuXG4gIGNvbnN0IGFib3J0ID0gKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIGNvbnN0IGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSA9ICgpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlUmF3Py53cml0YWJsZUVuZGVkKSBhYm9ydCgpO1xuICB9O1xuXG4gIHJlcXVlc3RSYXc/Lm9uY2UoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgcmVzcG9uc2VSYXc/Lm9uY2UoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuXG4gIGlmIChyZXF1ZXN0UmF3Py5hYm9ydGVkIHx8IChyZXNwb25zZVJhdz8uZGVzdHJveWVkICYmICFyZXNwb25zZVJhdy53cml0YWJsZUVuZGVkKSkge1xuICAgIGFib3J0KCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICByZXF1ZXN0UmF3Py5yZW1vdmVMaXN0ZW5lcihcImFib3J0ZWRcIiwgYWJvcnQpO1xuICAgICAgcmVzcG9uc2VSYXc/LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlKTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuY29uc3Qgb2F1dGhMb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvYXV0aFwiXSk7XG5cbmNsYXNzIFFncmlkRnJhbWVDbGFzcyBleHRlbmRzIEJhc2VGcmFtZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJRZ3JpZFwiKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBxdWVyeShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIHJlamVjdExlZ2FjeUxvZ01vZGUoYXJncyk7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3QgZGlzY29ubmVjdCA9IGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhcmdzLmxvZ2dlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShhcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfSA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgICAgbGV0IHJlc3VsdDogUXVlcnlPdXRwdXQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgZGlzY29ubmVjdC5zaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocmVxdWVzdExvZ0lkLCAoZSBhcyBFcnJvcikubWVzc2FnZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgYXJncywgcmVzdWx0KTtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9vbC1jYWxsIHJlcXVlc3RMb2dJZOyZgCBwcm92aWRlciB0aHJlYWRDb29yZOuKlCDshJzroZwg64+F66a97KCB7Jy866GcIOycoOyngO2VnOuLpC5cbiAgICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICAgIGNvbnN0IHJ1bkNvbnRleHQgPVxuICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICA/IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIC4uLih0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHt9KSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4ucmVzdWx0LCBydW5Db250ZXh0IH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgcXVlcnkgYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcm92aWRlciDsnZHri7XsnYAg7ISx6rO17ZaI7Jy866+A66GcIOuhnOq5hSDsnqXslaDqsIAg7IOd7ISxIOqysOqzvOulvCDrja7slrTsk7Dsp4Ag7JWK64qU64ukLlxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNjb25uZWN0LmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcHJlcGFyZVN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTx7IHN0cmVhbUlkOiBzdHJpbmcgfT4ge1xuICAgIHJlamVjdExlZ2FjeUxvZ01vZGUoYXJncyk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IHN0cmVhbUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5zZXQoc3RyZWFtSWQsIGFyZ3MpO1xuICAgIGNvbnN0IGV4cGlyeSA9IHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICBleHBpcnkudW5yZWY/LigpO1xuICAgIHJldHVybiB7IHN0cmVhbUlkIH07XG4gIH1cblxuICBAc3RyZWFtKHsgdHlwZTogXCJzc2VcIiwgZXZlbnRzOiBTdHJlYW1FdmVudHMgfSlcbiAgYXN5bmMgcXVlcnlTdHJlYW0oc3RyZWFtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFyZ3MgPSBwZW5kaW5nU3RyZWFtcy5nZXQoc3RyZWFtSWQpO1xuICAgIHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCk7XG4gICAgaWYgKCFhcmdzKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG9yIGV4cGlyZWQgc3RyZWFtSWRcIik7XG4gICAgcmVqZWN0TGVnYWN5TG9nTW9kZShhcmdzKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG5cbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IHNzZSA9IGN0eC5jcmVhdGVTU0UoU3RyZWFtRXZlbnRzKTtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHVybklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbVJlc3VsdDogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2xpZW50Q2xvc2VkID0gZmFsc2U7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgaW50ZXJydXB0T3BlbkFJID0gKCkgPT4ge1xuICAgICAgaWYgKHRocmVhZElkICYmIHR1cm5JZCkge1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZCwgdHVybklkKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGNsaWVudENsb3NlZCA9IHRydWU7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgICAgLy8gcHJvdmlkZXIg7Iuk7ZaJIOyghCBydW5uaW5nIHJvdyDsg53shLHsl5Ag7Iuk7Yyo7ZWY66m0IGxvZ2dlZCDsmpTssq3snLzroZwg7KeE7ZaJ7ZWY7KeAIOyViuuKlOuLpC5cbiAgICAgIHJ1bkluZm8gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICB9XG5cbiAgICAvLyBiZWZvcmVRdWVyeSBEQiDsnpHsl4Ug7KSRIGNsb3Nl66W8IOuGk+y5mOyngCDslYrqs6AgcHJvdmlkZXIg7Iuk7ZaJIOyghOyXkCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShcbiAgICAgICAgYXJncyxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRocmVhZElkOiAoaWQpID0+IHtcbiAgICAgICAgICAgIHRocmVhZElkID0gaWQ7XG4gICAgICAgICAgICBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiB0dXJuSWQpIHtcbiAgICAgICAgICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblR1cm5JZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0dXJuSWQgPSBpZDtcbiAgICAgICAgICAgIGlmICgoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpICYmIHRocmVhZElkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3RyZWFtRXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIHByb3ZpZGVyIOqysOqzvOqwgCDsl4bripQgY2xvc2XripQg7KaJ7IucIGFib3J0ZWTroZwg66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgJiYgIXN0cmVhbVJlc3VsdCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGc64qUIGxvZ2dlciDshKTsoJXqs7wg66y06rSA7ZWY6rKMIO2ajOyGoe2VnOuLpC5cbiAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gc3RyZWFtUmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgbGV0IHJ1bkNvbnRleHQ6IFFncmlkUnVuQ29udGV4dCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRocmVhZENvb3JkICE9PSB1bmRlZmluZWQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGNsb3NlIO2bhCDrj4TssKntlZwg6rKw6rO864+EIHN0ZXAvdXNhZ2XripQg64Ko6riw65CYLCDslYTrnpjsl5DshJwg7LWc7KKFIHN0YXR1c+ulvCBhYm9ydGVk66GcIOuNruyWtOyTtOuLpC5cbiAgICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KFxuICAgICAgICAgICAgcnVuSW5mby5yZXF1ZXN0TG9nSWQsXG4gICAgICAgICAgICBydW5JbmZvLnN0ZXBJbmRleCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Db250ZXh0ID1cbiAgICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICAgID8geyAuLi5saWZlY3ljbGUucnVuQ29udGV4dCwgLi4uKHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDoge30pIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAvLyBhZnRlclF1ZXJ56rCAIOynhO2WieuQmOuKlCDsgqzsnbQgY2xpZW506rCAIOuLq+2ejCDqsr3smrAg7JmE66OMIOyDge2DnOulvCBhYm9ydGVk66GcIOuQmOuPjOumsOuLpC5cbiAgICAgICAgICBpZiAoY2xpZW50Q2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcblxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBzdHJlYW1FcnJvci5tZXNzYWdlLCBhcmdzKTtcbiAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGlucHV0LnByb2plY3ROYW1lLFxuICAgICAgc3lzdGVtX3Byb21wdDogaW5wdXQuc3lzdGVtUHJvbXB0LFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYXBwZW5kU3RlcChpbnB1dDogQXBwZW5kU3RlcElucHV0KTogUHJvbWlzZTx7IHN0ZXBJZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGVwSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0ZXBfaW5kZXg6IGlucHV0LnN0ZXBJbmRleCxcbiAgICAgIHR5cGU6IGlucHV0LnR5cGUsXG4gICAgICBtb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQucmVxdWVzdGVkTW9kZWxOYW1lLFxuICAgICAgZmFsbGJhY2tfY291bnQ6IGlucHV0LmZhbGxiYWNrQ291bnQsXG4gICAgICBpbnB1dF90b2tlbnM6IGlucHV0LmlucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LmNhY2hlUmVhZFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvbjVtVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uMWhUb2tlbnMsXG4gICAgICBjb3N0X3VzZDogaW5wdXQuY29zdFVzZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTWF0aC5yb3VuZChpbnB1dC5jb3N0VXNkICogTUlDUk9fVVNEKSxcbiAgICAgIGNvc3Rfc291cmNlOiBpbnB1dC5jb3N0U291cmNlLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICB0dGZ0X21zOiBpbnB1dC50dGZ0TXMgPz8gbnVsbCxcbiAgICAgIGZpbmlzaF9yZWFzb246IGlucHV0LmZpbmlzaFJlYXNvbixcbiAgICAgIHJlYXNvbmluZ190ZXh0OiBpbnB1dC5yZWFzb25pbmdUZXh0LFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogaW5wdXQucmVhc29uaW5nVG9rZW5zLFxuICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbnB1dC50b29sQ2FsbEluZGV4LFxuICAgICAgdG9vbF9jYWxsX2lkOiBpbnB1dC50b29sQ2FsbElkLFxuICAgICAgdG9vbF9uYW1lOiBpbnB1dC50b29sTmFtZSxcbiAgICAgIHRvb2xfYXJnczogaW5wdXQudG9vbEFyZ3MsXG4gICAgICB0b29sX3Jlc3VsdDogaW5wdXQudG9vbFJlc3VsdCxcbiAgICAgIHRvb2xfZHVyYXRpb25fbXM6IGlucHV0LnRvb2xEdXJhdGlvbk1zLFxuICAgICAgZXJyb3I6IGlucHV0LmVycm9yLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZXBJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGZpbmlzaFJ1bihpbnB1dDogRmluaXNoUnVuSW5wdXQpOiBQcm9taXNlPHsgb2s6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4oaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlOiBpbnB1dC5yZXNwb25zZSxcbiAgICAgIHRva2VuX25hbWU6IGlucHV0LnRva2VuTmFtZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQudG90YWxJbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0LnRvdGFsT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjVtVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQudG90YWxEdXJhdGlvbk1zLFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBpbnB1dC5lcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8VG9rZW5TdGF0c1tdPiB7XG4gICAgcmV0dXJuIFFncmlkRGlzcGF0Y2hlci5nZXRTdGF0cygpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG90YWxDb3N0KHRva2VuTmFtZT86IHN0cmluZyk6IFByb21pc2U8eyB1c2Q6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHsgdXNkOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwudG90YWxDb3N0KHsgdG9rZW5fbmFtZTogdG9rZW5OYW1lIH0pIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBwcm9qZWN0TmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdFByb2plY3ROYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYWRkVG9rZW4oXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBuYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiXSB9KVxuICBhc3luYyB1cGRhdGVUb2tlbihcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodD86IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IHVwZGF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGlmIChcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSBudWxsICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocXVvdGFUaHJlc2hvbGQpIHx8IHF1b3RhVGhyZXNob2xkIDwgMSB8fCBxdW90YVRocmVzaG9sZCA+IDEwMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcInF1b3RhVGhyZXNob2xkIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCwgb3IgbnVsbFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IDEwMCkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcIndlaWdodCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDBcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoOiBUb2tlblVwZGF0ZUZpZWxkcyA9IHt9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHBhdGNoLm5hbWUgPSBuYW1lO1xuICAgIGlmIChxdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSBwYXRjaC5xdW90YV90aHJlc2hvbGQgPSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAod2VpZ2h0ICE9PSB1bmRlZmluZWQpIHBhdGNoLndlaWdodCA9IHdlaWdodDtcbiAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdXBkYXRlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBUb2tlbk1vZGVsLnVwZGF0ZUZpZWxkcyhpZCwgcGF0Y2gpO1xuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHVwZGF0ZWQgPiAwIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVtb3ZlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyByZW1vdmVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyByZW1vdmVkOiBmYWxzZSB9O1xuICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKFtlbnRyeS5pZF0pO1xuICAgIHJldHVybiB7IHJlbW92ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthqDtgbAg7Zmc7ISx7ZmUL+u5hO2ZnOyEse2ZlCDthqDquIAgRELsnZggYWN0aXZlIO2VhOuTnCDsl4XrjbDsnbTtirhcbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0b2dnbGVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgbmV3QWN0aXZlID0gIWVudHJ5LmFjdGl2ZTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZCxcbiAgICAgICAgcHJvdmlkZXI6IGVudHJ5LnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogZW50cnkuY3JlZGVudGlhbHMsXG4gICAgICAgIGFjdGl2ZTogbmV3QWN0aXZlLFxuICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhY3RpdmU6IG5ld0FjdGl2ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgeyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH0gPSBnZW5lcmF0ZVBLQ0UoKTtcblxuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gZ2V0T0F1dGhSZWRpcmVjdFVyaSgpO1xuICAgIGNvbnN0IGF1dGhVcmwgPSBidWlsZEF1dGhVcmwoY29kZUNoYWxsZW5nZSwgc3RhdGUsIHJlZGlyZWN0VXJpKTtcblxuICAgIGF3YWl0IHNldE9BdXRoU3RhdGUoc3RhdGUsIHsgY29kZVZlcmlmaWVyLCBuYW1lLCByZWRpcmVjdFVyaSB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwgfTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IGF3YWl0IGdldE9BdXRoU3RhdGUoc3RhdGUpO1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvYXV0aCBjYWxsYmFjazogaW52YWxpZF9zdGF0ZVwiKTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWludmFsaWRfc3RhdGVcIik7XG4gICAgfVxuICAgIGF3YWl0IGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgICAgY29kZSxcbiAgICAgICAgcGVuZGluZy5jb2RlVmVyaWZpZXIsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwZW5kaW5nLnJlZGlyZWN0VXJpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHRva2Vucy5hY2NvdW50VXVpZCkge1xuICAgICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlBY2NvdW50SWRlbnRpZmllcihcbiAgICAgICAgICBcIkFcIixcbiAgICAgICAgICBcImFudGhyb3BpY1wiLFxuICAgICAgICAgIHRva2Vucy5hY2NvdW50VXVpZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgZXhwaXJlc0F0OiB0b2tlbnMuZXhwaXJlc0F0ID8/IDAsXG4gICAgICAgICAgICBhY2NvdW50VXVpZDogdG9rZW5zLmFjY291bnRVdWlkID8/IFwiXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYW1lOiBwZW5kaW5nLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPXN1Y2Nlc3MmbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChwZW5kaW5nLm5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0T3BlbkFJKG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGlmICghUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICBjb25zdCB7IGF1dGhVcmwgfSA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyLnN0YXJ0QnJvd3NlckxvZ2luKG5hbWUpO1xuXG4gICAgLy8gZmlyZS1hbmQtZm9yZ2V0OiBjb2RleCBsb2dpbiDsmYTro4wg64yA6riwIOKGkiDthqDtgbAg7KCA7J6lXG4gICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgIC5jb21wbGV0ZUJyb3dzZXJMb2dpbigpXG4gICAgICAudGhlbihhc3luYyAoY3JlZHMpID0+IHtcbiAgICAgICAgaWYgKGNyZWRzLmFjY291bnRJZCkge1xuICAgICAgICAgIGNvbnN0IG9sZEVudHJpZXMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeUFjY291bnRJZGVudGlmaWVyKFxuICAgICAgICAgICAgXCJBXCIsXG4gICAgICAgICAgICBcIm9wZW5haVwiLFxuICAgICAgICAgICAgY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkcy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiBjcmVkcy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICAgIGlkVG9rZW46IGNyZWRzLmlkVG9rZW4sXG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJlc0F0OiBEYXRlLm5vdygpICsgMTAgKiAyNCAqIDM2MDAgKiAxMDAwLFxuICAgICAgICAgICAgICBhY2NvdW50SWQ6IGNyZWRzLmFjY291bnRJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBsb2dnZXIuaW5mbyhgT3BlbkFJIHRva2VuIHNhdmVkIGZvciAke25hbWV9YCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBPcGVuQUkgYnJvd3NlciBsb2dpbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHVzYWdlKHRva2VuSWQ/OiBudW1iZXIpOiBQcm9taXNlPFVzYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHJvd3M6IGFsbFRva2VucyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3QgZW50cnkgPSB0b2tlbklkXG4gICAgICA/IGFsbFRva2Vucy5maW5kKChlKSA9PiBlLmlkID09PSB0b2tlbklkKVxuICAgICAgOiBhbGxUb2tlbnMuZmluZExhc3QoKGUpID0+IGUuYWN0aXZlICYmIGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpO1xuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgZXJyb3I6IFwiTk9UX0ZPVU5EXCIgfTtcblxuICAgIGlmIChlbnRyeS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCFlbnRyeS5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHsgcHJvdmlkZXI6IFwib3BlbmFpXCIsIGZpdmVIb3VyOiBudWxsLCBzZXZlbkRheTogbnVsbCB9O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZChlbnRyeS5pZCk7XG4gICAgICAgIGNvbnN0IHJsID0gcmF3Py5kYXRhLnJhdGVMaW1pdHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgZml2ZUhvdXI6IHJsPy5wcmltYXJ5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB1dGlsaXphdGlvbjogcmwucHJpbWFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5wcmltYXJ5LnJlc2V0c0F0KSxcbiAgICAgICAgICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJsLnByaW1hcnkud2luZG93RHVyYXRpb25NaW5zLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2V2ZW5EYXk6IHJsPy5zZWNvbmRhcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5zZWNvbmRhcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwuc2Vjb25kYXJ5LnJlc2V0c0F0KSxcbiAgICAgICAgICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJsLnNlY29uZGFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBPcGVuQUkgdXNhZ2UgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgIT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIHJldHVybiB7IGVycm9yOiBgdXNhZ2UgQVBJIG5vdCBzdXBwb3J0ZWQgZm9yIHByb3ZpZGVyOiAke2VudHJ5LnByb3ZpZGVyfWAgfTtcbiAgICB9XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBnZXRBY2Nlc3NUb2tlbihlbnRyeS5jcmVkZW50aWFscyk7XG4gICAgY29uc3QgaXNFeHBpcmVkID0gZ2V0RXhwaXJlc0F0KGVudHJ5LmNyZWRlbnRpYWxzKSA8IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNFeHBpcmVkICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgIGlmIChyYXcuZXJyb3IgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICAgIGNvbnN0IHJldHJpZWQgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKHJldHJpZWQuZXJyb3IpIHJldHVybiB7IGVycm9yOiByZXRyaWVkLmVycm9yIH07XG4gICAgICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmV0cmllZCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyYXcuZXJyb3IpIHJldHVybiB7IGVycm9yOiByYXcuZXJyb3IgfTtcbiAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdyk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscztcbiAgICBjb25zdCBydCA9IGdldFJlZnJlc2hUb2tlbihjcmVkcyk7XG4gICAgaWYgKCFydCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmcmVzaCB0b2tlblwiKTtcbiAgICBjb25zdCByZWZyZXNoZWQgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4ocnQpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBUb2tlbkNyZWRlbnRpYWxzLnBhcnNlKHtcbiAgICAgIC4uLmNyZWRzLFxuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkLnJlZnJlc2hUb2tlbixcbiAgICAgIGV4cGlyZXNBdDogcmVmcmVzaGVkLmV4cGlyZXNBdCxcbiAgICB9KTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgIHByb3ZpZGVyOiB0b2tlbi5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWQsXG4gICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiByZWZyZXNoZWQuYWNjZXNzVG9rZW47XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBoZWFsdGgoKTogUHJvbWlzZTxIZWFsdGhSZXNwb25zZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIGFjdGl2ZVRva2VuczogUWdyaWREaXNwYXRjaGVyLnRva2Vucy5zaXplLFxuICAgICAgc3Vic2NyaWJlcjogUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnN0YXR1cygpID8/IG51bGwsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUWdyaWRGcmFtZSA9IG5ldyBRZ3JpZEZyYW1lQ2xhc3MoKTtcblxuZnVuY3Rpb24gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdzogQW50aHJvcGljVXNhZ2VSYXcpOiBVc2FnZVJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICBmaXZlSG91cjogcmF3LmZpdmVfaG91clxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuZml2ZV9ob3VyLnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LmZpdmVfaG91ci5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICAgIHNldmVuRGF5OiByYXcuc2V2ZW5fZGF5XG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5zZXZlbl9kYXkudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuc2V2ZW5fZGF5LnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLE1BQU0saUNBQWlCLElBQUksSUFBd0I7QUFHbkQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsU0FBUyxpQkFBaUIsU0FBbUQ7Q0FDM0UsT0FBTyxPQUFPLFlBQVksNEJBQVcsSUFBSSxLQUFLLFVBQVUsR0FBSSxFQUFDLENBQUMsWUFBWSxJQUFJO0FBQ2hGO0FBRUEsZUFBZSxjQUFjLE9BQWUsTUFBbUM7Q0FDN0UsTUFBTSxRQUFRLG1CQUFtQjtDQUNqQyxJQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSw4QkFBOEI7Q0FDMUQsTUFBTSxNQUFNLElBQUk7RUFDZCxLQUFLLEdBQUcscUJBQXFCO0VBQzdCLE9BQU8sS0FBSyxVQUFVLElBQUk7RUFDMUIsS0FBSztDQUNQLENBQUM7QUFDSDtBQUVBLGVBQWUsY0FBYyxPQUFrRDtDQUM3RSxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLDhCQUE4QjtDQUMxRCxNQUFNLE1BQU0sTUFBTSxNQUFNLElBQVksRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztDQUM1RSxJQUFJLENBQUMsS0FBSyxPQUFPO0NBQ2pCLE9BQU8sS0FB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
|