sonamu 0.7.53 → 0.8.0
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/api/config.d.ts +9 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.d.ts +21 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +159 -65
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
- package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
- package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
- package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +20 -2
- package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
- package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
- package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
- package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/organization.js +424 -0
- package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
- package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
- package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
- package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/sso.js +110 -0
- package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +2 -4
- package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/anonymous.js +26 -0
- package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/api-key.js +38 -0
- package/dist/auth/plugins/wrappers/index.d.ts +6 -0
- package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/index.js +7 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/jwt.js +30 -0
- package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/organization.js +67 -0
- package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/passkey.js +32 -0
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -4
- package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/sso.js +36 -0
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -4
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -4
- package/dist/bin/build-config.d.ts +2 -2
- package/dist/bin/build-config.js +6 -7
- package/dist/bin/cli.js +417 -32
- package/dist/bin/fixture.d.ts +27 -0
- package/dist/bin/fixture.d.ts.map +1 -0
- package/dist/bin/fixture.js +245 -0
- package/dist/cache/decorator.d.ts +4 -3
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +5 -4
- package/dist/cone/cone-generator.d.ts +33 -0
- package/dist/cone/cone-generator.d.ts.map +1 -0
- package/dist/cone/cone-generator.js +286 -0
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +16 -2
- package/dist/database/puri-subset.test-d.js +1 -1
- package/dist/database/puri-subset.types.d.ts +1 -1
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri.d.ts +4 -0
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +20 -2
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +19 -3
- package/dist/dict/en.d.ts +15 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +2 -1
- package/dist/dict/ko.d.ts +15 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +2 -1
- package/dist/dict/rc-keys.d.ts +28 -0
- package/dist/dict/rc-keys.d.ts.map +1 -1
- package/dist/dict/rc-keys.js +31 -1
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +20 -4
- package/dist/entity/entity-manager.d.ts +298 -2
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +4 -1
- package/dist/entity/entity-template-cone.d.ts +14 -0
- package/dist/entity/entity-template-cone.d.ts.map +1 -0
- package/dist/entity/entity-template-cone.js +222 -0
- package/dist/entity/entity.d.ts +47 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +161 -14
- package/dist/ssr/renderer.js +3 -3
- package/dist/syncer/api-parser.js +12 -1
- package/dist/syncer/checksum.d.ts +0 -14
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +1 -23
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +8 -2
- package/dist/syncer/syncer.d.ts +1 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +17 -10
- package/dist/tasks/workflow-manager.d.ts +13 -1
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +18 -1
- package/dist/template/entity-converter.js +4 -4
- package/dist/template/helpers.d.ts +10 -0
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +48 -1
- package/dist/template/implementations/entry-server.template.d.ts +1 -1
- package/dist/template/implementations/entry-server.template.js +7 -2
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +5 -1
- package/dist/template/implementations/generated_http.template.d.ts +1 -0
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +6 -2
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +29 -8
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.js +9 -1
- package/dist/template/implementations/sd.template.d.ts +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +28 -4
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +12 -12
- package/dist/template/implementations/view_form.template.d.ts +11 -7
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +97 -87
- package/dist/template/implementations/view_list.template.d.ts +3 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +115 -109
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +18 -14
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +95 -7
- package/dist/testing/_relation-graph.js +1 -1
- package/dist/testing/data-explorer.d.ts +61 -0
- package/dist/testing/data-explorer.d.ts.map +1 -0
- package/dist/testing/data-explorer.js +274 -0
- package/dist/testing/faker-mappings.d.ts +20 -0
- package/dist/testing/faker-mappings.d.ts.map +1 -0
- package/dist/testing/faker-mappings.js +421 -0
- package/dist/testing/fixture-generator.d.ts +161 -0
- package/dist/testing/fixture-generator.d.ts.map +1 -0
- package/dist/testing/fixture-generator.js +954 -0
- package/dist/testing/fixture-manager.d.ts +6 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +72 -4
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4 -1
- package/dist/types/types.d.ts +1520 -26
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +136 -22
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -4
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +303 -24
- package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
- package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/fs-utils.d.ts +2 -1
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +14 -3
- package/package.json +19 -11
- package/src/api/config.ts +12 -1
- package/src/api/sonamu.ts +179 -65
- package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
- package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
- package/src/auth/plugins/entity-definitions/index.ts +18 -0
- package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
- package/src/auth/plugins/entity-definitions/organization.ts +215 -0
- package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
- package/src/auth/plugins/entity-definitions/sso.ts +62 -0
- package/src/auth/plugins/entity-definitions/types.ts +11 -1
- package/src/auth/plugins/wrappers/admin.ts +1 -3
- package/src/auth/plugins/wrappers/anonymous.ts +30 -0
- package/src/auth/plugins/wrappers/api-key.ts +42 -0
- package/src/auth/plugins/wrappers/index.ts +6 -0
- package/src/auth/plugins/wrappers/jwt.ts +34 -0
- package/src/auth/plugins/wrappers/organization.ts +73 -0
- package/src/auth/plugins/wrappers/passkey.ts +36 -0
- package/src/auth/plugins/wrappers/phone-number.ts +1 -3
- package/src/auth/plugins/wrappers/sso.ts +40 -0
- package/src/auth/plugins/wrappers/two-factor.ts +1 -3
- package/src/auth/plugins/wrappers/username.ts +1 -3
- package/src/bin/build-config.ts +6 -6
- package/src/bin/cli.ts +452 -31
- package/src/bin/fixture.ts +302 -0
- package/src/cache/decorator.ts +4 -3
- package/src/cone/cone-generator.ts +363 -0
- package/src/database/_batch_update.ts +11 -0
- package/src/database/puri-subset.test-d.ts +13 -13
- package/src/database/puri-subset.types.ts +1 -1
- package/src/database/puri.ts +43 -1
- package/src/database/upsert-builder.ts +16 -2
- package/src/dict/en.ts +1 -0
- package/src/dict/ko.ts +1 -0
- package/src/dict/rc-keys.ts +32 -0
- package/src/dict/sd.ts +23 -3
- package/src/entity/entity-manager.ts +4 -0
- package/src/entity/entity-template-cone.ts +298 -0
- package/src/entity/entity.ts +189 -13
- package/src/shared/app.shared.ts.txt +5 -0
- package/src/shared/web.shared.ts.txt +9 -5
- package/src/skills/project/README.md +21 -0
- package/src/skills/project/architecture.md +373 -0
- package/src/skills/project/business-logic.md +270 -0
- package/src/skills/project/requirements.md +160 -0
- package/src/skills/sonamu/SKILL.md +168 -3
- package/src/skills/sonamu/api.md +102 -0
- package/src/skills/sonamu/database.md +220 -1
- package/src/skills/sonamu/entity-relations.md +89 -1
- package/src/skills/sonamu/fixture-cli.md +501 -0
- package/src/skills/sonamu/frontend.md +214 -0
- package/src/skills/sonamu/i18n.md +95 -0
- package/src/skills/sonamu/model.md +153 -0
- package/src/skills/sonamu/project-init.md +178 -8
- package/src/skills/sonamu/scaffolding.md +112 -0
- package/src/skills/sonamu/subset.md +9 -3
- package/src/skills/sonamu/testing.md +287 -2
- package/src/skills/sonamu/workflow.md +70 -5
- package/src/ssr/renderer.ts +2 -2
- package/src/syncer/api-parser.ts +12 -0
- package/src/syncer/checksum.ts +0 -38
- package/src/syncer/syncer-actions.ts +7 -1
- package/src/syncer/syncer.ts +16 -5
- package/src/tasks/workflow-manager.ts +29 -8
- package/src/template/entity-converter.ts +3 -3
- package/src/template/helpers.ts +49 -0
- package/src/template/implementations/entry-server.template.ts +1 -1
- package/src/template/implementations/generated.template.ts +4 -0
- package/src/template/implementations/generated_http.template.ts +1 -0
- package/src/template/implementations/generated_sso.template.ts +40 -11
- package/src/template/implementations/queries.template.ts +8 -0
- package/src/template/implementations/sd.template.ts +22 -3
- package/src/template/implementations/services.template.ts +11 -10
- package/src/template/implementations/view_form.template.ts +111 -101
- package/src/template/implementations/view_list.template.ts +120 -119
- package/src/template/implementations/view_search_input.template.ts +17 -13
- package/src/template/zod-converter.ts +103 -6
- package/src/testing/_relation-graph.ts +1 -1
- package/src/testing/data-explorer.ts +427 -0
- package/src/testing/faker-mappings.ts +434 -0
- package/src/testing/fixture-generator.ts +1166 -0
- package/src/testing/fixture-manager.ts +91 -6
- package/src/testing/index.ts +3 -0
- package/src/types/types.ts +222 -26
- package/src/ui/ai-client.ts +9 -1
- package/src/ui/api.ts +429 -23
- package/src/utils/fs-utils.ts +14 -1
- package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
- package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
- package/dist/template/implementations/view_enums_select.template.js +0 -62
- package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
- package/dist/template/implementations/view_id_async_select.template.js +0 -125
- package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
- package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
- package/src/template/implementations/view_enums_select.template.ts +0 -65
- package/src/template/implementations/view_id_async_select.template.ts +0 -139
package/dist/entity/entity.js
CHANGED
|
@@ -5,7 +5,7 @@ import path from "path";
|
|
|
5
5
|
import { group, unique } from "radashi";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { Sonamu } from "../api/sonamu.js";
|
|
8
|
-
import { isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isInternalSubsetField, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
|
|
8
|
+
import { getEnumDefValues, getSubsetFields, isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isInternalSubsetField, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
|
|
9
9
|
import { importMembers } from "../utils/esm-utils.js";
|
|
10
10
|
import { formatCode } from "../utils/formatter.js";
|
|
11
11
|
import { exists } from "../utils/fs-utils.js";
|
|
@@ -17,6 +17,7 @@ export class Entity {
|
|
|
17
17
|
parentId;
|
|
18
18
|
table;
|
|
19
19
|
title;
|
|
20
|
+
cone;
|
|
20
21
|
names;
|
|
21
22
|
props;
|
|
22
23
|
propsDict;
|
|
@@ -27,12 +28,15 @@ export class Entity {
|
|
|
27
28
|
types = {};
|
|
28
29
|
enums = {};
|
|
29
30
|
enumLabels = {};
|
|
30
|
-
|
|
31
|
+
enumCones = {};
|
|
32
|
+
subsetCones = {};
|
|
33
|
+
constructor({ id, parentId, table, title, cone, props, indexes, subsets, enums }){
|
|
31
34
|
// id
|
|
32
35
|
this.id = id;
|
|
33
36
|
this.parentId = parentId;
|
|
34
37
|
this.title = title ?? this.id;
|
|
35
38
|
this.table = table ?? inflection.underscore(inflection.pluralize(id));
|
|
39
|
+
this.cone = cone;
|
|
36
40
|
// props
|
|
37
41
|
if (props) {
|
|
38
42
|
this.props = props.map((prop)=>{
|
|
@@ -61,15 +65,29 @@ export class Entity {
|
|
|
61
65
|
}
|
|
62
66
|
// indexes
|
|
63
67
|
this.indexes = indexes ?? [];
|
|
64
|
-
// subsets: SubsetField[]를
|
|
68
|
+
// subsets: SubsetDef에서 SubsetField[]를 추출하여 subsets(일반)와 subsetsInternal(internal)로 분리
|
|
65
69
|
this.subsets = {};
|
|
66
70
|
this.subsetsInternal = {};
|
|
67
|
-
for (const [key,
|
|
71
|
+
for (const [key, subsetDef] of Object.entries(subsets ?? {})){
|
|
72
|
+
const fields = getSubsetFields(subsetDef);
|
|
68
73
|
this.subsets[key] = fields.filter((f)=>!isInternalSubsetField(f)).map(normalizeSubsetField);
|
|
69
74
|
this.subsetsInternal[key] = fields.filter(isInternalSubsetField).map(normalizeSubsetField);
|
|
75
|
+
// cone 추출
|
|
76
|
+
if (!Array.isArray(subsetDef) && "cone" in subsetDef && subsetDef.cone) {
|
|
77
|
+
this.subsetCones[key] = subsetDef.cone;
|
|
78
|
+
}
|
|
70
79
|
}
|
|
71
|
-
// enums
|
|
72
|
-
this.enumLabels = enums ?? {}
|
|
80
|
+
// enums: EnumDef에서 values와 cone를 추출하여 처리
|
|
81
|
+
this.enumLabels = Object.fromEntries(Object.entries(enums ?? {}).map(([key, enumDef])=>{
|
|
82
|
+
// cone 추출
|
|
83
|
+
if ("values" in enumDef && "cone" in enumDef && enumDef.cone) {
|
|
84
|
+
this.enumCones[key] = enumDef.cone;
|
|
85
|
+
}
|
|
86
|
+
return [
|
|
87
|
+
key,
|
|
88
|
+
getEnumDefValues(enumDef)
|
|
89
|
+
];
|
|
90
|
+
}));
|
|
73
91
|
this.enums = Object.fromEntries(Object.entries(this.enumLabels).map(([key, enumLabel])=>{
|
|
74
92
|
return [
|
|
75
93
|
key,
|
|
@@ -213,8 +231,11 @@ export class Entity {
|
|
|
213
231
|
const generateLoaderCode = (loaders)=>{
|
|
214
232
|
const loaderLines = [];
|
|
215
233
|
for (const loader of loaders){
|
|
216
|
-
const { toTable, toCol, through } = loader.manyJoin;
|
|
217
|
-
|
|
234
|
+
const { toTable, toCol, through, fromTable } = loader.manyJoin;
|
|
235
|
+
// fromTable의 Entity를 가져와서 PK 타입 확인
|
|
236
|
+
const fromEntity = EntityManager.getByTable(fromTable);
|
|
237
|
+
const fromIdsType = fromEntity.getPkArrayType();
|
|
238
|
+
loaderLines.push("{", `as: "${loader.as}",`, `refId: "${loader.manyJoin.idField}",`, `qb: (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[] | string[]) => {`);
|
|
218
239
|
if (through === undefined) {
|
|
219
240
|
// HasMany
|
|
220
241
|
loaderLines.push(//
|
|
@@ -232,7 +253,7 @@ export class Entity {
|
|
|
232
253
|
// 입체적 select 구조 생성 (refId 포함)
|
|
233
254
|
const selectObj = this.buildNestedSelectObject(loader.select);
|
|
234
255
|
selectObj.refId = `"${toTable}.${toCol}"`;
|
|
235
|
-
loaderLines.push(`.whereIn("${toTable}.${toCol}", fromIds)`, `.select(${this.stringifyNestedSelectObject(selectObj)});`);
|
|
256
|
+
loaderLines.push(`.whereIn("${toTable}.${toCol}", fromIds as ${fromIdsType})`, `.select(${this.stringifyNestedSelectObject(selectObj)});`);
|
|
236
257
|
} else {
|
|
237
258
|
// ManyToMany
|
|
238
259
|
loaderLines.push("return qbWrapper", `.from("${through.table}")`, `.join("${toTable}", "${through.table}.${through.toCol}", "${toTable}.${toCol}")`);
|
|
@@ -249,7 +270,7 @@ export class Entity {
|
|
|
249
270
|
// 입체적 select 구조 생성 (refId 포함)
|
|
250
271
|
const selectObj = this.buildNestedSelectObject(loader.select);
|
|
251
272
|
selectObj.refId = `"${through.table}.${through.fromCol}"`;
|
|
252
|
-
loaderLines.push(`.whereIn("${through.table}.${through.fromCol}", fromIds)`, `.select(${this.stringifyNestedSelectObject(selectObj)});`);
|
|
273
|
+
loaderLines.push(`.whereIn("${through.table}.${through.fromCol}", fromIds as ${fromIdsType})`, `.select(${this.stringifyNestedSelectObject(selectObj)});`);
|
|
253
274
|
}
|
|
254
275
|
loaderLines.push(`},`);
|
|
255
276
|
// 중첩 loaders 처리
|
|
@@ -641,7 +662,7 @@ export class Entity {
|
|
|
641
662
|
});
|
|
642
663
|
}
|
|
643
664
|
toJson() {
|
|
644
|
-
// subsets와 subsetsInternal을
|
|
665
|
+
// subsets와 subsetsInternal을 SubsetDef 형태로 복원 (cone 포함)
|
|
645
666
|
const subsets = {};
|
|
646
667
|
for (const key of Object.keys(this.subsets)){
|
|
647
668
|
const normalFields = this.subsets[key];
|
|
@@ -649,20 +670,43 @@ export class Entity {
|
|
|
649
670
|
field,
|
|
650
671
|
internal: true
|
|
651
672
|
}));
|
|
652
|
-
|
|
673
|
+
const fields = [
|
|
653
674
|
...normalFields,
|
|
654
675
|
...internalFields
|
|
655
676
|
];
|
|
677
|
+
// cone이 있으면 새로운 객체 형태로, 없으면 배열 형태로
|
|
678
|
+
if (this.subsetCones[key]) {
|
|
679
|
+
subsets[key] = {
|
|
680
|
+
fields,
|
|
681
|
+
cone: this.subsetCones[key]
|
|
682
|
+
};
|
|
683
|
+
} else {
|
|
684
|
+
subsets[key] = fields;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
// enums를 EnumDef 형태로 복원 (cone 포함)
|
|
688
|
+
const enums = {};
|
|
689
|
+
for (const [key, values] of Object.entries(this.enumLabels)){
|
|
690
|
+
// cone이 있으면 새로운 객체 형태로, 없으면 Record 형태로
|
|
691
|
+
if (this.enumCones[key]) {
|
|
692
|
+
enums[key] = {
|
|
693
|
+
values,
|
|
694
|
+
cone: this.enumCones[key]
|
|
695
|
+
};
|
|
696
|
+
} else {
|
|
697
|
+
enums[key] = values;
|
|
698
|
+
}
|
|
656
699
|
}
|
|
657
700
|
return {
|
|
658
701
|
id: this.id,
|
|
659
702
|
parentId: this.parentId,
|
|
660
703
|
table: this.table,
|
|
661
704
|
title: this.title,
|
|
705
|
+
cone: this.cone,
|
|
662
706
|
props: this.props,
|
|
663
707
|
indexes: this.indexes,
|
|
664
708
|
subsets,
|
|
665
|
-
enums
|
|
709
|
+
enums
|
|
666
710
|
};
|
|
667
711
|
}
|
|
668
712
|
async save() {
|
|
@@ -687,6 +731,102 @@ export class Entity {
|
|
|
687
731
|
// reload
|
|
688
732
|
await EntityManager.register(json);
|
|
689
733
|
}
|
|
734
|
+
/**
|
|
735
|
+
* 템플릿 cone 메타데이터를 생성합니다.
|
|
736
|
+
*
|
|
737
|
+
* LLM을 사용하지 않고 faker-mappings.ts를 활용하여 기본 cone을 생성합니다.
|
|
738
|
+
* stub entity 생성 시 자동으로 호출되어 최소한의 cone 메타데이터를 제공합니다.
|
|
739
|
+
*
|
|
740
|
+
* @param locale - 생성 시 사용할 locale (기본값: Sonamu.config.i18n.defaultLocale 또는 "ko")
|
|
741
|
+
*/ async generateTemplateCones(locale) {
|
|
742
|
+
const { generateTemplateCones } = await import("./entity-template-cone.js");
|
|
743
|
+
const configLocale = Sonamu.config.i18n?.defaultLocale;
|
|
744
|
+
const effectiveLocale = locale || (configLocale === "ko" || configLocale === "en" || configLocale === "ja" ? configLocale : "ko");
|
|
745
|
+
const result = generateTemplateCones(this.toJson(), effectiveLocale);
|
|
746
|
+
// 결과를 Entity에 적용 (applyCones와 동일한 방식)
|
|
747
|
+
if (result.entityCone) {
|
|
748
|
+
this.cone = result.entityCone;
|
|
749
|
+
}
|
|
750
|
+
for (const [propName, cone] of Object.entries(result.propCones)){
|
|
751
|
+
const prop = this.props.find((p)=>p.name === propName);
|
|
752
|
+
if (prop) {
|
|
753
|
+
prop.cone = cone;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
this.enumCones = {
|
|
757
|
+
...this.enumCones,
|
|
758
|
+
...result.enumCones
|
|
759
|
+
};
|
|
760
|
+
this.subsetCones = {
|
|
761
|
+
...this.subsetCones,
|
|
762
|
+
...result.subsetCones
|
|
763
|
+
};
|
|
764
|
+
await this.save();
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* LLM을 사용하여 cone 메타데이터를 생성합니다.
|
|
768
|
+
*
|
|
769
|
+
* @param options.preserveExisting - 기존 cone 보존 여부 (기본값: true)
|
|
770
|
+
* @param options.onlyEmpty - fixtureHint가 없는 cone만 생성 (기본값: false)
|
|
771
|
+
* @param options.locale - 생성 시 사용할 locale (기본값: "ko")
|
|
772
|
+
*/ async generateCones(options) {
|
|
773
|
+
const { generateCones } = await import("../cone/cone-generator.js");
|
|
774
|
+
const context = {
|
|
775
|
+
entity: this.toJson(),
|
|
776
|
+
locale: options?.locale || "ko",
|
|
777
|
+
existingCones: options?.preserveExisting !== false ? this.collectExistingCones() : undefined,
|
|
778
|
+
onlyEmpty: options?.onlyEmpty ?? false
|
|
779
|
+
};
|
|
780
|
+
const result = await generateCones(context);
|
|
781
|
+
this.applyCones(result);
|
|
782
|
+
await this.save();
|
|
783
|
+
return result;
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* 기존 cone들을 수집합니다 (entity, props, enums, subsets).
|
|
787
|
+
*
|
|
788
|
+
* @returns 키가 "entity:id", "prop:name", "enum:enumId", "subset:key" 형식인 cone 맵
|
|
789
|
+
*/ collectExistingCones() {
|
|
790
|
+
const cones = {};
|
|
791
|
+
if (this.cone) {
|
|
792
|
+
cones[`entity:${this.id}`] = this.cone;
|
|
793
|
+
}
|
|
794
|
+
for (const prop of this.props){
|
|
795
|
+
if (prop.cone) {
|
|
796
|
+
cones[`prop:${prop.name}`] = prop.cone;
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
for (const [enumId, cone] of Object.entries(this.enumCones)){
|
|
800
|
+
cones[`enum:${enumId}`] = cone;
|
|
801
|
+
}
|
|
802
|
+
for (const [subsetKey, cone] of Object.entries(this.subsetCones)){
|
|
803
|
+
cones[`subset:${subsetKey}`] = cone;
|
|
804
|
+
}
|
|
805
|
+
return cones;
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* 생성된 cone들을 Entity에 적용합니다.
|
|
809
|
+
*
|
|
810
|
+
* @param result - LLM으로 생성된 cone 결과
|
|
811
|
+
*/ applyCones(result) {
|
|
812
|
+
if (result.entityCone) {
|
|
813
|
+
this.cone = result.entityCone;
|
|
814
|
+
}
|
|
815
|
+
for (const [propName, cone] of Object.entries(result.propCones)){
|
|
816
|
+
const prop = this.props.find((p)=>p.name === propName);
|
|
817
|
+
if (prop) {
|
|
818
|
+
prop.cone = cone;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
this.enumCones = {
|
|
822
|
+
...this.enumCones,
|
|
823
|
+
...result.enumCones
|
|
824
|
+
};
|
|
825
|
+
this.subsetCones = {
|
|
826
|
+
...this.subsetCones,
|
|
827
|
+
...result.subsetCones
|
|
828
|
+
};
|
|
829
|
+
}
|
|
690
830
|
getSubsetRows(_subsets, _subsetsInternal, prefixes = []) {
|
|
691
831
|
if (prefixes.length > 10) {
|
|
692
832
|
return [];
|
|
@@ -940,6 +1080,13 @@ export class Entity {
|
|
|
940
1080
|
}
|
|
941
1081
|
return idProp;
|
|
942
1082
|
}
|
|
1083
|
+
/**
|
|
1084
|
+
* 엔티티의 PK 배열 타입을 반환합니다.
|
|
1085
|
+
* LoaderQuery의 fromIds 타입으로 사용됩니다.
|
|
1086
|
+
*/ getPkArrayType() {
|
|
1087
|
+
const pkType = this.getPkType();
|
|
1088
|
+
return pkType === "integer" ? "number[]" : "string[]";
|
|
1089
|
+
}
|
|
943
1090
|
}
|
|
944
1091
|
|
|
945
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdyb3VwLCB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0VudW1Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzSW50ZXJuYWxTdWJzZXRGaWVsZCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsQ29kZVByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIG5vcm1hbGl6ZVN1YnNldEZpZWxkLFxuICB0eXBlIFJlbGF0aW9uUHJvcCxcbiAgdHlwZSBTdWJzZXRGaWVsZCxcbiAgdHlwZSBTdWJzZXRRdWVyeSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi9lbnRpdHktbWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuXG4gICAgLy8gcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKGlzRW51bVByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAocHJvcC5pZC5pbmNsdWRlcyhcIiRNb2RlbFwiKSkge1xuICAgICAgICAgICAgcHJvcC5pZCA9IHByb3AuaWQucmVwbGFjZShcIiRNb2RlbFwiLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnByb3BzRGljdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtwcm9wLm5hbWUsIHByb3BdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIHJlbGF0aW9uc1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLmZpbHRlcigocHJvcCkgPT4gaXNSZWxhdGlvblByb3AocHJvcCkpLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcyA9IFtdO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSB7fTtcbiAgICAgIHRoaXMucmVsYXRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gaW5kZXhlc1xuICAgIHRoaXMuaW5kZXhlcyA9IGluZGV4ZXMgPz8gW107XG5cbiAgICAvLyBzdWJzZXRzOiBTdWJzZXRGaWVsZFtd66W8IO2MjOyLse2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgdGhpcy5zdWJzZXRzW2tleV0gPSBmaWVsZHMuZmlsdGVyKChmKSA9PiAhaXNJbnRlcm5hbFN1YnNldEZpZWxkKGYpKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgdGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA9IGZpZWxkcy5maWx0ZXIoaXNJbnRlcm5hbFN1YnNldEZpZWxkKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgIH1cblxuICAgIC8vIGVudW1zXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gZW51bXMgPz8ge307XG4gICAgdGhpcy5lbnVtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykubWFwKChba2V5LCBlbnVtTGFiZWxdKSA9PiB7XG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSBhcyB1bmtub3duIGFzIHJlYWRvbmx5IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChcbiAgICBzZWxlY3RJdGVtczogc3RyaW5nW10sXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDrsJjtmZgg7Jik67iM7KCd7Yq47J2YIOqwkuydgCBzdHJpbmfsnbwg7IiY64+EIOyeiOqzoCDrmJDri6Trpbgg7Jik67iM7KCd7Yq47J28IOyImOuPhCDsnojripTrjbAsIOydtOulvCDsnqzqt4Ag7YOA7J6F7Jy866GcIOuCmO2DgOuCvCDsiJgg7JeG7Ja0IGFueeuhnCDsspjrpqztlanri4jri6QuXG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdD4gPSB7fTtcblxuICAgIGZvciAoY29uc3Qgc2VsZWN0SXRlbSBvZiBzZWxlY3RJdGVtcykge1xuICAgICAgLy8gXCJ1c2Vycy5pZFwiIOuYkOuKlCBcInVzZXJzLmlkIGFzIHVzZXJfX2lkXCIg7ZiV7YOcIO2MjOyLsVxuICAgICAgY29uc3QgbWF0Y2ggPSBzZWxlY3RJdGVtLm1hdGNoKC9eKC4rPykoPzogYXMgKC4rKSk/JC8pO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IFssIGNvbHVtbiwgYWxpYXNdID0gbWF0Y2g7XG4gICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IGBcIiR7Y29sdW1uLnRyaW0oKX1cImA7XG5cbiAgICAgIGlmICghYWxpYXMgfHwgIWFsaWFzLmluY2x1ZGVzKFwiX19cIikpIHtcbiAgICAgICAgLy8gYWxpYXPqsIAg7JeG6rGw64KYIF9f66W8IO2PrO2VqO2VmOyngCDslYrsnLzrqbQg7LWc7IOB7JyEIO2VhOuTnFxuICAgICAgICBjb25zdCBrZXkgPSBhbGlhcyA/PyBhc3NlcnREZWZpbmVkKGNvbHVtbi5zcGxpdChcIi5cIikucG9wKCkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWxpYXPqsIAgX1/rpbwg7Y+s7ZWo7ZWY66m0IOyeheyytCDqtazsobDroZwg6re466O57ZmUXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYWxpYXMuc3BsaXQoXCJfX1wiKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSByZXN1bHQ7XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuCDsoITquYzsp4Ag7KSR7LKpIOqwneyytCDsg53shLFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgaWYgKHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50W3BhcnRdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDspJHssqkg7Jik67iM7KCd7Yq47J2YIOqwkuydgCBzdHJpbmfsnbwg7IiY64+EIOyeiOqzoCDrmJDri6Trpbgg7Jik67iM7KCd7Yq47J28IOyImOuPhCDsnojripTrjbAsIOydtOulvCDsnqzqt4Ag7YOA7J6F7Jy866GcIOuCmO2DgOuCvCDsiJgg7JeG7Ja0IGFueeuhnCDsspjrpqztlanri4jri6QuXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgICB3aXRoQnJhY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgaW5uZXJTcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gd2l0aEJyYWNlcyA/IFwie31cIiA6IFwiXCI7XG5cbiAgICBjb25zdCBsaW5lcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKGxvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2ggfSA9IGxvYWRlci5tYW55Sm9pbjtcbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSkgPT4ge2AsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRocm91Z2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEhhc01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIFwicmV0dXJuIHFiV3JhcHBlclwiLFxuICAgICAgICAgICAgYC5mcm9tKFwiJHt0b1RhYmxlfVwiKWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxvYWRlci5vbmVKb2lucy5mb3JFYWNoKChqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pID0+IHtcbiAgICAgICAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgICAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuICAgICAgICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgY2FsbGJhY2sg7ZiV7YOc7J2YIG9uIOuplOyEnOuTnOuhnCDsspjrpqztlanri4jri6QuXG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgKGopID0+IHtgLFxuICAgICAgICAgICAgICAgIGBqLm9uKFB1cmkucmF3U3RyaW5nKFwiJHtqb2luLmN1c3RvbX1cIikpO2AsXG4gICAgICAgICAgICAgICAgXCJ9KVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7J6F7LK07KCBIHNlbGVjdCDqtazsobAg7IOd7ISxIChyZWZJZCDtj6ztlagpXG4gICAgICAgICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChsb2FkZXIuc2VsZWN0KTtcbiAgICAgICAgICBzZWxlY3RPYmoucmVmSWQgPSBgXCIke3RvVGFibGV9LiR7dG9Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3RvVGFibGV9LiR7dG9Db2x9XCIsIGZyb21JZHMpYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYW55VG9NYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIFwicmV0dXJuIHFiV3JhcHBlclwiLFxuICAgICAgICAgICAgYC5mcm9tKFwiJHt0aHJvdWdoLnRhYmxlfVwiKWAsXG4gICAgICAgICAgICBgLmpvaW4oXCIke3RvVGFibGV9XCIsIFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2gudG9Db2x9XCIsIFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiKWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxvYWRlci5vbmVKb2lucy5mb3JFYWNoKChqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pID0+IHtcbiAgICAgICAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgICAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuICAgICAgICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgY2FsbGJhY2sg7ZiV7YOc7J2YIG9uIOuplOyEnOuTnOuhnCDsspjrpqztlanri4jri6QuXG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgKGopID0+IHtgLFxuICAgICAgICAgICAgICAgIGBqLm9uKFB1cmkucmF3U3RyaW5nKFwiJHtqb2luLmN1c3RvbX1cIikpO2AsXG4gICAgICAgICAgICAgICAgXCJ9KVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7J6F7LK07KCBIHNlbGVjdCDqtazsobAg7IOd7ISxIChyZWZJZCDtj6ztlagpXG4gICAgICAgICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChsb2FkZXIuc2VsZWN0KTtcbiAgICAgICAgICBzZWxlY3RPYmoucmVmSWQgPSBgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cIiwgZnJvbUlkcylgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChgfSxgKTtcblxuICAgICAgICAvLyDspJHssqkgbG9hZGVycyDsspjrpqxcbiAgICAgICAgaWYgKGxvYWRlci5sb2FkZXJzICYmIGxvYWRlci5sb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwibG9hZGVyczogW1wiLCAuLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVyLmxvYWRlcnMpLCBcIl0sXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcIn0sXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9hZGVyTGluZXM7XG4gICAgfTtcblxuICAgIGxpbmVzLnB1c2goLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlcnMpKTtcbiAgICBsaW5lcy5wdXNoKGBdYCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qXG4gICAgc3Vic2V0IFNFTEVDVC9KT0lOL0xPQURFUiDqsrDqs7wg66as7YS0XG4gICovXG4gIGdldFN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogU3Vic2V0UXVlcnkge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcblxuICAgIGNvbnN0IHJlc3VsdDogU3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgKi9cbiAgcmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIGZpZWxkczogc3RyaW5nW10sXG4gICAgaXNBbHJlYWR5T3V0ZXJKb2luZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogU3Vic2V0UXVlcnkge1xuICAgIC8vIHByZWZpeCDsuZjtmZggKHByZWZpeOuKlCBUb09uZVJlbGF0aW9u7J20IOuzteyImOuhnCDrtpnsnYAg6rK97JqwIOuqqOuRkCBfX+uhnCDrs4Dqsr3rkKgpXG4gICAgcHJlZml4ID0gcHJlZml4LnJlcGxhY2UoL1xcLi9nLCBcIl9fXCIpO1xuXG4gICAgLy8g7ISc67iM7IWL7J2EIDHrjoHsiqTrp4wg67aE66as7ZWY7JesIOq3uOujue2VkVxuICAgIGNvbnN0IHN1YnNldEdyb3VwID0gZ3JvdXAoZmllbGRzLCAoZmllbGQpID0+IHtcbiAgICAgIGlmIChmaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgY29uc3QgW3JlbF0gPSBmaWVsZC5zcGxpdChcIi5cIik7XG4gICAgICAgIHJldHVybiByZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKHN1YnNldEdyb3VwKS5yZWR1Y2UoXG4gICAgICAociwgZ3JvdXBLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gc3Vic2V0R3JvdXBbZ3JvdXBLZXldO1xuICAgICAgICBhc3NlcnQoZmllbGRzICE9PSB1bmRlZmluZWQsIFwiZmllbGRzIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAvLyDtmITsnqwg7YWM7J2067iUIO2VhOuTnOyFi+ydgCBzZWxlY3QsIHZpcnR1YWzsl5Ag7LaU6rCA7ZWY6rOgIOumrO2EtFxuICAgICAgICBpZiAoZ3JvdXBLZXkgPT09IFwiXCIpIHtcbiAgICAgICAgICBjb25zdCByZWFsRmllbGRzID0gZmllbGRzLmZpbHRlcigoZmllbGQpID0+ICFpc1ZpcnR1YWxQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSkpO1xuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcImNvZGVcIiAo65iQ64qUIHVuZGVmaW5lZCnsnbggdmlydHVhbCBwcm9w66eMIHIudmlydHVhbOyXkCDstpTqsIBcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJxdWVyeVwi7J24IOqyveyasCDsgqzsmqnsnpDqsIAgYXBwZW5kU2VsZWN066GcIOyngeygkSDstpTqsIDtlZjrr4DroZwg7KCc7Jm4XG4gICAgICAgICAgY29uc3QgdmlydHVhbENvZGVGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKChmaWVsZCkgPT5cbiAgICAgICAgICAgIGlzVmlydHVhbENvZGVQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIO2YhOyerCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCkpKTtcbiAgICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQodmlydHVhbENvZGVGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcblxuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb27sl5DshJwgaWQg7ZWE65Oc66eMIOywuOyhsO2VmOuKlCDqsr3smrAg66a066CI7J207IWYIOuEmOq4sOyngCDslYrqs6Ag66as7YS0XG4gICAgICAgICAgaWYgKHJlbEZpZWxkcy5sZW5ndGggPT09IDEgJiYgcmVsRmllbGRzWzBdID09PSBcImlkXCIpIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7dGhpcy50YWJsZX0uJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3ByZWZpeH0uJHtncm91cEtleX1faWQgYXMgJHtwcmVmaXh9X18ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5uZXJPck91dGVyXG4gICAgICAgICAgY29uc3QgaW5uZXJPck91dGVyID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0FscmVhZHlPdXRlckpvaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4gPT09IHRydWUgJiYgKHJlbGF0aW9uLm51bGxhYmxlID8/IGZhbHNlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5udWxsYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgICAgICAgICAgYCR7cHJlZml4ICE9PSBcIlwiID8gYCR7cHJlZml4fS5gIDogXCJcIn0ke2dyb3VwS2V5fWAsXG4gICAgICAgICAgICByZWxGaWVsZHMsXG4gICAgICAgICAgICBpbm5lck9yT3V0ZXIgPT09IFwib3V0ZXJcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdChyZWxTdWJzZXRRdWVyeS52aXJ0dWFsKTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5BcyA9IHByZWZpeCA9PT0gXCJcIiA/IGdyb3VwS2V5IDogYCR7cHJlZml4fV9fJHtncm91cEtleX1gO1xuICAgICAgICAgIGNvbnN0IGZyb21UYWJsZSA9IHByZWZpeCA9PT0gXCJcIiA/IHRoaXMudGFibGUgOiBwcmVmaXg7XG5cbiAgICAgICAgICBsZXQgam9pbkNsYXVzZTpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGZyb206IHN0cmluZztcbiAgICAgICAgICAgICAgICB0bzogc3RyaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBjdXN0b206IHN0cmluZztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSkge1xuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tOiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyb206IHN0cmluZywgdG86IHN0cmluZztcbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uaWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS4ke2luZmxlY3Rpb24udW5kZXJzY29yZSh0aGlzLm5hbWVzLmZzLnJlcGxhY2UoLy0vZywgXCJfXCIpKX1faWRgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zLnB1c2goe1xuICAgICAgICAgICAgYXM6IGpvaW5BcyxcbiAgICAgICAgICAgIGpvaW46IGlubmVyT3JPdXRlcixcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAuLi5qb2luQ2xhdXNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQmVsb25nc1RvT25lIOuwkeyXkCBIYXNNYW556rCAIOu2meydgCDqsr3smrBcbiAgICAgICAgICBpZiAocmVsU3Vic2V0UXVlcnkubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRMb2FkZXJzID0gcmVsU3Vic2V0UXVlcnkubG9hZGVycy5tYXAoKGxvYWRlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuZXdBcyA9IFtncm91cEtleSwgbG9hZGVyLmFzXS5qb2luKFwiX19cIik7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXM6IG5ld0FzLFxuICAgICAgICAgICAgICAgIHRhYmxlOiBsb2FkZXIudGFibGUsXG4gICAgICAgICAgICAgICAgbWFueUpvaW46IGxvYWRlci5tYW55Sm9pbixcbiAgICAgICAgICAgICAgICBvbmVKb2luczogbG9hZGVyLm9uZUpvaW5zLFxuICAgICAgICAgICAgICAgIHNlbGVjdDogbG9hZGVyLnNlbGVjdCxcbiAgICAgICAgICAgICAgICBsb2FkZXJzOiBsb2FkZXIubG9hZGVycyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByLmxvYWRlcnMgPSBbLi4uci5sb2FkZXJzLCAuLi5jb252ZXJ0ZWRMb2FkZXJzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zID0gci5qb2lucy5jb25jYXQocmVsU3Vic2V0UXVlcnkuam9pbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1NYW55IFJlbGF0aW9uOiBMb2FkZXIg66GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMSkuam9pbihcIi5cIikpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCByZWxGaWVsZHMpO1xuXG4gICAgICAgICAgbGV0IG1hbnlKb2luOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl1bbnVtYmVyXVtcIm1hbnlKb2luXCJdO1xuICAgICAgICAgIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tQ29sID0gcmVsYXRpb24/LmZyb21Db2x1bW4gPz8gXCJpZFwiO1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbCxcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYCR7ZnJvbUNvbH1gIDogYCR7cHJlZml4fV9fJHtmcm9tQ29sfWAsXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IHJlbGF0aW9uLmpvaW5Db2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbDogXCJpZFwiLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgaWRgIDogYCR7cHJlZml4fV9faWRgLFxuICAgICAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICAgICAgdGFibGU6IHJlbGF0aW9uLmpvaW5UYWJsZSxcbiAgICAgICAgICAgICAgICBmcm9tQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRoaXMudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgICAgdG9Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsRW50aXR5LnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiBcImlkXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmxvYWRlcnMucHVzaCh7XG4gICAgICAgICAgICBhczogZ3JvdXBLZXksXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgbWFueUpvaW4sXG4gICAgICAgICAgICBvbmVKb2luczogcmVsU3Vic2V0UXVlcnkuam9pbnMsXG4gICAgICAgICAgICBzZWxlY3Q6IHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCxcbiAgICAgICAgICAgIGxvYWRlcnM6IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbGVjdDogW10sXG4gICAgICAgIHZpcnR1YWw6IFtdLFxuICAgICAgICBqb2luczogW10sXG4gICAgICAgIGxvYWRlcnM6IFtdLFxuICAgICAgfSBhcyBTdWJzZXRRdWVyeSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgIEZpZWxkRXhwcltdIOydhCBFbnRpdHlQcm9wTm9kZVtdIOuhnCDrs4DtmZhcbiAgKi9cbiAgZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnM6IHN0cmluZ1tdLCBlbnRpdHk6IEVudGl0eSA9IHRoaXMpOiBFbnRpdHlQcm9wTm9kZVtdIHtcbiAgICBjb25zdCBncm91cHMgPSBmaWVsZEV4cHJzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGZpZWxkRXhwcikgPT4ge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGVsc2VFeHByOiBzdHJpbmdbXTtcbiAgICAgICAgaWYgKGZpZWxkRXhwci5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICBba2V5LCAuLi5lbHNlRXhwcl0gPSBmaWVsZEV4cHIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgIHZhbHVlID0gZWxzZUV4cHIuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gXCJcIjtcbiAgICAgICAgICB2YWx1ZSA9IGZpZWxkRXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRba2V5XSA9IChyZXN1bHRba2V5XSA/PyBbXSkuY29uY2F0KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcDxFbnRpdHlQcm9wTm9kZSwgRW50aXR5UHJvcE5vZGVbXT4oKGtleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNba2V5XTtcblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBncm91cC5tYXAoKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAnJHtwcm9wTmFtZX0nICjsgqzsmqkg6rCA64ql7ZWcIHByb3BzOiAke2VudGl0eS5wcm9wcy5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wc0RpY3Rba2V5XTtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgRmllbGRFeHByICR7a2V5fS4ke2dyb3VwWzBdfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgLy8gcmVsYXRpb24gLU9uZSDsl5AgaWQg7ZWE65OcIO2VmOuCmOyduCDqsr3smrBcbiAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChncm91cC5sZW5ndGggPT09IDEgJiYgKGdyb3VwWzBdID09PSBcImlkXCIgfHwgZ3JvdXBbMF0gPT09IFwiaWQ/XCIpKSB7XG4gICAgICAgICAgLy8gaWQg7ZWY64KY66eMIOyeiOuKlOyngCDssrTtgaztlbTshJwsIO2VmOuCmOunjCDsnojsnLzrqbQg7IOB7JyEIHByb3DsnLzroZwgaWTrpbwg66as7YS0XG4gICAgICAgICAgY29uc3QgaWRQcm9wID0gcmVsRW50aXR5LnByb3BzRGljdC5pZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgLi4uaWRQcm9wLFxuICAgICAgICAgICAgICBuYW1lOiBgJHtrZXl9X2lkYCxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gLU9uZSDqt7jsmbjsnZgg6rK97JqwIG9iamVjdOuhnCDrpqzthLRcbiAgICAgIC8vIC1NYW557J2YIOqyveyasCBhcnJheeuhnCDrpqzthLRcbiAgICAgIC8vIFJlY3Vyc2l2ZSDroZwg646B7IqkIOyymOumrFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpZWxkRXhwcnNUb1Byb3BOb2Rlcyhncm91cCwgcmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKVxuICAgICAgICAgID8gKFwib2JqZWN0XCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJhcnJheVwiIGFzIGNvbnN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpZWxkRXhwcnMocHJlZml4ID0gXCJcIiwgbWF4RGVwdGg6IG51bWJlciA9IDMsIGZyb21zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAuZmxhdE1hcCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IFtwcmVmaXgsIHByb3AubmFtZV0uZmlsdGVyKCh2KSA9PiB2ICE9PSBcIlwiKS5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSBwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAobWF4RGVwdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb21zLmluY2x1ZGVzKHByb3Aud2l0aCkpIHtcbiAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAg7KCc7Jm4XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7KCV67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCByZWN1cnNpdmUg7L2cXG4gICAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiByZWxNZC5nZXRGaWVsZEV4cHJzKHByb3BOYW1lLCBtYXhEZXB0aCAtIDEsIFsuLi5mcm9tcywgdGhpcy5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wTmFtZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICE9PSBudWxsKSBhcyBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiBwcm9w7J20IO2YhOyerCDthYzsnbTruJTsl5AgRksg7Lus65+87J2EIOyDneyEse2VmOuKlOyngCDtmZXsnbhcbiAgICooQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZShoYXNKb2luQ29sdW1uPXRydWUp7J24IOqyveyasCBGSyDsg53shLEpXG4gICAqL1xuICBwcml2YXRlIGhhc0ZvcmVpZ25LZXkocHJvcDogUmVsYXRpb25Qcm9wKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4gPT09IHRydWUpXG4gICAgKTtcbiAgfVxuXG4gIGdldFRhYmxlQ29sdW1ucygpOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICAvKipcbiAgICog7ZWE7YSw66eBIOqwgOuKpe2VnCBwcm9wcyDrsJjtmZhcbiAgICpcbiAgICogLSDsnbzrsJggcHJvcFxuICAgKiAtIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbiAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pXG4gICAqICAg4oaSIHtuYW1lfV9pZCDtmJXtg5zsnZgg6rCA7IOBIGludGVnZXIgcHJvcOycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZpbHRlcmFibGVQcm9wcygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZsYXRNYXAoKHByb3ApOiBFbnRpdHlQcm9wIHwgRW50aXR5UHJvcFtdID0+IHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb27rp4wg7Y+s7ZWoXG4gICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsXG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgIH0gYXMgRW50aXR5UHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWdpc3Rlck1vZHVsZVBhdGhzKCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7dHlwZXNNb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHR5cGVzRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPHouWm9kVHlwZUFueT4odHlwZXNGaWxlUGF0aCk7XG4gICAgICB0aGlzLnR5cGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBpbXBvcnRlZE1lbWJlcnMubWFwKCh7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgobmFtZSwgdHlwZXNNb2R1bGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIHZhbHVlXTtcbiAgICAgICAgfSksXG4gICAgICApIGFzIHsgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueSB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyVGFibGVTcGVjcygpOiB2b2lkIHtcbiAgICAvLyDsobDsnbgg7YWM7J2067iUIOyduOuNseyKpCDsoJzsmbggKOy7rOufvCDsnbTrpoTsl5AgJy4n7J20IO2PrO2VqOuQnCDqsr3smrApXG4gICAgY29uc3QgdW5pcXVlSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1xuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHgudHlwZSA9PT0gXCJ1bmlxdWVcIilcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LmNvbHVtbnMuZXZlcnkoKGNvbCkgPT4gIWNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkpO1xuXG4gICAgRW50aXR5TWFuYWdlci5zZXRUYWJsZVNwZWMoe1xuICAgICAgbmFtZTogdGhpcy50YWJsZSxcbiAgICAgIHVuaXF1ZUluZGV4ZXMsXG4gICAgICBqc29uQ29sdW1uczogdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJqc29uXCIpLm1hcCgocCkgPT4gcC5uYW1lKSxcbiAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpOiBFbnRpdHlKc29uIHtcbiAgICAvLyBzdWJzZXRz7JmAIHN1YnNldHNJbnRlcm5hbOydhCBTdWJzZXRGaWVsZFtdIO2Yle2DnOuhnCDrs7Xsm5BcbiAgICBjb25zdCBzdWJzZXRzOiB7IFtrZXk6IHN0cmluZ106IFN1YnNldEZpZWxkW10gfSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9IHRoaXMuc3Vic2V0c1trZXldO1xuICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSAodGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkubWFwKChmaWVsZCkgPT4gKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgc3Vic2V0c1trZXldID0gWy4uLm5vcm1hbEZpZWxkcywgLi4uaW50ZXJuYWxGaWVsZHNdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIHByb3BzOiB0aGlzLnByb3BzLFxuICAgICAgaW5kZXhlczogdGhpcy5pbmRleGVzLFxuICAgICAgc3Vic2V0cyxcbiAgICAgIGVudW1zOiB0aGlzLmVudW1MYWJlbHMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBcImpzb25cIiwganNvblBhdGgpKTtcblxuICAgIC8vIHJlbG9hZFxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVnaXN0ZXIoanNvbik7XG4gIH1cblxuICBnZXRTdWJzZXRSb3dzKFxuICAgIF9zdWJzZXRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIF9zdWJzZXRzSW50ZXJuYWw/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgcHJlZml4ZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IEVudGl0eVN1YnNldFJvd1tdIHtcbiAgICBpZiAocHJlZml4ZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRzID0gX3N1YnNldHMgPz8gdGhpcy5zdWJzZXRzO1xuICAgIGNvbnN0IHN1YnNldHNJbnRlcm5hbCA9IF9zdWJzZXRzSW50ZXJuYWwgPz8gdGhpcy5zdWJzZXRzSW50ZXJuYWw7XG4gICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHN1YnNldHMpO1xuICAgIGNvbnN0IGFsbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c1trZXldKSk7XG4gICAgLy8gaW50ZXJuYWwg7ZWE65Oc64+EIGFsbEZpZWxkc+yXkCDtj6ztlaggKHJlbGF0aW9uIO2DkOyDieyaqSlcbiAgICBjb25zdCBhbGxJbnRlcm5hbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pKTtcbiAgICBjb25zdCBjb21iaW5lZEZpZWxkcyA9IHVuaXF1ZShbLi4uYWxsRmllbGRzLCAuLi5hbGxJbnRlcm5hbEZpZWxkc10pO1xuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiICYmXG4gICAgICAgIGNvbWJpbmVkRmllbGRzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChgJHtbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIil9LmApKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVsRW50aXR5LmdldFN1YnNldFJvd3Moc3Vic2V0cywgc3Vic2V0c0ludGVybmFsLCBbXG4gICAgICAgICAgLi4ucHJlZml4ZXMsXG4gICAgICAgICAgYCR7cHJvcC5uYW1lfWAsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC53aXRoLFxuICAgICAgICAgIHByZWZpeGVzLFxuICAgICAgICAgIGlzT3BlbjogY2hpbGRyZW4ubGVuZ3RoID4gMCxcbiAgICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaGFzW3N1YnNldEtleV0gPT09IHRydWUpXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5pc0ludGVybmFsW3N1YnNldEtleV0gPT09IHRydWUpXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gWy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgPyBwcm9wLndpdGggOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWZpeGVzLFxuICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzZXRGaWVsZHMgPSBzdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgICAgICBjb25zdCBoYXMgPSBzdWJzZXRGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGhhc107XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcm5hbEZpZWxkcyA9IHN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9IGludGVybmFsRmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBpc0ludGVybmFsXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoXG4gICAgc3Vic2V0Um93czogRW50aXR5U3Vic2V0Um93W10sXG4gICAgc3Vic2V0S2V5OiBzdHJpbmcsXG4gICAgaW50ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGhhc0tleSA9IGludGVybmFsID8gXCJpc0ludGVybmFsXCIgOiBcImhhc1wiO1xuICAgIHJldHVybiBzdWJzZXRSb3dzXG4gICAgICAubWFwKChzdWJzZXRSb3cpID0+IHtcbiAgICAgICAgaWYgKHN1YnNldFJvdy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvdy5jaGlsZHJlbiwgc3Vic2V0S2V5LCBpbnRlcm5hbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Vic2V0Um93W2hhc0tleV1bc3Vic2V0S2V5XSkge1xuICAgICAgICAgIHJldHVybiBzdWJzZXRSb3cucHJlZml4ZXMuY29uY2F0KHN1YnNldFJvdy5maWVsZCkuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByb3AocHJvcDogRW50aXR5UHJvcCwgYXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWF0KSB7XG4gICAgICB0aGlzLnByb3BzLnB1c2gocHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAwLCBwcm9wKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICBhbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHtcbiAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gIH1bXSB7XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpO1xuXG4gICAgbGV0IGVudGl0eUlkID0gdGhpcy5pZDtcbiAgICBjb25zdCByZXN1bHQ6IHtcbiAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICBwcm9wTmFtZTogc3RyaW5nO1xuICAgIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGFycltpXTtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgZW50aXR5SWQsXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAoIXByb3ApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfeydmCDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgZW50aXR5SWQgPSBwcm9wLndpdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBtb2RpZnlQcm9wKG5ld1Byb3A6IEVudGl0eVByb3AsIGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsnbTrpoTsnbQg67CU64CQIOqyveyasFxuICAgIGlmIChvbGROYW1lICE9PSBuZXdQcm9wLm5hbWUpIHtcbiAgICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyImOygleuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsiJjsoJVcbiAgICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuXG4gICAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsiJjsoJUg7LKY66asXG4gICAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXQubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkID0gYW5hbHl6ZWQubWFwKChhKSA9PlxuICAgICAgICAgICAgICBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IG5ld1Byb3AubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IGEsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8g67aE7ISd7ZWcIO2VhOuTnOulvCDri6Tsi5wg7ISc67iM7IWLIO2VhOuTnOuhnCDrs7XqtaxcbiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZC5tYXAoKGEpID0+IGEucHJvcE5hbWUpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IiY7KCVXG4gICAgdGhpcy5wcm9wc1thdF0gPSBuZXdQcm9wO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGFzeW5jIGRlbFByb3AoYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyCreygnOuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsoJzsmbhcbiAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOydtO2bhOydmCDtlYTrk5zrpbwg7KCc7Jm4XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0XG4gICAgICAgICAgLm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBpZiAoYW5hbHl6ZWQuZmluZCgoYSkgPT4gYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkKSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJzZXRGaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2YhOyerCDsl5Tti7Dti7DsnZgg7J24642x7Iqk7JeQ7IScIOygnOyZuFxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgRW50aXR5TWFuYWdlci5nZXQodGhpcy5pZCkuaW5kZXhlcykge1xuICAgICAgaW5kZXguY29sdW1ucyA9IGluZGV4LmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5uYW1lICE9PSBvbGROYW1lKTtcbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IKt7KCcXG4gICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDEpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGdldEVudGl0eUlkRnJvbVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzdWJzZXRGaWVsZC5pbmNsdWRlcyhcIi5cIikgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc7J2YIOuniOyngOunieydgCDtlITroa3snbTrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDAsIC0xKTtcblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg64K066Ck6rCA66m07IScIOuniOyngOunieycvOuhnCByZWxhdGlvbuuQnCDsl5Tti7Dti7Drpbwg7LC+7J2MXG4gICAgY29uc3QgbGFzdEVudGl0eUlkID0gYXJyLnJlZHVjZSgoZW50aXR5SWQsIGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCByZWxQcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gZmllbGQpO1xuICAgICAgaWYgKCFyZWxQcm9wIHx8IHJlbFByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBhcnIsIHRoaXNJZDogdGhpcy5pZCwgZW50aXR5SWQsIGZpZWxkIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWxQcm9wLndpdGg7XG4gICAgfSwgdGhpcy5pZCk7XG4gICAgcmV0dXJuIGxhc3RFbnRpdHlJZDtcbiAgfVxuXG4gIGFzeW5jIG1vdmVQcm9wKGF0OiBudW1iZXIsIHRvOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wc1thdF07XG4gICAgY29uc3QgbmV3UHJvcHMgPSBbLi4udGhpcy5wcm9wc107XG4gICAgbmV3UHJvcHMuc3BsaWNlKHRvLCAwLCBwcm9wKTtcbiAgICBuZXdQcm9wcy5zcGxpY2UoYXQgPCB0byA/IGF0IDogYXQgKyAxLCAxKTtcbiAgICB0aGlzLnByb3BzID0gbmV3UHJvcHM7XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zrqoXsnYQgXCLthYzsnbTruJTrqoUu7ZWE65Oc66qFXCIg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RnVsbEZpZWxkTmFtZShmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnRhYmxlfS4ke2ZpZWxkfWA7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGlkIO2VhOuTnOydmCDtg4DsnoXsnYQg6riw7KSA7Jy866GcIFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwi66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrVHlwZSgpOiBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIiB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICBpZiAoaWRQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgfHwgaWRQcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4gaWRQcm9wLnR5cGU7XG4gICAgfVxuICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsgcHJvcOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGxlbmd0aCDrk7Eg7IS467aAIOygleuztOyXkCDsoJHqt7ztlaAg65WMIOyCrOyaqe2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrUHJvcCgpOiBFbnRpdHlQcm9wIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBpZFByb3A7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwicGF0aCIsImdyb3VwIiwidW5pcXVlIiwieiIsIlNvbmFtdSIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNFbnVtUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzSW50ZXJuYWxTdWJzZXRGaWVsZCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbENvZGVQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsIm5vcm1hbGl6ZVN1YnNldEZpZWxkIiwiaW1wb3J0TWVtYmVycyIsImZvcm1hdENvZGUiLCJleGlzdHMiLCJydW50aW1lUGF0aCIsImFzc2VydERlZmluZWQiLCJub25OdWxsYWJsZSIsIkVudGl0eU1hbmFnZXIiLCJFbnRpdHkiLCJpZCIsInBhcmVudElkIiwidGFibGUiLCJ0aXRsZSIsIm5hbWVzIiwicHJvcHMiLCJwcm9wc0RpY3QiLCJyZWxhdGlvbnMiLCJpbmRleGVzIiwic3Vic2V0cyIsInN1YnNldHNJbnRlcm5hbCIsInR5cGVzIiwiZW51bXMiLCJlbnVtTGFiZWxzIiwidW5kZXJzY29yZSIsInBsdXJhbGl6ZSIsIm1hcCIsInByb3AiLCJpbmNsdWRlcyIsInJlcGxhY2UiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsIm5hbWUiLCJmaWx0ZXIiLCJrZXkiLCJmaWVsZHMiLCJlbnRyaWVzIiwiZiIsImVudW1MYWJlbCIsImVudW0iLCJrZXlzIiwicGFyZW50RnMiLCJkYXNoZXJpemUiLCJ0b0xvd2VyQ2FzZSIsImZzIiwibW9kdWxlIiwiZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkiLCJzdWJzZXRLZXkiLCJnZXRQdXJpU3Vic2V0UXVlcnkiLCJzdWJzZXQiLCJzdWJzZXRRdWVyeSIsInJlc29sdmVTdWJzZXRRdWVyeSIsImxpbmVzIiwicHVzaCIsImpvaW4iLCJqb2lucyIsImpvaW5NZXRob2QiLCJhcyIsImN1c3RvbSIsImZyb20iLCJ0byIsInNlbGVjdE9iaiIsImJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0Iiwic2VsZWN0Iiwic3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0Iiwic2VsZWN0SXRlbXMiLCJyZXN1bHQiLCJzZWxlY3RJdGVtIiwibWF0Y2giLCJjb2x1bW4iLCJhbGlhcyIsImNvbHVtblZhbHVlIiwidHJpbSIsInNwbGl0IiwicG9wIiwicGFydHMiLCJjdXJyZW50IiwiaSIsImxlbmd0aCIsInBhcnQiLCJFcnJvciIsInNsaWNlIiwibGFzdFBhcnQiLCJvYmoiLCJpbmRlbnQiLCJ3aXRoQnJhY2VzIiwic3BhY2VzIiwicmVwZWF0IiwiaW5uZXJTcGFjZXMiLCJ2YWx1ZSIsImdldFB1cmlMb2FkZXJRdWVyeSIsImxvYWRlcnMiLCJnZW5lcmF0ZUxvYWRlckNvZGUiLCJsb2FkZXJMaW5lcyIsImxvYWRlciIsInRvVGFibGUiLCJ0b0NvbCIsInRocm91Z2giLCJtYW55Sm9pbiIsImlkRmllbGQiLCJ1bmRlZmluZWQiLCJvbmVKb2lucyIsImZvckVhY2giLCJyZWZJZCIsImZyb21Db2wiLCJnZXRTdWJzZXRRdWVyeSIsInByZWZpeCIsImlzQWxyZWFkeU91dGVySm9pbmVkIiwic3Vic2V0R3JvdXAiLCJmaWVsZCIsInJlbCIsInJlZHVjZSIsInIiLCJncm91cEtleSIsInJlYWxGaWVsZHMiLCJ2aXJ0dWFsQ29kZUZpZWxkcyIsImNvbmNhdCIsImdldEZ1bGxGaWVsZE5hbWUiLCJ2aXJ0dWFsIiwicmVsYXRpb24iLCJyZWxFbnRpdHkiLCJnZXQiLCJ3aXRoIiwicmVsRmllbGRzIiwiaW5uZXJPck91dGVyIiwiaGFzSm9pbkNvbHVtbiIsIm51bGxhYmxlIiwicmVsU3Vic2V0UXVlcnkiLCJqb2luQXMiLCJmcm9tVGFibGUiLCJqb2luQ2xhdXNlIiwiY3VzdG9tSm9pbkNsYXVzZSIsImNvbnZlcnRlZExvYWRlcnMiLCJuZXdBcyIsImZyb21Db2x1bW4iLCJqb2luQ29sdW1uIiwiam9pblRhYmxlIiwic2luZ3VsYXJpemUiLCJmaWVsZEV4cHJzVG9Qcm9wTm9kZXMiLCJmaWVsZEV4cHJzIiwiZW50aXR5IiwiZ3JvdXBzIiwiZmllbGRFeHByIiwiZWxzZUV4cHIiLCJmbGF0TWFwIiwicHJvcE5hbWUiLCJmaW5kIiwicCIsIm5vZGVUeXBlIiwiaWRQcm9wIiwiY2hpbGRyZW4iLCJnZXRGaWVsZEV4cHJzIiwibWF4RGVwdGgiLCJmcm9tcyIsInYiLCJyZWxNZCIsImhhc0ZvcmVpZ25LZXkiLCJyZWxhdGlvblR5cGUiLCJnZXRUYWJsZUNvbHVtbnMiLCJ0eXBlIiwiZ2V0VmVjdG9yQ29sdW1ucyIsImdldFZlY3RvckNvbHVtbiIsImNvbHVtbk5hbWUiLCJ2ZWN0b3JQcm9wcyIsImdldEZpbHRlcmFibGVQcm9wcyIsInJlZ2lzdGVyTW9kdWxlUGF0aHMiLCJiYXNlUGF0aCIsInNldE1vZHVsZVBhdGgiLCJ0b1VwcGVyQ2FzZSIsImVudW1JZCIsInR5cGVzTW9kdWxlUGF0aCIsInR5cGVzRmlsZVBhdGgiLCJhcGlSb290UGF0aCIsImltcG9ydGVkTWVtYmVycyIsInJlZ2lzdGVyVGFibGVTcGVjcyIsInVuaXF1ZUluZGV4ZXMiLCJpZHgiLCJjb2x1bW5zIiwiZXZlcnkiLCJjb2wiLCJzZXRUYWJsZVNwZWMiLCJqc29uQ29sdW1ucyIsInRvSnNvbiIsIm5vcm1hbEZpZWxkcyIsImludGVybmFsRmllbGRzIiwiaW50ZXJuYWwiLCJzYXZlIiwic3Vic2V0Um93cyIsImdldFN1YnNldFJvd3MiLCJzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMiLCJqc29uUGF0aCIsImpzb24iLCJKU09OIiwic3RyaW5naWZ5IiwicmVnaXN0ZXIiLCJfc3Vic2V0cyIsIl9zdWJzZXRzSW50ZXJuYWwiLCJwcmVmaXhlcyIsInN1YnNldEtleXMiLCJhbGxGaWVsZHMiLCJhbGxJbnRlcm5hbEZpZWxkcyIsImNvbWJpbmVkRmllbGRzIiwic3RhcnRzV2l0aCIsInJlbGF0aW9uRW50aXR5IiwiaXNPcGVuIiwiaGFzIiwiY2hpbGQiLCJpc0ludGVybmFsIiwic3Vic2V0RmllbGRzIiwic29tZSIsImhhc0tleSIsInN1YnNldFJvdyIsImZsYXQiLCJjcmVhdGVQcm9wIiwiYXQiLCJzcGxpY2UiLCJhbmFseXplU3Vic2V0RmllbGQiLCJzdWJzZXRGaWVsZCIsImFyciIsImVudGl0eUlkIiwibW9kaWZ5UHJvcCIsIm5ld1Byb3AiLCJvbGROYW1lIiwiZW50aXRpZXMiLCJhbGxFbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJyZWxFbnRpdHlJZCIsInJlbEVudGl0eVN1YnNldEtleXMiLCJtb2RpZmllZFN1YnNldEZpZWxkcyIsImFuYWx5emVkIiwibW9kaWZpZWQiLCJhIiwiUHJvbWlzZSIsImFsbCIsImRlbFByb3AiLCJpbmRleCIsImdldEVudGl0eUlkRnJvbVN1YnNldEZpZWxkIiwibGFzdEVudGl0eUlkIiwicmVsUHJvcCIsImNvbnNvbGUiLCJkZWJ1ZyIsInRoaXNJZCIsIm1vdmVQcm9wIiwibmV3UHJvcHMiLCJnZXRQa1R5cGUiLCJnZXRQa1Byb3AiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixTQUFTQyxTQUFTLFFBQVEsbUJBQWM7QUFDeEMsT0FBT0MsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLEtBQUssRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFDeEMsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQU1FQywwQkFBMEIsRUFDMUJDLFVBQVUsRUFDVkMscUJBQXFCLEVBQ3JCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLGlCQUFpQixFQUNqQkMsYUFBYSxFQUNiQyxvQkFBb0IsUUFJZixvQkFBaUI7QUFDeEIsU0FBU0MsYUFBYSxRQUFRLHdCQUFxQjtBQUNu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
|
|
1092
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdyb3VwLCB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vZW50aXR5LW1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb25lPzogQ29uZTtcbiAgbmFtZXM6IHtcbiAgICBwYXJlbnRGczogc3RyaW5nO1xuICAgIGZzOiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gIH07XG4gIHByb3BzOiBFbnRpdHlQcm9wW107XG4gIHByb3BzRGljdDoge1xuICAgIFtrZXk6IHN0cmluZ106IEVudGl0eVByb3A7XG4gIH07XG4gIHJlbGF0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IFJlbGF0aW9uUHJvcDtcbiAgfTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBzdWJzZXRzSW50ZXJuYWw6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgdHlwZXM6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55O1xuICB9ID0ge307XG4gIGVudW1zOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgfSA9IHt9O1xuICBlbnVtTGFiZWxzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXToge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgZW51bUNvbmVzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogQ29uZTtcbiAgfSA9IHt9O1xuICBzdWJzZXRDb25lczoge1xuICAgIFtzdWJzZXRLZXk6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcih7IGlkLCBwYXJlbnRJZCwgdGFibGUsIHRpdGxlLCBjb25lLCBwcm9wcywgaW5kZXhlcywgc3Vic2V0cywgZW51bXMgfTogRW50aXR5SnNvbikge1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGUgPz8gdGhpcy5pZDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGlkKSk7XG4gICAgdGhpcy5jb25lID0gY29uZTtcblxuICAgIC8vIHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKHByb3AuaWQuaW5jbHVkZXMoXCIkTW9kZWxcIikpIHtcbiAgICAgICAgICAgIHByb3AuaWQgPSBwcm9wLmlkLnJlcGxhY2UoXCIkTW9kZWxcIiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyByZWxhdGlvbnNcbiAgICAgIHRoaXMucmVsYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5maWx0ZXIoKHByb3ApID0+IGlzUmVsYXRpb25Qcm9wKHByb3ApKS5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMgPSBbXTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0ge307XG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIGluZGV4ZXNcbiAgICB0aGlzLmluZGV4ZXMgPSBpbmRleGVzID8/IFtdO1xuXG4gICAgLy8gc3Vic2V0czogU3Vic2V0RGVm7JeQ7IScIFN1YnNldEZpZWxkW13rpbwg7LaU7Lac7ZWY7JesIHN1YnNldHMo7J2867CYKeyZgCBzdWJzZXRzSW50ZXJuYWwoaW50ZXJuYWwp66GcIOu2hOumrFxuICAgIHRoaXMuc3Vic2V0cyA9IHt9O1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBzdWJzZXREZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YnNldHMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBnZXRTdWJzZXRGaWVsZHMoc3Vic2V0RGVmKTtcbiAgICAgIHRoaXMuc3Vic2V0c1trZXldID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgIHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHMuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZCkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcblxuICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJzZXREZWYpICYmIFwiY29uZVwiIGluIHN1YnNldERlZiAmJiBzdWJzZXREZWYuY29uZSkge1xuICAgICAgICB0aGlzLnN1YnNldENvbmVzW2tleV0gPSBzdWJzZXREZWYuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtczogRW51bURlZuyXkOyEnCB2YWx1ZXPsmYAgY29uZeulvCDstpTstpztlZjsl6wg7LKY66asXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZW51bXMgPz8ge30pLm1hcCgoW2tleSwgZW51bURlZl0pID0+IHtcbiAgICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gZW51bURlZiAmJiBcImNvbmVcIiBpbiBlbnVtRGVmICYmIGVudW1EZWYuY29uZSkge1xuICAgICAgICAgIHRoaXMuZW51bUNvbmVzW2tleV0gPSBlbnVtRGVmLmNvbmUgYXMgQ29uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuZW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpLm1hcCgoW2tleSwgZW51bUxhYmVsXSkgPT4ge1xuICAgICAgICByZXR1cm4gW2tleSwgei5lbnVtKE9iamVjdC5rZXlzKGVudW1MYWJlbCkgYXMgdW5rbm93biBhcyByZWFkb25seSBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBuYW1lc1xuICAgIHRoaXMubmFtZXMgPSB7XG4gICAgICBwYXJlbnRGczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHBhcmVudElkID8/IGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbW9kdWxlOiBpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOy/vOumrOyaqSDshJzruIzshYsg7ZWE65Oc66W8IOuwmO2ZmO2VqeuLiOuLpCAoc3Vic2V0cyArIHN1YnNldHNJbnRlcm5hbCDtlansuagpXG4gICAqL1xuICBnZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLnN1YnNldHNbc3Vic2V0S2V5XSA/PyBbXSksIC4uLih0aGlzLnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdKV07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOydtOumhChzdWJzZXRLZXkp7J2YIHN1YnNldOydhCDsi6TsoJzroZwg6rCA7KC47Jik64qUIFB1cmkg7L2U65OcIOq1rO2YhOyytCBzdHJpbmfsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3Qgc3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBmcm9tXG4gICAgbGluZXMucHVzaChgcmV0dXJuIHFiV3JhcHBlcmApO1xuICAgIGxpbmVzLnB1c2goYC5mcm9tKFwiJHt0aGlzLnRhYmxlfVwiKWApO1xuXG4gICAgLy8gam9pblxuICAgIGZvciAoY29uc3Qgam9pbiBvZiBzdWJzZXRRdWVyeS5qb2lucykge1xuICAgICAgLy8gam9pbiDrqZTshJzrk5wg6rKw7KCVOiBpbm5lciDihpIgam9pbiwgb3V0ZXIg4oaSIGxlZnRKb2luXG4gICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcblxuICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgcmF3IOyCrOyaqVxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIHFiV3JhcHBlci5rbmV4LnJhdyhcXGAke2pvaW4uY3VzdG9tfVxcYCkpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2VsZWN0IC0g7J6F7LK07KCBIOq1rOyhsOuhnCDsg53shLFcbiAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgbGluZXMucHVzaChgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqICouZW50aXR5Lmpzb27snZggc3Vic2V07JeQIOuTpOyWtOyeiOuKlCDtlYTrk5wg67Cw7Je07J2EIOuwm+yVhOyEnCxcbiAgICogUHVyaeydmCBTZWxlY3RPYmplY3Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiBbXCJ1c2Vycy5pZFwiLCBcInBhcmVudC5pZFwiLCBcInBhcmVudC5uYW1lXCJdXG4gICAqICAg4oaSIHsgaWQ6IFwidXNlcnMuaWRcIiwgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqXG4gICAqIOyWuOuNlOuwlOqwgCDslYTri4wg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlajsl5Ag7Jyg7J2Y7ZWY7IS47JqULlxuICAgKiDsnbTroIfqsowg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZjsl6wgc2VsZWN07JeQIOuEmOqyqOyjvOuptCBQYXJzZVNlbGVjdE9iamVjdCDtg4DsnoXsnbQgam9pbuuQnCDqsJ3ssrTsnZgg7YOA7J6F7J2EIOyemCDsnqHslYTspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7KaJLCBlbmhhbmNlcuyXkOyEnCByb3frpbwg67Cb7JWY7J2EIOuVjCBoeWRyYXRl65CcIOqwneyytCDsnpDssrTsnZggbnVsbGl0eeyZgCDqt7gg7JWI7Kq9IO2VhOuTnOydmCBudWxsaXR56rCAIGZrIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6YIOy2lOuhoOuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgc2VsZWN0SXRlbXM6IHN0cmluZ1tdLFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog67CY7ZmYIOyYpOu4jOygne2KuOydmCDqsJLsnYAgc3RyaW5n7J28IOyImOuPhCDsnojqs6Ag65iQ64uk66W4IOyYpOu4jOygne2KuOydvCDsiJjrj4Qg7J6I64qU642wLCDsnbTrpbwg7J6s6reAIO2DgOyeheycvOuhnCDrgpjtg4Drgrwg7IiYIOyXhuyWtCBhbnnroZwg7LKY66as7ZWp64uI64ukLlxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Q+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdEl0ZW0gb2Ygc2VsZWN0SXRlbXMpIHtcbiAgICAgIC8vIFwidXNlcnMuaWRcIiDrmJDripQgXCJ1c2Vycy5pZCBhcyB1c2VyX19pZFwiIO2Yle2DnCDtjIzsi7FcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VsZWN0SXRlbS5tYXRjaCgvXiguKz8pKD86IGFzICguKykpPyQvKTtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbLCBjb2x1bW4sIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBgXCIke2NvbHVtbi50cmltKCl9XCJgO1xuXG4gICAgICBpZiAoIWFsaWFzIHx8ICFhbGlhcy5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIOyXhuqxsOuCmCBfX+ulvCDtj6ztlajtlZjsp4Ag7JWK7Jy866m0IOy1nOyDgeychCDtlYTrk5xcbiAgICAgICAgY29uc3Qga2V5ID0gYWxpYXMgPz8gYXNzZXJ0RGVmaW5lZChjb2x1bW4uc3BsaXQoXCIuXCIpLnBvcCgpKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIF9f66W8IO2PrO2VqO2VmOuptCDsnoXssrQg6rWs7KGw66GcIOq3uOujue2ZlFxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFsaWFzLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGxldCBjdXJyZW50ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirgg7KCE6rmM7KeAIOykkeyyqSDqsJ3ssrQg7IOd7ISxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChwYXJ0IGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudFtwYXJ0XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAvLyDsnoXroKXsnbQgW1widXNlclwiLCBcInVzZXJfX2lkXCJdIOqwmeydgCDqsr3smrAhXG4gICAgICAgICAgICAgIC8vIOyVoOy0iOyXkCDrp5Drj4Qg7JWIIOuQmOyngOunjCDslYjsoITtlZjqsowg7JiI7Jm466W8IOuNmOynkeuLiOuLpC5cbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb25mbGljdCBkZXRlY3RlZCBpbiBzZWxlY3QgaXRlbXM6IHBhcmVudCBwYXRoIFwiJHtwYXJ0cy5zbGljZSgwLCBpICsgMSkuam9pbihcIl9fXCIpfVwiIGlzIGFscmVhZHkgc2V0IGFzIGEgZmllbGQsIGNhbm5vdCBuZXN0IFwiJHthbGlhc31cIiB1bmRlciBpdC5gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50W3BhcnRdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuOyXkCDqsJIg7ISk7KCVXG4gICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGN1cnJlbnRbbGFzdFBhcnRdID0gY29sdW1uVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLnN0cmluZ2lmeeyZgCDsnKDsgqztlZwg7J287J2EIO2VqeuLiOuLpC5cbiAgICog64uk66eMIOyjvOyWtOynhCDqsJ3ssrTrpbwgSlNPTuydtCDslYTri4wgVHlwZVNjcmlwdCDqsJ3ssrQg66as7YSw65+0IOyKpO2KuOungeycvOuhnCDrp4zrk6TslrTspI3ri4jri6QuXG4gICAqIGtleeyXkCDrlLDsmLTtkZzqsIAg7JeG7Ja07JqULlxuICAgKiDstpzroKUg7JiI7IucOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHtcbiAgICogICBpZDogXCJ1c2Vycy5pZFwiLFxuICAgKiAgIHBhcmVudDoge1xuICAgKiAgICAgaWQ6IFwicGFyZW50LmlkXCIsXG4gICAqICAgICBuYW1lOiBcInBhcmVudC5uYW1lXCIsXG4gICAqICAgfSxcbiAgICogfVxuICAgKiBgYGBcbiAgICogQHBhcmFtIG9iaiDrs4DtmZjtlaAg6rCd7LK0XG4gICAqIEBwYXJhbSBpbmRlbnQg65Ok7Jes7JOw6riwIOugiOuyqFxuICAgKiBAcGFyYW0gd2l0aEJyYWNlcyB0cnVl66m0IOykkeq0hO2YuCDtj6ztlagsIGZhbHNl66m0IOuCtOyaqeunjCDrsJjtmZhcbiAgICovXG4gIHByaXZhdGUgc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7KSR7LKpIOyYpOu4jOygne2KuOydmCDqsJLsnYAgc3RyaW5n7J28IOyImOuPhCDsnojqs6Ag65iQ64uk66W4IOyYpOu4jOygne2KuOydvCDsiJjrj4Qg7J6I64qU642wLCDsnbTrpbwg7J6s6reAIO2DgOyeheycvOuhnCDrgpjtg4Drgrwg7IiYIOyXhuyWtCBhbnnroZwg7LKY66as7ZWp64uI64ukLlxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBpbmRlbnQ6IG51bWJlciA9IDAsXG4gICAgd2l0aEJyYWNlczogYm9vbGVhbiA9IHRydWUsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgIGNvbnN0IGlubmVyU3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHdpdGhCcmFjZXMgPyBcInt9XCIgOiBcIlwiO1xuXG4gICAgY29uc3QgbGluZXMgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIOy7rOufvCDqsr3roZwgKOydtOuvuCDrlLDsmLTtkZwg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3ZhbHVlfSxgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytCAo7ZWt7IOBIOykkeq0hO2YuCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUsIGluZGVudCArIDEsIHRydWUpfSxgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHdpdGhCcmFjZXMpIHtcbiAgICAgIHJldHVybiBge1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke3NwYWNlc319YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7KSR6rSE7Zi4IOyXhuydtCDrgrTsmqnrp4wg67CY7ZmYICjslZ7rkqQg6rCc7ZaJIOygnOyZuClcbiAgICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChsb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoLCBmcm9tVGFibGUgfSA9IGxvYWRlci5tYW55Sm9pbjtcblxuICAgICAgICAvLyBmcm9tVGFibGXsnZggRW50aXR566W8IOqwgOyguOyZgOyEnCBQSyDtg4DsnoUg7ZmV7J24XG4gICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUoZnJvbVRhYmxlKTtcbiAgICAgICAgY29uc3QgZnJvbUlkc1R5cGUgPSBmcm9tRW50aXR5LmdldFBrQXJyYXlUeXBlKCk7XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdKSA9PiB7YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhyb3VnaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSGFzTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3RvVGFibGV9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBzdWJzZXRHcm91cFtncm91cEtleV07XG4gICAgICAgIGFzc2VydChmaWVsZHMgIT09IHVuZGVmaW5lZCwgXCJmaWVsZHMgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgIC8vIO2YhOyerCDthYzsnbTruJQg7ZWE65Oc7IWL7J2AIHNlbGVjdCwgdmlydHVhbOyXkCDstpTqsIDtlZjqs6Ag66as7YS0XG4gICAgICAgIGlmIChncm91cEtleSA9PT0gXCJcIikge1xuICAgICAgICAgIGNvbnN0IHJlYWxGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PlxuICAgICAgICAgICAgaXNWaXJ0dWFsQ29kZVByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5nZXRGdWxsRmllbGROYW1lKGZpZWxkKSkpO1xuICAgICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdCh2aXJ0dWFsQ29kZUZpZWxkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOuEmOyWtOyYqCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChcbiAgICAgICAgICAgICAgcmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgJHtwcmVmaXh9LiR7ZmllbGR9IGFzICR7cHJlZml4fV9fJHtmaWVsZH1gKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvbiA9IHRoaXMucmVsYXRpb25zW2dyb3VwS2V5XTtcbiAgICAgICAgaWYgKHJlbGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgcmVsYXRpb24g7LC47KGwICR7Z3JvdXBLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG5cbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb246IEpPSU4g7Jy866GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMSkuam9pbihcIi5cIikpO1xuXG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbuyXkOyEnCBpZCDtlYTrk5zrp4wg7LC47KGw7ZWY64qUIOqyveyasCDrprTroIjsnbTshZgg64SY6riw7KeAIOyViuqzoCDrpqzthLRcbiAgICAgICAgICBpZiAocmVsRmllbGRzLmxlbmd0aCA9PT0gMSAmJiByZWxGaWVsZHNbMF0gPT09IFwiaWRcIikge1xuICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHt0aGlzLnRhYmxlfS4ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7cHJlZml4fS4ke2dyb3VwS2V5fV9pZCBhcyAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpbm5lck9yT3V0ZXJcbiAgICAgICAgICBjb25zdCBpbm5lck9yT3V0ZXIgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQWxyZWFkeU91dGVySm9pbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbiA9PT0gdHJ1ZSAmJiAocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLm51bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgICAgICAgICBgJHtwcmVmaXggIT09IFwiXCIgPyBgJHtwcmVmaXh9LmAgOiBcIlwifSR7Z3JvdXBLZXl9YCxcbiAgICAgICAgICAgIHJlbEZpZWxkcyxcbiAgICAgICAgICAgIGlubmVyT3JPdXRlciA9PT0gXCJvdXRlclwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVsU3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnZpcnR1YWwpO1xuXG4gICAgICAgICAgY29uc3Qgam9pbkFzID0gcHJlZml4ID09PSBcIlwiID8gZ3JvdXBLZXkgOiBgJHtwcmVmaXh9X18ke2dyb3VwS2V5fWA7XG4gICAgICAgICAgY29uc3QgZnJvbVRhYmxlID0gcHJlZml4ID09PSBcIlwiID8gdGhpcy50YWJsZSA6IHByZWZpeDtcblxuICAgICAgICAgIGxldCBqb2luQ2xhdXNlOlxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlKSB7XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBjdXN0b206IHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS5pZGA7XG4gICAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LiR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHRoaXMubmFtZXMuZnMucmVwbGFjZSgvLS9nLCBcIl9cIikpfV9pZGA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIuam9pbnMucHVzaCh7XG4gICAgICAgICAgICBhczogam9pbkFzLFxuICAgICAgICAgICAgam9pbjogaW5uZXJPck91dGVyLFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIC4uLmpvaW5DbGF1c2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBCZWxvbmdzVG9PbmUg67CR7JeQIEhhc01hbnnqsIAg67aZ7J2AIOqyveyasFxuICAgICAgICAgIGlmIChyZWxTdWJzZXRRdWVyeS5sb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZExvYWRlcnMgPSByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLm1hcCgobG9hZGVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0FzID0gW2dyb3VwS2V5LCBsb2FkZXIuYXNdLmpvaW4oXCJfX1wiKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhczogbmV3QXMsXG4gICAgICAgICAgICAgICAgdGFibGU6IGxvYWRlci50YWJsZSxcbiAgICAgICAgICAgICAgICBtYW55Sm9pbjogbG9hZGVyLm1hbnlKb2luLFxuICAgICAgICAgICAgICAgIG9uZUpvaW5zOiBsb2FkZXIub25lSm9pbnMsXG4gICAgICAgICAgICAgICAgc2VsZWN0OiBsb2FkZXIuc2VsZWN0LFxuICAgICAgICAgICAgICAgIGxvYWRlcnM6IGxvYWRlci5sb2FkZXJzLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHIubG9hZGVycyA9IFsuLi5yLmxvYWRlcnMsIC4uLmNvbnZlcnRlZExvYWRlcnNdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIuam9pbnMgPSByLmpvaW5zLmNvbmNhdChyZWxTdWJzZXRRdWVyeS5qb2lucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU1hbnkgUmVsYXRpb246IExvYWRlciDroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHJlbEZpZWxkcyk7XG5cbiAgICAgICAgICBsZXQgbWFueUpvaW46IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXVtudW1iZXJdW1wibWFueUpvaW5cIl07XG4gICAgICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2wgPSByZWxhdGlvbj8uZnJvbUNvbHVtbiA/PyBcImlkXCI7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgJHtmcm9tQ29sfWAgOiBgJHtwcmVmaXh9X18ke2Zyb21Db2x9YCxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogcmVsYXRpb24uam9pbkNvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sOiBcImlkXCIsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGBpZGAgOiBgJHtwcmVmaXh9X19pZGAsXG4gICAgICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcmVsYXRpb24uam9pblRhYmxlLFxuICAgICAgICAgICAgICAgIGZyb21Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGhpcy50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgICB0b0NvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxFbnRpdHkudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IFwiaWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIubG9hZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBncm91cEtleSxcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICBtYW55Sm9pbixcbiAgICAgICAgICAgIG9uZUpvaW5zOiByZWxTdWJzZXRRdWVyeS5qb2lucyxcbiAgICAgICAgICAgIHNlbGVjdDogcmVsU3Vic2V0UXVlcnkuc2VsZWN0LFxuICAgICAgICAgICAgbG9hZGVyczogcmVsU3Vic2V0UXVlcnkubG9hZGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VsZWN0OiBbXSxcbiAgICAgICAgdmlydHVhbDogW10sXG4gICAgICAgIGpvaW5zOiBbXSxcbiAgICAgICAgbG9hZGVyczogW10sXG4gICAgICB9IGFzIFN1YnNldFF1ZXJ5LFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAgRmllbGRFeHByW10g7J2EIEVudGl0eVByb3BOb2RlW10g66GcIOuzgO2ZmFxuICAqL1xuICBmaWVsZEV4cHJzVG9Qcm9wTm9kZXMoZmllbGRFeHByczogc3RyaW5nW10sIGVudGl0eTogRW50aXR5ID0gdGhpcyk6IEVudGl0eVByb3BOb2RlW10ge1xuICAgIGNvbnN0IGdyb3VwcyA9IGZpZWxkRXhwcnMucmVkdWNlKFxuICAgICAgKHJlc3VsdCwgZmllbGRFeHByKSA9PiB7XG4gICAgICAgIGxldCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZWxzZUV4cHI6IHN0cmluZ1tdO1xuICAgICAgICBpZiAoZmllbGRFeHByLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIFtrZXksIC4uLmVsc2VFeHByXSA9IGZpZWxkRXhwci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgdmFsdWUgPSBlbHNlRXhwci5qb2luKFwiLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXkgPSBcIlwiO1xuICAgICAgICAgIHZhbHVlID0gZmllbGRFeHByO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtrZXldID0gKHJlc3VsdFtrZXldID8/IFtdKS5jb25jYXQodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMge1xuICAgICAgICBbazogc3RyaW5nXTogc3RyaW5nW107XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZ3JvdXBzKS5mbGF0TWFwPEVudGl0eVByb3BOb2RlLCBFbnRpdHlQcm9wTm9kZVtdPigoa2V5KSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3Vwc1trZXldO1xuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIGlmIChrZXkgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwLm1hcCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYCR7ZW50aXR5LmlkfSAtLSDsnpjrqrvrkJwgRmllbGRFeHByICcke3Byb3BOYW1lfScgKOyCrOyaqSDqsIDriqXtlZwgcHJvcHM6ICR7ZW50aXR5LnByb3BzLm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzRGljdFtrZXldO1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCBGaWVsZEV4cHIgJHtrZXl9LiR7Z3JvdXBbMF19YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAvLyByZWxhdGlvbiAtT25lIOyXkCBpZCDtlYTrk5wg7ZWY64KY7J24IOqyveyasFxuICAgICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCA9PT0gMSAmJiAoZ3JvdXBbMF0gPT09IFwiaWRcIiB8fCBncm91cFswXSA9PT0gXCJpZD9cIikpIHtcbiAgICAgICAgICAvLyBpZCDtlZjrgpjrp4wg7J6I64qU7KeAIOyytO2BrO2VtOyEnCwg7ZWY64KY66eMIOyeiOycvOuptCDsg4HsnIQgcHJvcOycvOuhnCBpZOulvCDrpqzthLRcbiAgICAgICAgICBjb25zdCBpZFByb3AgPSByZWxFbnRpdHkucHJvcHNEaWN0LmlkO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcDoge1xuICAgICAgICAgICAgICAuLi5pZFByb3AsXG4gICAgICAgICAgICAgIG5hbWU6IGAke2tleX1faWRgLFxuICAgICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAtT25lIOq3uOyZuOydmCDqsr3smrAgb2JqZWN066GcIOumrO2EtFxuICAgICAgLy8gLU1hbnnsnZgg6rK97JqwIGFycmF566GcIOumrO2EtFxuICAgICAgLy8gUmVjdXJzaXZlIOuhnCDrjoHsiqQg7LKY66asXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZmllbGRFeHByc1RvUHJvcE5vZGVzKGdyb3VwLCByZWxFbnRpdHkpO1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPVxuICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApXG4gICAgICAgICAgPyAoXCJvYmplY3RcIiBhcyBjb25zdClcbiAgICAgICAgICA6IChcImFycmF5XCIgYXMgY29uc3QpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmllbGRFeHBycyhwcmVmaXggPSBcIlwiLCBtYXhEZXB0aDogbnVtYmVyID0gMywgZnJvbXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5mbGF0TWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gW3ByZWZpeCwgcHJvcC5uYW1lXS5maWx0ZXIoKHYpID0+IHYgIT09IFwiXCIpLmpvaW4oXCIuXCIpO1xuICAgICAgICBpZiAocHJvcE5hbWUgPT09IHByZWZpeCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChtYXhEZXB0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZnJvbXMuaW5jbHVkZXMocHJvcC53aXRoKSkge1xuICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCDsoJzsmbhcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyDsoJXrsKntlqUgcmVsYXRpb27snbgg6rK97JqwIHJlY3Vyc2l2ZSDsvZxcbiAgICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlbE1kLmdldEZpZWxkRXhwcnMocHJvcE5hbWUsIG1heERlcHRoIC0gMSwgWy4uLmZyb21zLCB0aGlzLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BOYW1lO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgIT09IG51bGwpIGFzIHN0cmluZ1tdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIHByb3DsnbQg7ZiE7J6sIO2FjOydtOu4lOyXkCBGSyDsu6zrn7zsnYQg7IOd7ISx7ZWY64qU7KeAIO2ZleyduFxuICAgKihCZWxvbmdzVG9PbmUg65iQ64qUIE9uZVRvT25lKGhhc0pvaW5Db2x1bW49dHJ1ZSnsnbgg6rK97JqwIEZLIOyDneyEsSlcbiAgICovXG4gIHByaXZhdGUgaGFzRm9yZWlnbktleShwcm9wOiBSZWxhdGlvblByb3ApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJvcC5yZWxhdGlvblR5cGUgPT09IFwiQmVsb25nc1RvT25lXCIgfHxcbiAgICAgIChwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJPbmVUb09uZVwiICYmIHByb3AuaGFzSm9pbkNvbHVtbiA9PT0gdHJ1ZSlcbiAgICApO1xuICB9XG5cbiAgZ2V0VGFibGVDb2x1bW5zKCk6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCwgdHlwZTogXCJpbnRfdW5zaWduZWRcIiB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogcHJvcC5uYW1lLCB0eXBlOiBwcm9wLnR5cGUgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnsl5Ag7KCV7J2Y65CcIOuqqOuToCB2ZWN0b3Ig7YOA7J6FIOy7rOufvCDrsJjtmZhcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbnMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJ2ZWN0b3JcIik7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIHZlY3RvciDsu6zrn7wg67CY7ZmYXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lIC0g7Lus65+866qFICjsg53rnrUg7IucIOyyqyDrsojsp7ggdmVjdG9yIOy7rOufvClcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbihjb2x1bW5OYW1lPzogc3RyaW5nKTogRW50aXR5UHJvcCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmVjdG9yUHJvcHMgPSB0aGlzLmdldFZlY3RvckNvbHVtbnMoKTtcbiAgICBpZiAoY29sdW1uTmFtZSkge1xuICAgICAgcmV0dXJuIHZlY3RvclByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3JQcm9wc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTthLDrp4Eg6rCA64ql7ZWcIHByb3BzIOuwmO2ZmFxuICAgKlxuICAgKiAtIOydvOuwmCBwcm9wXG4gICAqIC0gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9uIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lIHdpdGggaGFzSm9pbkNvbHVtbilcbiAgICogICDihpIge25hbWV9X2lkIO2Yle2DnOydmCDqsIDsg4EgaW50ZWdlciBwcm9w7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RmlsdGVyYWJsZVByb3BzKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmxhdE1hcCgocHJvcCk6IEVudGl0eVByb3AgfCBFbnRpdHlQcm9wW10gPT4ge1xuICAgICAgLy8gVmlydHVhbCBwcm9wIOygnOyZuFxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIC8vIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbuunjCDtj6ztlahcbiAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCxcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgfSBhcyBFbnRpdHlQcm9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyTW9kdWxlUGF0aHMoKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBgJHt0aGlzLm5hbWVzLnBhcmVudEZzfWA7XG5cbiAgICAvLyBiYXNlLXNjaGVtZVxuICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfUJhc2VTY2hlbWFgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuXG4gICAgLy8gc3Vic2V0XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykubGVuZ3RoID4gMCkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0S2V5YCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldE1hcHBpbmdgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoXG4gICAgICAgICAgYCR7dGhpcy5pZH1TdWJzZXQke3N1YnNldEtleS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICAgICAgYHNvbmFtdS5nZW5lcmF0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1zXG4gICAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGVudW1JZCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyB0eXBlc1xuICAgIGNvbnN0IHR5cGVzTW9kdWxlUGF0aCA9IGAke2Jhc2VQYXRofS8ke3RoaXMubmFtZXMucGFyZW50RnN9LnR5cGVzYDtcbiAgICBjb25zdCB0eXBlc0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHt0eXBlc01vZHVsZVBhdGh9LmpzYCksXG4gICAgKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHModHlwZXNGaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlQW55Pih0eXBlc0ZpbGVQYXRoKTtcbiAgICAgIHRoaXMudHlwZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIGltcG9ydGVkTWVtYmVycy5tYXAoKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChuYW1lLCB0eXBlc01vZHVsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgdmFsdWVdO1xuICAgICAgICB9KSxcbiAgICAgICkgYXMgeyBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55IH07XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZVNwZWNzKCk6IHZvaWQge1xuICAgIC8vIOyhsOyduCDthYzsnbTruJQg7J24642x7IqkIOygnOyZuCAo7Lus65+8IOydtOumhOyXkCAnLifsnbQg7Y+s7ZWo65CcIOqyveyasClcbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gdGhpcy5pbmRleGVzXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC50eXBlID09PSBcInVuaXF1ZVwiKVxuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHguY29sdW1ucy5ldmVyeSgoY29sKSA9PiAhY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSk7XG5cbiAgICBFbnRpdHlNYW5hZ2VyLnNldFRhYmxlU3BlYyh7XG4gICAgICBuYW1lOiB0aGlzLnRhYmxlLFxuICAgICAgdW5pcXVlSW5kZXhlcyxcbiAgICAgIGpzb25Db2x1bW5zOiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcImpzb25cIikubWFwKChwKSA9PiBwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IEVudGl0eUpzb24ge1xuICAgIC8vIHN1YnNldHPsmYAgc3Vic2V0c0ludGVybmFs7J2EIFN1YnNldERlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBzdWJzZXRzOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLlN1YnNldERlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgY29uc3Qgbm9ybWFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gdGhpcy5zdWJzZXRzW2tleV07XG4gICAgICBjb25zdCBpbnRlcm5hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9ICh0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKS5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgaW50ZXJuYWw6IHRydWUsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBmaWVsZHMgPSBbLi4ubm9ybWFsRmllbGRzLCAuLi5pbnRlcm5hbEZpZWxkc107XG5cbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQg67Cw7Je0IO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuc3Vic2V0Q29uZXNba2V5XSkge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSB7XG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuc3Vic2V0Q29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc+ulvCBFbnVtRGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IGVudW1zOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLkVudW1EZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IFJlY29yZCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLmVudW1Db25lc1trZXldKSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB7XG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuZW51bUNvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtc1trZXldID0gdmFsdWVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGNvbmU6IHRoaXMuY29uZSxcbiAgICAgIHByb3BzOiB0aGlzLnByb3BzLFxuICAgICAgaW5kZXhlczogdGhpcy5pbmRleGVzLFxuICAgICAgc3Vic2V0cyxcbiAgICAgIGVudW1zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHNvcnQ6IHN1YnNldHNcbiAgICBjb25zdCBzdWJzZXRSb3dzID0gdGhpcy5nZXRTdWJzZXRSb3dzKCk7XG4gICAgdGhpcy5zdWJzZXRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzKS5tYXAoKFtzdWJzZXRLZXldKSA9PiB7XG4gICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3dzLCBzdWJzZXRLZXksIGZhbHNlKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzSW50ZXJuYWwpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgdHJ1ZSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIHNhdmVcbiAgICBjb25zdCBqc29uUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIGBzcmMvYXBwbGljYXRpb24vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS8ke3RoaXMubmFtZXMuZnN9LmVudGl0eS5qc29uYCxcbiAgICApO1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShqc29uUGF0aCwgZm9ybWF0Q29kZShKU09OLnN0cmluZ2lmeShqc29uKSwgXCJqc29uXCIsIGpzb25QYXRoKSk7XG5cbiAgICAvLyByZWxvYWRcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlZ2lzdGVyKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2FnO2UjOumvyBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIExMTeydhCDsgqzsmqntlZjsp4Ag7JWK6rOgIGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZeydhCDsg53shLHtlanri4jri6QuXG4gICAqIHN0dWIgZW50aXR5IOyDneyEsSDsi5wg7J6Q64+Z7Jy866GcIO2YuOy2nOuQmOyWtCDstZzshoztlZzsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7KCc6rO17ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g7IOd7ISxIOyLnCDsgqzsmqntlaAgbG9jYWxlICjquLDrs7jqsJI6IFNvbmFtdS5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlIOuYkOuKlCBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMobG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMgfSA9IGF3YWl0IGltcG9ydChcIi4vZW50aXR5LXRlbXBsYXRlLWNvbmVcIik7XG4gICAgY29uc3QgY29uZmlnTG9jYWxlID0gU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUxvY2FsZSA9XG4gICAgICBsb2NhbGUgfHxcbiAgICAgIChjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICA6IFwia29cIik7XG4gICAgY29uc3QgcmVzdWx0ID0gZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKHRoaXMudG9Kc29uKCksIGVmZmVjdGl2ZUxvY2FsZSk7XG5cbiAgICAvLyDqsrDqs7zrpbwgRW50aXR57JeQIOyggeyaqSAoYXBwbHlDb25lc+yZgCDrj5nsnbztlZwg67Cp7IudKVxuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIChwcm9wIGFzIHsgY29uZT86IENvbmUgfSkuY29uZSA9IGNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnVtQ29uZXMgPSB7IC4uLnRoaXMuZW51bUNvbmVzLCAuLi5yZXN1bHQuZW51bUNvbmVzIH07XG4gICAgdGhpcy5zdWJzZXRDb25lcyA9IHsgLi4udGhpcy5zdWJzZXRDb25lcywgLi4ucmVzdWx0LnN1YnNldENvbmVzIH07XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7JesIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucHJlc2VydmVFeGlzdGluZyAtIOq4sOyhtCBjb25lIOuztOyhtCDsl6zrtoAgKOq4sOuzuOqwkjogdHJ1ZSlcbiAgICogQHBhcmFtIG9wdGlvbnMub25seUVtcHR5IC0gZml4dHVyZUhpbnTqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISxICjquLDrs7jqsJI6IGZhbHNlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5sb2NhbGUgLSDsg53shLEg7IucIOyCrOyaqe2VoCBsb2NhbGUgKOq4sOuzuOqwkjogXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVDb25lcyhvcHRpb25zPzoge1xuICAgIHByZXNlcnZlRXhpc3Rpbmc/OiBib29sZWFuO1xuICAgIG9ubHlFbXB0eT86IGJvb2xlYW47XG4gICAgbG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0KTtcbiAgICB0aGlzLmFwcGx5Q29uZXMocmVzdWx0KTtcbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCBjb25l65Ok7J2EIOyImOynke2VqeuLiOuLpCAoZW50aXR5LCBwcm9wcywgZW51bXMsIHN1YnNldHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyDtgqTqsIAgXCJlbnRpdHk6aWRcIiwgXCJwcm9wOm5hbWVcIiwgXCJlbnVtOmVudW1JZFwiLCBcInN1YnNldDprZXlcIiDtmJXsi53snbggY29uZSDrp7VcbiAgICovXG4gIHByaXZhdGUgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiA9IHt9O1xuXG4gICAgaWYgKHRoaXMuY29uZSkge1xuICAgICAgY29uZXNbYGVudGl0eToke3RoaXMuaWR9YF0gPSB0aGlzLmNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMucHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLmNvbmUpIHtcbiAgICAgICAgY29uZXNbYHByb3A6JHtwcm9wLm5hbWV9YF0gPSBwcm9wLmNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZW51bUlkLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1Db25lcykpIHtcbiAgICAgIGNvbmVzW2BlbnVtOiR7ZW51bUlkfWBdID0gY29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJzZXRLZXksIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2V0Q29uZXMpKSB7XG4gICAgICBjb25lc1tgc3Vic2V0OiR7c3Vic2V0S2V5fWBdID0gY29uZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZXM7XG4gIH1cblxuICAvKipcbiAgICog7IOd7ISx65CcIGNvbmXrk6TsnYQgRW50aXR57JeQIOyggeyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIExMTeycvOuhnCDsg53shLHrkJwgY29uZSDqsrDqs7xcbiAgICovXG4gIHByaXZhdGUgYXBwbHlDb25lcyhyZXN1bHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25SZXN1bHQpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldID09PSB0cnVlKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldID09PSB0cnVlKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc3Vic2V0RmllbGQuaW5jbHVkZXMoXCIuXCIpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0Iiwid3JpdGVGaWxlIiwiaW5mbGVjdGlvbiIsInBhdGgiLCJncm91cCIsInVuaXF1ZSIsInoiLCJTb25hbXUiLCJnZXRFbnVtRGVmVmFsdWVzIiwiZ2V0U3Vic2V0RmllbGRzIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0VudW1Qcm9wIiwiaXNIYXNNYW55UmVsYXRpb25Qcm9wIiwiaXNJbnRlcm5hbFN1YnNldEZpZWxkIiwiaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNWaXJ0dWFsQ29kZVByb3AiLCJpc1ZpcnR1YWxQcm9wIiwibm9ybWFsaXplU3Vic2V0RmllbGQiLCJpbXBvcnRNZW1iZXJzIiwiZm9ybWF0Q29kZSIsImV4aXN0cyIsInJ1bnRpbWVQYXRoIiwiYXNzZXJ0RGVmaW5lZCIsIm5vbk51bGxhYmxlIiwiRW50aXR5TWFuYWdlciIsIkVudGl0eSIsImlkIiwicGFyZW50SWQiLCJ0YWJsZSIsInRpdGxlIiwiY29uZSIsIm5hbWVzIiwicHJvcHMiLCJwcm9wc0RpY3QiLCJyZWxhdGlvbnMiLCJpbmRleGVzIiwic3Vic2V0cyIsInN1YnNldHNJbnRlcm5hbCIsInR5cGVzIiwiZW51bXMiLCJlbnVtTGFiZWxzIiwiZW51bUNvbmVzIiwic3Vic2V0Q29uZXMiLCJ1bmRlcnNjb3JlIiwicGx1cmFsaXplIiwibWFwIiwicHJvcCIsImluY2x1ZGVzIiwicmVwbGFjZSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwibmFtZSIsImZpbHRlciIsImtleSIsInN1YnNldERlZiIsImVudHJpZXMiLCJmaWVsZHMiLCJmIiwiQXJyYXkiLCJpc0FycmF5IiwiZW51bURlZiIsImVudW1MYWJlbCIsImVudW0iLCJrZXlzIiwicGFyZW50RnMiLCJkYXNoZXJpemUiLCJ0b0xvd2VyQ2FzZSIsImZzIiwibW9kdWxlIiwiZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkiLCJzdWJzZXRLZXkiLCJnZXRQdXJpU3Vic2V0UXVlcnkiLCJzdWJzZXQiLCJzdWJzZXRRdWVyeSIsInJlc29sdmVTdWJzZXRRdWVyeSIsImxpbmVzIiwicHVzaCIsImpvaW4iLCJqb2lucyIsImpvaW5NZXRob2QiLCJhcyIsImN1c3RvbSIsImZyb20iLCJ0byIsInNlbGVjdE9iaiIsImJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0Iiwic2VsZWN0Iiwic3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0Iiwic2VsZWN0SXRlbXMiLCJyZXN1bHQiLCJzZWxlY3RJdGVtIiwibWF0Y2giLCJjb2x1bW4iLCJhbGlhcyIsImNvbHVtblZhbHVlIiwidHJpbSIsInNwbGl0IiwicG9wIiwicGFydHMiLCJjdXJyZW50IiwiaSIsImxlbmd0aCIsInBhcnQiLCJFcnJvciIsInNsaWNlIiwibGFzdFBhcnQiLCJvYmoiLCJpbmRlbnQiLCJ3aXRoQnJhY2VzIiwic3BhY2VzIiwicmVwZWF0IiwiaW5uZXJTcGFjZXMiLCJ2YWx1ZSIsImdldFB1cmlMb2FkZXJRdWVyeSIsImxvYWRlcnMiLCJnZW5lcmF0ZUxvYWRlckNvZGUiLCJsb2FkZXJMaW5lcyIsImxvYWRlciIsInRvVGFibGUiLCJ0b0NvbCIsInRocm91Z2giLCJmcm9tVGFibGUiLCJtYW55Sm9pbiIsImZyb21FbnRpdHkiLCJnZXRCeVRhYmxlIiwiZnJvbUlkc1R5cGUiLCJnZXRQa0FycmF5VHlwZSIsImlkRmllbGQiLCJ1bmRlZmluZWQiLCJvbmVKb2lucyIsImZvckVhY2giLCJyZWZJZCIsImZyb21Db2wiLCJnZXRTdWJzZXRRdWVyeSIsInByZWZpeCIsImlzQWxyZWFkeU91dGVySm9pbmVkIiwic3Vic2V0R3JvdXAiLCJmaWVsZCIsInJlbCIsInJlZHVjZSIsInIiLCJncm91cEtleSIsInJlYWxGaWVsZHMiLCJ2aXJ0dWFsQ29kZUZpZWxkcyIsImNvbmNhdCIsImdldEZ1bGxGaWVsZE5hbWUiLCJ2aXJ0dWFsIiwicmVsYXRpb24iLCJyZWxFbnRpdHkiLCJnZXQiLCJ3aXRoIiwicmVsRmllbGRzIiwiaW5uZXJPck91dGVyIiwiaGFzSm9pbkNvbHVtbiIsIm51bGxhYmxlIiwicmVsU3Vic2V0UXVlcnkiLCJqb2luQXMiLCJqb2luQ2xhdXNlIiwiY3VzdG9tSm9pbkNsYXVzZSIsImNvbnZlcnRlZExvYWRlcnMiLCJuZXdBcyIsImZyb21Db2x1bW4iLCJqb2luQ29sdW1uIiwiam9pblRhYmxlIiwic2luZ3VsYXJpemUiLCJmaWVsZEV4cHJzVG9Qcm9wTm9kZXMiLCJmaWVsZEV4cHJzIiwiZW50aXR5IiwiZ3JvdXBzIiwiZmllbGRFeHByIiwiZWxzZUV4cHIiLCJmbGF0TWFwIiwicHJvcE5hbWUiLCJmaW5kIiwicCIsIm5vZGVUeXBlIiwiaWRQcm9wIiwiY2hpbGRyZW4iLCJnZXRGaWVsZEV4cHJzIiwibWF4RGVwdGgiLCJmcm9tcyIsInYiLCJyZWxNZCIsImhhc0ZvcmVpZ25LZXkiLCJyZWxhdGlvblR5cGUiLCJnZXRUYWJsZUNvbHVtbnMiLCJ0eXBlIiwiZ2V0VmVjdG9yQ29sdW1ucyIsImdldFZlY3RvckNvbHVtbiIsImNvbHVtbk5hbWUiLCJ2ZWN0b3JQcm9wcyIsImdldEZpbHRlcmFibGVQcm9wcyIsInJlZ2lzdGVyTW9kdWxlUGF0aHMiLCJiYXNlUGF0aCIsInNldE1vZHVsZVBhdGgiLCJ0b1VwcGVyQ2FzZSIsImVudW1JZCIsInR5cGVzTW9kdWxlUGF0aCIsInR5cGVzRmlsZVBhdGgiLCJhcGlSb290UGF0aCIsImltcG9ydGVkTWVtYmVycyIsInJlZ2lzdGVyVGFibGVTcGVjcyIsInVuaXF1ZUluZGV4ZXMiLCJpZHgiLCJjb2x1bW5zIiwiZXZlcnkiLCJjb2wiLCJzZXRUYWJsZVNwZWMiLCJqc29uQ29sdW1ucyIsInRvSnNvbiIsIm5vcm1hbEZpZWxkcyIsImludGVybmFsRmllbGRzIiwiaW50ZXJuYWwiLCJ2YWx1ZXMiLCJzYXZlIiwic3Vic2V0Um93cyIsImdldFN1YnNldFJvd3MiLCJzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMiLCJqc29uUGF0aCIsImpzb24iLCJKU09OIiwic3RyaW5naWZ5IiwicmVnaXN0ZXIiLCJnZW5lcmF0ZVRlbXBsYXRlQ29uZXMiLCJsb2NhbGUiLCJjb25maWdMb2NhbGUiLCJjb25maWciLCJpMThuIiwiZGVmYXVsdExvY2FsZSIsImVmZmVjdGl2ZUxvY2FsZSIsImVudGl0eUNvbmUiLCJwcm9wQ29uZXMiLCJnZW5lcmF0ZUNvbmVzIiwib3B0aW9ucyIsImNvbnRleHQiLCJleGlzdGluZ0NvbmVzIiwicHJlc2VydmVFeGlzdGluZyIsImNvbGxlY3RFeGlzdGluZ0NvbmVzIiwib25seUVtcHR5IiwiYXBwbHlDb25lcyIsImNvbmVzIiwiX3N1YnNldHMiLCJfc3Vic2V0c0ludGVybmFsIiwicHJlZml4ZXMiLCJzdWJzZXRLZXlzIiwiYWxsRmllbGRzIiwiYWxsSW50ZXJuYWxGaWVsZHMiLCJjb21iaW5lZEZpZWxkcyIsInN0YXJ0c1dpdGgiLCJyZWxhdGlvbkVudGl0eSIsImlzT3BlbiIsImhhcyIsImNoaWxkIiwiaXNJbnRlcm5hbCIsInN1YnNldEZpZWxkcyIsInNvbWUiLCJoYXNLZXkiLCJzdWJzZXRSb3ciLCJmbGF0IiwiY3JlYXRlUHJvcCIsImF0Iiwic3BsaWNlIiwiYW5hbHl6ZVN1YnNldEZpZWxkIiwic3Vic2V0RmllbGQiLCJhcnIiLCJlbnRpdHlJZCIsIm1vZGlmeVByb3AiLCJuZXdQcm9wIiwib2xkTmFtZSIsImVudGl0aWVzIiwiYWxsRW50aXR5SWRzIiwiZ2V0QWxsSWRzIiwicmVsRW50aXR5SWQiLCJyZWxFbnRpdHlTdWJzZXRLZXlzIiwibW9kaWZpZWRTdWJzZXRGaWVsZHMiLCJhbmFseXplZCIsIm1vZGlmaWVkIiwiYSIsIlByb21pc2UiLCJhbGwiLCJkZWxQcm9wIiwiaW5kZXgiLCJnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZCIsImxhc3RFbnRpdHlJZCIsInJlbFByb3AiLCJjb25zb2xlIiwiZGVidWciLCJ0aGlzSWQiLCJtb3ZlUHJvcCIsIm5ld1Byb3BzIiwiZ2V0UGtUeXBlIiwiZ2V0UGtQcm9wIiwicGtUeXBlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsU0FBUyxRQUFRLG1CQUFjO0FBQ3hDLE9BQU9DLGdCQUFnQixhQUFhO0FBQ3BDLE9BQU9DLFVBQVUsT0FBTztBQUN4QixTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBQ3hDLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBQ3hCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FPRUMsZ0JBQWdCLEVBQ2hCQyxlQUFlLEVBQ2ZDLDBCQUEwQixFQUMxQkMsVUFBVSxFQUNWQyxxQkFBcUIsRUFDckJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxzQkFBc0IsRUFDdEJDLGNBQWMsRUFDZEMsaUJBQWlCLEVBQ2pCQyxhQUFhLEVBQ2JDLG9CQUFvQixRQUlmLG9CQUFpQjtBQUN4QixTQUFTQyxhQUFhLFFBQVEsd0JBQXFCO0FBQ25ELFNBQVNDLFVBQVUsUUFBUSx3QkFBcUI7QUFDaEQsU0FBU0MsTUFBTSxRQUFRLHVCQUFvQjtBQUMzQyxTQUFTQyxXQUFXLFFBQVEseUJBQXNCO0FBQ2xELFNBQVNDLGFBQWEsRUFBRUMsV0FBVyxRQUFRLG9CQUFpQjtBQUM1RCxTQUFTQyxhQUFhLFFBQVEsc0JBQW1CO0FBRWpELE9BQU8sTUFBTUM7SUFDWEMsR0FBVztJQUNYQyxTQUFrQjtJQUNsQkMsTUFBYztJQUNkQyxNQUFjO0lBQ2RDLEtBQVk7SUFDWkMsTUFJRTtJQUNGQyxNQUFvQjtJQUNwQkMsVUFFRTtJQUNGQyxVQUVFO0lBQ0ZDLFFBQXVCO0lBQ3ZCQyxRQUVFO0lBQ0ZDLGdCQUVFO0lBQ0ZDLFFBRUksQ0FBQyxFQUFFO0lBQ1BDLFFBRUksQ0FBQyxFQUFFO0lBQ1BDLGFBSUksQ0FBQyxFQUFFO0lBQ1BDLFlBRUksQ0FBQyxFQUFFO0lBQ1BDLGNBRUksQ0FBQyxFQUFFO0lBRVAsWUFBWSxFQUFFaEIsRUFBRSxFQUFFQyxRQUFRLEVBQUVDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxJQUFJLEVBQUVFLEtBQUssRUFBRUcsT0FBTyxFQUFFQyxPQUFPLEVBQUVHLEtBQUssRUFBYyxDQUFFO1FBQzVGLEtBQUs7UUFDTCxJQUFJLENBQUNiLEVBQUUsR0FBR0E7UUFDVixJQUFJLENBQUNDLFFBQVEsR0FBR0E7UUFDaEIsSUFBSSxDQUFDRSxLQUFLLEdBQUdBLFNBQVMsSUFBSSxDQUFDSCxFQUFFO1FBQzdCLElBQUksQ0FBQ0UsS0FBSyxHQUFHQSxTQUFTNUIsV0FBVzJDLFVBQVUsQ0FBQzNDLFdBQVc0QyxTQUFTLENBQUNsQjtRQUNqRSxJQUFJLENBQUNJLElBQUksR0FBR0E7UUFFWixRQUFRO1FBQ1IsSUFBSUUsT0FBTztZQUNULElBQUksQ0FBQ0EsS0FBSyxHQUFHQSxNQUFNYSxHQUFHLENBQUMsQ0FBQ0M7Z0JBQ3RCLElBQUlyQyxXQUFXcUMsT0FBTztvQkFDcEIsSUFBSUEsS0FBS3BCLEVBQUUsQ0FBQ3FCLFFBQVEsQ0FBQyxXQUFXO3dCQUM5QkQsS0FBS3BCLEVBQUUsR0FBR29CLEtBQUtwQixFQUFFLENBQUNzQixPQUFPLENBQUMsVUFBVXRCO29CQUN0QztnQkFDRjtnQkFDQSxPQUFPb0I7WUFDVDtZQUNBLElBQUksQ0FBQ2IsU0FBUyxHQUFHZ0IsT0FBT0MsV0FBVyxDQUNqQ2xCLE1BQU1hLEdBQUcsQ0FBQyxDQUFDQztnQkFDVCxPQUFPO29CQUFDQSxLQUFLSyxJQUFJO29CQUFFTDtpQkFBSztZQUMxQjtZQUdGLFlBQVk7WUFDWixJQUFJLENBQUNaLFNBQVMsR0FBR2UsT0FBT0MsV0FBVyxDQUNqQ2xCLE1BQU1vQixNQUFNLENBQUMsQ0FBQ04sT0FBU2hDLGVBQWVnQyxPQUFPRCxHQUFHLENBQUMsQ0FBQ0MsT0FBUztvQkFBQ0EsS0FBS0ssSUFBSTtvQkFBRUw7aUJBQUs7UUFFaEYsT0FBTztZQUNMLElBQUksQ0FBQ2QsS0FBSyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUNDLFNBQVMsR0FBRyxDQUFDO1lBQ2xCLElBQUksQ0FBQ0MsU0FBUyxHQUFHLENBQUM7UUFDcEI7UUFFQSxVQUFVO1FBQ1YsSUFBSSxDQUFDQyxPQUFPLEdBQUdBLFdBQVcsRUFBRTtRQUU1QixzRkFBc0Y7UUFDdEYsSUFBSSxDQUFDQyxPQUFPLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUNDLGVBQWUsR0FBRyxDQUFDO1FBQ3hCLEtBQUssTUFBTSxDQUFDZ0IsS0FBS0MsVUFBVSxJQUFJTCxPQUFPTSxPQUFPLENBQUNuQixXQUFXLENBQUMsR0FBSTtZQUM1RCxNQUFNb0IsU0FBU2pELGdCQUFnQitDO1lBQy9CLElBQUksQ0FBQ2xCLE9BQU8sQ0FBQ2lCLElBQUksR0FBR0csT0FBT0osTUFBTSxDQUFDLENBQUNLLElBQU0sQ0FBQzlDLHNCQUFzQjhDLElBQUlaLEdBQUcsQ0FBQzVCO1lBQ3hFLElBQUksQ0FBQ29CLGVBQWUsQ0FBQ2dCLElBQUksR0FBR0csT0FBT0osTUFBTSxDQUFDekMsdUJBQXVCa0MsR0FBRyxDQUFDNUI7WUFFckUsVUFBVTtZQUNWLElBQUksQ0FBQ3lDLE1BQU1DLE9BQU8sQ0FBQ0wsY0FBYyxVQUFVQSxhQUFhQSxVQUFVeEIsSUFBSSxFQUFFO2dCQUN0RSxJQUFJLENBQUNZLFdBQVcsQ0FBQ1csSUFBSSxHQUFHQyxVQUFVeEIsSUFBSTtZQUN4QztRQUNGO1FBRUEseUNBQXlDO1FBQ3pDLElBQUksQ0FBQ1UsVUFBVSxHQUFHUyxPQUFPQyxXQUFXLENBQ2xDRCxPQUFPTSxPQUFPLENBQUNoQixTQUFTLENBQUMsR0FBR00sR0FBRyxDQUFDLENBQUMsQ0FBQ1EsS0FBS08sUUFBUTtZQUM3QyxVQUFVO1lBQ1YsSUFBSSxZQUFZQSxXQUFXLFVBQVVBLFdBQVdBLFFBQVE5QixJQUFJLEVBQUU7Z0JBQzVELElBQUksQ0FBQ1csU0FBUyxDQUFDWSxJQUFJLEdBQUdPLFFBQVE5QixJQUFJO1lBQ3BDO1lBQ0EsT0FBTztnQkFBQ3VCO2dCQUFLL0MsaUJBQWlCc0Q7YUFBUztRQUN6QztRQUVGLElBQUksQ0FBQ3JCLEtBQUssR0FBR1UsT0FBT0MsV0FBVyxDQUM3QkQsT0FBT00sT0FBTyxDQUFDLElBQUksQ0FBQ2YsVUFBVSxFQUFFSyxHQUFHLENBQUMsQ0FBQyxDQUFDUSxLQUFLUSxVQUFVO1lBQ25ELE9BQU87Z0JBQUNSO2dCQUFLakQsRUFBRTBELElBQUksQ0FBQ2IsT0FBT2MsSUFBSSxDQUFDRjthQUF5RDtRQUMzRjtRQUdGLFFBQVE7UUFDUixJQUFJLENBQUM5QixLQUFLLEdBQUc7WUFDWGlDLFVBQVVoRSxXQUFXaUUsU0FBUyxDQUFDakUsV0FBVzJDLFVBQVUsQ0FBQ2hCLFlBQVlELEtBQUt3QyxXQUFXO1lBQ2pGQyxJQUFJbkUsV0FBV2lFLFNBQVMsQ0FBQ2pFLFdBQVcyQyxVQUFVLENBQUNqQixLQUFLd0MsV0FBVztZQUMvREUsUUFBUTFDO1FBQ1Y7SUFDRjtJQUVBOztHQUVDLEdBQ0QyQyx3QkFBd0JDLFNBQWlCLEVBQVk7UUFDbkQsT0FBTztlQUFLLElBQUksQ0FBQ2xDLE9BQU8sQ0FBQ2tDLFVBQVUsSUFBSSxFQUFFO2VBQU8sSUFBSSxDQUFDakMsZUFBZSxDQUFDaUMsVUFBVSxJQUFJLEVBQUU7U0FBRTtJQUN6RjtJQUVBOztHQUVDLEdBQ0RDLG1CQUFtQkQsU0FBaUIsRUFBVTtRQUM1QyxNQUFNRSxTQUFTLElBQUksQ0FBQ0gsdUJBQXVCLENBQUNDO1FBQzVDLE1BQU1HLGNBQWMsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQyxJQUFJRjtRQUVoRCxNQUFNRyxRQUFrQixFQUFFO1FBRTFCLE9BQU87UUFDUEEsTUFBTUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUM7UUFDN0JELE1BQU1DLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUNoRCxLQUFLLENBQUMsRUFBRSxDQUFDO1FBRW5DLE9BQU87UUFDUCxLQUFLLE1BQU1pRCxRQUFRSixZQUFZSyxLQUFLLENBQUU7WUFDcEMsOENBQThDO1lBQzlDLDhDQUE4QztZQUM5QyxNQUFNQyxhQUFhRixLQUFLQSxJQUFJLEtBQUssVUFBVSxTQUFTO1lBRXBELElBQUksWUFBWUEsTUFBTTtnQkFDcEIsNkJBQTZCO2dCQUM3QkYsTUFBTUMsSUFBSSxDQUNSLENBQUMsQ0FBQyxFQUFFRyxXQUFXLEdBQUcsRUFBRUYsS0FBS0csRUFBRSxDQUFDLEdBQUcsRUFBRUgsS0FBS2pELEtBQUssQ0FBQywwQkFBMEIsRUFBRWlELEtBQUtJLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFFN0YsT0FBTztnQkFDTE4sTUFBTUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFRyxXQUFXLEdBQUcsRUFBRUYsS0FBS0csRUFBRSxDQUFDLEdBQUcsRUFBRUgsS0FBS2pELEtBQUssQ0FBQyxNQUFNLEVBQUVpRCxLQUFLSyxJQUFJLENBQUMsSUFBSSxFQUFFTCxLQUFLTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVGO1FBQ0Y7UUFFQSxzQkFBc0I7UUFDdEIsTUFBTUMsWUFBWSxJQUFJLENBQUNDLHVCQUF1QixDQUFDWixZQUFZYSxNQUFNO1FBQ2pFWCxNQUFNQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDVywyQkFBMkIsQ0FBQ0gsV0FBVyxFQUFFLENBQUM7UUFFckUsT0FBT1QsTUFBTUUsSUFBSSxDQUFDO0lBQ3BCO0lBRUE7Ozs7Ozs7Ozs7R0FVQyxHQUNELEFBQVFRLHdCQUNORyxXQUFxQixFQUVBO1FBQ3JCLE1BQU1DLFNBQTBELENBQUM7UUFFakUsS0FBSyxNQUFNQyxjQUFjRixZQUFhO1lBQ3BDLDZDQUE2QztZQUM3QyxNQUFNRyxRQUFRRCxXQUFXQyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDQSxPQUFPO1lBRVosTUFBTSxHQUFHQyxRQUFRQyxNQUFNLEdBQUdGO1lBQzFCLE1BQU1HLGNBQWMsQ0FBQyxDQUFDLEVBQUVGLE9BQU9HLElBQUksR0FBRyxDQUFDLENBQUM7WUFFeEMsSUFBSSxDQUFDRixTQUFTLENBQUNBLE1BQU05QyxRQUFRLENBQUMsT0FBTztnQkFDbkMsaUNBQWlDO2dCQUNqQyxNQUFNTSxNQUFNd0MsU0FBU3ZFLGNBQWNzRSxPQUFPSSxLQUFLLENBQUMsS0FBS0MsR0FBRztnQkFDeERSLE1BQU0sQ0FBQ3BDLElBQUksR0FBR3lDO1lBQ2hCLE9BQU87Z0JBQ0wsNkJBQTZCO2dCQUM3QixNQUFNSSxRQUFRTCxNQUFNRyxLQUFLLENBQUM7Z0JBQzFCLElBQUlHLFVBQVVWO2dCQUVkLHNCQUFzQjtnQkFDdEIsSUFBSyxJQUFJVyxJQUFJLEdBQUdBLElBQUlGLE1BQU1HLE1BQU0sR0FBRyxHQUFHRCxJQUFLO29CQUN6QyxNQUFNRSxPQUFPSixLQUFLLENBQUNFLEVBQUU7b0JBQ3JCLElBQUlFLFFBQVFILFNBQVM7d0JBQ25CLElBQUksT0FBT0EsT0FBTyxDQUFDRyxLQUFLLEtBQUssVUFBVTs0QkFDckMsa0NBQWtDOzRCQUNsQyw4QkFBOEI7NEJBQzlCLE1BQU0sSUFBSUMsTUFDUixDQUFDLGdEQUFnRCxFQUFFTCxNQUFNTSxLQUFLLENBQUMsR0FBR0osSUFBSSxHQUFHdkIsSUFBSSxDQUFDLE1BQU0sMENBQTBDLEVBQUVnQixNQUFNLFdBQVcsQ0FBQzt3QkFFdEo7b0JBQ0YsT0FBTzt3QkFDTE0sT0FBTyxDQUFDRyxLQUFLLEdBQUcsQ0FBQztvQkFDbkI7b0JBQ0FILFVBQVVBLE9BQU8sQ0FBQ0csS0FBSztnQkFDekI7Z0JBRUEsZUFBZTtnQkFDZixNQUFNRyxXQUFXUCxLQUFLLENBQUNBLE1BQU1HLE1BQU0sR0FBRyxFQUFFO2dCQUN4Q0YsT0FBTyxDQUFDTSxTQUFTLEdBQUdYO1lBQ3RCO1FBQ0Y7UUFFQSxPQUFPTDtJQUNUO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJDLEdBQ0QsQUFBUUYsNEJBQ04sMEhBQTBIO0lBQzFIbUIsR0FBd0IsRUFDeEJDLFNBQWlCLENBQUMsRUFDbEJDLGFBQXNCLElBQUksRUFDbEI7UUFDUixNQUFNQyxTQUFTLEtBQUtDLE1BQU0sQ0FBQ0g7UUFDM0IsTUFBTUksY0FBYyxLQUFLRCxNQUFNLENBQUNILFNBQVM7UUFFekMsTUFBTXBELFVBQVVOLE9BQU9NLE9BQU8sQ0FBQ21EO1FBQy9CLElBQUluRCxRQUFROEMsTUFBTSxLQUFLLEdBQUcsT0FBT08sYUFBYSxPQUFPO1FBRXJELE1BQU1qQyxRQUFRcEIsUUFBUVYsR0FBRyxDQUFDLENBQUMsQ0FBQ1EsS0FBSzJELE1BQU07WUFDckMsSUFBSSxPQUFPQSxVQUFVLFVBQVU7Z0JBQzdCLG9CQUFvQjtnQkFDcEIsT0FBTyxHQUFHRCxjQUFjMUQsSUFBSSxFQUFFLEVBQUUyRCxNQUFNLENBQUMsQ0FBQztZQUMxQyxPQUFPO2dCQUNMLG9CQUFvQjtnQkFDcEIsT0FBTyxHQUFHRCxjQUFjMUQsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDa0MsMkJBQTJCLENBQUN5QixPQUFPTCxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDOUY7UUFDRjtRQUVBLElBQUlDLFlBQVk7WUFDZCxPQUFPLENBQUMsR0FBRyxFQUFFakMsTUFBTUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFZ0MsT0FBTyxDQUFDLENBQUM7UUFDN0MsT0FBTztZQUNMLDJCQUEyQjtZQUMzQixPQUFPbEMsTUFBTUUsSUFBSSxDQUFDO1FBQ3BCO0lBQ0Y7SUFFQW9DLG1CQUFtQjNDLFNBQWlCLEVBQVU7UUFDNUMsTUFBTUUsU0FBUyxJQUFJLENBQUNILHVCQUF1QixDQUFDQztRQUM1QyxNQUFNLEVBQUU0QyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUN4QyxrQkFBa0IsQ0FBQyxJQUFJRjtRQUVoRCxNQUFNRyxRQUFrQjtZQUFDLENBQUMsQ0FBQyxDQUFDO1NBQUM7UUFFN0IsMEJBQTBCO1FBQzFCLE1BQU13QyxxQkFBcUIsQ0FBQ0Q7WUFDMUIsTUFBTUUsY0FBd0IsRUFBRTtZQUVoQyxLQUFLLE1BQU1DLFVBQVVILFFBQVM7Z0JBQzVCLE1BQU0sRUFBRUksT0FBTyxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sRUFBRUMsU0FBUyxFQUFFLEdBQUdKLE9BQU9LLFFBQVE7Z0JBRTlELG1DQUFtQztnQkFDbkMsTUFBTUMsYUFBYW5HLGNBQWNvRyxVQUFVLENBQUNIO2dCQUM1QyxNQUFNSSxjQUFjRixXQUFXRyxjQUFjO2dCQUU3Q1YsWUFBWXhDLElBQUksQ0FDZCxLQUNBLENBQUMsS0FBSyxFQUFFeUMsT0FBT3JDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDckIsQ0FBQyxRQUFRLEVBQUVxQyxPQUFPSyxRQUFRLENBQUNLLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFDdEMsQ0FBQyxxRkFBcUYsQ0FBQztnQkFHekYsSUFBSVAsWUFBWVEsV0FBVztvQkFDekIsVUFBVTtvQkFDVlosWUFBWXhDLElBQUksQ0FDZCxFQUFFO29CQUNGLG9CQUNBLENBQUMsT0FBTyxFQUFFMEMsUUFBUSxFQUFFLENBQUM7b0JBR3ZCRCxPQUFPWSxRQUFRLENBQUNDLE9BQU8sQ0FBQyxDQUFDckQ7d0JBQ3ZCLDhDQUE4Qzt3QkFDOUMsTUFBTUUsYUFBYUYsS0FBS0EsSUFBSSxLQUFLLFVBQVUsU0FBUzt3QkFDcEQsSUFBSSxZQUFZQSxNQUFNOzRCQUNwQixrREFBa0Q7NEJBQ2xEdUMsWUFBWXhDLElBQUksQ0FDZCxDQUFDLENBQUMsRUFBRUcsV0FBVyxHQUFHLEVBQUVGLEtBQUtHLEVBQUUsQ0FBQyxHQUFHLEVBQUVILEtBQUtqRCxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQzFELENBQUMscUJBQXFCLEVBQUVpRCxLQUFLSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQ3pDO3dCQUVKLE9BQU87NEJBQ0xtQyxZQUFZeEMsSUFBSSxDQUNkLENBQUMsQ0FBQyxFQUFFRyxXQUFXLEdBQUcsRUFBRUYsS0FBS0csRUFBRSxDQUFDLEdBQUcsRUFBRUgsS0FBS2pELEtBQUssQ0FBQyxNQUFNLEVBQUVpRCxLQUFLSyxJQUFJLENBQUMsSUFBSSxFQUFFTCxLQUFLTSxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUVuRjtvQkFDRjtvQkFFQSw4QkFBOEI7b0JBQzlCLE1BQU1DLFlBQVksSUFBSSxDQUFDQyx1QkFBdUIsQ0FBQ2dDLE9BQU8vQixNQUFNO29CQUM1REYsVUFBVStDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRWIsUUFBUSxDQUFDLEVBQUVDLE1BQU0sQ0FBQyxDQUFDO29CQUN6Q0gsWUFBWXhDLElBQUksQ0FDZCxDQUFDLFVBQVUsRUFBRTBDLFFBQVEsQ0FBQyxFQUFFQyxNQUFNLGNBQWMsRUFBRU0sWUFBWSxDQUFDLENBQUMsRUFDNUQsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDdEMsMkJBQTJCLENBQUNILFdBQVcsRUFBRSxDQUFDO2dCQUU5RCxPQUFPO29CQUNMLGFBQWE7b0JBQ2JnQyxZQUFZeEMsSUFBSSxDQUNkLG9CQUNBLENBQUMsT0FBTyxFQUFFNEMsUUFBUTVGLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFDM0IsQ0FBQyxPQUFPLEVBQUUwRixRQUFRLElBQUksRUFBRUUsUUFBUTVGLEtBQUssQ0FBQyxDQUFDLEVBQUU0RixRQUFRRCxLQUFLLENBQUMsSUFBSSxFQUFFRCxRQUFRLENBQUMsRUFBRUMsTUFBTSxFQUFFLENBQUM7b0JBR25GRixPQUFPWSxRQUFRLENBQUNDLE9BQU8sQ0FBQyxDQUFDckQ7d0JBQ3ZCLDhDQUE4Qzt3QkFDOUMsTUFBTUUsYUFBYUYsS0FBS0EsSUFBSSxLQUFLLFVBQVUsU0FBUzt3QkFDcEQsSUFBSSxZQUFZQSxNQUFNOzRCQUNwQixrREFBa0Q7NEJBQ2xEdUMsWUFBWXhDLElBQUksQ0FDZCxDQUFDLENBQUMsRUFBRUcsV0FBVyxHQUFHLEVBQUVGLEtBQUtHLEVBQUUsQ0FBQyxHQUFHLEVBQUVILEtBQUtqRCxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQzFELENBQUMscUJBQXFCLEVBQUVpRCxLQUFLSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQ3pDO3dCQUVKLE9BQU87NEJBQ0xtQyxZQUFZeEMsSUFBSSxDQUNkLENBQUMsQ0FBQyxFQUFFRyxXQUFXLEdBQUcsRUFBRUYsS0FBS0csRUFBRSxDQUFDLEdBQUcsRUFBRUgsS0FBS2pELEtBQUssQ0FBQyxNQUFNLEVBQUVpRCxLQUFLSyxJQUFJLENBQUMsSUFBSSxFQUFFTCxLQUFLTSxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUVuRjtvQkFDRjtvQkFFQSw4QkFBOEI7b0JBQzlCLE1BQU1DLFlBQVksSUFBSSxDQUFDQyx1QkFBdUIsQ0FBQ2dDLE9BQU8vQixNQUFNO29CQUM1REYsVUFBVStDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRVgsUUFBUTVGLEtBQUssQ0FBQyxDQUFDLEVBQUU0RixRQUFRWSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUN6RGhCLFlBQVl4QyxJQUFJLENBQ2QsQ0FBQyxVQUFVLEVBQUU0QyxRQUFRNUYsS0FBSyxDQUFDLENBQUMsRUFBRTRGLFFBQVFZLE9BQU8sQ0FBQyxjQUFjLEVBQUVQLFlBQVksQ0FBQyxDQUFDLEVBQzVFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQ3RDLDJCQUEyQixDQUFDSCxXQUFXLEVBQUUsQ0FBQztnQkFFOUQ7Z0JBRUFnQyxZQUFZeEMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUVyQixnQkFBZ0I7Z0JBQ2hCLElBQUl5QyxPQUFPSCxPQUFPLElBQUlHLE9BQU9ILE9BQU8sQ0FBQ2IsTUFBTSxHQUFHLEdBQUc7b0JBQy9DZSxZQUFZeEMsSUFBSSxDQUFDLGlCQUFpQnVDLG1CQUFtQkUsT0FBT0gsT0FBTyxHQUFHO2dCQUN4RTtnQkFFQUUsWUFBWXhDLElBQUksQ0FBQztZQUNuQjtZQUVBLE9BQU93QztRQUNUO1FBRUF6QyxNQUFNQyxJQUFJLElBQUl1QyxtQkFBbUJEO1FBQ2pDdkMsTUFBTUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWQsT0FBT0QsTUFBTUUsSUFBSSxDQUFDO0lBQ3BCO0lBRUE7O0VBRUEsR0FDQXdELGVBQWUvRCxTQUFpQixFQUFlO1FBQzdDLE1BQU1FLFNBQVMsSUFBSSxDQUFDSCx1QkFBdUIsQ0FBQ0M7UUFFNUMsTUFBTW1CLFNBQXNCLElBQUksQ0FBQ2Ysa0JBQWtCLENBQUMsSUFBSUY7UUFDeEQsT0FBT2lCO0lBQ1Q7SUFFQTtHQUNDLEdBQ0RmLG1CQUNFNEQsTUFBYyxFQUNkOUUsTUFBZ0IsRUFDaEIrRSx1QkFBZ0MsS0FBSyxFQUN4QjtRQUNiLDBEQUEwRDtRQUMxREQsU0FBU0EsT0FBT3RGLE9BQU8sQ0FBQyxPQUFPO1FBRS9CLHFCQUFxQjtRQUNyQixNQUFNd0YsY0FBY3RJLE1BQU1zRCxRQUFRLENBQUNpRjtZQUNqQyxJQUFJQSxNQUFNMUYsUUFBUSxDQUFDLE1BQU07Z0JBQ3ZCLE1BQU0sQ0FBQzJGLElBQUksR0FBR0QsTUFBTXpDLEtBQUssQ0FBQztnQkFDMUIsT0FBTzBDO1lBQ1QsT0FBTztnQkFDTCxPQUFPO1lBQ1Q7UUFDRjtRQUVBLE1BQU1qRCxTQUFTeEMsT0FBT2MsSUFBSSxDQUFDeUUsYUFBYUcsTUFBTSxDQUM1QyxDQUFDQyxHQUFHQztZQUNGLE1BQU1yRixTQUFTZ0YsV0FBVyxDQUFDSyxTQUFTO1lBQ3BDL0ksT0FBTzBELFdBQVd3RSxXQUFXO1lBRTdCLHVDQUF1QztZQUN2QyxJQUFJYSxhQUFhLElBQUk7Z0JBQ25CLE1BQU1DLGFBQWF0RixPQUFPSixNQUFNLENBQUMsQ0FBQ3FGLFFBQVUsQ0FBQ3pILGNBQWMsSUFBSSxDQUFDaUIsU0FBUyxDQUFDd0csTUFBTTtnQkFDaEYsa0VBQWtFO2dCQUNsRSwwREFBMEQ7Z0JBQzFELE1BQU1NLG9CQUFvQnZGLE9BQU9KLE1BQU0sQ0FBQyxDQUFDcUYsUUFDdkMxSCxrQkFBa0IsSUFBSSxDQUFDa0IsU0FBUyxDQUFDd0csTUFBTTtnQkFHekMsSUFBSUgsV0FBVyxJQUFJO29CQUNqQixhQUFhO29CQUNiTSxFQUFFdEQsTUFBTSxHQUFHc0QsRUFBRXRELE1BQU0sQ0FBQzBELE1BQU0sQ0FBQ0YsV0FBV2pHLEdBQUcsQ0FBQyxDQUFDNEYsUUFBVSxJQUFJLENBQUNRLGdCQUFnQixDQUFDUjtvQkFDM0VHLEVBQUVNLE9BQU8sR0FBR04sRUFBRU0sT0FBTyxDQUFDRixNQUFNLENBQUNEO2dCQUMvQixPQUFPO29CQUNMLGNBQWM7b0JBQ2RILEVBQUV0RCxNQUFNLEdBQUdzRCxFQUFFdEQsTUFBTSxDQUFDMEQsTUFBTSxDQUN4QkYsV0FBV2pHLEdBQUcsQ0FBQyxDQUFDNEYsUUFBVSxHQUFHSCxPQUFPLENBQUMsRUFBRUcsTUFBTSxJQUFJLEVBQUVILE9BQU8sRUFBRSxFQUFFRyxPQUFPO2dCQUV6RTtnQkFFQSxPQUFPRztZQUNUO1lBRUEsTUFBTU8sV0FBVyxJQUFJLENBQUNqSCxTQUFTLENBQUMyRyxTQUFTO1lBQ3pDLElBQUlNLGFBQWFuQixXQUFXO2dCQUMxQixNQUFNLElBQUl6QixNQUFNLENBQUMsb0JBQW9CLEVBQUVzQyxVQUFVO1lBQ25EO1lBQ0EsTUFBTU8sWUFBWTVILGNBQWM2SCxHQUFHLENBQUNGLFNBQVNHLElBQUk7WUFFakQsSUFBSXpJLHVCQUF1QnNJLGFBQWEzSSwyQkFBMkIySSxXQUFXO2dCQUM1RSw0QkFBNEI7Z0JBQzVCLE1BQU1JLFlBQVkvRixPQUFPWCxHQUFHLENBQUMsQ0FBQzRGLFFBQVVBLE1BQU16QyxLQUFLLENBQUMsS0FBS1EsS0FBSyxDQUFDLEdBQUczQixJQUFJLENBQUM7Z0JBRXZFLGdEQUFnRDtnQkFDaEQsSUFBSTBFLFVBQVVsRCxNQUFNLEtBQUssS0FBS2tELFNBQVMsQ0FBQyxFQUFFLEtBQUssTUFBTTtvQkFDbkQsSUFBSWpCLFdBQVcsSUFBSTt3QkFDakJNLEVBQUV0RCxNQUFNLEdBQUdzRCxFQUFFdEQsTUFBTSxDQUFDMEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDcEgsS0FBSyxDQUFDLENBQUMsRUFBRWlILFNBQVMsR0FBRyxDQUFDO29CQUMzRCxPQUFPO3dCQUNMRCxFQUFFdEQsTUFBTSxHQUFHc0QsRUFBRXRELE1BQU0sQ0FBQzBELE1BQU0sQ0FBQyxHQUFHVixPQUFPLENBQUMsRUFBRU8sU0FBUyxPQUFPLEVBQUVQLE9BQU8sRUFBRSxFQUFFTyxTQUFTLEdBQUcsQ0FBQztvQkFDcEY7b0JBQ0EsT0FBT0Q7Z0JBQ1Q7Z0JBRUEsZUFBZTtnQkFDZixNQUFNWSxlQUFlLEFBQUMsQ0FBQTtvQkFDcEIsSUFBSWpCLHNCQUFzQjt3QkFDeEIsT0FBTztvQkFDVDtvQkFFQSxJQUFJMUgsdUJBQXVCc0ksV0FBVzt3QkFDcEMsSUFBSUEsU0FBU00sYUFBYSxLQUFLLFFBQVEsQUFBQ04sQ0FBQUEsU0FBU08sUUFBUSxJQUFJLEtBQUksTUFBTyxPQUFPOzRCQUM3RSxPQUFPO3dCQUNULE9BQU87NEJBQ0wsT0FBTzt3QkFDVDtvQkFDRixPQUFPO3dCQUNMLElBQUlQLFNBQVNPLFFBQVEsRUFBRTs0QkFDckIsT0FBTzt3QkFDVCxPQUFPOzRCQUNMLE9BQU87d0JBQ1Q7b0JBQ0Y7Z0JBQ0YsQ0FBQTtnQkFDQSxNQUFNQyxpQkFBaUJQLFVBQVUxRSxrQkFBa0IsQ0FDakQsR0FBRzRELFdBQVcsS0FBSyxHQUFHQSxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUtPLFVBQVUsRUFDakRVLFdBQ0FDLGlCQUFpQjtnQkFFbkJaLEVBQUV0RCxNQUFNLEdBQUdzRCxFQUFFdEQsTUFBTSxDQUFDMEQsTUFBTSxDQUFDVyxlQUFlckUsTUFBTTtnQkFDaERzRCxFQUFFTSxPQUFPLEdBQUdOLEVBQUVNLE9BQU8sQ0FBQ0YsTUFBTSxDQUFDVyxlQUFlVCxPQUFPO2dCQUVuRCxNQUFNVSxTQUFTdEIsV0FBVyxLQUFLTyxXQUFXLEdBQUdQLE9BQU8sRUFBRSxFQUFFTyxVQUFVO2dCQUNsRSxNQUFNcEIsWUFBWWEsV0FBVyxLQUFLLElBQUksQ0FBQzFHLEtBQUssR0FBRzBHO2dCQUUvQyxJQUFJdUI7Z0JBUUosSUFBSVYsU0FBU1csZ0JBQWdCLEVBQUU7b0JBQzdCRCxhQUFhO3dCQUNYNUUsUUFBUWtFLFNBQVNXLGdCQUFnQjtvQkFDbkM7Z0JBQ0YsT0FBTztvQkFDTCxJQUFJNUUsTUFBY0M7b0JBQ2xCLElBQUl0RSx1QkFBdUJzSSxXQUFXO3dCQUNwQyxJQUFJQSxTQUFTTSxhQUFhLEVBQUU7NEJBQzFCdkUsT0FBTyxHQUFHdUMsVUFBVSxDQUFDLEVBQUUwQixTQUFTaEcsSUFBSSxDQUFDLEdBQUcsQ0FBQzs0QkFDekNnQyxLQUFLLEdBQUd5RSxPQUFPLEdBQUcsQ0FBQzt3QkFDckIsT0FBTzs0QkFDTDFFLE9BQU8sR0FBR3VDLFVBQVUsR0FBRyxDQUFDOzRCQUN4QnRDLEtBQUssR0FBR3lFLE9BQU8sQ0FBQyxFQUFFNUosV0FBVzJDLFVBQVUsQ0FBQyxJQUFJLENBQUNaLEtBQUssQ0FBQ29DLEVBQUUsQ0FBQ25CLE9BQU8sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDO3dCQUNoRjtvQkFDRixPQUFPO3dCQUNMa0MsT0FBTyxHQUFHdUMsVUFBVSxDQUFDLEVBQUUwQixTQUFTaEcsSUFBSSxDQUFDLEdBQUcsQ0FBQzt3QkFDekNnQyxLQUFLLEdBQUd5RSxPQUFPLEdBQUcsQ0FBQztvQkFDckI7b0JBQ0FDLGFBQWE7d0JBQ1gzRTt3QkFDQUM7b0JBQ0Y7Z0JBQ0Y7Z0JBRUF5RCxFQUFFOUQsS0FBSyxDQUFDRixJQUFJLENBQUM7b0JBQ1hJLElBQUk0RTtvQkFDSi9FLE1BQU0yRTtvQkFDTjVILE9BQU93SCxVQUFVeEgsS0FBSztvQkFDdEIsR0FBR2lJLFVBQVU7Z0JBQ2Y7Z0JBRUEsaUNBQWlDO2dCQUNqQyxJQUFJRixlQUFlekMsT0FBTyxDQUFDYixNQUFNLEdBQUcsR0FBRztvQkFDckMsTUFBTTBELG1CQUFtQkosZUFBZXpDLE9BQU8sQ0FBQ3JFLEdBQUcsQ0FBQyxDQUFDd0U7d0JBQ25ELE1BQU0yQyxRQUFROzRCQUFDbkI7NEJBQVV4QixPQUFPckMsRUFBRTt5QkFBQyxDQUFDSCxJQUFJLENBQUM7d0JBQ3pDLE9BQU87NEJBQ0xHLElBQUlnRjs0QkFDSnBJLE9BQU95RixPQUFPekYsS0FBSzs0QkFDbkI4RixVQUFVTCxPQUFPSyxRQUFROzRCQUN6Qk8sVUFBVVosT0FBT1ksUUFBUTs0QkFDekIzQyxRQUFRK0IsT0FBTy9CLE1BQU07NEJBQ3JCNEIsU0FBU0csT0FBT0gsT0FBTzt3QkFDekI7b0JBQ0Y7b0JBRUEwQixFQUFFMUIsT0FBTyxHQUFHOzJCQUFJMEIsRUFBRTFCLE9BQU87MkJBQUs2QztxQkFBaUI7Z0JBQ2pEO2dCQUVBbkIsRUFBRTlELEtBQUssR0FBRzhELEVBQUU5RCxLQUFLLENBQUNrRSxNQUFNLENBQUNXLGVBQWU3RSxLQUFLO1lBQy9DLE9BQU8sSUFBSXBFLHNCQUFzQnlJLGFBQWF2SSx5QkFBeUJ1SSxXQUFXO2dCQUNoRiw4QkFBOEI7Z0JBQzlCLE1BQU1JLFlBQVkvRixPQUFPWCxHQUFHLENBQUMsQ0FBQzRGLFFBQVVBLE1BQU16QyxLQUFLLENBQUMsS0FBS1EsS0FBSyxDQUFDLEdBQUczQixJQUFJLENBQUM7Z0JBQ3ZFLE1BQU04RSxpQkFBaUJQLFVBQVUxRSxrQkFBa0IsQ0FBQyxJQUFJNkU7Z0JBRXhELElBQUk3QjtnQkFDSixJQUFJaEgsc0JBQXNCeUksV0FBVztvQkFDbkMsTUFBTWYsVUFBVWUsVUFBVWMsY0FBYztvQkFDeEN2QyxXQUFXO3dCQUNURCxXQUFXLElBQUksQ0FBQzdGLEtBQUs7d0JBQ3JCd0c7d0JBQ0FMLFNBQVNPLFdBQVcsS0FBSyxHQUFHRixTQUFTLEdBQUcsR0FBR0UsT0FBTyxFQUFFLEVBQUVGLFNBQVM7d0JBQy9EZCxTQUFTOEIsVUFBVXhILEtBQUs7d0JBQ3hCMkYsT0FBTzRCLFNBQVNlLFVBQVU7b0JBQzVCO2dCQUNGLE9BQU8sSUFBSXRKLHlCQUF5QnVJLFdBQVc7b0JBQzdDekIsV0FBVzt3QkFDVEQsV0FBVyxJQUFJLENBQUM3RixLQUFLO3dCQUNyQndHLFNBQVM7d0JBQ1RMLFNBQVNPLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUdBLE9BQU8sSUFBSSxDQUFDO3dCQUMvQ2QsU0FBUzs0QkFDUDVGLE9BQU91SCxTQUFTZ0IsU0FBUzs0QkFDekIvQixTQUFTLEdBQUdwSSxXQUFXb0ssV0FBVyxDQUFDLElBQUksQ0FBQ3hJLEtBQUssRUFBRSxHQUFHLENBQUM7NEJBQ25EMkYsT0FBTyxHQUFHdkgsV0FBV29LLFdBQVcsQ0FBQ2hCLFVBQVV4SCxLQUFLLEVBQUUsR0FBRyxDQUFDO3dCQUN4RDt3QkFDQTBGLFNBQVM4QixVQUFVeEgsS0FBSzt3QkFDeEIyRixPQUFPO29CQUNUO2dCQUNGLE9BQU87b0JBQ0wsTUFBTSxJQUFJaEI7Z0JBQ1o7Z0JBRUFxQyxFQUFFMUIsT0FBTyxDQUFDdEMsSUFBSSxDQUFDO29CQUNiSSxJQUFJNkQ7b0JBQ0pqSCxPQUFPd0gsVUFBVXhILEtBQUs7b0JBQ3RCOEY7b0JBQ0FPLFVBQVUwQixlQUFlN0UsS0FBSztvQkFDOUJRLFFBQVFxRSxlQUFlckUsTUFBTTtvQkFDN0I0QixTQUFTeUMsZUFBZXpDLE9BQU87Z0JBQ2pDO1lBQ0Y7WUFFQSxPQUFPMEI7UUFDVCxHQUNBO1lBQ0V0RCxRQUFRLEVBQUU7WUFDVjRELFNBQVMsRUFBRTtZQUNYcEUsT0FBTyxFQUFFO1lBQ1RvQyxTQUFTLEVBQUU7UUFDYjtRQUVGLE9BQU96QjtJQUNUO0lBRUE7O0VBRUEsR0FDQTRFLHNCQUFzQkMsVUFBb0IsRUFBRUMsU0FBaUIsSUFBSSxFQUFvQjtRQUNuRixNQUFNQyxTQUFTRixXQUFXM0IsTUFBTSxDQUM5QixDQUFDbEQsUUFBUWdGO1lBQ1AsSUFBSXBILEtBQWEyRCxPQUFlMEQ7WUFDaEMsSUFBSUQsVUFBVTFILFFBQVEsQ0FBQyxNQUFNO2dCQUMzQixDQUFDTSxLQUFLLEdBQUdxSCxTQUFTLEdBQUdELFVBQVV6RSxLQUFLLENBQUM7Z0JBQ3JDZ0IsUUFBUTBELFNBQVM3RixJQUFJLENBQUM7WUFDeEIsT0FBTztnQkFDTHhCLE1BQU07Z0JBQ04yRCxRQUFReUQ7WUFDVjtZQUNBaEYsTUFBTSxDQUFDcEMsSUFBSSxHQUFHLEFBQUNvQyxDQUFBQSxNQUFNLENBQUNwQyxJQUFJLElBQUksRUFBRSxBQUFELEVBQUcyRixNQUFNLENBQUNoQztZQUV6QyxPQUFPdkI7UUFDVCxHQUNBLENBQUM7UUFLSCxPQUFPeEMsT0FBT2MsSUFBSSxDQUFDeUcsUUFBUUcsT0FBTyxDQUFtQyxDQUFDdEg7WUFDcEUsTUFBTW5ELFFBQVFzSyxNQUFNLENBQUNuSCxJQUFJO1lBRXpCLGFBQWE7WUFDYixJQUFJQSxRQUFRLElBQUk7Z0JBQ2QsT0FBT25ELE1BQU0yQyxHQUFHLENBQUMsQ0FBQytIO29CQUNoQixNQUFNOUgsT0FBT3lILE9BQU92SSxLQUFLLENBQUM2SSxJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRTNILElBQUksS0FBS3lIO29CQUNqRCxJQUFJOUgsU0FBU2tGLFdBQVc7d0JBQ3RCLE1BQU0sSUFBSXpCLE1BQ1IsR0FBR2dFLE9BQU83SSxFQUFFLENBQUMsbUJBQW1CLEVBQUVrSixTQUFTLGlCQUFpQixFQUFFTCxPQUFPdkksS0FBSyxDQUFDYSxHQUFHLENBQUMsQ0FBQ2lJLElBQU1BLEVBQUUzSCxJQUFJLEVBQUUwQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRS9HO29CQUNBLE9BQU87d0JBQ0xrRyxVQUFVO3dCQUNWakk7b0JBQ0Y7Z0JBQ0Y7WUFDRjtZQUVBLG1CQUFtQjtZQUNuQixNQUFNQSxPQUFPeUgsT0FBT3RJLFNBQVMsQ0FBQ29CLElBQUk7WUFDbEMsSUFBSSxDQUFDdkMsZUFBZWdDLE9BQU87Z0JBQ3pCLE1BQU0sSUFBSXlELE1BQU0sQ0FBQyxjQUFjLEVBQUVsRCxJQUFJLENBQUMsRUFBRW5ELEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDcEQ7WUFDQSxNQUFNa0osWUFBWTVILGNBQWM2SCxHQUFHLENBQUN2RyxLQUFLd0csSUFBSTtZQUU3QywrQkFBK0I7WUFDL0IsSUFBSTlJLDJCQUEyQnNDLFNBQVNqQyx1QkFBdUJpQyxPQUFPO2dCQUNwRSxJQUFJNUMsTUFBTW1HLE1BQU0sS0FBSyxLQUFNbkcsQ0FBQUEsS0FBSyxDQUFDLEVBQUUsS0FBSyxRQUFRQSxLQUFLLENBQUMsRUFBRSxLQUFLLEtBQUksR0FBSTtvQkFDbkUsNENBQTRDO29CQUM1QyxNQUFNOEssU0FBUzVCLFVBQVVuSCxTQUFTLENBQUNQLEVBQUU7b0JBQ3JDLE9BQU87d0JBQ0xxSixVQUFVO3dCQUNWakksTUFBTTs0QkFDSixHQUFHa0ksTUFBTTs0QkFDVDdILE1BQU0sR0FBR0UsSUFBSSxHQUFHLENBQUM7NEJBQ2pCcUcsVUFBVTVHLEtBQUs0RyxRQUFRO3dCQUN6QjtvQkFDRjtnQkFDRjtZQUNGO1lBRUEseUJBQXlCO1lBQ3pCLHNCQUFzQjtZQUN0QixvQkFBb0I7WUFDcEIsTUFBTXVCLFdBQVcsSUFBSSxDQUFDWixxQkFBcUIsQ0FBQ25LLE9BQU9rSjtZQUNuRCxNQUFNMkIsV0FDSnZLLDJCQUEyQnNDLFNBQVNqQyx1QkFBdUJpQyxRQUN0RCxXQUNBO1lBRVAsT0FBTztnQkFDTGlJO2dCQUNBakk7Z0JBQ0FtSTtZQUNGO1FBQ0Y7SUFDRjtJQUVBQyxjQUFjNUMsU0FBUyxFQUFFLEVBQUU2QyxXQUFtQixDQUFDLEVBQUVDLFFBQWtCLEVBQUUsRUFBWTtRQUMvRSxPQUFPLElBQUksQ0FBQ3BKLEtBQUssQ0FDZDJJLE9BQU8sQ0FBQyxDQUFDN0g7WUFDUixNQUFNOEgsV0FBVztnQkFBQ3RDO2dCQUFReEYsS0FBS0ssSUFBSTthQUFDLENBQUNDLE1BQU0sQ0FBQyxDQUFDaUksSUFBTUEsTUFBTSxJQUFJeEcsSUFBSSxDQUFDO1lBQ2xFLElBQUkrRixhQUFhdEMsUUFBUTtnQkFDdkIsT0FBTztZQUNUO1lBQ0EsSUFBSXhILGVBQWVnQyxPQUFPO2dCQUN4QixJQUFJcUksV0FBVyxHQUFHO29CQUNoQixPQUFPO2dCQUNUO2dCQUNBLElBQUlDLE1BQU1ySSxRQUFRLENBQUNELEtBQUt3RyxJQUFJLEdBQUc7b0JBQzdCLHNCQUFzQjtvQkFDdEIsT0FBTztnQkFDVDtnQkFDQSwrQkFBK0I7Z0JBQy9CLE1BQU1nQyxRQUFROUosY0FBYzZILEdBQUcsQ0FBQ3ZHLEtBQUt3RyxJQUFJO2dCQUN6QyxPQUFPZ0MsTUFBTUosYUFBYSxDQUFDTixVQUFVTyxXQUFXLEdBQUc7dUJBQUlDO29CQUFPLElBQUksQ0FBQzFKLEVBQUU7aUJBQUM7WUFDeEU7WUFDQSxPQUFPa0o7UUFDVCxHQUNDeEgsTUFBTSxDQUFDLENBQUNLLElBQU1BLE1BQU07SUFDekI7SUFFQTs7O0dBR0MsR0FDRCxBQUFROEgsY0FBY3pJLElBQWtCLEVBQVc7UUFDakQsT0FDRUEsS0FBSzBJLFlBQVksS0FBSyxrQkFDckIxSSxLQUFLMEksWUFBWSxLQUFLLGNBQWMxSSxLQUFLMkcsYUFBYSxLQUFLO0lBRWhFO0lBRUFnQyxrQkFBb0Q7UUFDbEQsT0FBTyxJQUFJLENBQUN6SixLQUFLLENBQ2RhLEdBQUcsQ0FBQyxDQUFDQztZQUNKLElBQUlBLEtBQUs0SSxJQUFJLEtBQUssWUFBWTtnQkFDNUIsSUFBSSxJQUFJLENBQUNILGFBQWEsQ0FBQ3pJLE9BQU87b0JBQzVCLE9BQU87d0JBQUVLLE1BQU0sR0FBR0wsS0FBS0ssSUFBSSxDQUFDLEdBQUcsQ0FBQzt3QkFBRXVJLE1BQU07b0JBQWU7Z0JBQ3pELE9BQU87b0JBQ0wsT0FBTztnQkFDVDtZQUNGO1lBQ0EsT0FBTztnQkFBRXZJLE1BQU1MLEtBQUtLLElBQUk7Z0JBQUV1SSxNQUFNNUksS0FBSzRJLElBQUk7WUFBQztRQUM1QyxHQUNDdEksTUFBTSxDQUFDN0I7SUFDWjtJQUVBOztHQUVDLEdBQ0RvSyxtQkFBaUM7UUFDL0IsT0FBTyxJQUFJLENBQUMzSixLQUFLLENBQUNvQixNQUFNLENBQUMsQ0FBQzBILElBQU1BLEVBQUVZLElBQUksS0FBSztJQUM3QztJQUVBOzs7R0FHQyxHQUNERSxnQkFBZ0JDLFVBQW1CLEVBQTBCO1FBQzNELE1BQU1DLGNBQWMsSUFBSSxDQUFDSCxnQkFBZ0I7UUFDekMsSUFBSUUsWUFBWTtZQUNkLE9BQU9DLFlBQVlqQixJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRTNILElBQUksS0FBSzBJO1FBQzVDO1FBQ0EsT0FBT0MsV0FBVyxDQUFDLEVBQUU7SUFDdkI7SUFFQTs7Ozs7O0dBTUMsR0FDREMscUJBQW1DO1FBQ2pDLE9BQU8sSUFBSSxDQUFDL0osS0FBSyxDQUFDMkksT0FBTyxDQUFDLENBQUM3SDtZQUN6QixrQkFBa0I7WUFDbEIsSUFBSTlCLGNBQWM4QixPQUFPO2dCQUN2QixPQUFPLEVBQUU7WUFDWDtZQUVBLG1CQUFtQjtZQUNuQixJQUFJaEMsZUFBZWdDLE9BQU87Z0JBQ3hCLHdCQUF3QjtnQkFDeEIsSUFBSSxJQUFJLENBQUN5SSxhQUFhLENBQUN6SSxPQUFPO29CQUM1QixPQUFPO3dCQUNMSyxNQUFNLEdBQUdMLEtBQUtLLElBQUksQ0FBQyxHQUFHLENBQUM7d0JBQ3ZCdUksTUFBTTt3QkFDTmhDLFVBQVU1RyxLQUFLNEcsUUFBUTtvQkFDekI7Z0JBQ0Y7Z0JBQ0EsT0FBTyxFQUFFO1lBQ1g7WUFFQSxhQUFhO1lBQ2IsT0FBTzVHO1FBQ1Q7SUFDRjtJQUVBLE1BQU1rSixzQkFBc0I7UUFDMUIsTUFBTUMsV0FBVyxHQUFHLElBQUksQ0FBQ2xLLEtBQUssQ0FBQ2lDLFFBQVEsRUFBRTtRQUV6QyxjQUFjO1FBQ2R4QyxjQUFjMEssYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDeEssRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7UUFFdEUsU0FBUztRQUNULElBQUl1QixPQUFPYyxJQUFJLENBQUMsSUFBSSxDQUFDM0IsT0FBTyxFQUFFaUUsTUFBTSxHQUFHLEdBQUc7WUFDeEM3RSxjQUFjMEssYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDeEssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7WUFDckVGLGNBQWMwSyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUN4SyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN6RSxLQUFLLE1BQU00QyxhQUFhckIsT0FBT2MsSUFBSSxDQUFDLElBQUksQ0FBQzNCLE9BQU8sRUFBRztnQkFDakRaLGNBQWMwSyxhQUFhLENBQ3pCLEdBQUcsSUFBSSxDQUFDeEssRUFBRSxDQUFDLE1BQU0sRUFBRTRDLFVBQVU2SCxXQUFXLElBQUksRUFDNUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUV0QjtRQUNGO1FBRUEsUUFBUTtRQUNSLEtBQUssTUFBTUMsVUFBVW5KLE9BQU9jLElBQUksQ0FBQyxJQUFJLENBQUN2QixVQUFVLEVBQUc7WUFDakRoQixjQUFjMEssYUFBYSxDQUFDRSxRQUFRLENBQUMsZ0JBQWdCLENBQUM7UUFDeEQ7UUFFQSxRQUFRO1FBQ1IsTUFBTUMsa0JBQWtCLEdBQUdKLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQ2xLLEtBQUssQ0FBQ2lDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDbEUsTUFBTXNJLGdCQUFnQnJNLEtBQUs0RSxJQUFJLENBQzdCeEUsT0FBT2tNLFdBQVcsRUFDbEJsTCxZQUFZLENBQUMsaUJBQWlCLEVBQUVnTCxnQkFBZ0IsR0FBRyxDQUFDO1FBR3RELElBQUksTUFBTWpMLE9BQU9rTCxnQkFBZ0I7WUFDL0IsTUFBTUUsa0JBQWtCLE1BQU10TCxjQUE0Qm9MO1lBQzFELElBQUksQ0FBQ2hLLEtBQUssR0FBR1csT0FBT0MsV0FBVyxDQUM3QnNKLGdCQUFnQjNKLEdBQUcsQ0FBQyxDQUFDLEVBQUVNLElBQUksRUFBRTZELEtBQUssRUFBRTtnQkFDbEN4RixjQUFjMEssYUFBYSxDQUFDL0ksTUFBTWtKO2dCQUNsQyxPQUFPO29CQUFDbEo7b0JBQU02RDtpQkFBTTtZQUN0QjtRQUVKO0lBQ0Y7SUFFQXlGLHFCQUEyQjtRQUN6QixxQ0FBcUM7UUFDckMsTUFBTUMsZ0JBQWdCLElBQUksQ0FBQ3ZLLE9BQU8sQ0FDL0JpQixNQUFNLENBQUMsQ0FBQ3VKLE1BQVFBLElBQUlqQixJQUFJLEtBQUssVUFDN0J0SSxNQUFNLENBQUMsQ0FBQ3VKLE1BQVFBLElBQUlDLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLENBQUNDLE1BQVEsQ0FBQ0EsSUFBSTNKLElBQUksQ0FBQ0osUUFBUSxDQUFDO1FBRWpFdkIsY0FBY3VMLFlBQVksQ0FBQztZQUN6QjVKLE1BQU0sSUFBSSxDQUFDdkIsS0FBSztZQUNoQjhLO1lBQ0FNLGFBQWEsSUFBSSxDQUFDaEwsS0FBSyxDQUFDb0IsTUFBTSxDQUFDLENBQUMwSCxJQUFNQSxFQUFFWSxJQUFJLEtBQUssUUFBUTdJLEdBQUcsQ0FBQyxDQUFDaUksSUFBTUEsRUFBRTNILElBQUk7UUFDNUU7SUFDRjtJQUVBOEosU0FBcUI7UUFDbkIsdURBQXVEO1FBQ3ZELE1BQU03SyxVQUFpRSxDQUFDO1FBQ3hFLEtBQUssTUFBTWlCLE9BQU9KLE9BQU9jLElBQUksQ0FBQyxJQUFJLENBQUMzQixPQUFPLEVBQUc7WUFDM0MsTUFBTThLLGVBQThCLElBQUksQ0FBQzlLLE9BQU8sQ0FBQ2lCLElBQUk7WUFDckQsTUFBTThKLGlCQUFnQyxBQUFDLENBQUEsSUFBSSxDQUFDOUssZUFBZSxDQUFDZ0IsSUFBSSxJQUFJLEVBQUUsQUFBRCxFQUFHUixHQUFHLENBQUMsQ0FBQzRGLFFBQVcsQ0FBQTtvQkFDdEZBO29CQUNBMkUsVUFBVTtnQkFDWixDQUFBO1lBQ0EsTUFBTTVKLFNBQVM7bUJBQUkwSjttQkFBaUJDO2FBQWU7WUFFbkQsbUNBQW1DO1lBQ25DLElBQUksSUFBSSxDQUFDekssV0FBVyxDQUFDVyxJQUFJLEVBQUU7Z0JBQ3pCakIsT0FBTyxDQUFDaUIsSUFBSSxHQUFHO29CQUNiRztvQkFDQTFCLE1BQU0sSUFBSSxDQUFDWSxXQUFXLENBQUNXLElBQUk7Z0JBQzdCO1lBQ0YsT0FBTztnQkFDTGpCLE9BQU8sQ0FBQ2lCLElBQUksR0FBR0c7WUFDakI7UUFDRjtRQUVBLGtDQUFrQztRQUNsQyxNQUFNakIsUUFBNkQsQ0FBQztRQUNwRSxLQUFLLE1BQU0sQ0FBQ2MsS0FBS2dLLE9BQU8sSUFBSXBLLE9BQU9NLE9BQU8sQ0FBQyxJQUFJLENBQUNmLFVBQVUsRUFBRztZQUMzRCx1Q0FBdUM7WUFDdkMsSUFBSSxJQUFJLENBQUNDLFNBQVMsQ0FBQ1ksSUFBSSxFQUFFO2dCQUN2QmQsS0FBSyxDQUFDYyxJQUFJLEdBQUc7b0JBQ1hnSztvQkFDQXZMLE1BQU0sSUFBSSxDQUFDVyxTQUFTLENBQUNZLElBQUk7Z0JBQzNCO1lBQ0YsT0FBTztnQkFDTGQsS0FBSyxDQUFDYyxJQUFJLEdBQUdnSztZQUNmO1FBQ0Y7UUFFQSxPQUFPO1lBQ0wzTCxJQUFJLElBQUksQ0FBQ0EsRUFBRTtZQUNYQyxVQUFVLElBQUksQ0FBQ0EsUUFBUTtZQUN2QkMsT0FBTyxJQUFJLENBQUNBLEtBQUs7WUFDakJDLE9BQU8sSUFBSSxDQUFDQSxLQUFLO1lBQ2pCQyxNQUFNLElBQUksQ0FBQ0EsSUFBSTtZQUNmRSxPQUFPLElBQUksQ0FBQ0EsS0FBSztZQUNqQkcsU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDckJDO1lBQ0FHO1FBQ0Y7SUFDRjtJQUVBLE1BQU0rSyxPQUFzQjtRQUMxQixnQkFBZ0I7UUFDaEIsTUFBTUMsYUFBYSxJQUFJLENBQUNDLGFBQWE7UUFDckMsSUFBSSxDQUFDcEwsT0FBTyxHQUFHYSxPQUFPQyxXQUFXLENBQy9CRCxPQUFPTSxPQUFPLENBQUMsSUFBSSxDQUFDbkIsT0FBTyxFQUFFUyxHQUFHLENBQUMsQ0FBQyxDQUFDeUIsVUFBVTtZQUMzQyxPQUFPO2dCQUFDQTtnQkFBVyxJQUFJLENBQUNtSix3QkFBd0IsQ0FBQ0YsWUFBWWpKLFdBQVc7YUFBTztRQUNqRjtRQUVGLElBQUksQ0FBQ2pDLGVBQWUsR0FBR1ksT0FBT0MsV0FBVyxDQUN2Q0QsT0FBT00sT0FBTyxDQUFDLElBQUksQ0FBQ2xCLGVBQWUsRUFBRVEsR0FBRyxDQUFDLENBQUMsQ0FBQ3lCLFVBQVU7WUFDbkQsT0FBTztnQkFBQ0E7Z0JBQVcsSUFBSSxDQUFDbUosd0JBQXdCLENBQUNGLFlBQVlqSixXQUFXO2FBQU07UUFDaEY7UUFHRixPQUFPO1FBQ1AsTUFBTW9KLFdBQVd6TixLQUFLNEUsSUFBSSxDQUN4QnhFLE9BQU9rTSxXQUFXLEVBQ2xCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDeEssS0FBSyxDQUFDaUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNqQyxLQUFLLENBQUNvQyxFQUFFLENBQUMsWUFBWSxDQUFDO1FBRXZFLE1BQU13SixPQUFPLElBQUksQ0FBQ1YsTUFBTTtRQUN4QixNQUFNbE4sVUFBVTJOLFVBQVV2TSxXQUFXeU0sS0FBS0MsU0FBUyxDQUFDRixPQUFPLFFBQVFEO1FBRW5FLFNBQVM7UUFDVCxNQUFNbE0sY0FBY3NNLFFBQVEsQ0FBQ0g7SUFDL0I7SUFFQTs7Ozs7OztHQU9DLEdBQ0QsTUFBTUksc0JBQXNCQyxNQUEyQixFQUFpQjtRQUN0RSxNQUFNLEVBQUVELHFCQUFxQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDL0MsTUFBTUUsZUFBZTVOLE9BQU82TixNQUFNLENBQUNDLElBQUksRUFBRUM7UUFDekMsTUFBTUMsa0JBQ0pMLFVBQ0NDLENBQUFBLGlCQUFpQixRQUFRQSxpQkFBaUIsUUFBUUEsaUJBQWlCLE9BQ2hFQSxlQUNBLElBQUc7UUFDVCxNQUFNeEksU0FBU3NJLHNCQUFzQixJQUFJLENBQUNkLE1BQU0sSUFBSW9CO1FBRXBELHNDQUFzQztRQUN0QyxJQUFJNUksT0FBTzZJLFVBQVUsRUFBRTtZQUNyQixJQUFJLENBQUN4TSxJQUFJLEdBQUcyRCxPQUFPNkksVUFBVTtRQUMvQjtRQUVBLEtBQUssTUFBTSxDQUFDMUQsVUFBVTlJLEtBQUssSUFBSW1CLE9BQU9NLE9BQU8sQ0FBQ2tDLE9BQU84SSxTQUFTLEVBQUc7WUFDL0QsTUFBTXpMLE9BQU8sSUFBSSxDQUFDZCxLQUFLLENBQUM2SSxJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRTNILElBQUksS0FBS3lIO1lBQy9DLElBQUk5SCxNQUFNO2dCQUNQQSxLQUF5QmhCLElBQUksR0FBR0E7WUFDbkM7UUFDRjtRQUVBLElBQUksQ0FBQ1csU0FBUyxHQUFHO1lBQUUsR0FBRyxJQUFJLENBQUNBLFNBQVM7WUFBRSxHQUFHZ0QsT0FBT2hELFNBQVM7UUFBQztRQUMxRCxJQUFJLENBQUNDLFdBQVcsR0FBRztZQUFFLEdBQUcsSUFBSSxDQUFDQSxXQUFXO1lBQUUsR0FBRytDLE9BQU8vQyxXQUFXO1FBQUM7UUFFaEUsTUFBTSxJQUFJLENBQUM0SyxJQUFJO0lBQ2pCO0lBRUE7Ozs7OztHQU1DLEdBQ0QsTUFBTWtCLGNBQWNDLE9BSW5CLEVBQWtFO1FBQ2pFLE1BQU0sRUFBRUQsYUFBYSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDdkMsTUFBTUUsVUFBa0U7WUFDdEVuRSxRQUFRLElBQUksQ0FBQzBDLE1BQU07WUFDbkJlLFFBQVFTLFNBQVNULFVBQVU7WUFDM0JXLGVBQWVGLFNBQVNHLHFCQUFxQixRQUFRLElBQUksQ0FBQ0Msb0JBQW9CLEtBQUs3RztZQUNuRjhHLFdBQVdMLFNBQVNLLGFBQWE7UUFDbkM7UUFFQSxNQUFNckosU0FBUyxNQUFNK0ksY0FBY0U7UUFDbkMsSUFBSSxDQUFDSyxVQUFVLENBQUN0SjtRQUNoQixNQUFNLElBQUksQ0FBQzZILElBQUk7UUFDZixPQUFPN0g7SUFDVDtJQUVBOzs7O0dBSUMsR0FDRCxBQUFRb0osdUJBQTZDO1FBQ25ELE1BQU1HLFFBQThCLENBQUM7UUFFckMsSUFBSSxJQUFJLENBQUNsTixJQUFJLEVBQUU7WUFDYmtOLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUN0TixFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQ0ksSUFBSTtRQUN4QztRQUVBLEtBQUssTUFBTWdCLFFBQVEsSUFBSSxDQUFDZCxLQUFLLENBQUU7WUFDN0IsSUFBSWMsS0FBS2hCLElBQUksRUFBRTtnQkFDYmtOLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRWxNLEtBQUtLLElBQUksRUFBRSxDQUFDLEdBQUdMLEtBQUtoQixJQUFJO1lBQ3hDO1FBQ0Y7UUFFQSxLQUFLLE1BQU0sQ0FBQ3NLLFFBQVF0SyxLQUFLLElBQUltQixPQUFPTSxPQUFPLENBQUMsSUFBSSxDQUFDZCxTQUFTLEVBQUc7WUFDM0R1TSxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUU1QyxRQUFRLENBQUMsR0FBR3RLO1FBQzVCO1FBRUEsS0FBSyxNQUFNLENBQUN3QyxXQUFXeEMsS0FBSyxJQUFJbUIsT0FBT00sT0FBTyxDQUFDLElBQUksQ0FBQ2IsV0FBVyxFQUFHO1lBQ2hFc00sS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFMUssV0FBVyxDQUFDLEdBQUd4QztRQUNqQztRQUVBLE9BQU9rTjtJQUNUO0lBRUE7Ozs7R0FJQyxHQUNELEFBQVFELFdBQVd0SixNQUE2RCxFQUFRO1FBQ3RGLElBQUlBLE9BQU82SSxVQUFVLEVBQUU7WUFDckIsSUFBSSxDQUFDeE0sSUFBSSxHQUFHMkQsT0FBTzZJLFVBQVU7UUFDL0I7UUFFQSxLQUFLLE1BQU0sQ0FBQzFELFVBQVU5SSxLQUFLLElBQUltQixPQUFPTSxPQUFPLENBQUNrQyxPQUFPOEksU0FBUyxFQUFHO1lBQy9ELE1BQU16TCxPQUFPLElBQUksQ0FBQ2QsS0FBSyxDQUFDNkksSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUUzSCxJQUFJLEtBQUt5SDtZQUMvQyxJQUFJOUgsTUFBTTtnQkFDUEEsS0FBeUJoQixJQUFJLEdBQUdBO1lBQ25DO1FBQ0Y7UUFFQSxJQUFJLENBQUNXLFNBQVMsR0FBRztZQUFFLEdBQUcsSUFBSSxDQUFDQSxTQUFTO1lBQUUsR0FBR2dELE9BQU9oRCxTQUFTO1FBQUM7UUFDMUQsSUFBSSxDQUFDQyxXQUFXLEdBQUc7WUFBRSxHQUFHLElBQUksQ0FBQ0EsV0FBVztZQUFFLEdBQUcrQyxPQUFPL0MsV0FBVztRQUFDO0lBQ2xFO0lBRUE4SyxjQUNFeUIsUUFBc0MsRUFDdENDLGdCQUE4QyxFQUM5Q0MsV0FBcUIsRUFBRSxFQUNKO1FBQ25CLElBQUlBLFNBQVM5SSxNQUFNLEdBQUcsSUFBSTtZQUN4QixPQUFPLEVBQUU7UUFDWDtRQUVBLE1BQU1qRSxVQUFVNk0sWUFBWSxJQUFJLENBQUM3TSxPQUFPO1FBQ3hDLE1BQU1DLGtCQUFrQjZNLG9CQUFvQixJQUFJLENBQUM3TSxlQUFlO1FBQ2hFLE1BQU0rTSxhQUFhbk0sT0FBT2MsSUFBSSxDQUFDM0I7UUFDL0IsTUFBTWlOLFlBQVlsUCxPQUFPaVAsV0FBV3pFLE9BQU8sQ0FBQyxDQUFDdEgsTUFBUWpCLE9BQU8sQ0FBQ2lCLElBQUk7UUFDakUsNENBQTRDO1FBQzVDLE1BQU1pTSxvQkFBb0JuUCxPQUFPaVAsV0FBV3pFLE9BQU8sQ0FBQyxDQUFDdEgsTUFBUWhCLGVBQWUsQ0FBQ2dCLElBQUksSUFBSSxFQUFFO1FBQ3ZGLE1BQU1rTSxpQkFBaUJwUCxPQUFPO2VBQUlrUDtlQUFjQztTQUFrQjtRQUVsRSxPQUFPLElBQUksQ0FBQ3ROLEtBQUssQ0FBQ2EsR0FBRyxDQUFDLENBQUNDO1lBQ3JCLElBQ0VBLEtBQUs0SSxJQUFJLEtBQUssY0FDZDZELGVBQWUxRSxJQUFJLENBQUMsQ0FBQ3BILElBQU1BLEVBQUUrTCxVQUFVLENBQUMsR0FBRzt1QkFBSUw7b0JBQVVyTSxLQUFLSyxJQUFJO2lCQUFDLENBQUMwQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFDaEY7Z0JBQ0EsTUFBTXVFLFlBQVk1SCxjQUFjNkgsR0FBRyxDQUFDdkcsS0FBS3dHLElBQUk7Z0JBQzdDLE1BQU0yQixXQUFXN0IsVUFBVW9FLGFBQWEsQ0FBQ3BMLFNBQVNDLGlCQUFpQjt1QkFDOUQ4TTtvQkFDSCxHQUFHck0sS0FBS0ssSUFBSSxFQUFFO2lCQUNmO2dCQUVELE9BQU87b0JBQ0xzRixPQUFPM0YsS0FBS0ssSUFBSTtvQkFDaEI4SDtvQkFDQXdFLGdCQUFnQjNNLEtBQUt3RyxJQUFJO29CQUN6QjZGO29CQUNBTyxRQUFRekUsU0FBUzVFLE1BQU0sR0FBRztvQkFDMUJzSixLQUFLMU0sT0FBT0MsV0FBVyxDQUNyQmtNLFdBQVd2TSxHQUFHLENBQUMsQ0FBQ3lCO3dCQUNkLE9BQU87NEJBQUNBOzRCQUFXMkcsU0FBUzRCLEtBQUssQ0FBQyxDQUFDK0MsUUFBVUEsTUFBTUQsR0FBRyxDQUFDckwsVUFBVSxLQUFLO3lCQUFNO29CQUM5RTtvQkFFRnVMLFlBQVk1TSxPQUFPQyxXQUFXLENBQzVCa00sV0FBV3ZNLEdBQUcsQ0FBQyxDQUFDeUI7d0JBQ2QsT0FBTzs0QkFBQ0E7NEJBQVcyRyxTQUFTNEIsS0FBSyxDQUFDLENBQUMrQyxRQUFVQSxNQUFNQyxVQUFVLENBQUN2TCxVQUFVLEtBQUs7eUJBQU07b0JBQ3JGO2dCQUVKO1lBQ0Y7WUFFQSxNQUFNbUUsUUFBUTttQkFBSTBHO2dCQUFVck0sS0FBS0ssSUFBSTthQUFDLENBQUMwQixJQUFJLENBQUM7WUFDNUMsT0FBTztnQkFDTDRELE9BQU8zRixLQUFLSyxJQUFJO2dCQUNoQjhILFVBQVUsRUFBRTtnQkFDWndFLGdCQUFnQjNNLEtBQUs0SSxJQUFJLEtBQUssYUFBYTVJLEtBQUt3RyxJQUFJLEdBQUd0QjtnQkFDdkRtSDtnQkFDQVEsS0FBSzFNLE9BQU9DLFdBQVcsQ0FDckJrTSxXQUFXdk0sR0FBRyxDQUFDLENBQUN5QjtvQkFDZCxNQUFNd0wsZUFBZTFOLE9BQU8sQ0FBQ2tDLFVBQVU7b0JBQ3ZDLE1BQU1xTCxNQUFNRyxhQUFhQyxJQUFJLENBQUMsQ0FBQ3RNO3dCQUM3QixPQUFPQSxNQUFNZ0YsU0FBU2hGLEVBQUUrTCxVQUFVLENBQUMsR0FBRy9HLE1BQU0sQ0FBQyxDQUFDO29CQUNoRDtvQkFDQSxPQUFPO3dCQUFDbkU7d0JBQVdxTDtxQkFBSTtnQkFDekI7Z0JBRUZFLFlBQVk1TSxPQUFPQyxXQUFXLENBQzVCa00sV0FBV3ZNLEdBQUcsQ0FBQyxDQUFDeUI7b0JBQ2QsTUFBTTZJLGlCQUFpQjlLLGVBQWUsQ0FBQ2lDLFVBQVUsSUFBSSxFQUFFO29CQUN2RCxNQUFNdUwsYUFBYTFDLGVBQWU0QyxJQUFJLENBQUMsQ0FBQ3RNO3dCQUN0QyxPQUFPQSxNQUFNZ0YsU0FBU2hGLEVBQUUrTCxVQUFVLENBQUMsR0FBRy9HLE1BQU0sQ0FBQyxDQUFDO29CQUNoRDtvQkFDQSxPQUFPO3dCQUFDbkU7d0JBQVd1TDtxQkFBVztnQkFDaEM7WUFFSjtRQUNGO0lBQ0Y7SUFFQXBDLHlCQUNFRixVQUE2QixFQUM3QmpKLFNBQWlCLEVBQ2pCOEksV0FBb0IsS0FBSyxFQUNmO1FBQ1YsTUFBTTRDLFNBQVM1QyxXQUFXLGVBQWU7UUFDekMsT0FBT0csV0FDSjFLLEdBQUcsQ0FBQyxDQUFDb047WUFDSixJQUFJQSxVQUFVaEYsUUFBUSxDQUFDNUUsTUFBTSxHQUFHLEdBQUc7Z0JBQ2pDLE9BQU8sSUFBSSxDQUFDb0gsd0JBQXdCLENBQUN3QyxVQUFVaEYsUUFBUSxFQUFFM0csV0FBVzhJO1lBQ3RFLE9BQU8sSUFBSTZDLFNBQVMsQ0FBQ0QsT0FBTyxDQUFDMUwsVUFBVSxFQUFFO2dCQUN2QyxPQUFPMkwsVUFBVWQsUUFBUSxDQUFDbkcsTUFBTSxDQUFDaUgsVUFBVXhILEtBQUssRUFBRTVELElBQUksQ0FBQztZQUN6RCxPQUFPO2dCQUNMLE9BQU87WUFDVDtRQUNGLEdBQ0N6QixNQUFNLENBQUM3QixhQUNQMk8sSUFBSTtJQUNUO0lBRUEsTUFBTUMsV0FBV3JOLElBQWdCLEVBQUVzTixFQUFXLEVBQWlCO1FBQzdELElBQUksQ0FBQ0EsSUFBSTtZQUNQLElBQUksQ0FBQ3BPLEtBQUssQ0FBQzRDLElBQUksQ0FBQzlCO1FBQ2xCLE9BQU87WUFDTCxJQUFJLENBQUNkLEtBQUssQ0FBQ3FPLE1BQU0sQ0FBQ0QsSUFBSSxHQUFHdE47UUFDM0I7UUFDQSxNQUFNLElBQUksQ0FBQ3dLLElBQUk7SUFDakI7SUFFQWdELG1CQUFtQkMsV0FBbUIsRUFHbEM7UUFDRixNQUFNQyxNQUFNRCxZQUFZdkssS0FBSyxDQUFDO1FBRTlCLElBQUl5SyxXQUFXLElBQUksQ0FBQy9PLEVBQUU7UUFDdEIsTUFBTStELFNBR0EsRUFBRTtRQUNSLElBQUssSUFBSVcsSUFBSSxHQUFHQSxJQUFJb0ssSUFBSW5LLE1BQU0sRUFBRUQsSUFBSztZQUNuQyxNQUFNd0UsV0FBVzRGLEdBQUcsQ0FBQ3BLLEVBQUU7WUFDdkJYLE9BQU9iLElBQUksQ0FBQztnQkFDVjZMO2dCQUNBN0Y7WUFDRjtZQUVBLE1BQU05SCxPQUFPdEIsY0FBYzZILEdBQUcsQ0FBQ29ILFVBQVV6TyxLQUFLLENBQUM2SSxJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRTNILElBQUksS0FBS3lIO1lBQ3RFLElBQUksQ0FBQzlILE1BQU07Z0JBQ1QsTUFBTSxJQUFJeUQsTUFBTSxHQUFHa0ssU0FBUyxXQUFXLEVBQUVGLGFBQWE7WUFDeEQ7WUFDQSxJQUFJelAsZUFBZWdDLE9BQU87Z0JBQ3hCMk4sV0FBVzNOLEtBQUt3RyxJQUFJO1lBQ3RCO1FBQ0Y7UUFDQSxPQUFPN0Q7SUFDVDtJQUVBLE1BQU1pTCxXQUFXQyxPQUFtQixFQUFFUCxFQUFVLEVBQWlCO1FBQy9ELGNBQWM7UUFDZCxNQUFNUSxVQUFVLElBQUksQ0FBQzVPLEtBQUssQ0FBQ29PLEdBQUcsQ0FBQ2pOLElBQUk7UUFFbkMsVUFBVTtRQUNWLE1BQU0wTixXQUFxQjtZQUFDLElBQUk7U0FBQztRQUVqQyxZQUFZO1FBQ1osSUFBSUQsWUFBWUQsUUFBUXhOLElBQUksRUFBRTtZQUM1Qiw4Q0FBOEM7WUFDOUMsTUFBTTJOLGVBQWV0UCxjQUFjdVAsU0FBUztZQUM1QyxLQUFLLE1BQU1DLGVBQWVGLGFBQWM7Z0JBQ3RDLE1BQU0xSCxZQUFZNUgsY0FBYzZILEdBQUcsQ0FBQzJIO2dCQUNwQyxNQUFNQyxzQkFBc0JoTyxPQUFPYyxJQUFJLENBQUNxRixVQUFVaEgsT0FBTztnQkFDekQsS0FBSyxNQUFNa0MsYUFBYTJNLG9CQUFxQjtvQkFDM0MsTUFBTXpNLFNBQVM0RSxVQUFVaEgsT0FBTyxDQUFDa0MsVUFBVTtvQkFFM0MsMERBQTBEO29CQUMxRCxNQUFNNE0sdUJBQXVCMU0sT0FBTzNCLEdBQUcsQ0FBQyxDQUFDME47d0JBQ3ZDLE1BQU1ZLFdBQVcvSCxVQUFVa0gsa0JBQWtCLENBQUNDO3dCQUM5QyxNQUFNYSxXQUFXRCxTQUFTdE8sR0FBRyxDQUFDLENBQUN3TyxJQUM3QkEsRUFBRXpHLFFBQVEsS0FBS2dHLFdBQVdTLEVBQUVaLFFBQVEsS0FBSyxJQUFJLENBQUMvTyxFQUFFLEdBQzVDO2dDQUNFLEdBQUcyUCxDQUFDO2dDQUNKekcsVUFBVStGLFFBQVF4TixJQUFJOzRCQUN4QixJQUNBa087d0JBRU4sd0JBQXdCO3dCQUN4QixPQUFPRCxTQUFTdk8sR0FBRyxDQUFDLENBQUN3TyxJQUFNQSxFQUFFekcsUUFBUSxFQUFFL0YsSUFBSSxDQUFDO29CQUM5QztvQkFFQSxJQUFJTCxPQUFPSyxJQUFJLENBQUMsU0FBU3FNLHFCQUFxQnJNLElBQUksQ0FBQyxNQUFNO3dCQUN2RHVFLFVBQVVoSCxPQUFPLENBQUNrQyxVQUFVLEdBQUc0TTt3QkFDL0JMLFNBQVNqTSxJQUFJLENBQUN3RTtvQkFDaEI7Z0JBQ0Y7WUFDRjtRQUNGO1FBRUEsUUFBUTtRQUNSLElBQUksQ0FBQ3BILEtBQUssQ0FBQ29PLEdBQUcsR0FBR087UUFFakIsTUFBTVcsUUFBUUMsR0FBRyxDQUFDVixTQUFTaE8sR0FBRyxDQUFDLE9BQU8wSCxTQUFXQSxPQUFPK0MsSUFBSTtJQUM5RDtJQUVBLE1BQU1rRSxRQUFRcEIsRUFBVSxFQUFpQjtRQUN2QyxjQUFjO1FBQ2QsTUFBTVEsVUFBVSxJQUFJLENBQUM1TyxLQUFLLENBQUNvTyxHQUFHLENBQUNqTixJQUFJO1FBRW5DLFVBQVU7UUFDVixNQUFNME4sV0FBcUI7WUFBQyxJQUFJO1NBQUM7UUFFakMsOENBQThDO1FBQzlDLE1BQU1DLGVBQWV0UCxjQUFjdVAsU0FBUztRQUM1QyxLQUFLLE1BQU1DLGVBQWVGLGFBQWM7WUFDdEMsTUFBTTFILFlBQVk1SCxjQUFjNkgsR0FBRyxDQUFDMkg7WUFDcEMsTUFBTUMsc0JBQXNCaE8sT0FBT2MsSUFBSSxDQUFDcUYsVUFBVWhILE9BQU87WUFDekQsS0FBSyxNQUFNa0MsYUFBYTJNLG9CQUFxQjtnQkFDM0MsTUFBTXpNLFNBQVM0RSxVQUFVaEgsT0FBTyxDQUFDa0MsVUFBVTtnQkFDM0MsK0RBQStEO2dCQUMvRCxNQUFNNE0sdUJBQXVCMU0sT0FDMUIzQixHQUFHLENBQUMsQ0FBQzBOO29CQUNKLE1BQU1ZLFdBQVcvSCxVQUFVa0gsa0JBQWtCLENBQUNDO29CQUM5QyxJQUFJWSxTQUFTdEcsSUFBSSxDQUFDLENBQUN3RyxJQUFNQSxFQUFFekcsUUFBUSxLQUFLZ0csV0FBV1MsRUFBRVosUUFBUSxLQUFLLElBQUksQ0FBQy9PLEVBQUUsR0FBRzt3QkFDMUUsT0FBTztvQkFDVCxPQUFPO3dCQUNMLE9BQU82TztvQkFDVDtnQkFDRixHQUNDbk4sTUFBTSxDQUFDN0I7Z0JBRVYsSUFBSWlELE9BQU9LLElBQUksQ0FBQyxTQUFTcU0scUJBQXFCck0sSUFBSSxDQUFDLE1BQU07b0JBQ3ZEdUUsVUFBVWhILE9BQU8sQ0FBQ2tDLFVBQVUsR0FBRzRNO29CQUMvQkwsU0FBU2pNLElBQUksQ0FBQ3dFO2dCQUNoQjtZQUNGO1FBQ0Y7UUFFQSxtQkFBbUI7UUFDbkIsS0FBSyxNQUFNcUksU0FBU2pRLGNBQWM2SCxHQUFHLENBQUMsSUFBSSxDQUFDM0gsRUFBRSxFQUFFUyxPQUFPLENBQUU7WUFDdERzUCxNQUFNN0UsT0FBTyxHQUFHNkUsTUFBTTdFLE9BQU8sQ0FBQ3hKLE1BQU0sQ0FBQyxDQUFDMEosTUFBUUEsSUFBSTNKLElBQUksS0FBS3lOO1FBQzdEO1FBRUEsUUFBUTtRQUNSLElBQUksQ0FBQzVPLEtBQUssQ0FBQ3FPLE1BQU0sQ0FBQ0QsSUFBSTtRQUV0QixNQUFNa0IsUUFBUUMsR0FBRyxDQUFDVixTQUFTaE8sR0FBRyxDQUFDLE9BQU8wSCxTQUFXQSxPQUFPK0MsSUFBSTtJQUM5RDtJQUVBb0UsMkJBQTJCbkIsV0FBbUIsRUFBVTtRQUN0RCxJQUFJQSxZQUFZeE4sUUFBUSxDQUFDLFNBQVMsT0FBTztZQUN2QyxPQUFPLElBQUksQ0FBQ3JCLEVBQUU7UUFDaEI7UUFFQSx3QkFBd0I7UUFDeEIsTUFBTThPLE1BQU1ELFlBQVl2SyxLQUFLLENBQUMsS0FBS1EsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUU3Qyx3Q0FBd0M7UUFDeEMsTUFBTW1MLGVBQWVuQixJQUFJN0gsTUFBTSxDQUFDLENBQUM4SCxVQUFVaEk7WUFDekMsTUFBTW1KLFVBQVVwUSxjQUFjNkgsR0FBRyxDQUFDb0gsVUFBVXpPLEtBQUssQ0FBQzZJLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFM0gsSUFBSSxLQUFLc0Y7WUFDekUsSUFBSSxDQUFDbUosV0FBV0EsUUFBUWxHLElBQUksS0FBSyxZQUFZO2dCQUMzQ21HLFFBQVFDLEtBQUssQ0FBQztvQkFBRXRCO29CQUFLdUIsUUFBUSxJQUFJLENBQUNyUSxFQUFFO29CQUFFK087b0JBQVVoSTtnQkFBTTtnQkFDdEQsTUFBTSxJQUFJbEMsTUFBTSxDQUFDLFNBQVMsRUFBRWdLLGFBQWE7WUFDM0M7WUFDQSxPQUFPcUIsUUFBUXRJLElBQUk7UUFDckIsR0FBRyxJQUFJLENBQUM1SCxFQUFFO1FBQ1YsT0FBT2lRO0lBQ1Q7SUFFQSxNQUFNSyxTQUFTNUIsRUFBVSxFQUFFakwsRUFBVSxFQUFpQjtRQUNwRCxNQUFNckMsT0FBTyxJQUFJLENBQUNkLEtBQUssQ0FBQ29PLEdBQUc7UUFDM0IsTUFBTTZCLFdBQVc7ZUFBSSxJQUFJLENBQUNqUSxLQUFLO1NBQUM7UUFDaENpUSxTQUFTNUIsTUFBTSxDQUFDbEwsSUFBSSxHQUFHckM7UUFDdkJtUCxTQUFTNUIsTUFBTSxDQUFDRCxLQUFLakwsS0FBS2lMLEtBQUtBLEtBQUssR0FBRztRQUN2QyxJQUFJLENBQUNwTyxLQUFLLEdBQUdpUTtRQUViLE1BQU0sSUFBSSxDQUFDM0UsSUFBSTtJQUNqQjtJQUVBOztHQUVDLEdBQ0RyRSxpQkFBaUJSLEtBQWEsRUFBVTtRQUN0QyxJQUFJQSxNQUFNMUYsUUFBUSxDQUFDLE1BQU07WUFDdkIsT0FBTzBGO1FBQ1Q7UUFDQSxPQUFPLEdBQUcsSUFBSSxDQUFDN0csS0FBSyxDQUFDLENBQUMsRUFBRTZHLE9BQU87SUFDakM7SUFFQTs7O0dBR0MsR0FDRHlKLFlBQTJDO1FBQ3pDLE1BQU1sSCxTQUFTLElBQUksQ0FBQy9JLFNBQVMsQ0FBQ1AsRUFBRTtRQUNoQyxJQUFJLENBQUNzSixRQUFRO1lBQ1gsTUFBTSxJQUFJekUsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM3RSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQ2xEO1FBQ0EsSUFBSXNKLE9BQU9VLElBQUksS0FBSyxZQUFZVixPQUFPVSxJQUFJLEtBQUssUUFBUTtZQUN0RCxPQUFPVixPQUFPVSxJQUFJO1FBQ3BCO1FBQ0EsT0FBTztJQUNUO0lBRUE7OztHQUdDLEdBQ0R5RyxZQUF3QjtRQUN0QixNQUFNbkgsU0FBUyxJQUFJLENBQUMvSSxTQUFTLENBQUNQLEVBQUU7UUFDaEMsSUFBSSxDQUFDc0osUUFBUTtZQUNYLE1BQU0sSUFBSXpFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDN0UsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUNsRDtRQUNBLE9BQU9zSjtJQUNUO0lBRUE7OztHQUdDLEdBQ0RsRCxpQkFBeUI7UUFDdkIsTUFBTXNLLFNBQVMsSUFBSSxDQUFDRixTQUFTO1FBQzdCLE9BQU9FLFdBQVcsWUFBWSxhQUFhO0lBQzdDO0FBQ0YifQ==
|