sonamu 0.7.21 → 0.7.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/agents/agent.d.ts +6 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +20 -5
- package/dist/api/base-frame.d.ts +4 -0
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +9 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +2 -2
- package/dist/api/config.d.ts +35 -3
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/decorators.d.ts +4 -4
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +80 -18
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +2 -1
- package/dist/api/secret.d.ts +7 -0
- package/dist/api/secret.d.ts.map +1 -0
- package/dist/api/secret.js +17 -0
- package/dist/api/sonamu.d.ts +17 -8
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +265 -47
- package/dist/cache/cache-manager.d.ts +11 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +22 -0
- package/dist/cache/decorator.d.ts +31 -0
- package/dist/cache/decorator.d.ts.map +1 -0
- package/dist/cache/decorator.js +86 -0
- package/dist/cache/drivers.d.ts +33 -0
- package/dist/cache/drivers.d.ts.map +1 -0
- package/dist/cache/drivers.js +36 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +8 -0
- package/dist/cache/types.d.ts +28 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +6 -0
- package/dist/database/base-model.d.ts +4 -2
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +9 -4
- package/dist/database/code-generator.d.ts +3 -1
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +3 -2
- package/dist/database/db.d.ts +1 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +5 -5
- package/dist/database/knex.d.ts +3 -0
- package/dist/database/knex.d.ts.map +1 -0
- package/dist/database/knex.js +29 -0
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +49 -5
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/logger/category.d.ts +4 -0
- package/dist/logger/category.d.ts.map +1 -0
- package/dist/logger/category.js +34 -0
- package/dist/logger/configure.d.ts +9 -0
- package/dist/logger/configure.d.ts.map +1 -0
- package/dist/logger/configure.js +115 -0
- package/dist/migration/code-generation.d.ts +5 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +13 -7
- package/dist/migration/migrator.d.ts +1 -1
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +7 -7
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +5 -3
- package/dist/naite/naite.d.ts +0 -4
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +11 -19
- package/dist/ssr/index.d.ts +4 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +4 -0
- package/dist/ssr/registry.d.ts +10 -0
- package/dist/ssr/registry.d.ts.map +1 -0
- package/dist/ssr/registry.js +43 -0
- package/dist/ssr/renderer.d.ts +6 -0
- package/dist/ssr/renderer.d.ts.map +1 -0
- package/dist/ssr/renderer.js +70 -0
- package/dist/ssr/types.d.ts +19 -0
- package/dist/ssr/types.d.ts.map +1 -0
- package/dist/ssr/types.js +4 -0
- package/dist/syncer/syncer.d.ts +1 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +58 -1
- package/dist/tasks/decorator.d.ts +1 -0
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +9 -7
- package/dist/tasks/step-wrapper.d.ts +5 -0
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +11 -6
- package/dist/tasks/workflow-manager.d.ts +2 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +5 -2
- package/dist/template/implementations/entry-server.template.d.ts +17 -0
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -0
- package/dist/template/implementations/entry-server.template.js +78 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +5 -3
- package/dist/template/implementations/queries.template.d.ts +17 -0
- package/dist/template/implementations/queries.template.d.ts.map +1 -0
- package/dist/template/implementations/queries.template.js +83 -0
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_select.template.js +34 -20
- package/dist/template/implementations/view_form.template.d.ts +2 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +301 -129
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_async_select.template.js +136 -57
- package/dist/template/implementations/view_list.template.d.ts +2 -0
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +392 -227
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +46 -30
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +2 -2
- package/dist/testing/bootstrap.d.ts +28 -0
- package/dist/testing/bootstrap.d.ts.map +1 -0
- package/dist/testing/bootstrap.js +120 -0
- package/dist/testing/fixture-loader.d.ts +21 -0
- package/dist/testing/fixture-loader.d.ts.map +1 -0
- package/dist/testing/fixture-loader.js +28 -0
- package/dist/testing/fixture-manager.d.ts +1 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +7 -7
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/naite-vitest-reporter.d.ts +12 -0
- package/dist/testing/naite-vitest-reporter.d.ts.map +1 -0
- package/dist/testing/naite-vitest-reporter.js +17 -0
- package/dist/types/types.d.ts +5 -6
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +7 -8
- package/dist/ui/ai-client.d.ts +3 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +27 -8
- package/dist/ui-web/assets/index-CTYv3qL6.js +92 -0
- package/dist/ui-web/index.html +1 -1
- package/package.json +43 -20
- package/src/ai/agents/agent.ts +38 -19
- package/src/api/base-frame.ts +8 -0
- package/src/api/caster.ts +6 -1
- package/src/api/config.ts +38 -4
- package/src/api/decorators.ts +106 -20
- package/src/api/index.ts +1 -0
- package/src/api/secret.ts +23 -0
- package/src/api/sonamu.ts +334 -61
- package/src/cache/cache-manager.ts +23 -0
- package/src/cache/decorator.ts +116 -0
- package/src/cache/drivers.ts +42 -0
- package/src/cache/index.ts +16 -0
- package/src/cache/types.ts +32 -0
- package/src/database/base-model.ts +7 -3
- package/src/database/code-generator.ts +3 -1
- package/src/database/db.ts +5 -5
- package/src/database/knex.ts +34 -0
- package/src/database/puri.types.ts +2 -3
- package/src/database/upsert-builder.ts +58 -4
- package/src/index.ts +4 -0
- package/src/logger/category.ts +42 -0
- package/src/logger/configure.ts +132 -0
- package/src/migration/code-generation.ts +19 -6
- package/src/migration/migrator.ts +7 -6
- package/src/migration/postgresql-schema-reader.ts +7 -2
- package/src/naite/naite.ts +10 -18
- package/src/shared/web.shared.ts.txt +1 -1
- package/src/ssr/index.ts +13 -0
- package/src/ssr/registry.ts +52 -0
- package/src/ssr/renderer.ts +105 -0
- package/src/ssr/types.ts +20 -0
- package/src/syncer/syncer.ts +59 -0
- package/src/tasks/decorator.ts +20 -4
- package/src/tasks/step-wrapper.ts +14 -5
- package/src/tasks/workflow-manager.ts +9 -1
- package/src/template/implementations/entry-server.template.ts +81 -0
- package/src/template/implementations/model.template.ts +4 -2
- package/src/template/implementations/queries.template.ts +111 -0
- package/src/template/implementations/view_enums_select.template.ts +33 -19
- package/src/template/implementations/view_form.template.ts +324 -145
- package/src/template/implementations/view_id_async_select.template.ts +145 -56
- package/src/template/implementations/view_list.template.ts +446 -236
- package/src/template/implementations/view_search_input.template.ts +45 -29
- package/src/template/zod-converter.ts +4 -1
- package/src/testing/bootstrap.ts +176 -0
- package/src/testing/fixture-loader.ts +28 -0
- package/src/testing/fixture-manager.ts +7 -6
- package/src/testing/index.ts +3 -0
- package/src/testing/naite-vitest-reporter.ts +18 -0
- package/src/types/types.ts +4 -5
- package/src/ui/ai-client.ts +82 -50
- package/dist/template/implementations/view_enums_dropdown.template.d.ts +0 -17
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +0 -1
- package/dist/template/implementations/view_enums_dropdown.template.js +0 -50
- package/dist/ui-web/assets/index-B87IyofX.js +0 -92
- package/src/template/implementations/view_enums_dropdown.template.ts +0 -53
package/dist/ui/ai-client.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/** biome-ignore-all lint/suspicious/noExplicitAny: AI SDK의 타입이 명확하지 않아 any를 허용함 */ import
|
|
2
|
-
import { stepCountIs, streamText, tool } from "ai";
|
|
3
|
-
import assert from "assert";
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: AI SDK의 타입이 명확하지 않아 any를 허용함 */ import assert from "assert";
|
|
4
2
|
import fs from "fs";
|
|
5
3
|
import path from "path";
|
|
6
4
|
import { z } from "zod";
|
|
@@ -9,11 +7,26 @@ import { EntityManager } from "../entity/entity-manager.js";
|
|
|
9
7
|
import { isInternalSubsetField, normalizeSubsetField, TemplateOptions } from "../types/types.js";
|
|
10
8
|
import { nonNullable } from "../utils/utils.js";
|
|
11
9
|
class AIClient {
|
|
12
|
-
model =
|
|
10
|
+
model = null;
|
|
11
|
+
aiSdk = null;
|
|
13
12
|
async init() {
|
|
14
|
-
|
|
13
|
+
try {
|
|
14
|
+
const { anthropic } = await import("@ai-sdk/anthropic");
|
|
15
|
+
const aiModule = await import("ai");
|
|
16
|
+
this.aiSdk = {
|
|
17
|
+
...aiModule,
|
|
18
|
+
anthropic
|
|
19
|
+
};
|
|
20
|
+
this.model = anthropic("claude-sonnet-4-5");
|
|
21
|
+
} catch (error) {
|
|
22
|
+
console.warn("AI SDK packages not installed. Install @ai-sdk/anthropic and ai to use AI features.");
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
15
25
|
}
|
|
16
26
|
handleFixture(messages, fixtureRecords) {
|
|
27
|
+
if (!this.aiSdk || !this.model) {
|
|
28
|
+
throw new Error("AI SDK not initialized. Call init() first.");
|
|
29
|
+
}
|
|
17
30
|
// 현재 fixtureRecords에서 사용된 엔티티들의 구조 정보 수집
|
|
18
31
|
const usedEntityIds = [
|
|
19
32
|
...new Set(fixtureRecords.map((r)=>r.entityId))
|
|
@@ -56,6 +69,7 @@ class AIClient {
|
|
|
56
69
|
예시: 새로운 User 픽스쳐를 생성하려면:
|
|
57
70
|
createFixtures({ fixtures: [{ entityId: "User", id: -1, columns: { name: "홍길동", email: "hong@example.com" } }] })
|
|
58
71
|
`;
|
|
72
|
+
const { streamText, tool } = this.aiSdk;
|
|
59
73
|
return streamText({
|
|
60
74
|
model: this.model,
|
|
61
75
|
system: systemMessage,
|
|
@@ -180,6 +194,9 @@ class AIClient {
|
|
|
180
194
|
});
|
|
181
195
|
}
|
|
182
196
|
handleEntity(messages) {
|
|
197
|
+
if (!this.aiSdk || !this.model) {
|
|
198
|
+
throw new Error("AI SDK not initialized. Call init() first.");
|
|
199
|
+
}
|
|
183
200
|
// entity.instructions.md 파일 읽기 (dist/ui 또는 src/ui에서 실행되므로 패키지 루트 기준으로 접근)
|
|
184
201
|
const instructionsPath = path.join(import.meta.dirname, "..", "..", "src", "ui", "entity.instructions.md");
|
|
185
202
|
const instructions = fs.readFileSync(instructionsPath, "utf-8");
|
|
@@ -264,6 +281,7 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
|
|
|
264
281
|
| "text 타입은 textType이 필수" | 해당 prop에 textType 추가 ("text", "mediumtext", "longtext") |
|
|
265
282
|
| "onUpdate가 필수" | 해당 relation prop에 onUpdate, onDelete 추가 ("CASCADE") |
|
|
266
283
|
`;
|
|
284
|
+
const { streamText, tool, stepCountIs } = this.aiSdk;
|
|
267
285
|
return streamText({
|
|
268
286
|
model: this.model,
|
|
269
287
|
system: systemMessage,
|
|
@@ -356,8 +374,9 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
|
|
|
356
374
|
const normalizedSubsets = {};
|
|
357
375
|
const normalizedSubsetsInternal = {};
|
|
358
376
|
for (const [key, fields] of Object.entries(updates.subsets)){
|
|
359
|
-
|
|
360
|
-
|
|
377
|
+
const fieldArray = fields;
|
|
378
|
+
normalizedSubsets[key] = fieldArray.filter((f)=>!isInternalSubsetField(f)).map(normalizeSubsetField);
|
|
379
|
+
normalizedSubsetsInternal[key] = fieldArray.filter(isInternalSubsetField).map(normalizeSubsetField);
|
|
361
380
|
}
|
|
362
381
|
entity.subsets = mode === "replace" ? normalizedSubsets : {
|
|
363
382
|
...entity.subsets,
|
|
@@ -455,4 +474,4 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
|
|
|
455
474
|
}
|
|
456
475
|
export const aiClient = new AIClient();
|
|
457
476
|
|
|
458
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9haS1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIGJpb21lLWlnbm9yZS1hbGwgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEFJIFNES+ydmCDtg4DsnoXsnbQg66qF7ZmV7ZWY7KeAIOyViuyVhCBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5pbXBvcnQgeyBhbnRocm9waWMgfSBmcm9tIFwiQGFpLXNkay9hbnRocm9waWNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTGFuZ3VhZ2VNb2RlbCxcbiAgdHlwZSBNb2RlbE1lc3NhZ2UsXG4gIHR5cGUgU3RyZWFtVGV4dFJlc3VsdCxcbiAgc3RlcENvdW50SXMsXG4gIHN0cmVhbVRleHQsXG4gIHRvb2wsXG59IGZyb20gXCJhaVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbiAgVGVtcGxhdGVPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbnR5cGUgVmFsaWRhdGlvbkVycm9yID0ge1xuICBmaWVsZDogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5jbGFzcyBBSUNsaWVudCB7XG4gIHByaXZhdGUgbW9kZWwgPSBhbnRocm9waWMoXCJjbGF1ZGUtc29ubmV0LTQtNVwiKTtcblxuICBhc3luYyBpbml0KCkge1xuICAgIGNvbnNvbGUubG9nKFwiQUkgY2xpZW50IGluaXRpYWxpemVkIHdpdGggQUkgU0RLXCIpO1xuICB9XG5cbiAgaGFuZGxlRml4dHVyZShcbiAgICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW10sXG4gICAgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIC8vIO2YhOyerCBmaXh0dXJlUmVjb3Jkc+yXkOyEnCDsgqzsmqnrkJwg7JeU7Yuw7Yuw65Ok7J2YIOq1rOyhsCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgdXNlZEVudGl0eUlkcyA9IFsuLi5uZXcgU2V0KGZpeHR1cmVSZWNvcmRzLm1hcCgocikgPT4gci5lbnRpdHlJZCkpXTtcbiAgICBjb25zdCBlbnRpdHlTdHJ1Y3R1cmVzID0gdXNlZEVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIHRhYmxlOiBlbnRpdHkudGFibGUsXG4gICAgICAgIHByb3BzOiBlbnRpdHkucHJvcHMsXG4gICAgICAgIHJlbGF0aW9uczogZW50aXR5LnJlbGF0aW9ucyxcbiAgICAgICAgZW51bUxhYmVsczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3lzdGVtTWVzc2FnZSA9IGBcbiAgICAgICAg64u57Iug7J2AIO2UveyKpOyzkCDroIjsvZTrk5zrpbwg7IiY7KCV7ZWY6rOgIOyDneyEse2VoCDsiJgg7J6I64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuICAgICAgICDtmITsnqwg7ZS97Iqk7LOQIOugiOy9lOuTnDpcbiAgICAgICAgJHtKU09OLnN0cmluZ2lmeShmaXh0dXJlUmVjb3JkcywgbnVsbCwgMil9XG5cbiAgICAgICAg7JeU7Yuw7YuwIOq1rOyhsCDsoJXrs7Q6XG4gICAgICAgICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5U3RydWN0dXJlcywgbnVsbCwgMil9XG5cbiAgICAgICAgIyMg7ZS97Iqk7LOQIOyImOyglVxuICAgICAgICDsgqzsmqnsnpDqsIAg7ZS97Iqk7LOQIOqwkiDsiJjsoJXsnYQg7JqU7LKt7ZWY66m0IHVwZGF0ZUZpeHR1cmVzIOuPhOq1rOulvCDsgqzsmqntlZjsl6wg67OA6rK97IKs7ZWt7J2EIOyggeyaqe2VmOyEuOyalC5cbiAgICAgICAgLSBmaXh0dXJlSWQ6IOyImOygle2VoCDtlL3siqTss5AgSUQgKO2YleyLnTogXCJFbnRpdHlJZCNpZFwiKVxuICAgICAgICAtIHVwZGF0ZXM6IOy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcblxuICAgICAgICDsmIjsi5w6IFwiVXNlciMxXCIg7ZS97Iqk7LOQ7J2YIFwibmFtZVwiIOy7rOufvOydhCBcIu2Zjeq4uOuPmVwi7Jy866GcIOuzgOqyve2VmOugpOuptDpcbiAgICAgICAgdXBkYXRlRml4dHVyZXMoeyB1cGRhdGVzOiBbeyBmaXh0dXJlSWQ6IFwiVXNlciMxXCIsIHVwZGF0ZXM6IHsgbmFtZTogXCLtmY3quLjrj5lcIiB9IH1dIH0pXG5cbiAgICAgICAg67OA6rK965CgIOy7rOufvOydmCB0eXBl7J20IHJlbGF0aW9u7J24IOqyveyasCwg6rSA66CoIOyXlO2LsO2LsOyXkOuPhCDrsJjsmIHrkJjslrTslbwg7ZWgIOy7rOufvOydtCDsnojripTsp4Ag7ZmV7J247ZWY7IS47JqULlxuXG4gICAgICAgICMjIO2UveyKpOyzkCDsg53shLFcbiAgICAgICAg7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDtlL3siqTss5Ag7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVGaXh0dXJlcyDrj4Tqtazrpbwg7IKs7Jqp7ZWY7IS47JqULlxuICAgICAgICAtIGVudGl0eUlkOiDsg53shLHtlaAg7JeU7Yuw7YuwIElEXG4gICAgICAgIC0gaWQ6IOyDiCDroIjsvZTrk5zsnZggSUQgKOq4sOyhtCDtlL3siqTss5DsmYAg7KSR67O165CY7KeAIOyViuuKlCDsnYzsiJgg7IKs7JqpIOq2jOyepSwg7JiIOiAtMSwgLTIpXG4gICAgICAgIC0gY29sdW1uczog7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0ICjsl5Tti7Dti7Ag6rWs7KGwIOywuOqzoClcblxuICAgICAgICDsmIjsi5w6IOyDiOuhnOyatCBVc2VyIO2UveyKpOyzkOulvCDsg53shLHtlZjroKTrqbQ6XG4gICAgICAgIGNyZWF0ZUZpeHR1cmVzKHsgZml4dHVyZXM6IFt7IGVudGl0eUlkOiBcIlVzZXJcIiwgaWQ6IC0xLCBjb2x1bW5zOiB7IG5hbWU6IFwi7ZmN6ri464+ZXCIsIGVtYWlsOiBcImhvbmdAZXhhbXBsZS5jb21cIiB9IH1dIH0pXG4gICAgICBgO1xuXG4gICAgcmV0dXJuIHN0cmVhbVRleHQoe1xuICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICBzeXN0ZW06IHN5c3RlbU1lc3NhZ2UsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIHRvb2xzOiB7XG4gICAgICAgIHVwZGF0ZUZpeHR1cmVzOiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7ZS97Iqk7LOQIOugiOy9lOuTnOydmCDqsJLsnYQg7IiY7KCV7ZWp64uI64ukLiDsgqzsmqnsnpDqsIAg7Yq57KCVIOy7rOufvOydtOuCmCDqsJLsnYQg67OA6rK97ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICB1cGRhdGVzOiB6LmFycmF5KFxuICAgICAgICAgICAgICB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgZml4dHVyZUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2UveyKpOyzkCBJRCAo7ZiV7IudOiBFbnRpdHlJZCNpZClcIiksXG4gICAgICAgICAgICAgICAgdXBkYXRlczogelxuICAgICAgICAgICAgICAgICAgLnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlcbiAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIuy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgICB9KTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gfT4gPT4ge1xuICAgICAgICAgICAgLy8gZml4dHVyZVJlY29yZHPrpbwg67O17IKs7ZWY6rOgIOyXheuNsOydtO2KuCDsoIHsmqlcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlUmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVzLmZpbmQoKHUpID0+IHUuZml4dHVyZUlkID09PSByZWNvcmQuZml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbHVtbnPsnZggdmFsdWXrpbwg7JeF642w7J207Yq4XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbY29sdW1uTmFtZSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZS51cGRhdGVzKSkge1xuICAgICAgICAgICAgICAgICAgcmVjb3JkLmNvbHVtbnNbY29sdW1uTmFtZV0udmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSBhcyBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXVtzdHJpbmddW1widmFsdWVcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHVwZGF0ZWRSZWNvcmRzIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIGNyZWF0ZUZpeHR1cmVzOiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7IOI66Gc7Jq0IO2UveyKpOyzkCDroIjsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLiDsgqzsmqnsnpDqsIAg7IOI66Gc7Jq0IOuNsOydtO2EsOulvCDstpTqsIDtlbTri6zrnbzqs6Ag7JqU7LKt7ZWgIOuVjCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgICAgIGZpeHR1cmVzOiB6LmFycmF5KFxuICAgICAgICAgICAgICB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCLsg53shLHtlaAg7JeU7Yuw7YuwIElEXCIpLFxuICAgICAgICAgICAgICAgIGlkOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwi7IOIIOugiOy9lOuTnOydmCBJRCAo7J2M7IiYIOq2jOyepSwg7JiIOiAtMSwgLTIpXCIpLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHpcbiAgICAgICAgICAgICAgICAgIC5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpXG4gICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoXCLsu6zrn7zrqoXsnYQg7YKk66GcLCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgZml4dHVyZXMsXG4gICAgICAgICAgfSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyB1cGRhdGVkUmVjb3JkczogRml4dHVyZVJlY29yZFtdIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1JlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IGZpeHR1cmVzLm1hcCgoZml4dHVyZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgICAgICAvLyDsl5Tti7Dti7AgcHJvcHPrpbwg6riw67CY7Jy866GcIGNvbHVtbnMg6rWs7ISxXG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnM6IEZpeHR1cmVSZWNvcmRbXCJjb2x1bW5zXCJdID0ge307XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInZpcnR1YWxcIikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmaXh0dXJlLmNvbHVtbnNbcHJvcC5uYW1lXSA/PyBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIO2YhOyerCDsi5zqsITsnLzroZwg7ISk7KCVXG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgIChwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJIYXNNYW55XCIgfHwgcHJvcC5yZWxhdGlvblR5cGUgPT09IFwiTWFueVRvTWFueVwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgLy8g67Cw7Je066GcIOuzgO2ZmFxuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbHVtbnNbcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUgYXMgRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpeHR1cmVJZDogYCR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfWAsXG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgaWQ6IGZpeHR1cmUuaWQsXG4gICAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgICAgICAgICAgYmVsb25nc1JlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyDsg4gg66CI7L2U65Oc65Ok7J2YIHJlbGF0aW9uIOy7rOufvOydhCDtmZXsnbjtlZjsl6wg6riw7KG0IOugiOy9lOuTnOuTpOydmCDsl63rsKntlqUgcmVsYXRpb24g7JeF642w7J207Yq4XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ld1JlY29yZCBvZiBuZXdSZWNvcmRzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW19jb2xOYW1lLCBjb2xdIG9mIE9iamVjdC5lbnRyaWVzKG5ld1JlY29yZC5jb2x1bW5zKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb2wucHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgY29sLnZhbHVlID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHlJZCA9IGNvbC5wcm9wLndpdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IEFycmF5LmlzQXJyYXkoY29sLnZhbHVlKSA/IGNvbC52YWx1ZSA6IFtjb2wudmFsdWVdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3JlbGF0ZWRFbnRpdHlJZH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWNvcmQgPSBuZXdSZWNvcmRzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSByZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9uIOywvuq4sFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlQ29sID0gT2JqZWN0LmVudHJpZXMocmVsYXRlZFJlY29yZC5jb2x1bW5zKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgIChbLCBjXSkgPT4gYy5wcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJiBjLnByb3Aud2l0aCA9PT0gbmV3UmVjb3JkLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlQ29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3JldmVyc2VDb2xOYW1lLCByZXZlcnNlQ29sVmFsdWVdID0gcmV2ZXJzZUNvbDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSByZXZlcnNlQ29sVmFsdWUudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyDsl63rsKntlqXsnbQg67Cw7Je07J24IOqyveyasCAoSGFzTWFueSwgTWFueVRvTWFueSlcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlQ29sVmFsdWUucHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXZlcnNlQ29sVmFsdWUucHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VDb2xWYWx1ZS5wcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJNYW55VG9NYW55XCIpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpLCBcImN1cnJlbnRWYWx1ZSBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUuaW5jbHVkZXMobmV3UmVjb3JkLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkUmVjb3JkLmNvbHVtbnNbcmV2ZXJzZUNvbE5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJldmVyc2VDb2xWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWy4uLmN1cnJlbnRWYWx1ZSwgbmV3UmVjb3JkLmlkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7Zal7J20IOuLqOydvCDqsJLsnbgg6rK97JqwIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFJlY29yZC5jb2x1bW5zW3JldmVyc2VDb2xOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmV2ZXJzZUNvbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3UmVjb3JkLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdXBkYXRlZFJlY29yZHM6IG5ld1JlY29yZHMgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVFbnRpdHkobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIC8vIGVudGl0eS5pbnN0cnVjdGlvbnMubWQg7YyM7J28IOydveq4sCAoZGlzdC91aSDrmJDripQgc3JjL3Vp7JeQ7IScIOyLpO2WieuQmOuvgOuhnCDtjKjtgqTsp4Ag66Oo7Yq4IOq4sOykgOycvOuhnCDsoJHqt7wpXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgICBcIi4uXCIsXG4gICAgICBcIi4uXCIsXG4gICAgICBcInNyY1wiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJlbnRpdHkuaW5zdHJ1Y3Rpb25zLm1kXCIsXG4gICAgKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIO2YhOyerCDrk7HroZ3rkJwg7JeU7Yuw7YuwIOygleuztCDsiJjsp5FcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGV4aXN0aW5nRW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgdGl0bGU6IGVudGl0eS50aXRsZSxcbiAgICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgICAgcHJvcHM6IGVudGl0eS5wcm9wcy5tYXAoKHApID0+ICh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgICAgICBkZXNjOiBwLmRlc2MsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzeXN0ZW1NZXNzYWdlID0gYFxu64u57Iug7J2AIFNvbmFtdSDtlITroIjsnoTsm4ztgazsl5DshJwgRW50aXR57JmAIEVudW3snYQg7IOd7ISx7ZWY64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuJHtpbnN0cnVjdGlvbnN9XG5cbiMjIO2YhOyerCDrk7HroZ3rkJwgRW50aXR5IOuqqeuhnVxu64uk66W4IOyXlO2LsO2LsOyZgCDqtIDqs4QocmVsYXRpb24p66W8IOunuuqxsOuCmCBzdWJzZXTsl5DshJwg7LC47KGw7ZWgIOuVjCDrsJjrk5zsi5wg7JWE656YIOygleuztOulvCDtmZXsnbjtlZjshLjsmpQuXG5cbiR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdFbnRpdGllcywgbnVsbCwgMil9XG5cbiMjIFRvb2wg7IKs7JqpIOqwgOydtOuTnFxuXG4jIyMgRW50aXR5IOyDneyEsSAoY3JlYXRlRW50aXR5KVxu7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCBFbnRpdHkg7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC5cbi0gZW50aXR5SWQ6IFBhc2NhbENhc2XroZwg65CcIEVudGl0eSBJRCAo7JiIOiBcIlVzZXJcIiwgXCJQcm9kdWN0Q2F0ZWdvcnlcIilcbi0gdGl0bGU6IO2VnOq4gCDsoJzrqqkgKOyYiDogXCLsgqzsmqnsnpBcIiwgXCLsg4Htkogg7Lm07YWM6rOg66asXCIpXG4tIHRhYmxlOiBzbmFrZV9jYXNl66GcIOuQnCDthYzsnbTruJTrqoUgKOyYiDogXCJ1c2Vyc1wiLCBcInByb2R1Y3RfY2F0ZWdvcmllc1wiKVxuLSBwYXJlbnRJZDog67aA66qoIEVudGl0eSBJRCAo7ISg7YOd7IKs7ZWtKVxuLSBwcm9wczogRW50aXR57J2YIO2UhOuhnO2NvO2LsCDrsLDsl7QgKOychCDrrLjshJzsnZggUHJvcGVydHkgVHlwZXMg7LC46rOgKVxuLSBpbmRleGVzOiDsnbjrjbHsiqQg67Cw7Je0XG4tIHN1YnNldHM6IOyEnOu4jOyFiyDsoJXsnZggKOq4sOuzuOqwkjogeyBBOiBbXCJpZFwiXSB9KVxuLSBlbnVtczogRW51bSDsoJXsnZhcblxuIyMjIEVudGl0eSDsiJjsoJUgKHVwZGF0ZUVudGl0eSlcbuq4sOyhtCBFbnRpdHnrpbwg7IiY7KCV7ZWgIOuVjCB1cGRhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC4gRW51bSDstpTqsIAsIHByb3BzIOy2lOqwgC/siJjsoJUsIGluZGV4ZXMg7IiY7KCVIOuTsSDrqqjrk6Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlanri4jri6QuXG4tIGVudGl0eUlkOiDsiJjsoJXtlaAgRW50aXR5IElEXG4tIHVwZGF0ZXM6IOyImOygle2VoCDtlYTrk5zrk6QgKOu2gOu2hCDsl4XrjbDsnbTtirgpXG4gIC0gdGl0bGU6IOyXlO2LsO2LsCDtlZzquIAg7KCc66qpXG4gIC0gdGFibGU6IO2FjOydtOu4lOuqhVxuICAtIHByb3BzOiDstpTqsIDtlaAg7ZSE66Gc7Y287YuwIOuwsOyXtCAo6riw7KG0IHByb3Bz7JeQIOy2lOqwgCwg6rCZ7J2AIOydtOumhOydtOuptCDqtZDssrQpXG4gIC0gaW5kZXhlczog7LaU6rCA7ZWgIOyduOuNseyKpCDrsLDsl7QgKOq4sOyhtCBpbmRleGVz7JeQIOy2lOqwgClcbiAgLSBzdWJzZXRzOiDshJzruIzshYsg7KCV7J2YICjquLDsobQgc3Vic2V0c+yXkCDrs5HtlakpXG4gIC0gZW51bUxhYmVsczogRW51bSDsoJXsnZggKOq4sOyhtCBlbnVtTGFiZWxz7JeQIOuzke2VqSlcbi0gbW9kZTogXCJtZXJnZVwiKOq4sOuzuOqwkikg65iQ64qUIFwicmVwbGFjZVwiXG4gIC0gbWVyZ2U6IOq4sOyhtCDqsJLsl5Ag67OR7ZWpXG4gIC0gcmVwbGFjZTog7ZW064u5IO2VhOuTnCDsoITssrQg6rWQ7LK0XG5cbuyYiOyLnDogRW1wbG95ZWXsl5Ag7IOIIEVudW0g7LaU6rCAXG51cGRhdGVFbnRpdHkoeyBlbnRpdHlJZDogXCJFbXBsb3llZVwiLCB1cGRhdGVzOiB7IGVudW1MYWJlbHM6IHsgXCJFbXBsb3llZVJvbGVcIjogeyBcImFkbWluXCI6IFwi6rSA66as7J6QXCIsIFwidXNlclwiOiBcIuydvOuwmFwiIH0gfSB9IH0pXG5cbuyYiOyLnDogUHJvamVjdOyXkCDsg4gg7ZSE66Gc7Y287YuwIOy2lOqwgFxudXBkYXRlRW50aXR5KHsgZW50aXR5SWQ6IFwiUHJvamVjdFwiLCB1cGRhdGVzOiB7IHByb3BzOiBbeyBuYW1lOiBcInByaW9yaXR5XCIsIHR5cGU6IFwiaW50ZWdlclwiLCBkZXNjOiBcIuyasOyEoOyInOychFwiIH1dIH0gfSlcblxuIyMg7ZWE7IiYIOyCrO2VrVxuLSBFbnRpdHnsnZggcHJvcHPsl5DripQg7LWc7IaM7ZWcIGlkKGludGVnZXIsIHVuc2lnbmVkKSwgY3JlYXRlZF9hdCh0aW1lc3RhbXAp6rCAIO2PrO2VqOuQmOyWtOyVvCDtlanri4jri6QuXG4tIHJlbGF0aW9uIO2VhOuTnOuKlCBvblVwZGF0ZSwgb25EZWxldGXqsIAg7ZWE7IiY7J6F64uI64ukLiAo7JiI7Jm4OiBPbmVUb09uZeyXkOyEnCBoYXNKb2luQ29sdW1u7J20IGZhbHNl7J24IOqyveyasClcbi0gRW51bSBJROuKlCDrs7TthrUgRW50aXR5SWQgKyDsho3shLHrqoUg7ZiV7YOc7J6F64uI64ukICjsmIg6IFVzZXJTdGF0dXMsIFByb2R1Y3RUeXBlKVxuLSBzdWJzZXTsl5DshJwg64uk66W4IOyXlO2LsO2LsOydmCDtlITroZztjbzti7Drpbwg7LC47KGw7ZWgIOuVjOuKlCDrsJjrk5zsi5wg7ZW064u5IOyXlO2LsO2LsOydmCDsi6TsoJwg7ZSE66Gc7Y287Yuw66qF7J2EIOyCrOyaqe2VmOyEuOyalC5cblxuIyMg6rKA7KadIOyYpOulmCDsspjrpqxcbuuPhOq1rCDtmLjstpwg6rKw6rO866GcIOqygOymnSDsmKTrpZgodmFsaWRhdGlvbkVycm9ycynqsIAg67CY7ZmY65CY66m0OlxuMS4g7Jik66WYIOuplOyLnOyngOulvCDrtoTshJ3tlZjsl6wg66y47KCc7KCQ7J2EIO2MjOyVhe2VmOyEuOyalC5cbjIuIOyYpOulmOulvCDsiJjsoJXtlZwg642w7J207YSw66GcIGNyZWF0ZUVudGl0eeulvCDri6Tsi5wg7Zi47Lac7ZWY7IS47JqULlxuMy4g7IKs7Jqp7J6Q7JeQ6rKMIOyYpOulmOulvCDqt7jrjIDroZwg7KCE64us7ZWY7KeAIOunkOqzoCwg7IiY7KCVIO2bhCDsnqzsi5zrj4TtlZjshLjsmpQuXG5cbiMjIyDsnbzrsJjsoIHsnbgg6rKA7KadIOyYpOulmOyZgCDsiJjsoJUg67Cp67KVXG58IOyYpOulmCDrqZTsi5zsp4AgfCDsiJjsoJUg67Cp67KVIHxcbnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXxcbnwgXCJpZCDtlITroZztjbzti7DqsIAg7ZWE7IiYXCIgfCBwcm9wc+yXkCB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIHVuc2lnbmVkOiB0cnVlIH0g7LaU6rCAIHxcbnwgXCJjcmVhdGVkX2F0IO2UhOuhnO2NvO2LsOqwgCDtlYTsiJhcIiB8IHByb3Bz7JeQIHsgbmFtZTogXCJjcmVhdGVkX2F0XCIsIHR5cGU6IFwidGltZXN0YW1wXCIsIGRiRGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiIH0g7LaU6rCAIHxcbnwgXCJYeHhPcmRlckJ5IGVudW3snbQg7ZWE7IiYXCIgfCBlbnVtc+yXkCB7IFwiWHh4T3JkZXJCeVwiOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSB9IOy2lOqwgCB8XG58IFwiWHh4U2VhcmNoRmllbGQgZW51beydtCDtlYTsiJhcIiB8IGVudW1z7JeQIHsgXCJYeHhTZWFyY2hGaWVsZFwiOiB7IFwiaWRcIjogXCJJRFwiIH0gfSDstpTqsIAgfFxufCBcInN0cmluZyDtg4DsnoXsnYAgbGVuZ3Ro6rCAIO2VhOyImFwiIHwg7ZW064u5IHByb3Dsl5AgbGVuZ3RoIOy2lOqwgCAo7JiIOiAyNTUpIHxcbnwgXCJ0ZXh0IO2DgOyeheydgCB0ZXh0VHlwZeydtCDtlYTsiJhcIiB8IO2VtOuLuSBwcm9w7JeQIHRleHRUeXBlIOy2lOqwgCAoXCJ0ZXh0XCIsIFwibWVkaXVtdGV4dFwiLCBcImxvbmd0ZXh0XCIpIHxcbnwgXCJvblVwZGF0ZeqwgCDtlYTsiJhcIiB8IO2VtOuLuSByZWxhdGlvbiBwcm9w7JeQIG9uVXBkYXRlLCBvbkRlbGV0ZSDstpTqsIAgKFwiQ0FTQ0FERVwiKSB8XG4gICAgICBgO1xuXG4gICAgcmV0dXJuIHN0cmVhbVRleHQoe1xuICAgICAgbW9kZWw6IHRoaXMubW9kZWwgYXMgdW5rbm93biBhcyBMYW5ndWFnZU1vZGVsLFxuICAgICAgc3lzdGVtOiBzeXN0ZW1NZXNzYWdlLFxuICAgICAgbWVzc2FnZXMsXG4gICAgICBzdG9wV2hlbjogc3RlcENvdW50SXMoMiksXG4gICAgICB0b29sczoge1xuICAgICAgICBjcmVhdGVFbnRpdHk6IHRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCLsg4jroZzsmrQgRW50aXR566W8IOyDneyEse2VqeuLiOuLpC4g7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDsl5Tti7Dti7Drgpgg7YWM7J2067iUIOyDneyEseydhCDsmpTssq3tlaAg65WMIOyCrOyaqe2VmOyEuOyalC5cIixcbiAgICAgICAgICBpbnB1dFNjaGVtYTogVGVtcGxhdGVPcHRpb25zLnNoYXBlLmVudGl0eSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgKTogUHJvbWlzZTx7XG4gICAgICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9ycz86IFZhbGlkYXRpb25FcnJvcltdO1xuICAgICAgICAgIH0+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpSDqsoDspp1cbiAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRW50aXR5SnNvbihlbnRpdHkpO1xuXG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZDogZW50aXR5LmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGDqsoDspp0g7Jik66WYOiAke3ZhbGlkYXRpb25FcnJvcnMubWFwKChlKSA9PiBgWyR7ZS5maWVsZH1dICR7ZS5tZXNzYWdlfWApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoe1xuICAgICAgICAgICAgICAgIHN1YnNldHM6IHsgQTogW1wiaWRcIl0gfSxcbiAgICAgICAgICAgICAgICBlbnVtczoge30sXG4gICAgICAgICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBFbnRpdHlNYW5hZ2VyIOumrOuhnOuTnFxuICAgICAgICAgICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVudGl0eUlkOiBlbnRpdHkuZW50aXR5SWQgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVudGl0eUlkOiBlbnRpdHkuZW50aXR5SWQsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHVwZGF0ZUVudGl0eTogdG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIuq4sOyhtCBFbnRpdHnrpbwg7IiY7KCV7ZWp64uI64ukLiBFbnVtIOy2lOqwgCwgcHJvcHMg7LaU6rCAL+yImOyglSwgaW5kZXhlcyDsiJjsoJUsIHN1YnNldHMg7IiY7KCVIOuTsSDrqqjrk6Ag7JeU7Yuw7YuwIOyImOyglSDsnpHsl4Xsl5Ag7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICBlbnRpdHlJZDogei5zdHJpbmcoKS5kZXNjcmliZShcIuyImOygle2VoCBFbnRpdHkgSURcIiksXG4gICAgICAgICAgICB1cGRhdGVzOiBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5LnBhcnRpYWwoKS5kZXNjcmliZShcIuyImOygle2VoCDtlYTrk5zrk6RcIiksXG4gICAgICAgICAgICBtb2RlOiB6XG4gICAgICAgICAgICAgIC5lbnVtKFtcIm1lcmdlXCIsIFwicmVwbGFjZVwiXSlcbiAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgLmRlc2NyaWJlKFwi7IiY7KCVIOuqqOuTnDogbWVyZ2Uo6riw67O46rCSLCDquLDsobQg6rCS7JeQIOuzke2VqSkg65iQ64qUIHJlcGxhY2Uo7KCE7LK0IOq1kOyytClcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgICAgIG1vZGUgPSBcIm1lcmdlXCIsXG4gICAgICAgICAgfSk6IFByb21pc2U8e1xuICAgICAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnM/OiBWYWxpZGF0aW9uRXJyb3JbXTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGJhc2ljIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LmlkID0gdXBkYXRlcy5lbnRpdHlJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucGFyZW50SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LnBhcmVudElkID0gdXBkYXRlcy5wYXJlbnRJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGl0bGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRpdGxlID0gdXBkYXRlcy50aXRsZTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGFibGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRhYmxlID0gdXBkYXRlcy50YWJsZTtcblxuICAgICAgICAgICAgICAvLyBwcm9wczogbWVyZ2Ug7IucIOydtOumhCDquLDspIAg67OR7ZWpLCByZXBsYWNlIOyLnCDqtZDssrRcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzID0gdXBkYXRlcy5wcm9wcyBhcyBFbnRpdHlQcm9wW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmV3UHJvcCBvZiB1cGRhdGVzLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IG5ld1Byb3AubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkucHJvcHNbZXhpc3RpbmdJbmRleF0gPSBuZXdQcm9wIGFzIEVudGl0eVByb3A7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzLnB1c2gobmV3UHJvcCBhcyBFbnRpdHlQcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGluZGV4ZXM6IG1lcmdlIOyLnCDstpTqsIAsIHJlcGxhY2Ug7IucIOq1kOyytFxuICAgICAgICAgICAgICBpZiAodXBkYXRlcy5pbmRleGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkuaW5kZXhlcyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IHVwZGF0ZXMuaW5kZXhlcyA6IFsuLi5lbnRpdHkuaW5kZXhlcywgLi4udXBkYXRlcy5pbmRleGVzXTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbDogYXNzaWdu7Jy866GcIOuzke2VqSDrmJDripQg6rWQ7LK0XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnN1YnNldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBzdWJzZXQgZmllbGRzOiBzZXBhcmF0ZSBpbnRvIHN1YnNldHMgKG5vcm1hbCkgYW5kIHN1YnNldHNJbnRlcm5hbCAoaW50ZXJuYWwpXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZXMuc3Vic2V0cykpIHtcbiAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRTdWJzZXRzW2tleV0gPSBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVudGl0eS5zdWJzZXRzID1cbiAgICAgICAgICAgICAgICAgIG1vZGUgPT09IFwicmVwbGFjZVwiXG4gICAgICAgICAgICAgICAgICAgID8gbm9ybWFsaXplZFN1YnNldHNcbiAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmVudGl0eS5zdWJzZXRzLCAuLi5ub3JtYWxpemVkU3Vic2V0cyB9O1xuICAgICAgICAgICAgICAgIGVudGl0eS5zdWJzZXRzSW50ZXJuYWwgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBub3JtYWxpemVkU3Vic2V0c0ludGVybmFsXG4gICAgICAgICAgICAgICAgICAgIDogeyAuLi5lbnRpdHkuc3Vic2V0c0ludGVybmFsLCAuLi5ub3JtYWxpemVkU3Vic2V0c0ludGVybmFsIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodXBkYXRlcy5lbnVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZW50aXR5LmVudW1MYWJlbHMgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCIgPyB1cGRhdGVzLmVudW1zIDogeyAuLi5lbnRpdHkuZW51bUxhYmVscywgLi4udXBkYXRlcy5lbnVtcyB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8g7KCA7J6lIOyghCDqsoDspp1cbiAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRW50aXR5SnNvbih7XG4gICAgICAgICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgICAgICAgICAgZW51bXM6IGVudGl0eS5lbnVtTGFiZWxzLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogYOqygOymnSDsmKTrpZg6ICR7dmFsaWRhdGlvbkVycm9ycy5tYXAoKGUpID0+IGBbJHtlLmZpZWxkfV0gJHtlLm1lc3NhZ2V9YCkuam9pbihcIiwgXCIpfWAsXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVudGl0eUlkIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlbnRpdHlJZCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnRpdHkgSlNPTuydtCBlbnRpdHkuaW5zdHJ1Y3Rpb25zLm1k7J2YIOq3nOy5meydhCDrlLDrpbTripTsp4Ag6rKA7Kad7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUVudGl0eUpzb24oaW5wdXQ6IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSk6IFZhbGlkYXRpb25FcnJvcltdIHtcbiAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICBjb25zdCB7IGVudGl0eUlkLCBwcm9wcywgZW51bXMgfSA9IGlucHV0O1xuXG4gIC8vIDEuIGlkLCBjcmVhdGVkX2F0IHByb3Ag7ZWE7IiYXG4gIGNvbnN0IGhhc0lkUHJvcCA9IHByb3BzPy5zb21lKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gIGlmICghaGFzSWRQcm9wKSB7XG4gICAgZXJyb3JzLnB1c2goeyBmaWVsZDogXCJwcm9wc1wiLCBtZXNzYWdlOiBcImlkIO2UhOuhnO2NvO2LsOqwgCDtlYTsiJjsnoXri4jri6QuXCIgfSk7XG4gIH1cbiAgY29uc3QgaGFzQ3JlYXRlZEF0UHJvcCA9IHByb3BzPy5zb21lKChwKSA9PiBwLm5hbWUgPT09IFwiY3JlYXRlZF9hdFwiKTtcbiAgaWYgKCFoYXNDcmVhdGVkQXRQcm9wKSB7XG4gICAgZXJyb3JzLnB1c2goeyBmaWVsZDogXCJwcm9wc1wiLCBtZXNzYWdlOiBcImNyZWF0ZWRfYXQg7ZSE66Gc7Y287Yuw6rCAIO2VhOyImOyeheuLiOuLpC5cIiB9KTtcbiAgfVxuXG4gIC8vIDIuIO2VhOyImCBlbnVtIOqygOymnTogRW50aXR5TmFtZU9yZGVyQnksIEVudGl0eU5hbWVTZWFyY2hGaWVsZFxuICBjb25zdCBvcmRlckJ5RW51bUlkID0gYCR7ZW50aXR5SWR9T3JkZXJCeWA7XG4gIGNvbnN0IHNlYXJjaEZpZWxkRW51bUlkID0gYCR7ZW50aXR5SWR9U2VhcmNoRmllbGRgO1xuXG4gIGlmICghZW51bXM/LltvcmRlckJ5RW51bUlkXSkge1xuICAgIGVycm9ycy5wdXNoKHtcbiAgICAgIGZpZWxkOiBcImVudW1zXCIsXG4gICAgICBtZXNzYWdlOiBgJHtvcmRlckJ5RW51bUlkfSBlbnVt7J20IO2VhOyImOyeheuLiOuLpC4gKOyYiDogeyBcImlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiIH0pYCxcbiAgICB9KTtcbiAgfVxuICBpZiAoIWVudW1zPy5bc2VhcmNoRmllbGRFbnVtSWRdKSB7XG4gICAgZXJyb3JzLnB1c2goe1xuICAgICAgZmllbGQ6IFwiZW51bXNcIixcbiAgICAgIG1lc3NhZ2U6IGAke3NlYXJjaEZpZWxkRW51bUlkfSBlbnVt7J20IO2VhOyImOyeheuLiOuLpC4gKOyYiDogeyBcImlkXCI6IFwiSURcIiB9KWAsXG4gICAgfSk7XG4gIH1cblxuICAvLyAzLiBlbnVtIHByb3DsnZggaWTqsIAgZW51bXPsl5Ag7KCV7J2Y65CY7Ja0IOyeiOuKlOyngCDtmZXsnbggKGNyb3NzLWZpZWxkIOqygOymnSlcbiAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzID8/IFtdKSB7XG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgJiYgIWVudW1zPy5bcHJvcC5pZF0pIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6IGBwcm9wcy4ke3Byb3AubmFtZX1gLFxuICAgICAgICBtZXNzYWdlOiBgZW51bSBpZCBcIiR7cHJvcC5pZH1cIuqwgCBlbnVtc+yXkCDsoJXsnZjrkJjslrQg7J6I7KeAIOyViuyKteuLiOuLpC5gLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGNvbnN0IGFpQ2xpZW50ID0gbmV3IEFJQ2xpZW50KCk7XG4iXSwibmFtZXMiOlsiYW50aHJvcGljIiwic3RlcENvdW50SXMiLCJzdHJlYW1UZXh0IiwidG9vbCIsImFzc2VydCIsImZzIiwicGF0aCIsInoiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiaXNJbnRlcm5hbFN1YnNldEZpZWxkIiwibm9ybWFsaXplU3Vic2V0RmllbGQiLCJUZW1wbGF0ZU9wdGlvbnMiLCJub25OdWxsYWJsZSIsIkFJQ2xpZW50IiwibW9kZWwiLCJpbml0IiwiY29uc29sZSIsImxvZyIsImhhbmRsZUZpeHR1cmUiLCJtZXNzYWdlcyIsImZpeHR1cmVSZWNvcmRzIiwidXNlZEVudGl0eUlkcyIsIlNldCIsIm1hcCIsInIiLCJlbnRpdHlJZCIsImVudGl0eVN0cnVjdHVyZXMiLCJlbnRpdHkiLCJnZXQiLCJpZCIsInRhYmxlIiwicHJvcHMiLCJyZWxhdGlvbnMiLCJlbnVtTGFiZWxzIiwic3lzdGVtTWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeXN0ZW0iLCJ0b29scyIsInVwZGF0ZUZpeHR1cmVzIiwiZGVzY3JpcHRpb24iLCJpbnB1dFNjaGVtYSIsIm9iamVjdCIsInVwZGF0ZXMiLCJhcnJheSIsImZpeHR1cmVJZCIsInN0cmluZyIsImRlc2NyaWJlIiwicmVjb3JkIiwidW5rbm93biIsImV4ZWN1dGUiLCJ1cGRhdGVkUmVjb3JkcyIsInVwZGF0ZSIsImZpbmQiLCJ1IiwiY29sdW1uTmFtZSIsIm5ld1ZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsImNvbHVtbnMiLCJ2YWx1ZSIsInN1Y2Nlc3MiLCJjcmVhdGVGaXh0dXJlcyIsImZpeHR1cmVzIiwibnVtYmVyIiwibmV3UmVjb3JkcyIsImZpeHR1cmUiLCJwcm9wIiwidHlwZSIsIm5hbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJyZWxhdGlvblR5cGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWx0ZXIiLCJmZXRjaGVkUmVjb3JkcyIsImJlbG9uZ3NSZWNvcmRzIiwib3ZlcnJpZGUiLCJuZXdSZWNvcmQiLCJfY29sTmFtZSIsImNvbCIsInJlbGF0ZWRFbnRpdHlJZCIsIndpdGgiLCJyZWxhdGVkSWRzIiwicmVsYXRlZElkIiwicmVsYXRlZEZpeHR1cmVJZCIsInJlbGF0ZWRSZWNvcmQiLCJyZXZlcnNlQ29sIiwiYyIsInJldmVyc2VDb2xOYW1lIiwicmV2ZXJzZUNvbFZhbHVlIiwiY3VycmVudFZhbHVlIiwiaW5jbHVkZXMiLCJoYW5kbGVFbnRpdHkiLCJpbnN0cnVjdGlvbnNQYXRoIiwiam9pbiIsImRpcm5hbWUiLCJpbnN0cnVjdGlvbnMiLCJyZWFkRmlsZVN5bmMiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJleGlzdGluZ0VudGl0aWVzIiwidGl0bGUiLCJwIiwiZGVzYyIsInN0b3BXaGVuIiwiY3JlYXRlRW50aXR5Iiwic2hhcGUiLCJ2YWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdGVFbnRpdHlKc29uIiwibGVuZ3RoIiwiZXJyb3IiLCJlIiwiZmllbGQiLCJtZXNzYWdlIiwic3luY2VyIiwic3Vic2V0cyIsIkEiLCJlbnVtcyIsInJlbG9hZCIsIkVycm9yIiwidXBkYXRlRW50aXR5IiwicGFydGlhbCIsIm1vZGUiLCJlbnVtIiwib3B0aW9uYWwiLCJ1bmRlZmluZWQiLCJwYXJlbnRJZCIsIm5ld1Byb3AiLCJleGlzdGluZ0luZGV4IiwiZmluZEluZGV4IiwicHVzaCIsImluZGV4ZXMiLCJub3JtYWxpemVkU3Vic2V0cyIsIm5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWwiLCJrZXkiLCJmaWVsZHMiLCJmIiwic3Vic2V0c0ludGVybmFsIiwic2F2ZSIsImlucHV0IiwiZXJyb3JzIiwiaGFzSWRQcm9wIiwic29tZSIsImhhc0NyZWF0ZWRBdFByb3AiLCJvcmRlckJ5RW51bUlkIiwic2VhcmNoRmllbGRFbnVtSWQiLCJhaUNsaWVudCJdLCJtYXBwaW5ncyI6IkFBQUEsaUZBQWlGLEdBQ2pGLFNBQVNBLFNBQVMsUUFBUSxvQkFBb0I7QUFDOUMsU0FJRUMsV0FBVyxFQUNYQyxVQUFVLEVBQ1ZDLElBQUksUUFDQyxLQUFLO0FBQ1osT0FBT0MsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FHRUMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLGVBQWUsUUFDVixvQkFBaUI7QUFDeEIsU0FBU0MsV0FBVyxRQUFRLG9CQUFpQjtBQU83QyxNQUFNQztJQUNJQyxRQUFRZixVQUFVLHFCQUFxQjtJQUUvQyxNQUFNZ0IsT0FBTztRQUNYQyxRQUFRQyxHQUFHLENBQUM7SUFDZDtJQUVBQyxjQUNFQyxRQUF3QixFQUN4QkMsY0FBK0IsRUFDSDtRQUM1Qix5Q0FBeUM7UUFDekMsTUFBTUMsZ0JBQWdCO2VBQUksSUFBSUMsSUFBSUYsZUFBZUcsR0FBRyxDQUFDLENBQUNDLElBQU1BLEVBQUVDLFFBQVE7U0FBRztRQUN6RSxNQUFNQyxtQkFBbUJMLGNBQWNFLEdBQUcsQ0FBQyxDQUFDRTtZQUMxQyxNQUFNRSxTQUFTbkIsY0FBY29CLEdBQUcsQ0FBQ0g7WUFFakMsT0FBTztnQkFDTEEsVUFBVUUsT0FBT0UsRUFBRTtnQkFDbkJDLE9BQU9ILE9BQU9HLEtBQUs7Z0JBQ25CQyxPQUFPSixPQUFPSSxLQUFLO2dCQUNuQkMsV0FBV0wsT0FBT0ssU0FBUztnQkFDM0JDLFlBQVlOLE9BQU9NLFVBQVU7WUFDL0I7UUFDRjtRQUVBLE1BQU1DLGdCQUFnQixDQUFDOzs7O1FBSW5CLEVBQUVDLEtBQUtDLFNBQVMsQ0FBQ2hCLGdCQUFnQixNQUFNLEdBQUc7OztRQUcxQyxFQUFFZSxLQUFLQyxTQUFTLENBQUNWLGtCQUFrQixNQUFNLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bb0I5QyxDQUFDO1FBRUgsT0FBT3pCLFdBQVc7WUFDaEJhLE9BQU8sSUFBSSxDQUFDQSxLQUFLO1lBQ2pCdUIsUUFBUUg7WUFDUmY7WUFDQW1CLE9BQU87Z0JBQ0xDLGdCQUFnQnJDLEtBQUs7b0JBQ25Cc0MsYUFDRTtvQkFDRkMsYUFBYW5DLEVBQUVvQyxNQUFNLENBQUM7d0JBQ3BCQyxTQUFTckMsRUFBRXNDLEtBQUssQ0FDZHRDLEVBQUVvQyxNQUFNLENBQUM7NEJBQ1BHLFdBQVd2QyxFQUFFd0MsTUFBTSxHQUFHQyxRQUFRLENBQUM7NEJBQy9CSixTQUFTckMsRUFDTjBDLE1BQU0sQ0FBQzFDLEVBQUV3QyxNQUFNLElBQUl4QyxFQUFFMkMsT0FBTyxJQUM1QkYsUUFBUSxDQUFDO3dCQUNkO29CQUVKO29CQUNBRyxTQUFTLE9BQU8sRUFDZFAsT0FBTyxFQUNSO3dCQUNDLCtCQUErQjt3QkFDL0IsTUFBTVEsaUJBQWtDL0IsZUFBZUcsR0FBRyxDQUFDLENBQUN5Qjs0QkFDMUQsTUFBTUksU0FBU1QsUUFBUVUsSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUVULFNBQVMsS0FBS0csT0FBT0gsU0FBUzs0QkFDbkUsSUFBSU8sUUFBUTtnQ0FDVix1QkFBdUI7Z0NBQ3ZCLEtBQUssTUFBTSxDQUFDRyxZQUFZQyxTQUFTLElBQUlDLE9BQU9DLE9BQU8sQ0FBQ04sT0FBT1QsT0FBTyxFQUFHO29DQUNuRUssT0FBT1csT0FBTyxDQUFDSixXQUFXLENBQUNLLEtBQUssR0FDOUJKO2dDQUNKO2dDQUNBLE9BQU9SOzRCQUNUOzRCQUVBLE9BQU9BO3dCQUNUO3dCQUVBLE9BQU87NEJBQUVhLFNBQVM7NEJBQU1WO3dCQUFlO29CQUN6QztnQkFDRjtnQkFDQVcsZ0JBQWdCNUQsS0FBSztvQkFDbkJzQyxhQUNFO29CQUNGQyxhQUFhbkMsRUFBRW9DLE1BQU0sQ0FBQzt3QkFDcEJxQixVQUFVekQsRUFBRXNDLEtBQUssQ0FDZnRDLEVBQUVvQyxNQUFNLENBQUM7NEJBQ1BqQixVQUFVbkIsRUFBRXdDLE1BQU0sR0FBR0MsUUFBUSxDQUFDOzRCQUM5QmxCLElBQUl2QixFQUFFMEQsTUFBTSxHQUFHakIsUUFBUSxDQUFDOzRCQUN4QlksU0FBU3JELEVBQ04wQyxNQUFNLENBQUMxQyxFQUFFd0MsTUFBTSxJQUFJeEMsRUFBRTJDLE9BQU8sSUFDNUJGLFFBQVEsQ0FBQzt3QkFDZDtvQkFFSjtvQkFDQUcsU0FBUyxPQUFPLEVBQ2RhLFFBQVEsRUFDVDt3QkFDQyxNQUFNRSxhQUE4QkYsU0FBU3hDLEdBQUcsQ0FBQyxDQUFDMkM7NEJBQ2hELE1BQU12QyxTQUFTbkIsY0FBY29CLEdBQUcsQ0FBQ3NDLFFBQVF6QyxRQUFROzRCQUVqRCw2QkFBNkI7NEJBQzdCLE1BQU1rQyxVQUFvQyxDQUFDOzRCQUMzQyxLQUFLLE1BQU1RLFFBQVF4QyxPQUFPSSxLQUFLLENBQUU7Z0NBQy9CLElBQUlvQyxLQUFLQyxJQUFJLEtBQUssV0FBVztnQ0FFN0IsSUFBSVIsUUFBUU0sUUFBUVAsT0FBTyxDQUFDUSxLQUFLRSxJQUFJLENBQUMsSUFBSTtnQ0FFMUMsSUFBSUYsS0FBS0UsSUFBSSxLQUFLLGNBQWM7b0NBQzlCLGFBQWE7b0NBQ2JULFFBQVEsSUFBSVUsT0FBT0MsV0FBVztnQ0FDaEMsT0FBTyxJQUNMSixLQUFLQyxJQUFJLEtBQUssY0FDYkQsQ0FBQUEsS0FBS0ssWUFBWSxLQUFLLGFBQWFMLEtBQUtLLFlBQVksS0FBSyxZQUFXLEdBQ3JFO29DQUNBLFNBQVM7b0NBQ1RaLFFBQVFhLE1BQU1DLE9BQU8sQ0FBQ2QsU0FBU0EsUUFBUTt3Q0FBQ0E7cUNBQU0sQ0FBQ2UsTUFBTSxDQUFDL0Q7Z0NBQ3hEO2dDQUVBK0MsT0FBTyxDQUFDUSxLQUFLRSxJQUFJLENBQUMsR0FBRztvQ0FDbkJGO29DQUNBUCxPQUFPQTtnQ0FDVDs0QkFDRjs0QkFFQSxPQUFPO2dDQUNMZixXQUFXLEdBQUdxQixRQUFRekMsUUFBUSxDQUFDLENBQUMsRUFBRXlDLFFBQVFyQyxFQUFFLEVBQUU7Z0NBQzlDSixVQUFVeUMsUUFBUXpDLFFBQVE7Z0NBQzFCSSxJQUFJcUMsUUFBUXJDLEVBQUU7Z0NBQ2Q4QjtnQ0FDQWlCLGdCQUFnQixFQUFFO2dDQUNsQkMsZ0JBQWdCLEVBQUU7Z0NBQ2xCQyxVQUFVOzRCQUNaO3dCQUNGO3dCQUVBLHVEQUF1RDt3QkFDdkQsS0FBSyxNQUFNQyxhQUFhZCxXQUFZOzRCQUNsQyxLQUFLLE1BQU0sQ0FBQ2UsVUFBVUMsSUFBSSxJQUFJeEIsT0FBT0MsT0FBTyxDQUFDcUIsVUFBVXBCLE9BQU8sRUFBRztnQ0FDL0QsSUFBSXNCLElBQUlkLElBQUksQ0FBQ0MsSUFBSSxLQUFLLGNBQWNhLElBQUlyQixLQUFLLEtBQUssTUFBTTtnQ0FFeEQsTUFBTXNCLGtCQUFrQkQsSUFBSWQsSUFBSSxDQUFDZ0IsSUFBSTtnQ0FDckMsTUFBTUMsYUFBYVgsTUFBTUMsT0FBTyxDQUFDTyxJQUFJckIsS0FBSyxJQUFJcUIsSUFBSXJCLEtBQUssR0FBRztvQ0FBQ3FCLElBQUlyQixLQUFLO2lDQUFDO2dDQUVyRSxLQUFLLE1BQU15QixhQUFhRCxXQUFZO29DQUNsQyxNQUFNRSxtQkFBbUIsR0FBR0osZ0JBQWdCLENBQUMsRUFBRUcsV0FBVztvQ0FDMUQsTUFBTUUsZ0JBQWdCdEIsV0FBV1osSUFBSSxDQUFDLENBQUM3QixJQUFNQSxFQUFFcUIsU0FBUyxLQUFLeUM7b0NBRTdELElBQUlDLGVBQWU7d0NBQ2pCLGtCQUFrQjt3Q0FDbEIsTUFBTUMsYUFBYS9CLE9BQU9DLE9BQU8sQ0FBQzZCLGNBQWM1QixPQUFPLEVBQUVOLElBQUksQ0FDM0QsQ0FBQyxHQUFHb0MsRUFBRSxHQUFLQSxFQUFFdEIsSUFBSSxDQUFDQyxJQUFJLEtBQUssY0FBY3FCLEVBQUV0QixJQUFJLENBQUNnQixJQUFJLEtBQUtKLFVBQVV0RCxRQUFRO3dDQUc3RSxJQUFJK0QsWUFBWTs0Q0FDZCxNQUFNLENBQUNFLGdCQUFnQkMsZ0JBQWdCLEdBQUdIOzRDQUMxQyxNQUFNSSxlQUFlRCxnQkFBZ0IvQixLQUFLOzRDQUUxQyxvQ0FBb0M7NENBQ3BDLElBQ0UrQixnQkFBZ0J4QixJQUFJLENBQUNDLElBQUksS0FBSyxjQUM3QnVCLENBQUFBLGdCQUFnQnhCLElBQUksQ0FBQ0ssWUFBWSxLQUFLLGFBQ3JDbUIsZ0JBQWdCeEIsSUFBSSxDQUFDSyxZQUFZLEtBQUssWUFBVyxHQUNuRDtnREFDQXJFLE9BQU9zRSxNQUFNQyxPQUFPLENBQUNrQixlQUFlO2dEQUNwQyxJQUFJLENBQUNBLGFBQWFDLFFBQVEsQ0FBQ2QsVUFBVWxELEVBQUUsR0FBRztvREFDeEMwRCxjQUFjNUIsT0FBTyxDQUFDK0IsZUFBZSxHQUFHO3dEQUN0QyxHQUFHQyxlQUFlO3dEQUNsQi9CLE9BQU87K0RBQUlnQzs0REFBY2IsVUFBVWxELEVBQUU7eURBQUM7b0RBQ3hDO2dEQUNGOzRDQUNGLE9BQU87Z0RBQ0wseUNBQXlDO2dEQUN6QzBELGNBQWM1QixPQUFPLENBQUMrQixlQUFlLEdBQUc7b0RBQ3RDLEdBQUdDLGVBQWU7b0RBQ2xCL0IsT0FBT21CLFVBQVVsRCxFQUFFO2dEQUNyQjs0Q0FDRjt3Q0FDRjtvQ0FDRjtnQ0FDRjs0QkFDRjt3QkFDRjt3QkFFQSxPQUFPOzRCQUFFZ0MsU0FBUzs0QkFBTVYsZ0JBQWdCYzt3QkFBVztvQkFDckQ7Z0JBQ0Y7WUFDRjtRQUNGO0lBQ0Y7SUFFQTZCLGFBQWEzRSxRQUF3QixFQUE4QjtRQUNqRSwwRUFBMEU7UUFDMUUsTUFBTTRFLG1CQUFtQjFGLEtBQUsyRixJQUFJLENBQ2hDLFlBQVlDLE9BQU8sRUFDbkIsTUFDQSxNQUNBLE9BQ0EsTUFDQTtRQUVGLE1BQU1DLGVBQWU5RixHQUFHK0YsWUFBWSxDQUFDSixrQkFBa0I7UUFFdkQsbUJBQW1CO1FBQ25CLE1BQU1LLFlBQVk1RixjQUFjNkYsU0FBUztRQUN6QyxNQUFNQyxtQkFBbUJGLFVBQVU3RSxHQUFHLENBQUMsQ0FBQ0U7WUFDdEMsTUFBTUUsU0FBU25CLGNBQWNvQixHQUFHLENBQUNIO1lBQ2pDLE9BQU87Z0JBQ0xJLElBQUlGLE9BQU9FLEVBQUU7Z0JBQ2IwRSxPQUFPNUUsT0FBTzRFLEtBQUs7Z0JBQ25CekUsT0FBT0gsT0FBT0csS0FBSztnQkFDbkJDLE9BQU9KLE9BQU9JLEtBQUssQ0FBQ1IsR0FBRyxDQUFDLENBQUNpRixJQUFPLENBQUE7d0JBQzlCbkMsTUFBTW1DLEVBQUVuQyxJQUFJO3dCQUNaRCxNQUFNb0MsRUFBRXBDLElBQUk7d0JBQ1pxQyxNQUFNRCxFQUFFQyxJQUFJO29CQUNkLENBQUE7WUFDRjtRQUNGO1FBRUEsTUFBTXZFLGdCQUFnQixDQUFDOzs7QUFHM0IsRUFBRWdFLGFBQWE7Ozs7O0FBS2YsRUFBRS9ELEtBQUtDLFNBQVMsQ0FBQ2tFLGtCQUFrQixNQUFNLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXlEdEMsQ0FBQztRQUVILE9BQU9yRyxXQUFXO1lBQ2hCYSxPQUFPLElBQUksQ0FBQ0EsS0FBSztZQUNqQnVCLFFBQVFIO1lBQ1JmO1lBQ0F1RixVQUFVMUcsWUFBWTtZQUN0QnNDLE9BQU87Z0JBQ0xxRSxjQUFjekcsS0FBSztvQkFDakJzQyxhQUNFO29CQUNGQyxhQUFhOUIsZ0JBQWdCaUcsS0FBSyxDQUFDakYsTUFBTTtvQkFDekN1QixTQUFTLE9BQ1B2Qjt3QkFPQSxJQUFJOzRCQUNGLFFBQVE7NEJBQ1IsTUFBTWtGLG1CQUFtQkMsbUJBQW1CbkY7NEJBRTVDLElBQUlrRixpQkFBaUJFLE1BQU0sR0FBRyxHQUFHO2dDQUMvQixPQUFPO29DQUNMbEQsU0FBUztvQ0FDVHBDLFVBQVVFLE9BQU9GLFFBQVE7b0NBQ3pCdUYsT0FBTyxDQUFDLE9BQU8sRUFBRUgsaUJBQWlCdEYsR0FBRyxDQUFDLENBQUMwRixJQUFNLENBQUMsQ0FBQyxFQUFFQSxFQUFFQyxLQUFLLENBQUMsRUFBRSxFQUFFRCxFQUFFRSxPQUFPLEVBQUUsRUFBRW5CLElBQUksQ0FBQyxPQUFPO29DQUN0RmE7Z0NBQ0Y7NEJBQ0Y7NEJBRUEsTUFBTXRHLE9BQU82RyxNQUFNLENBQUNULFlBQVksQ0FBQztnQ0FDL0JVLFNBQVM7b0NBQUVDLEdBQUc7d0NBQUM7cUNBQUs7Z0NBQUM7Z0NBQ3JCQyxPQUFPLENBQUM7Z0NBQ1IsR0FBRzVGLE1BQU07NEJBQ1g7NEJBRUEsb0JBQW9COzRCQUNwQixNQUFNbkIsY0FBY2dILE1BQU07NEJBRTFCLE9BQU87Z0NBQUUzRCxTQUFTO2dDQUFNcEMsVUFBVUUsT0FBT0YsUUFBUTs0QkFBQzt3QkFDcEQsRUFBRSxPQUFPd0YsR0FBRzs0QkFDVixNQUFNRCxRQUFRQyxhQUFhUSxRQUFRUixFQUFFRSxPQUFPLEdBQUc7NEJBQy9DLE9BQU87Z0NBQUV0RCxTQUFTO2dDQUFPcEMsVUFBVUUsT0FBT0YsUUFBUTtnQ0FBRXVGOzRCQUFNO3dCQUM1RDtvQkFDRjtnQkFDRjtnQkFDQVUsY0FBY3hILEtBQUs7b0JBQ2pCc0MsYUFDRTtvQkFDRkMsYUFBYW5DLEVBQUVvQyxNQUFNLENBQUM7d0JBQ3BCakIsVUFBVW5CLEVBQUV3QyxNQUFNLEdBQUdDLFFBQVEsQ0FBQzt3QkFDOUJKLFNBQVNoQyxnQkFBZ0JpRyxLQUFLLENBQUNqRixNQUFNLENBQUNnRyxPQUFPLEdBQUc1RSxRQUFRLENBQUM7d0JBQ3pENkUsTUFBTXRILEVBQ0h1SCxJQUFJLENBQUM7NEJBQUM7NEJBQVM7eUJBQVUsRUFDekJDLFFBQVEsR0FDUi9FLFFBQVEsQ0FBQztvQkFDZDtvQkFDQUcsU0FBUyxPQUFPLEVBQ2R6QixRQUFRLEVBQ1JrQixPQUFPLEVBQ1BpRixPQUFPLE9BQU8sRUFDZjt3QkFNQyxJQUFJOzRCQUNGLE1BQU1qRyxTQUFTbkIsY0FBY29CLEdBQUcsQ0FBQ0g7NEJBRWpDLDBCQUEwQjs0QkFDMUIsSUFBSWtCLFFBQVFsQixRQUFRLEtBQUtzRyxXQUFXcEcsT0FBT0UsRUFBRSxHQUFHYyxRQUFRbEIsUUFBUTs0QkFDaEUsSUFBSWtCLFFBQVFxRixRQUFRLEtBQUtELFdBQVdwRyxPQUFPcUcsUUFBUSxHQUFHckYsUUFBUXFGLFFBQVE7NEJBQ3RFLElBQUlyRixRQUFRNEQsS0FBSyxLQUFLd0IsV0FBV3BHLE9BQU80RSxLQUFLLEdBQUc1RCxRQUFRNEQsS0FBSzs0QkFDN0QsSUFBSTVELFFBQVFiLEtBQUssS0FBS2lHLFdBQVdwRyxPQUFPRyxLQUFLLEdBQUdhLFFBQVFiLEtBQUs7NEJBRTdELHdDQUF3Qzs0QkFDeEMsSUFBSWEsUUFBUVosS0FBSyxLQUFLZ0csV0FBVztnQ0FDL0IsSUFBSUgsU0FBUyxXQUFXO29DQUN0QmpHLE9BQU9JLEtBQUssR0FBR1ksUUFBUVosS0FBSztnQ0FDOUIsT0FBTztvQ0FDTCxLQUFLLE1BQU1rRyxXQUFXdEYsUUFBUVosS0FBSyxDQUFFO3dDQUNuQyxNQUFNbUcsZ0JBQWdCdkcsT0FBT0ksS0FBSyxDQUFDb0csU0FBUyxDQUFDLENBQUMzQixJQUFNQSxFQUFFbkMsSUFBSSxLQUFLNEQsUUFBUTVELElBQUk7d0NBQzNFLElBQUk2RCxpQkFBaUIsR0FBRzs0Q0FDdEJ2RyxPQUFPSSxLQUFLLENBQUNtRyxjQUFjLEdBQUdEO3dDQUNoQyxPQUFPOzRDQUNMdEcsT0FBT0ksS0FBSyxDQUFDcUcsSUFBSSxDQUFDSDt3Q0FDcEI7b0NBQ0Y7Z0NBQ0Y7NEJBQ0Y7NEJBRUEsb0NBQW9DOzRCQUNwQyxJQUFJdEYsUUFBUTBGLE9BQU8sS0FBS04sV0FBVztnQ0FDakNwRyxPQUFPMEcsT0FBTyxHQUNaVCxTQUFTLFlBQVlqRixRQUFRMEYsT0FBTyxHQUFHO3VDQUFJMUcsT0FBTzBHLE9BQU87dUNBQUsxRixRQUFRMEYsT0FBTztpQ0FBQzs0QkFDbEY7NEJBRUEsOENBQThDOzRCQUM5QyxJQUFJMUYsUUFBUTBFLE9BQU8sS0FBS1UsV0FBVztnQ0FDakMseUZBQXlGO2dDQUN6RixNQUFNTyxvQkFBaUQsQ0FBQztnQ0FDeEQsTUFBTUMsNEJBQXlELENBQUM7Z0NBRWhFLEtBQUssTUFBTSxDQUFDQyxLQUFLQyxPQUFPLElBQUloRixPQUFPQyxPQUFPLENBQUNmLFFBQVEwRSxPQUFPLEVBQUc7b0NBQzNEaUIsaUJBQWlCLENBQUNFLElBQUksR0FBR0MsT0FDdEI5RCxNQUFNLENBQUMsQ0FBQytELElBQU0sQ0FBQ2pJLHNCQUFzQmlJLElBQ3JDbkgsR0FBRyxDQUFDYjtvQ0FDUDZILHlCQUF5QixDQUFDQyxJQUFJLEdBQUdDLE9BQzlCOUQsTUFBTSxDQUFDbEUsdUJBQ1BjLEdBQUcsQ0FBQ2I7Z0NBQ1Q7Z0NBRUFpQixPQUFPMEYsT0FBTyxHQUNaTyxTQUFTLFlBQ0xVLG9CQUNBO29DQUFFLEdBQUczRyxPQUFPMEYsT0FBTztvQ0FBRSxHQUFHaUIsaUJBQWlCO2dDQUFDO2dDQUNoRDNHLE9BQU9nSCxlQUFlLEdBQ3BCZixTQUFTLFlBQ0xXLDRCQUNBO29DQUFFLEdBQUc1RyxPQUFPZ0gsZUFBZTtvQ0FBRSxHQUFHSix5QkFBeUI7Z0NBQUM7NEJBQ2xFOzRCQUVBLElBQUk1RixRQUFRNEUsS0FBSyxLQUFLUSxXQUFXO2dDQUMvQnBHLE9BQU9NLFVBQVUsR0FDZjJGLFNBQVMsWUFBWWpGLFFBQVE0RSxLQUFLLEdBQUc7b0NBQUUsR0FBRzVGLE9BQU9NLFVBQVU7b0NBQUUsR0FBR1UsUUFBUTRFLEtBQUs7Z0NBQUM7NEJBQ2xGOzRCQUVBLFVBQVU7NEJBQ1YsTUFBTVYsbUJBQW1CQyxtQkFBbUI7Z0NBQzFDLEdBQUduRixNQUFNO2dDQUNURixVQUFVRSxPQUFPRSxFQUFFO2dDQUNuQjBGLE9BQU81RixPQUFPTSxVQUFVOzRCQUMxQjs0QkFFQSxJQUFJNEUsaUJBQWlCRSxNQUFNLEdBQUcsR0FBRztnQ0FDL0IsT0FBTztvQ0FDTGxELFNBQVM7b0NBQ1RwQztvQ0FDQXVGLE9BQU8sQ0FBQyxPQUFPLEVBQUVILGlCQUFpQnRGLEdBQUcsQ0FBQyxDQUFDMEYsSUFBTSxDQUFDLENBQUMsRUFBRUEsRUFBRUMsS0FBSyxDQUFDLEVBQUUsRUFBRUQsRUFBRUUsT0FBTyxFQUFFLEVBQUVuQixJQUFJLENBQUMsT0FBTztvQ0FDdEZhO2dDQUNGOzRCQUNGOzRCQUVBLE1BQU1sRixPQUFPaUgsSUFBSTs0QkFFakIsT0FBTztnQ0FBRS9FLFNBQVM7Z0NBQU1wQzs0QkFBUzt3QkFDbkMsRUFBRSxPQUFPd0YsR0FBRzs0QkFDVixNQUFNRCxRQUFRQyxhQUFhUSxRQUFRUixFQUFFRSxPQUFPLEdBQUc7NEJBQy9DLE9BQU87Z0NBQUV0RCxTQUFTO2dDQUFPcEM7Z0NBQVV1Rjs0QkFBTTt3QkFDM0M7b0JBQ0Y7Z0JBQ0Y7WUFDRjtRQUNGO0lBQ0Y7QUFDRjtBQUVBOztDQUVDLEdBQ0QsU0FBU0YsbUJBQW1CK0IsS0FBZ0M7SUFDMUQsTUFBTUMsU0FBNEIsRUFBRTtJQUNwQyxNQUFNLEVBQUVySCxRQUFRLEVBQUVNLEtBQUssRUFBRXdGLEtBQUssRUFBRSxHQUFHc0I7SUFFbkMsNEJBQTRCO0lBQzVCLE1BQU1FLFlBQVloSCxPQUFPaUgsS0FBSyxDQUFDeEMsSUFBTUEsRUFBRW5DLElBQUksS0FBSztJQUNoRCxJQUFJLENBQUMwRSxXQUFXO1FBQ2RELE9BQU9WLElBQUksQ0FBQztZQUFFbEIsT0FBTztZQUFTQyxTQUFTO1FBQWtCO0lBQzNEO0lBQ0EsTUFBTThCLG1CQUFtQmxILE9BQU9pSCxLQUFLLENBQUN4QyxJQUFNQSxFQUFFbkMsSUFBSSxLQUFLO0lBQ3ZELElBQUksQ0FBQzRFLGtCQUFrQjtRQUNyQkgsT0FBT1YsSUFBSSxDQUFDO1lBQUVsQixPQUFPO1lBQVNDLFNBQVM7UUFBMEI7SUFDbkU7SUFFQSwwREFBMEQ7SUFDMUQsTUFBTStCLGdCQUFnQixHQUFHekgsU0FBUyxPQUFPLENBQUM7SUFDMUMsTUFBTTBILG9CQUFvQixHQUFHMUgsU0FBUyxXQUFXLENBQUM7SUFFbEQsSUFBSSxDQUFDOEYsT0FBTyxDQUFDMkIsY0FBYyxFQUFFO1FBQzNCSixPQUFPVixJQUFJLENBQUM7WUFDVmxCLE9BQU87WUFDUEMsU0FBUyxHQUFHK0IsY0FBYyx5Q0FBeUMsQ0FBQztRQUN0RTtJQUNGO0lBQ0EsSUFBSSxDQUFDM0IsT0FBTyxDQUFDNEIsa0JBQWtCLEVBQUU7UUFDL0JMLE9BQU9WLElBQUksQ0FBQztZQUNWbEIsT0FBTztZQUNQQyxTQUFTLEdBQUdnQyxrQkFBa0IsaUNBQWlDLENBQUM7UUFDbEU7SUFDRjtJQUVBLHdEQUF3RDtJQUN4RCxLQUFLLE1BQU1oRixRQUFRcEMsU0FBUyxFQUFFLENBQUU7UUFDOUIsSUFBSW9DLEtBQUtDLElBQUksS0FBSyxVQUFVLENBQUNtRCxPQUFPLENBQUNwRCxLQUFLdEMsRUFBRSxDQUFDLEVBQUU7WUFDN0NpSCxPQUFPVixJQUFJLENBQUM7Z0JBQ1ZsQixPQUFPLENBQUMsTUFBTSxFQUFFL0MsS0FBS0UsSUFBSSxFQUFFO2dCQUMzQjhDLFNBQVMsQ0FBQyxTQUFTLEVBQUVoRCxLQUFLdEMsRUFBRSxDQUFDLHVCQUF1QixDQUFDO1lBQ3ZEO1FBQ0Y7SUFDRjtJQUVBLE9BQU9pSDtBQUNUO0FBRUEsT0FBTyxNQUFNTSxXQUFXLElBQUl2SSxXQUFXIn0=
|
|
477
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9haS1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIGJpb21lLWlnbm9yZS1hbGwgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEFJIFNES+ydmCDtg4DsnoXsnbQg66qF7ZmV7ZWY7KeAIOyViuyVhCBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlTW9kZWwsIE1vZGVsTWVzc2FnZSwgU3RyZWFtVGV4dFJlc3VsdCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbiAgVGVtcGxhdGVPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbnR5cGUgVmFsaWRhdGlvbkVycm9yID0ge1xuICBmaWVsZDogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5jbGFzcyBBSUNsaWVudCB7XG4gIHByaXZhdGUgbW9kZWw6IExhbmd1YWdlTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhaVNkazpcbiAgICB8ICh0eXBlb2YgaW1wb3J0KFwiYWlcIikgJiB7XG4gICAgICAgIGFudGhyb3BpYz86IHR5cGVvZiBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKS5hbnRocm9waWM7XG4gICAgICB9KVxuICAgIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgICAgY29uc3QgYWlNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcbiAgICAgIHRoaXMuYWlTZGsgPSB7IC4uLmFpTW9kdWxlLCBhbnRocm9waWMgfTtcbiAgICAgIHRoaXMubW9kZWwgPSBhbnRocm9waWMoXCJjbGF1ZGUtc29ubmV0LTQtNVwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkFJIFNESyBwYWNrYWdlcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsIEBhaS1zZGsvYW50aHJvcGljIGFuZCBhaSB0byB1c2UgQUkgZmVhdHVyZXMuXCIsXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRml4dHVyZShcbiAgICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW10sXG4gICAgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIGlmICghdGhpcy5haVNkayB8fCAhdGhpcy5tb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUkgU0RLIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cblxuICAgIC8vIO2YhOyerCBmaXh0dXJlUmVjb3Jkc+yXkOyEnCDsgqzsmqnrkJwg7JeU7Yuw7Yuw65Ok7J2YIOq1rOyhsCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgdXNlZEVudGl0eUlkcyA9IFsuLi5uZXcgU2V0KGZpeHR1cmVSZWNvcmRzLm1hcCgocikgPT4gci5lbnRpdHlJZCkpXTtcbiAgICBjb25zdCBlbnRpdHlTdHJ1Y3R1cmVzID0gdXNlZEVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIHRhYmxlOiBlbnRpdHkudGFibGUsXG4gICAgICAgIHByb3BzOiBlbnRpdHkucHJvcHMsXG4gICAgICAgIHJlbGF0aW9uczogZW50aXR5LnJlbGF0aW9ucyxcbiAgICAgICAgZW51bUxhYmVsczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3lzdGVtTWVzc2FnZSA9IGBcbiAgICAgICAg64u57Iug7J2AIO2UveyKpOyzkCDroIjsvZTrk5zrpbwg7IiY7KCV7ZWY6rOgIOyDneyEse2VoCDsiJgg7J6I64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuICAgICAgICDtmITsnqwg7ZS97Iqk7LOQIOugiOy9lOuTnDpcbiAgICAgICAgJHtKU09OLnN0cmluZ2lmeShmaXh0dXJlUmVjb3JkcywgbnVsbCwgMil9XG5cbiAgICAgICAg7JeU7Yuw7YuwIOq1rOyhsCDsoJXrs7Q6XG4gICAgICAgICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5U3RydWN0dXJlcywgbnVsbCwgMil9XG5cbiAgICAgICAgIyMg7ZS97Iqk7LOQIOyImOyglVxuICAgICAgICDsgqzsmqnsnpDqsIAg7ZS97Iqk7LOQIOqwkiDsiJjsoJXsnYQg7JqU7LKt7ZWY66m0IHVwZGF0ZUZpeHR1cmVzIOuPhOq1rOulvCDsgqzsmqntlZjsl6wg67OA6rK97IKs7ZWt7J2EIOyggeyaqe2VmOyEuOyalC5cbiAgICAgICAgLSBmaXh0dXJlSWQ6IOyImOygle2VoCDtlL3siqTss5AgSUQgKO2YleyLnTogXCJFbnRpdHlJZCNpZFwiKVxuICAgICAgICAtIHVwZGF0ZXM6IOy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcblxuICAgICAgICDsmIjsi5w6IFwiVXNlciMxXCIg7ZS97Iqk7LOQ7J2YIFwibmFtZVwiIOy7rOufvOydhCBcIu2Zjeq4uOuPmVwi7Jy866GcIOuzgOqyve2VmOugpOuptDpcbiAgICAgICAgdXBkYXRlRml4dHVyZXMoeyB1cGRhdGVzOiBbeyBmaXh0dXJlSWQ6IFwiVXNlciMxXCIsIHVwZGF0ZXM6IHsgbmFtZTogXCLtmY3quLjrj5lcIiB9IH1dIH0pXG5cbiAgICAgICAg67OA6rK965CgIOy7rOufvOydmCB0eXBl7J20IHJlbGF0aW9u7J24IOqyveyasCwg6rSA66CoIOyXlO2LsO2LsOyXkOuPhCDrsJjsmIHrkJjslrTslbwg7ZWgIOy7rOufvOydtCDsnojripTsp4Ag7ZmV7J247ZWY7IS47JqULlxuXG4gICAgICAgICMjIO2UveyKpOyzkCDsg53shLFcbiAgICAgICAg7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDtlL3siqTss5Ag7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVGaXh0dXJlcyDrj4Tqtazrpbwg7IKs7Jqp7ZWY7IS47JqULlxuICAgICAgICAtIGVudGl0eUlkOiDsg53shLHtlaAg7JeU7Yuw7YuwIElEXG4gICAgICAgIC0gaWQ6IOyDiCDroIjsvZTrk5zsnZggSUQgKOq4sOyhtCDtlL3siqTss5DsmYAg7KSR67O165CY7KeAIOyViuuKlCDsnYzsiJgg7IKs7JqpIOq2jOyepSwg7JiIOiAtMSwgLTIpXG4gICAgICAgIC0gY29sdW1uczog7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0ICjsl5Tti7Dti7Ag6rWs7KGwIOywuOqzoClcblxuICAgICAgICDsmIjsi5w6IOyDiOuhnOyatCBVc2VyIO2UveyKpOyzkOulvCDsg53shLHtlZjroKTrqbQ6XG4gICAgICAgIGNyZWF0ZUZpeHR1cmVzKHsgZml4dHVyZXM6IFt7IGVudGl0eUlkOiBcIlVzZXJcIiwgaWQ6IC0xLCBjb2x1bW5zOiB7IG5hbWU6IFwi7ZmN6ri464+ZXCIsIGVtYWlsOiBcImhvbmdAZXhhbXBsZS5jb21cIiB9IH1dIH0pXG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sIH0gPSB0aGlzLmFpU2RrO1xuXG4gICAgcmV0dXJuIHN0cmVhbVRleHQoe1xuICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICBzeXN0ZW06IHN5c3RlbU1lc3NhZ2UsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIHRvb2xzOiB7XG4gICAgICAgIHVwZGF0ZUZpeHR1cmVzOiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7ZS97Iqk7LOQIOugiOy9lOuTnOydmCDqsJLsnYQg7IiY7KCV7ZWp64uI64ukLiDsgqzsmqnsnpDqsIAg7Yq57KCVIOy7rOufvOydtOuCmCDqsJLsnYQg67OA6rK97ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICB1cGRhdGVzOiB6LmFycmF5KFxuICAgICAgICAgICAgICB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgZml4dHVyZUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2UveyKpOyzkCBJRCAo7ZiV7IudOiBFbnRpdHlJZCNpZClcIiksXG4gICAgICAgICAgICAgICAgdXBkYXRlczogelxuICAgICAgICAgICAgICAgICAgLnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlcbiAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIuy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICB1cGRhdGVzOiBBcnJheTx7IGZpeHR1cmVJZDogc3RyaW5nOyB1cGRhdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PjtcbiAgICAgICAgICB9KTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gfT4gPT4ge1xuICAgICAgICAgICAgLy8gZml4dHVyZVJlY29yZHPrpbwg67O17IKs7ZWY6rOgIOyXheuNsOydtO2KuCDsoIHsmqlcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlUmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHU6IHsgZml4dHVyZUlkOiBzdHJpbmcgfSkgPT4gdS5maXh0dXJlSWQgPT09IHJlY29yZC5maXh0dXJlSWQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBjb2x1bW5z7J2YIHZhbHVl66W8IOyXheuNsOydtO2KuFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIG5ld1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGUudXBkYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW2NvbHVtbk5hbWVdLnZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgYXMgRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB1cGRhdGVkUmVjb3JkcyB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBjcmVhdGVGaXh0dXJlczogdG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIuyDiOuhnOyatCDtlL3siqTss5Ag66CI7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC4g7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDrjbDsnbTthLDrpbwg7LaU6rCA7ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICBmaXh0dXJlczogei5hcnJheShcbiAgICAgICAgICAgICAgei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IOd7ISx7ZWgIOyXlO2LsO2LsCBJRFwiKSxcbiAgICAgICAgICAgICAgICBpZDogei5udW1iZXIoKS5kZXNjcmliZShcIuyDiCDroIjsvZTrk5zsnZggSUQgKOydjOyImCDqtozsnqUsIOyYiDogLTEsIC0yKVwiKSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB6XG4gICAgICAgICAgICAgICAgICAucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKVxuICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKFwi7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0XCIpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgICAgIGZpeHR1cmVzLFxuICAgICAgICAgIH06IHtcbiAgICAgICAgICAgIGZpeHR1cmVzOiBBcnJheTx7IGVudGl0eUlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+O1xuICAgICAgICAgIH0pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgdXBkYXRlZFJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSB9PiA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlcy5tYXAoXG4gICAgICAgICAgICAgIChmaXh0dXJlOiB7IGVudGl0eUlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgICAgICAgIC8vIOyXlO2LsO2LsCBwcm9wc+ulvCDquLDrsJjsnLzroZwgY29sdW1ucyDqtazshLFcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwidmlydHVhbFwiKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW3Byb3AubmFtZV0gPz8gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7ZiE7J6sIOyLnOqwhOycvOuhnCDshKTsoJVcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8IHByb3AucmVsYXRpb25UeXBlID09PSBcIk1hbnlUb01hbnlcIilcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyDrsLDsl7TroZwg67OA7ZmYXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0uZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29sdW1uc1twcm9wLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUgYXMgRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgZml4dHVyZUlkOiBgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9YCxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgaWQ6IGZpeHR1cmUuaWQsXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgYmVsb25nc1JlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyDsg4gg66CI7L2U65Oc65Ok7J2YIHJlbGF0aW9uIOy7rOufvOydhCDtmZXsnbjtlZjsl6wg6riw7KG0IOugiOy9lOuTnOuTpOydmCDsl63rsKntlqUgcmVsYXRpb24g7JeF642w7J207Yq4XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ld1JlY29yZCBvZiBuZXdSZWNvcmRzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW19jb2xOYW1lLCBjb2xdIG9mIE9iamVjdC5lbnRyaWVzKG5ld1JlY29yZC5jb2x1bW5zKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb2wucHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgY29sLnZhbHVlID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHlJZCA9IGNvbC5wcm9wLndpdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IEFycmF5LmlzQXJyYXkoY29sLnZhbHVlKSA/IGNvbC52YWx1ZSA6IFtjb2wudmFsdWVdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3JlbGF0ZWRFbnRpdHlJZH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWNvcmQgPSBuZXdSZWNvcmRzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSByZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9uIOywvuq4sFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlQ29sID0gT2JqZWN0LmVudHJpZXMocmVsYXRlZFJlY29yZC5jb2x1bW5zKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgIChbLCBjXSkgPT4gYy5wcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJiBjLnByb3Aud2l0aCA9PT0gbmV3UmVjb3JkLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlQ29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3JldmVyc2VDb2xOYW1lLCByZXZlcnNlQ29sVmFsdWVdID0gcmV2ZXJzZUNvbDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSByZXZlcnNlQ29sVmFsdWUudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyDsl63rsKntlqXsnbQg67Cw7Je07J24IOqyveyasCAoSGFzTWFueSwgTWFueVRvTWFueSlcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlQ29sVmFsdWUucHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXZlcnNlQ29sVmFsdWUucHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VDb2xWYWx1ZS5wcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJNYW55VG9NYW55XCIpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpLCBcImN1cnJlbnRWYWx1ZSBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUuaW5jbHVkZXMobmV3UmVjb3JkLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkUmVjb3JkLmNvbHVtbnNbcmV2ZXJzZUNvbE5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJldmVyc2VDb2xWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWy4uLmN1cnJlbnRWYWx1ZSwgbmV3UmVjb3JkLmlkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7Zal7J20IOuLqOydvCDqsJLsnbgg6rK97JqwIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFJlY29yZC5jb2x1bW5zW3JldmVyc2VDb2xOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmV2ZXJzZUNvbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3UmVjb3JkLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdXBkYXRlZFJlY29yZHM6IG5ld1JlY29yZHMgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVFbnRpdHkobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIGlmICghdGhpcy5haVNkayB8fCAhdGhpcy5tb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUkgU0RLIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cblxuICAgIC8vIGVudGl0eS5pbnN0cnVjdGlvbnMubWQg7YyM7J28IOydveq4sCAoZGlzdC91aSDrmJDripQgc3JjL3Vp7JeQ7IScIOyLpO2WieuQmOuvgOuhnCDtjKjtgqTsp4Ag66Oo7Yq4IOq4sOykgOycvOuhnCDsoJHqt7wpXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgICBcIi4uXCIsXG4gICAgICBcIi4uXCIsXG4gICAgICBcInNyY1wiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJlbnRpdHkuaW5zdHJ1Y3Rpb25zLm1kXCIsXG4gICAgKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIO2YhOyerCDrk7HroZ3rkJwg7JeU7Yuw7YuwIOygleuztCDsiJjsp5FcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGV4aXN0aW5nRW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgdGl0bGU6IGVudGl0eS50aXRsZSxcbiAgICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgICAgcHJvcHM6IGVudGl0eS5wcm9wcy5tYXAoKHApID0+ICh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgICAgICBkZXNjOiBwLmRlc2MsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzeXN0ZW1NZXNzYWdlID0gYFxu64u57Iug7J2AIFNvbmFtdSDtlITroIjsnoTsm4ztgazsl5DshJwgRW50aXR57JmAIEVudW3snYQg7IOd7ISx7ZWY64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuJHtpbnN0cnVjdGlvbnN9XG5cbiMjIO2YhOyerCDrk7HroZ3rkJwgRW50aXR5IOuqqeuhnVxu64uk66W4IOyXlO2LsO2LsOyZgCDqtIDqs4QocmVsYXRpb24p66W8IOunuuqxsOuCmCBzdWJzZXTsl5DshJwg7LC47KGw7ZWgIOuVjCDrsJjrk5zsi5wg7JWE656YIOygleuztOulvCDtmZXsnbjtlZjshLjsmpQuXG5cbiR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdFbnRpdGllcywgbnVsbCwgMil9XG5cbiMjIFRvb2wg7IKs7JqpIOqwgOydtOuTnFxuXG4jIyMgRW50aXR5IOyDneyEsSAoY3JlYXRlRW50aXR5KVxu7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCBFbnRpdHkg7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC5cbi0gZW50aXR5SWQ6IFBhc2NhbENhc2XroZwg65CcIEVudGl0eSBJRCAo7JiIOiBcIlVzZXJcIiwgXCJQcm9kdWN0Q2F0ZWdvcnlcIilcbi0gdGl0bGU6IO2VnOq4gCDsoJzrqqkgKOyYiDogXCLsgqzsmqnsnpBcIiwgXCLsg4Htkogg7Lm07YWM6rOg66asXCIpXG4tIHRhYmxlOiBzbmFrZV9jYXNl66GcIOuQnCDthYzsnbTruJTrqoUgKOyYiDogXCJ1c2Vyc1wiLCBcInByb2R1Y3RfY2F0ZWdvcmllc1wiKVxuLSBwYXJlbnRJZDog67aA66qoIEVudGl0eSBJRCAo7ISg7YOd7IKs7ZWtKVxuLSBwcm9wczogRW50aXR57J2YIO2UhOuhnO2NvO2LsCDrsLDsl7QgKOychCDrrLjshJzsnZggUHJvcGVydHkgVHlwZXMg7LC46rOgKVxuLSBpbmRleGVzOiDsnbjrjbHsiqQg67Cw7Je0XG4tIHN1YnNldHM6IOyEnOu4jOyFiyDsoJXsnZggKOq4sOuzuOqwkjogeyBBOiBbXCJpZFwiXSB9KVxuLSBlbnVtczogRW51bSDsoJXsnZhcblxuIyMjIEVudGl0eSDsiJjsoJUgKHVwZGF0ZUVudGl0eSlcbuq4sOyhtCBFbnRpdHnrpbwg7IiY7KCV7ZWgIOuVjCB1cGRhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC4gRW51bSDstpTqsIAsIHByb3BzIOy2lOqwgC/siJjsoJUsIGluZGV4ZXMg7IiY7KCVIOuTsSDrqqjrk6Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlanri4jri6QuXG4tIGVudGl0eUlkOiDsiJjsoJXtlaAgRW50aXR5IElEXG4tIHVwZGF0ZXM6IOyImOygle2VoCDtlYTrk5zrk6QgKOu2gOu2hCDsl4XrjbDsnbTtirgpXG4gIC0gdGl0bGU6IOyXlO2LsO2LsCDtlZzquIAg7KCc66qpXG4gIC0gdGFibGU6IO2FjOydtOu4lOuqhVxuICAtIHByb3BzOiDstpTqsIDtlaAg7ZSE66Gc7Y287YuwIOuwsOyXtCAo6riw7KG0IHByb3Bz7JeQIOy2lOqwgCwg6rCZ7J2AIOydtOumhOydtOuptCDqtZDssrQpXG4gIC0gaW5kZXhlczog7LaU6rCA7ZWgIOyduOuNseyKpCDrsLDsl7QgKOq4sOyhtCBpbmRleGVz7JeQIOy2lOqwgClcbiAgLSBzdWJzZXRzOiDshJzruIzshYsg7KCV7J2YICjquLDsobQgc3Vic2V0c+yXkCDrs5HtlakpXG4gIC0gZW51bUxhYmVsczogRW51bSDsoJXsnZggKOq4sOyhtCBlbnVtTGFiZWxz7JeQIOuzke2VqSlcbi0gbW9kZTogXCJtZXJnZVwiKOq4sOuzuOqwkikg65iQ64qUIFwicmVwbGFjZVwiXG4gIC0gbWVyZ2U6IOq4sOyhtCDqsJLsl5Ag67OR7ZWpXG4gIC0gcmVwbGFjZTog7ZW064u5IO2VhOuTnCDsoITssrQg6rWQ7LK0XG5cbuyYiOyLnDogRW1wbG95ZWXsl5Ag7IOIIEVudW0g7LaU6rCAXG51cGRhdGVFbnRpdHkoeyBlbnRpdHlJZDogXCJFbXBsb3llZVwiLCB1cGRhdGVzOiB7IGVudW1MYWJlbHM6IHsgXCJFbXBsb3llZVJvbGVcIjogeyBcImFkbWluXCI6IFwi6rSA66as7J6QXCIsIFwidXNlclwiOiBcIuydvOuwmFwiIH0gfSB9IH0pXG5cbuyYiOyLnDogUHJvamVjdOyXkCDsg4gg7ZSE66Gc7Y287YuwIOy2lOqwgFxudXBkYXRlRW50aXR5KHsgZW50aXR5SWQ6IFwiUHJvamVjdFwiLCB1cGRhdGVzOiB7IHByb3BzOiBbeyBuYW1lOiBcInByaW9yaXR5XCIsIHR5cGU6IFwiaW50ZWdlclwiLCBkZXNjOiBcIuyasOyEoOyInOychFwiIH1dIH0gfSlcblxuIyMg7ZWE7IiYIOyCrO2VrVxuLSBFbnRpdHnsnZggcHJvcHPsl5DripQg7LWc7IaM7ZWcIGlkKGludGVnZXIsIHVuc2lnbmVkKSwgY3JlYXRlZF9hdCh0aW1lc3RhbXAp6rCAIO2PrO2VqOuQmOyWtOyVvCDtlanri4jri6QuXG4tIHJlbGF0aW9uIO2VhOuTnOuKlCBvblVwZGF0ZSwgb25EZWxldGXqsIAg7ZWE7IiY7J6F64uI64ukLiAo7JiI7Jm4OiBPbmVUb09uZeyXkOyEnCBoYXNKb2luQ29sdW1u7J20IGZhbHNl7J24IOqyveyasClcbi0gRW51bSBJROuKlCDrs7TthrUgRW50aXR5SWQgKyDsho3shLHrqoUg7ZiV7YOc7J6F64uI64ukICjsmIg6IFVzZXJTdGF0dXMsIFByb2R1Y3RUeXBlKVxuLSBzdWJzZXTsl5DshJwg64uk66W4IOyXlO2LsO2LsOydmCDtlITroZztjbzti7Drpbwg7LC47KGw7ZWgIOuVjOuKlCDrsJjrk5zsi5wg7ZW064u5IOyXlO2LsO2LsOydmCDsi6TsoJwg7ZSE66Gc7Y287Yuw66qF7J2EIOyCrOyaqe2VmOyEuOyalC5cblxuIyMg6rKA7KadIOyYpOulmCDsspjrpqxcbuuPhOq1rCDtmLjstpwg6rKw6rO866GcIOqygOymnSDsmKTrpZgodmFsaWRhdGlvbkVycm9ycynqsIAg67CY7ZmY65CY66m0OlxuMS4g7Jik66WYIOuplOyLnOyngOulvCDrtoTshJ3tlZjsl6wg66y47KCc7KCQ7J2EIO2MjOyVhe2VmOyEuOyalC5cbjIuIOyYpOulmOulvCDsiJjsoJXtlZwg642w7J207YSw66GcIGNyZWF0ZUVudGl0eeulvCDri6Tsi5wg7Zi47Lac7ZWY7IS47JqULlxuMy4g7IKs7Jqp7J6Q7JeQ6rKMIOyYpOulmOulvCDqt7jrjIDroZwg7KCE64us7ZWY7KeAIOunkOqzoCwg7IiY7KCVIO2bhCDsnqzsi5zrj4TtlZjshLjsmpQuXG5cbiMjIyDsnbzrsJjsoIHsnbgg6rKA7KadIOyYpOulmOyZgCDsiJjsoJUg67Cp67KVXG58IOyYpOulmCDrqZTsi5zsp4AgfCDsiJjsoJUg67Cp67KVIHxcbnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXxcbnwgXCJpZCDtlITroZztjbzti7DqsIAg7ZWE7IiYXCIgfCBwcm9wc+yXkCB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIHVuc2lnbmVkOiB0cnVlIH0g7LaU6rCAIHxcbnwgXCJjcmVhdGVkX2F0IO2UhOuhnO2NvO2LsOqwgCDtlYTsiJhcIiB8IHByb3Bz7JeQIHsgbmFtZTogXCJjcmVhdGVkX2F0XCIsIHR5cGU6IFwidGltZXN0YW1wXCIsIGRiRGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiIH0g7LaU6rCAIHxcbnwgXCJYeHhPcmRlckJ5IGVudW3snbQg7ZWE7IiYXCIgfCBlbnVtc+yXkCB7IFwiWHh4T3JkZXJCeVwiOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSB9IOy2lOqwgCB8XG58IFwiWHh4U2VhcmNoRmllbGQgZW51beydtCDtlYTsiJhcIiB8IGVudW1z7JeQIHsgXCJYeHhTZWFyY2hGaWVsZFwiOiB7IFwiaWRcIjogXCJJRFwiIH0gfSDstpTqsIAgfFxufCBcInN0cmluZyDtg4DsnoXsnYAgbGVuZ3Ro6rCAIO2VhOyImFwiIHwg7ZW064u5IHByb3Dsl5AgbGVuZ3RoIOy2lOqwgCAo7JiIOiAyNTUpIHxcbnwgXCJ0ZXh0IO2DgOyeheydgCB0ZXh0VHlwZeydtCDtlYTsiJhcIiB8IO2VtOuLuSBwcm9w7JeQIHRleHRUeXBlIOy2lOqwgCAoXCJ0ZXh0XCIsIFwibWVkaXVtdGV4dFwiLCBcImxvbmd0ZXh0XCIpIHxcbnwgXCJvblVwZGF0ZeqwgCDtlYTsiJhcIiB8IO2VtOuLuSByZWxhdGlvbiBwcm9w7JeQIG9uVXBkYXRlLCBvbkRlbGV0ZSDstpTqsIAgKFwiQ0FTQ0FERVwiKSB8XG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sLCBzdGVwQ291bnRJcyB9ID0gdGhpcy5haVNkaztcblxuICAgIHJldHVybiBzdHJlYW1UZXh0KHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsIGFzIHVua25vd24gYXMgTGFuZ3VhZ2VNb2RlbCxcbiAgICAgIHN5c3RlbTogc3lzdGVtTWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDIpLFxuICAgICAgdG9vbHM6IHtcbiAgICAgICAgY3JlYXRlRW50aXR5OiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7IOI66Gc7Jq0IEVudGl0eeulvCDsg53shLHtlanri4jri6QuIOyCrOyaqeyekOqwgCDsg4jroZzsmrQg7JeU7Yuw7Yuw64KYIO2FjOydtOu4lCDsg53shLHsnYQg7JqU7LKt7ZWgIOuVjCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IFRlbXBsYXRlT3B0aW9ucy5zaGFwZS5lbnRpdHksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKFxuICAgICAgICAgICAgZW50aXR5OiB6LmluZmVyPHR5cGVvZiBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5PixcbiAgICAgICAgICApOiBQcm9taXNlPHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzPzogVmFsaWRhdGlvbkVycm9yW107XG4gICAgICAgICAgfT4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g7J6F66ClIOqygOymnVxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVFbnRpdHlKc29uKGVudGl0eSk7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBlbnRpdHkuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogYOqygOymnSDsmKTrpZg6ICR7dmFsaWRhdGlvbkVycm9ycy5tYXAoKGUpID0+IGBbJHtlLmZpZWxkfV0gJHtlLm1lc3NhZ2V9YCkuam9pbihcIiwgXCIpfWAsXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7XG4gICAgICAgICAgICAgICAgc3Vic2V0czogeyBBOiBbXCJpZFwiXSB9LFxuICAgICAgICAgICAgICAgIGVudW1zOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5lbnRpdHksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEVudGl0eU1hbmFnZXIg66as66Gc65OcXG4gICAgICAgICAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZW50aXR5SWQ6IGVudGl0eS5lbnRpdHlJZCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZW50aXR5SWQ6IGVudGl0eS5lbnRpdHlJZCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgdXBkYXRlRW50aXR5OiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi6riw7KG0IEVudGl0eeulvCDsiJjsoJXtlanri4jri6QuIEVudW0g7LaU6rCALCBwcm9wcyDstpTqsIAv7IiY7KCVLCBpbmRleGVzIOyImOyglSwgc3Vic2V0cyDsiJjsoJUg65OxIOuqqOuToCDsl5Tti7Dti7Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIEVudGl0eSBJRFwiKSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IFRlbXBsYXRlT3B0aW9ucy5zaGFwZS5lbnRpdHkucGFydGlhbCgpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2VhOuTnOuTpFwiKSxcbiAgICAgICAgICAgIG1vZGU6IHpcbiAgICAgICAgICAgICAgLmVudW0oW1wibWVyZ2VcIiwgXCJyZXBsYWNlXCJdKVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCLsiJjsoJUg66qo65OcOiBtZXJnZSjquLDrs7jqsJIsIOq4sOyhtCDqsJLsl5Ag67OR7ZWpKSDrmJDripQgcmVwbGFjZSjsoITssrQg6rWQ7LK0KVwiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICB1cGRhdGVzLFxuICAgICAgICAgICAgbW9kZSA9IFwibWVyZ2VcIixcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBkYXRlczogUGFydGlhbDx6LmluZmVyPHR5cGVvZiBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5Pj47XG4gICAgICAgICAgICBtb2RlPzogXCJtZXJnZVwiIHwgXCJyZXBsYWNlXCI7XG4gICAgICAgICAgfSk6IFByb21pc2U8e1xuICAgICAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnM/OiBWYWxpZGF0aW9uRXJyb3JbXTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGJhc2ljIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LmlkID0gdXBkYXRlcy5lbnRpdHlJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucGFyZW50SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LnBhcmVudElkID0gdXBkYXRlcy5wYXJlbnRJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGl0bGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRpdGxlID0gdXBkYXRlcy50aXRsZTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGFibGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRhYmxlID0gdXBkYXRlcy50YWJsZTtcblxuICAgICAgICAgICAgICAvLyBwcm9wczogbWVyZ2Ug7IucIOydtOumhCDquLDspIAg67OR7ZWpLCByZXBsYWNlIOyLnCDqtZDssrRcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzID0gdXBkYXRlcy5wcm9wcyBhcyBFbnRpdHlQcm9wW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmV3UHJvcCBvZiB1cGRhdGVzLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IG5ld1Byb3AubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkucHJvcHNbZXhpc3RpbmdJbmRleF0gPSBuZXdQcm9wIGFzIEVudGl0eVByb3A7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzLnB1c2gobmV3UHJvcCBhcyBFbnRpdHlQcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGluZGV4ZXM6IG1lcmdlIOyLnCDstpTqsIAsIHJlcGxhY2Ug7IucIOq1kOyytFxuICAgICAgICAgICAgICBpZiAodXBkYXRlcy5pbmRleGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkuaW5kZXhlcyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IHVwZGF0ZXMuaW5kZXhlcyA6IFsuLi5lbnRpdHkuaW5kZXhlcywgLi4udXBkYXRlcy5pbmRleGVzXTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbDogYXNzaWdu7Jy866GcIOuzke2VqSDrmJDripQg6rWQ7LK0XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnN1YnNldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBzdWJzZXQgZmllbGRzOiBzZXBhcmF0ZSBpbnRvIHN1YnNldHMgKG5vcm1hbCkgYW5kIHN1YnNldHNJbnRlcm5hbCAoaW50ZXJuYWwpXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZXMuc3Vic2V0cykpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkQXJyYXkgPSBmaWVsZHMgYXMgc3RyaW5nW107XG4gICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3Vic2V0c1trZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChmOiBzdHJpbmcpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHMgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBub3JtYWxpemVkU3Vic2V0c1xuICAgICAgICAgICAgICAgICAgICA6IHsgLi4uZW50aXR5LnN1YnNldHMsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzIH07XG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHNJbnRlcm5hbCA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIlxuICAgICAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmVudGl0eS5zdWJzZXRzSW50ZXJuYWwsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWwgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLmVudW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IHVwZGF0ZXMuZW51bXMgOiB7IC4uLmVudGl0eS5lbnVtTGFiZWxzLCAuLi51cGRhdGVzLmVudW1zIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyDsoIDsnqUg7KCEIOqygOymnVxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVFbnRpdHlKc29uKHtcbiAgICAgICAgICAgICAgICAuLi5lbnRpdHksXG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgICAgICBlbnVtczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBg6rKA7KadIOyYpOulmDogJHt2YWxpZGF0aW9uRXJyb3JzLm1hcCgoZSkgPT4gYFske2UuZmllbGR9XSAke2UubWVzc2FnZX1gKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZW50aXR5SWQgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVudGl0eUlkLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEVudGl0eSBKU09O7J20IGVudGl0eS5pbnN0cnVjdGlvbnMubWTsnZgg6rec7LmZ7J2EIOuUsOultOuKlOyngCDqsoDspp3tlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW50aXR5SnNvbihpbnB1dDogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKTogVmFsaWRhdGlvbkVycm9yW10ge1xuICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG4gIGNvbnN0IHsgZW50aXR5SWQsIHByb3BzLCBlbnVtcyB9ID0gaW5wdXQ7XG5cbiAgLy8gMS4gaWQsIGNyZWF0ZWRfYXQgcHJvcCDtlYTsiJhcbiAgY29uc3QgaGFzSWRQcm9wID0gcHJvcHM/LnNvbWUoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgaWYgKCFoYXNJZFByb3ApIHtcbiAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiBcInByb3BzXCIsIG1lc3NhZ2U6IFwiaWQg7ZSE66Gc7Y287Yuw6rCAIO2VhOyImOyeheuLiOuLpC5cIiB9KTtcbiAgfVxuICBjb25zdCBoYXNDcmVhdGVkQXRQcm9wID0gcHJvcHM/LnNvbWUoKHApID0+IHAubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpO1xuICBpZiAoIWhhc0NyZWF0ZWRBdFByb3ApIHtcbiAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiBcInByb3BzXCIsIG1lc3NhZ2U6IFwiY3JlYXRlZF9hdCDtlITroZztjbzti7DqsIAg7ZWE7IiY7J6F64uI64ukLlwiIH0pO1xuICB9XG5cbiAgLy8gMi4g7ZWE7IiYIGVudW0g6rKA7KadOiBFbnRpdHlOYW1lT3JkZXJCeSwgRW50aXR5TmFtZVNlYXJjaEZpZWxkXG4gIGNvbnN0IG9yZGVyQnlFbnVtSWQgPSBgJHtlbnRpdHlJZH1PcmRlckJ5YDtcbiAgY29uc3Qgc2VhcmNoRmllbGRFbnVtSWQgPSBgJHtlbnRpdHlJZH1TZWFyY2hGaWVsZGA7XG5cbiAgaWYgKCFlbnVtcz8uW29yZGVyQnlFbnVtSWRdKSB7XG4gICAgZXJyb3JzLnB1c2goe1xuICAgICAgZmllbGQ6IFwiZW51bXNcIixcbiAgICAgIG1lc3NhZ2U6IGAke29yZGVyQnlFbnVtSWR9IGVudW3snbQg7ZWE7IiY7J6F64uI64ukLiAo7JiIOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSlgLFxuICAgIH0pO1xuICB9XG4gIGlmICghZW51bXM/LltzZWFyY2hGaWVsZEVudW1JZF0pIHtcbiAgICBlcnJvcnMucHVzaCh7XG4gICAgICBmaWVsZDogXCJlbnVtc1wiLFxuICAgICAgbWVzc2FnZTogYCR7c2VhcmNoRmllbGRFbnVtSWR9IGVudW3snbQg7ZWE7IiY7J6F64uI64ukLiAo7JiIOiB7IFwiaWRcIjogXCJJRFwiIH0pYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDMuIGVudW0gcHJvcOydmCBpZOqwgCBlbnVtc+yXkCDsoJXsnZjrkJjslrQg7J6I64qU7KeAIO2ZleyduCAoY3Jvc3MtZmllbGQg6rKA7KadKVxuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMgPz8gW10pIHtcbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiAmJiAhZW51bXM/Lltwcm9wLmlkXSkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogYHByb3BzLiR7cHJvcC5uYW1lfWAsXG4gICAgICAgIG1lc3NhZ2U6IGBlbnVtIGlkIFwiJHtwcm9wLmlkfVwi6rCAIGVudW1z7JeQIOygleydmOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLmAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgY29uc3QgYWlDbGllbnQgPSBuZXcgQUlDbGllbnQoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJmcyIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsImlzSW50ZXJuYWxTdWJzZXRGaWVsZCIsIm5vcm1hbGl6ZVN1YnNldEZpZWxkIiwiVGVtcGxhdGVPcHRpb25zIiwibm9uTnVsbGFibGUiLCJBSUNsaWVudCIsIm1vZGVsIiwiYWlTZGsiLCJpbml0IiwiYW50aHJvcGljIiwiYWlNb2R1bGUiLCJlcnJvciIsImNvbnNvbGUiLCJ3YXJuIiwiaGFuZGxlRml4dHVyZSIsIm1lc3NhZ2VzIiwiZml4dHVyZVJlY29yZHMiLCJFcnJvciIsInVzZWRFbnRpdHlJZHMiLCJTZXQiLCJtYXAiLCJyIiwiZW50aXR5SWQiLCJlbnRpdHlTdHJ1Y3R1cmVzIiwiZW50aXR5IiwiZ2V0IiwiaWQiLCJ0YWJsZSIsInByb3BzIiwicmVsYXRpb25zIiwiZW51bUxhYmVscyIsInN5c3RlbU1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RyZWFtVGV4dCIsInRvb2wiLCJzeXN0ZW0iLCJ0b29scyIsInVwZGF0ZUZpeHR1cmVzIiwiZGVzY3JpcHRpb24iLCJpbnB1dFNjaGVtYSIsIm9iamVjdCIsInVwZGF0ZXMiLCJhcnJheSIsImZpeHR1cmVJZCIsInN0cmluZyIsImRlc2NyaWJlIiwicmVjb3JkIiwidW5rbm93biIsImV4ZWN1dGUiLCJ1cGRhdGVkUmVjb3JkcyIsInVwZGF0ZSIsImZpbmQiLCJ1IiwiY29sdW1uTmFtZSIsIm5ld1ZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsImNvbHVtbnMiLCJ2YWx1ZSIsInN1Y2Nlc3MiLCJjcmVhdGVGaXh0dXJlcyIsImZpeHR1cmVzIiwibnVtYmVyIiwibmV3UmVjb3JkcyIsImZpeHR1cmUiLCJwcm9wIiwidHlwZSIsIm5hbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJyZWxhdGlvblR5cGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWx0ZXIiLCJmZXRjaGVkUmVjb3JkcyIsImJlbG9uZ3NSZWNvcmRzIiwib3ZlcnJpZGUiLCJuZXdSZWNvcmQiLCJfY29sTmFtZSIsImNvbCIsInJlbGF0ZWRFbnRpdHlJZCIsIndpdGgiLCJyZWxhdGVkSWRzIiwicmVsYXRlZElkIiwicmVsYXRlZEZpeHR1cmVJZCIsInJlbGF0ZWRSZWNvcmQiLCJyZXZlcnNlQ29sIiwiYyIsInJldmVyc2VDb2xOYW1lIiwicmV2ZXJzZUNvbFZhbHVlIiwiY3VycmVudFZhbHVlIiwiaW5jbHVkZXMiLCJoYW5kbGVFbnRpdHkiLCJpbnN0cnVjdGlvbnNQYXRoIiwiam9pbiIsImRpcm5hbWUiLCJpbnN0cnVjdGlvbnMiLCJyZWFkRmlsZVN5bmMiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJleGlzdGluZ0VudGl0aWVzIiwidGl0bGUiLCJwIiwiZGVzYyIsInN0ZXBDb3VudElzIiwic3RvcFdoZW4iLCJjcmVhdGVFbnRpdHkiLCJzaGFwZSIsInZhbGlkYXRpb25FcnJvcnMiLCJ2YWxpZGF0ZUVudGl0eUpzb24iLCJsZW5ndGgiLCJlIiwiZmllbGQiLCJtZXNzYWdlIiwic3luY2VyIiwic3Vic2V0cyIsIkEiLCJlbnVtcyIsInJlbG9hZCIsInVwZGF0ZUVudGl0eSIsInBhcnRpYWwiLCJtb2RlIiwiZW51bSIsIm9wdGlvbmFsIiwidW5kZWZpbmVkIiwicGFyZW50SWQiLCJuZXdQcm9wIiwiZXhpc3RpbmdJbmRleCIsImZpbmRJbmRleCIsInB1c2giLCJpbmRleGVzIiwibm9ybWFsaXplZFN1YnNldHMiLCJub3JtYWxpemVkU3Vic2V0c0ludGVybmFsIiwia2V5IiwiZmllbGRzIiwiZmllbGRBcnJheSIsImYiLCJzdWJzZXRzSW50ZXJuYWwiLCJzYXZlIiwiaW5wdXQiLCJlcnJvcnMiLCJoYXNJZFByb3AiLCJzb21lIiwiaGFzQ3JlYXRlZEF0UHJvcCIsIm9yZGVyQnlFbnVtSWQiLCJzZWFyY2hGaWVsZEVudW1JZCIsImFpQ2xpZW50Il0sIm1hcHBpbmdzIjoiQUFBQSxpRkFBaUYsR0FFakYsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FHRUMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLGVBQWUsUUFDVixvQkFBaUI7QUFDeEIsU0FBU0MsV0FBVyxRQUFRLG9CQUFpQjtBQU83QyxNQUFNQztJQUNJQyxRQUE4QixLQUFLO0lBQ25DQyxRQUlHLEtBQUs7SUFFaEIsTUFBTUMsT0FBTztRQUNYLElBQUk7WUFDRixNQUFNLEVBQUVDLFNBQVMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDO1lBQ25DLE1BQU1DLFdBQVcsTUFBTSxNQUFNLENBQUM7WUFDOUIsSUFBSSxDQUFDSCxLQUFLLEdBQUc7Z0JBQUUsR0FBR0csUUFBUTtnQkFBRUQ7WUFBVTtZQUN0QyxJQUFJLENBQUNILEtBQUssR0FBR0csVUFBVTtRQUN6QixFQUFFLE9BQU9FLE9BQU87WUFDZEMsUUFBUUMsSUFBSSxDQUNWO1lBRUYsTUFBTUY7UUFD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
|