sonamu 0.10.7 → 0.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.js +10 -253
- package/dist/migration/code-generation.js +2 -2
- package/dist/ui-web/assets/{index-D0MHYbxl.js → index-CJf8uJYf.js} +47 -41
- package/dist/ui-web/assets/index-GMMIVGja.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/package.json +3 -3
- package/src/bin/cli.ts +12 -375
- package/src/migration/code-generation.ts +1 -1
- package/dist/ui-web/assets/index-Dx_JX4aQ.css +0 -1
- package/src/skills/AGENTS.md +0 -108
- package/src/skills/sonamu/SKILL.md +0 -75
- package/src/skills/sonamu-ai-agents/SKILL.md +0 -205
- package/src/skills/sonamu-api/SKILL.md +0 -480
- package/src/skills/sonamu-auth/SKILL.md +0 -327
- package/src/skills/sonamu-auth/references/plugins.md +0 -310
- package/src/skills/sonamu-auth/references/user-id-migration-followups.md +0 -192
- package/src/skills/sonamu-auth/references/user-id-migration.md +0 -455
- package/src/skills/sonamu-config/SKILL.md +0 -203
- package/src/skills/sonamu-config/references/database.md +0 -452
- package/src/skills/sonamu-config/references/environments.md +0 -178
- package/src/skills/sonamu-config/references/server-options.md +0 -400
- package/src/skills/sonamu-entity/SKILL.md +0 -180
- package/src/skills/sonamu-entity/references/creation-workflow.md +0 -581
- package/src/skills/sonamu-entity/references/design-guides.md +0 -243
- package/src/skills/sonamu-entity/references/field-types.md +0 -170
- package/src/skills/sonamu-entity/references/relations-detail.md +0 -245
- package/src/skills/sonamu-entity/references/relations.md +0 -463
- package/src/skills/sonamu-entity/references/subset.md +0 -156
- package/src/skills/sonamu-fixture/SKILL.md +0 -180
- package/src/skills/sonamu-fixture/references/cli-usage.md +0 -439
- package/src/skills/sonamu-fixture/references/cone.md +0 -298
- package/src/skills/sonamu-frontend/SKILL.md +0 -142
- package/src/skills/sonamu-frontend/references/components.md +0 -323
- package/src/skills/sonamu-frontend/references/examples.md +0 -64
- package/src/skills/sonamu-frontend/references/hooks.md +0 -273
- package/src/skills/sonamu-frontend/references/runtime.md +0 -165
- package/src/skills/sonamu-frontend/references/scaffolding.md +0 -439
- package/src/skills/sonamu-i18n/SKILL.md +0 -287
- package/src/skills/sonamu-migration/SKILL.md +0 -316
- package/src/skills/sonamu-naite/SKILL.md +0 -266
- package/src/skills/sonamu-query/SKILL.md +0 -48
- package/src/skills/sonamu-query/references/model-patterns.md +0 -390
- package/src/skills/sonamu-query/references/model.md +0 -366
- package/src/skills/sonamu-query/references/puri.md +0 -413
- package/src/skills/sonamu-query/references/search.md +0 -238
- package/src/skills/sonamu-query/references/upsert.md +0 -324
- package/src/skills/sonamu-tasks/SKILL.md +0 -236
- package/src/skills/sonamu-testing/SKILL.md +0 -251
- package/src/skills/sonamu-testing/references/devrunner.md +0 -405
- package/src/skills/sonamu-testing/references/helpers.md +0 -185
- package/src/skills/sonamu-testing/references/patterns.md +0 -263
- package/src/skills/sonamu-testing/references/pitfalls.md +0 -588
- package/src/skills/sonamu-testing/references/quick-start.md +0 -285
- package/src/skills/sonamu-testing/references/type-safety.md +0 -172
- package/src/skills/sonamu-testing/references/writing-plan.md +0 -375
- package/src/skills/sonamu-vector/SKILL.md +0 -222
package/dist/bin/cli.js
CHANGED
|
@@ -16,8 +16,7 @@ import assert from "assert";
|
|
|
16
16
|
import path from "path";
|
|
17
17
|
import knex from "knex";
|
|
18
18
|
import chalk from "chalk";
|
|
19
|
-
import {
|
|
20
|
-
import os from "os";
|
|
19
|
+
import { mkdir, readdir, writeFile } from "fs/promises";
|
|
21
20
|
import { execSync, spawn } from "child_process";
|
|
22
21
|
import { createRequire } from "module";
|
|
23
22
|
import process from "process";
|
|
@@ -196,7 +195,6 @@ async function bootstrap() {
|
|
|
196
195
|
["dev", "web"],
|
|
197
196
|
["start"],
|
|
198
197
|
["skills", "sync"],
|
|
199
|
-
["skills", "index"],
|
|
200
198
|
["test"],
|
|
201
199
|
["auth", "generate"],
|
|
202
200
|
["auth", "add-companions"]
|
|
@@ -227,8 +225,7 @@ async function bootstrap() {
|
|
|
227
225
|
dev_api,
|
|
228
226
|
dev_web,
|
|
229
227
|
start,
|
|
230
|
-
skills_sync,
|
|
231
|
-
skills_index,
|
|
228
|
+
skills_sync: skillsMigrationNotice,
|
|
232
229
|
test: testCommand,
|
|
233
230
|
auth_generate,
|
|
234
231
|
"auth_add-companions": auth_add_companions
|
|
@@ -254,6 +251,13 @@ async function sync() {
|
|
|
254
251
|
else await Sonamu.syncer.sync();
|
|
255
252
|
}
|
|
256
253
|
/**
|
|
254
|
+
* 이전 생성 프로젝트의 postinstall이 업그레이드를 막지 않도록 구 명령만 안전하게 종료합니다.
|
|
255
|
+
*/
|
|
256
|
+
async function skillsMigrationNotice() {
|
|
257
|
+
console.log(chalk.yellow("'sonamu skills sync' is no longer supported."));
|
|
258
|
+
console.log(chalk.cyan("Install Sonamu skills with 'npx skills@latest add cartanova-ai/skills'."));
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
257
261
|
* API 개발 서버를 실행하는 공통 로직입니다.
|
|
258
262
|
* dev_all과 dev_api에서 공유합니다.
|
|
259
263
|
*
|
|
@@ -813,253 +817,6 @@ async function scaffold_view_list(entityId) {
|
|
|
813
817
|
async function scaffold_view_form(entityId) {
|
|
814
818
|
await Sonamu.syncer.generateTemplate("view_form", { entityId });
|
|
815
819
|
}
|
|
816
|
-
/**
|
|
817
|
-
* pnpm sonamu skills sync 하면 실행되는 함수입니다.
|
|
818
|
-
* 공식 Skills를 로컬 프로젝트 또는 글로벌 ~/.claude/로 동기화합니다.
|
|
819
|
-
*
|
|
820
|
-
* --global 플래그: ~/.claude/에 동기화 (프로젝트 생성 전 사용 가능)
|
|
821
|
-
*/
|
|
822
|
-
async function skills_sync() {
|
|
823
|
-
const { flags } = parseCliOptions();
|
|
824
|
-
const isGlobal = flags.has("global");
|
|
825
|
-
const sourceBase = path.resolve(import.meta.dirname, "..", "..", "src", "skills");
|
|
826
|
-
if (!await exists(sourceBase)) {
|
|
827
|
-
console.log(chalk.yellow("Skills source not found in sonamu package."));
|
|
828
|
-
return;
|
|
829
|
-
}
|
|
830
|
-
if (isGlobal) {
|
|
831
|
-
await skills_sync_to(os.homedir(), {
|
|
832
|
-
useSymlink: false,
|
|
833
|
-
sourceBase
|
|
834
|
-
});
|
|
835
|
-
await rm(path.join(os.homedir(), ".claude", "commands", "sonamu-skills.md"), { force: true });
|
|
836
|
-
console.log(chalk.cyan(`\n Global sync complete → ~/.agents/skills/`));
|
|
837
|
-
console.log(chalk.dim(` These skills are available in every agent session.`));
|
|
838
|
-
console.log(chalk.dim(` Once a project is created, run 'pnpm sonamu skills sync' for project-local sync.`));
|
|
839
|
-
} else await skills_sync_to(findProjectRoot(), {
|
|
840
|
-
useSymlink: true,
|
|
841
|
-
createSettings: true,
|
|
842
|
-
sourceBase
|
|
843
|
-
});
|
|
844
|
-
}
|
|
845
|
-
/**
|
|
846
|
-
* 두 경로가 심볼릭 링크를 따라 같은 실체를 가리키는지 확인합니다.
|
|
847
|
-
*/
|
|
848
|
-
async function resolvesToSameDir(a, b) {
|
|
849
|
-
try {
|
|
850
|
-
return await realpath(a) === await realpath(b);
|
|
851
|
-
} catch {
|
|
852
|
-
return false;
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
/**
|
|
856
|
-
* `.claude/<entry>`가 `../.agents/<entry>`를 가리키도록 보장합니다.
|
|
857
|
-
*
|
|
858
|
-
* 원본은 에이전트 중립인 `.agents/`에 두고, Claude Code용 `.claude/`는 심볼릭
|
|
859
|
-
* 링크로만 연결합니다. 이 저장소의 `CLAUDE.md -> AGENTS.md` 규약과 같은 방식입니다.
|
|
860
|
-
* 이미 심볼릭 링크가 아닌 실체가 있으면 사용자 파일일 수 있으므로 건드리지 않습니다.
|
|
861
|
-
*/
|
|
862
|
-
async function linkClaudeEntry(root, relative) {
|
|
863
|
-
if (await resolvesToSameDir(path.join(root, ".claude"), path.join(root, ".agents"))) return false;
|
|
864
|
-
const target = path.join(root, ".claude", relative);
|
|
865
|
-
const source = path.join(root, ".agents", relative);
|
|
866
|
-
let existing;
|
|
867
|
-
try {
|
|
868
|
-
existing = await readlink(target);
|
|
869
|
-
} catch {}
|
|
870
|
-
if (existing === void 0 && await exists(target)) return false;
|
|
871
|
-
await mkdir(path.dirname(target), { recursive: true });
|
|
872
|
-
await rm(target, {
|
|
873
|
-
recursive: true,
|
|
874
|
-
force: true
|
|
875
|
-
});
|
|
876
|
-
await symlink(path.relative(path.dirname(target), source), target, "dir");
|
|
877
|
-
return true;
|
|
878
|
-
}
|
|
879
|
-
/**
|
|
880
|
-
* 스킬을 배치할 프로젝트 루트를 찾습니다.
|
|
881
|
-
*
|
|
882
|
-
* Sonamu 프로젝트는 두 가지 레이아웃이 공존합니다.
|
|
883
|
-
*
|
|
884
|
-
* - `<root>/api` (예: examples/miomock)
|
|
885
|
-
* - `<root>/packages/api` (create-sonamu가 생성하는 레이아웃)
|
|
886
|
-
*
|
|
887
|
-
* `findAppRootPath()`는 api의 부모를 그대로 돌려주므로 후자에서 `<root>/packages`가
|
|
888
|
-
* 나오고, `findWorkspaceRoot()`는 pnpm-workspace.yaml을 찾아 올라가므로 모노레포에
|
|
889
|
-
* 든 프로젝트에서 바깥 저장소가 잡힙니다. api의 부모가 `packages`면 한 단계 더
|
|
890
|
-
* 올라가는 방식으로 두 경우를 모두 맞춥니다.
|
|
891
|
-
*/
|
|
892
|
-
function findProjectRoot() {
|
|
893
|
-
const apiParent = findAppRootPath();
|
|
894
|
-
return path.basename(apiParent) === "packages" ? path.dirname(apiParent) : apiParent;
|
|
895
|
-
}
|
|
896
|
-
/**
|
|
897
|
-
* 구버전이 남긴 `skills/sonamu` 평면 디렉토리를 제거합니다.
|
|
898
|
-
*
|
|
899
|
-
* 예전에는 모든 스킬 문서를 `skills/sonamu/*.md` 한 디렉토리에 복사했습니다.
|
|
900
|
-
* 지금은 `sonamu`가 라우팅 테이블을 담은 루트 스킬 이름이라 경로가 겹치는데,
|
|
901
|
-
* 남아 있는 구버전 디렉토리에는 삭제된 문서를 가리키는 옛 SKILL.md가 들어 있어
|
|
902
|
-
* 그대로 두면 낡은 라우팅 테이블이 스킬로 계속 로드됩니다.
|
|
903
|
-
*
|
|
904
|
-
* 심볼릭 링크는 정상 배치 경로에서 처리하므로 건드리지 않습니다. 최상위에
|
|
905
|
-
* SKILL.md 외의 `.md`가 있으면 구버전 산출물로 판정합니다 — 새 루트 스킬은
|
|
906
|
-
* SKILL.md 하나만 가집니다.
|
|
907
|
-
*/
|
|
908
|
-
async function removeLegacyFlatSkillDir(root) {
|
|
909
|
-
for (const base of [".agents", ".claude"]) {
|
|
910
|
-
const target = path.join(root, base, "skills", "sonamu");
|
|
911
|
-
try {
|
|
912
|
-
await readlink(target);
|
|
913
|
-
continue;
|
|
914
|
-
} catch {}
|
|
915
|
-
if (!await exists(target)) continue;
|
|
916
|
-
let entries;
|
|
917
|
-
try {
|
|
918
|
-
entries = await readdir(target);
|
|
919
|
-
} catch {
|
|
920
|
-
continue;
|
|
921
|
-
}
|
|
922
|
-
if (!entries.some((e) => e.endsWith(".md") && e !== "SKILL.md")) continue;
|
|
923
|
-
await rm(target, {
|
|
924
|
-
recursive: true,
|
|
925
|
-
force: true
|
|
926
|
-
});
|
|
927
|
-
console.log(chalk.yellow(`✓ Removed legacy ${base}/skills/sonamu (flat layout)`));
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
/**
|
|
931
|
-
* 배치 대상 스킬 디렉토리를 나열합니다.
|
|
932
|
-
*
|
|
933
|
-
* 에이전트는 `skills/<name>/SKILL.md` 단위로 스킬을 인식하므로,
|
|
934
|
-
* SKILL.md를 가진 디렉토리만 대상으로 삼습니다.
|
|
935
|
-
*/
|
|
936
|
-
async function listSkillDirs(sourceBase) {
|
|
937
|
-
if (!sourceBase || !await exists(sourceBase)) return [];
|
|
938
|
-
const entries = await readdir(sourceBase, { withFileTypes: true });
|
|
939
|
-
const result = [];
|
|
940
|
-
for (const entry of entries) {
|
|
941
|
-
if (!entry.isDirectory() || !entry.name.startsWith("sonamu")) continue;
|
|
942
|
-
const source = path.join(sourceBase, entry.name);
|
|
943
|
-
if (!await exists(path.join(source, "SKILL.md"))) continue;
|
|
944
|
-
result.push({
|
|
945
|
-
source,
|
|
946
|
-
name: entry.name
|
|
947
|
-
});
|
|
948
|
-
}
|
|
949
|
-
return result.sort((a, b) => a.name.localeCompare(b.name));
|
|
950
|
-
}
|
|
951
|
-
/**
|
|
952
|
-
* 프로젝트(또는 홈) 루트에 skills를 동기화하는 공통 로직입니다.
|
|
953
|
-
*
|
|
954
|
-
* 원본은 `.agents/`에 두고 `.claude/`에는 심볼릭 링크만 겁니다.
|
|
955
|
-
*/
|
|
956
|
-
async function skills_sync_to(root, options) {
|
|
957
|
-
const agentsDir = path.join(root, ".agents");
|
|
958
|
-
const skillsRoot = path.join(agentsDir, "skills");
|
|
959
|
-
await mkdir(skillsRoot, { recursive: true });
|
|
960
|
-
await removeLegacyFlatSkillDir(root);
|
|
961
|
-
const targets = await listSkillDirs(options.sourceBase);
|
|
962
|
-
for (const { source, name } of targets) {
|
|
963
|
-
const targetDir = path.join(skillsRoot, name);
|
|
964
|
-
try {
|
|
965
|
-
await rm(targetDir, {
|
|
966
|
-
recursive: true,
|
|
967
|
-
force: true
|
|
968
|
-
});
|
|
969
|
-
} catch {}
|
|
970
|
-
if (options.useSymlink) try {
|
|
971
|
-
await symlink(source, targetDir, "dir");
|
|
972
|
-
} catch (error) {
|
|
973
|
-
console.log(chalk.yellow(`⚠ Symlink failed (${name}): ${error instanceof Error ? error.message : String(error)}`));
|
|
974
|
-
console.log(chalk.yellow(` Falling back to copy...`));
|
|
975
|
-
await skillsCopy(source, targetDir);
|
|
976
|
-
}
|
|
977
|
-
else await skillsCopy(source, targetDir);
|
|
978
|
-
await linkClaudeEntry(root, path.join("skills", name));
|
|
979
|
-
}
|
|
980
|
-
console.log(chalk.green(`✓ Skills ${options.useSymlink ? "linked" : "copied"} → .agents/skills/ (${targets.length}): ${targets.map((t) => t.name).join(", ")}`));
|
|
981
|
-
console.log(chalk.dim(` .claude/skills/* symlinked for Claude Code`));
|
|
982
|
-
if (options.createSettings) {
|
|
983
|
-
await mkdir(path.join(root, ".claude"), { recursive: true });
|
|
984
|
-
const settingsLocalPath = path.join(root, ".claude", "settings.local.json");
|
|
985
|
-
if (!await exists(settingsLocalPath)) try {
|
|
986
|
-
await writeFile(settingsLocalPath, `${JSON.stringify({ hooks: { PostToolUse: [{
|
|
987
|
-
matcher: "Edit|Write|MultiEdit",
|
|
988
|
-
hooks: [{
|
|
989
|
-
type: "command",
|
|
990
|
-
command: "pnpm check 2>&1 | head -60"
|
|
991
|
-
}]
|
|
992
|
-
}] } }, null, 2)}\n`);
|
|
993
|
-
console.log(chalk.green(`✓ .claude/settings.local.json created`));
|
|
994
|
-
} catch (error) {
|
|
995
|
-
console.error(chalk.red(`✗ Failed to create settings.local.json: ${error instanceof Error ? error.message : String(error)}`));
|
|
996
|
-
}
|
|
997
|
-
else console.log(chalk.dim(`⏭ .claude/settings.local.json already exists (preserved)`));
|
|
998
|
-
}
|
|
999
|
-
console.log(chalk.dim(`\n To also write the skill index into this project's AGENTS.md, run 'sonamu skills index'.`));
|
|
1000
|
-
}
|
|
1001
|
-
/**
|
|
1002
|
-
* 루트 스킬(`sonamu`)의 라우팅 테이블과 공통 규약을 프로젝트 AGENTS.md에 씁니다.
|
|
1003
|
-
*
|
|
1004
|
-
* 개별 스킬의 description은 각자의 발동 순간에만 걸리므로, 어느 스킬에도 맞지
|
|
1005
|
-
* 않는 작업에서는 아무것도 안 걸립니다. 상시 로드되는 AGENTS.md에 인덱스를 두면
|
|
1006
|
-
* 그 공백을 메울 수 있습니다.
|
|
1007
|
-
*
|
|
1008
|
-
* 다만 사용자의 에이전트 프롬프트 파일을 고치는 동작이므로 `skills sync`에
|
|
1009
|
-
* 포함하지 않고, 사용자가 명시적으로 실행할 때만 수행합니다.
|
|
1010
|
-
* `<!-- SONAMU:START -->` ~ `<!-- SONAMU:END -->` 구간만 갱신하며 나머지는 보존합니다.
|
|
1011
|
-
*/
|
|
1012
|
-
async function skills_index() {
|
|
1013
|
-
const appRoot = findProjectRoot();
|
|
1014
|
-
const sourceBase = path.resolve(import.meta.dirname, "..", "..", "src", "skills");
|
|
1015
|
-
const rootSkill = path.join(sourceBase, "sonamu", "SKILL.md");
|
|
1016
|
-
if (!await exists(rootSkill)) {
|
|
1017
|
-
console.log(chalk.yellow("Root skill not found in sonamu package."));
|
|
1018
|
-
return;
|
|
1019
|
-
}
|
|
1020
|
-
const body = (await readFile(rootSkill, "utf-8")).replace(/^---\n[\s\S]*?\n---\n+/, "");
|
|
1021
|
-
const startMarker = "<!-- SONAMU:START -->";
|
|
1022
|
-
const endMarker = "<!-- SONAMU:END -->";
|
|
1023
|
-
const section = `${startMarker}\n${body.trim()}\n${endMarker}`;
|
|
1024
|
-
const targetPath = path.join(appRoot, "AGENTS.md");
|
|
1025
|
-
const existing = await exists(targetPath) ? await readFile(targetPath, "utf-8") : void 0;
|
|
1026
|
-
let next;
|
|
1027
|
-
let action;
|
|
1028
|
-
if (existing === void 0) {
|
|
1029
|
-
next = `${section}\n`;
|
|
1030
|
-
action = "created";
|
|
1031
|
-
} else {
|
|
1032
|
-
const startIdx = existing.indexOf(startMarker);
|
|
1033
|
-
const endIdx = existing.indexOf(endMarker);
|
|
1034
|
-
if (startIdx !== -1 && endIdx !== -1 && startIdx < endIdx) {
|
|
1035
|
-
next = existing.slice(0, startIdx) + section + existing.slice(endIdx + 19);
|
|
1036
|
-
action = "updated";
|
|
1037
|
-
} else {
|
|
1038
|
-
next = `${existing.trimEnd()}\n\n${section}\n`;
|
|
1039
|
-
action = "appended";
|
|
1040
|
-
}
|
|
1041
|
-
}
|
|
1042
|
-
if (next === existing) {
|
|
1043
|
-
console.log(chalk.dim(`⏭ AGENTS.md already up to date`));
|
|
1044
|
-
return;
|
|
1045
|
-
}
|
|
1046
|
-
await writeFile(targetPath, next);
|
|
1047
|
-
console.log(chalk.green(`✓ AGENTS.md ${action} (Sonamu marker region)`));
|
|
1048
|
-
if (!await exists(path.join(appRoot, "CLAUDE.md"))) {
|
|
1049
|
-
await symlink("AGENTS.md", path.join(appRoot, "CLAUDE.md"));
|
|
1050
|
-
console.log(chalk.dim(` CLAUDE.md → AGENTS.md`));
|
|
1051
|
-
}
|
|
1052
|
-
console.log(chalk.dim(` Remove the marker region to undo.`));
|
|
1053
|
-
}
|
|
1054
|
-
async function skillsCopy(src, dest) {
|
|
1055
|
-
try {
|
|
1056
|
-
await cp(src, dest, { recursive: true });
|
|
1057
|
-
console.log(chalk.green(`✓ Skills copied`));
|
|
1058
|
-
} catch (copyError) {
|
|
1059
|
-
console.error(chalk.red(`✗ Failed to copy skills: ${copyError instanceof Error ? copyError.message : String(copyError)}`));
|
|
1060
|
-
throw copyError;
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
820
|
async function auth_generate() {
|
|
1064
821
|
const pluginsArg = process.argv.find((arg) => arg.startsWith("--plugins"));
|
|
1065
822
|
const plugins = [];
|
|
@@ -1092,4 +849,4 @@ async function auth_add_companions() {
|
|
|
1092
849
|
//#endregion
|
|
1093
850
|
export {};
|
|
1094
851
|
|
|
1095
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7XG4gIGNwLFxuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHJlYWRsaW5rLFxuICByZWFscGF0aCxcbiAgcm0sXG4gIHN5bWxpbmssXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBrbmV4IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgdHNpY2xpIH0gZnJvbSBcInRzaWNsaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgYWRkQ29tcGFuaW9uc1RvRW50aXRpZXMsIGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzIH0gZnJvbSBcIi4uL2F1dGgvYXV0aC1nZW5lcmF0b3JcIjtcbmltcG9ydCB7IGlzVmFsaWRQbHVnaW5JZCwgU1VQUE9SVEVEX1BMVUdJTl9JRFMgfSBmcm9tIFwiLi4vYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBCZXR0ZXJBdXRoUGx1Z2luSWQgfSBmcm9tIFwiLi4vYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgZXhlY1dpdGhMaW5lUHJlZml4LFxuICBwcmludEJ1aWxkU3VtbWFyeSxcbiAgcHJpbnRUYXNrRmFpbGVkLFxuICBwcmludFRhc2tIZWFkZXIsXG4gIHByaW50VGFza1N0YXJ0LFxuICBwcmludFRhc2tTdWNjZXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCwgZmluZEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBBUElfQVJUSUZBQ1RTLCBXRUJfQVJUSUZBQ1RTIH0gZnJvbSBcIi4vYnVpbGQtY29uZmlnXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWxkQXJ0aWZhY3QgfSBmcm9tIFwiLi9idWlsZC1jb25maWdcIjtcbmltcG9ydCB7IGZpeHR1cmVFeHBsb3JlQ29tbWFuZCwgZml4dHVyZUZldGNoQ29tbWFuZCwgZml4dHVyZUdlbkNvbW1hbmQgfSBmcm9tIFwiLi9maXh0dXJlXCI7XG5pbXBvcnQgeyBnZXRNaWdyYXRlUnVuVGFyZ2V0cyB9IGZyb20gXCIuL21pZ3JhdGUtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tIFwiLi90ZXN0LWNvbW1hbmRcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuLyoqXG4gKiBDTEkg7Ji17IWY7J2EIO2MjOyLse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2xpT3B0aW9ucyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndik6IHtcbiAgZmxhZ3M6IFNldDxzdHJpbmc+OyAvLyAtLXJlZ2VuZXJhdGUsIC0tYWksIC0tbm8tY29uZXMg65OxXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IC8vIC0tbG9jYWxlIGtvIOuTsVxufSB7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkgY29udGludWU7XG5cbiAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi51cbiAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJnLnNsaWNlKDIpLnNwbGl0KFwiPVwiKTtcbiAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduFxuICAgIGNvbnN0IG5leHRBcmcgPSBhcmd2W2kgKyAxXTtcbiAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIG9wdGlvbnNbYXJnLnNsaWNlKDIpXSA9IG5leHRBcmc7XG4gICAgICBpKys7IC8vIOuLpOydjCBhcmfripQg6rCS7J2066+A66GcIOyKpO2CtVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtLWZsYWcg7ZiV7IudXG4gICAgICBmbGFncy5hZGQoYXJnLnNsaWNlKDIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmbGFncywgb3B0aW9ucyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIiwgXCJ0ZXN0XCJdLmluY2x1ZGVzKHByb2Nlc3MuYXJndlsyXSA/PyBcIlwiKTtcbiAgaWYgKCFub3RUb0luaXQpIHtcbiAgICBhd2FpdCBTb25hbXUuaW5pdChmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyB0c2ljbGnripQg7KCV7ZmV7ZWcIOuqheugueyWtCDrp6Tsua3rp4wg7KeA7JuQ7ZWY66+A66GcLCAtLeuhnCDsi5zsnpHtlZjripQg7Ji17IWY6rO8IOq3uCDqsJLsnYQg7ZWE7YSw66eB7ZWp64uI64ukLlxuICAgIC8vIOyYteyFmCDtjIzsi7HsnYAg6rCBIHJ1bm5lciDtlajsiJjsl5DshJwg7JuQ67O4IHByb2Nlc3MuYXJnduulvCDsgqzsmqntlZjsl6wg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIFwiLS1cIihiYXJlIGRvdWJsZSBkYXNoKeuKlCBwYXNzdGhyb3VnaCDqtazrtoTsnpDsnbTrr4DroZwsIOq3uCDrkqTsnZgg66qo65OgIOyduOyekOuPhCDsoJzsmbjtlanri4jri6QuXG4gICAgY29uc3QgZmlsdGVyZWRBcmd2OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBza2lwTmV4dCA9IGZhbHNlO1xuICAgIGxldCBhZnRlckRvdWJsZURhc2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYXJnID0gcHJvY2Vzcy5hcmd2W2ldO1xuICAgICAgaWYgKGFyZyA9PT0gXCItLVwiKSB7XG4gICAgICAgIGFmdGVyRG91YmxlRGFzaCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFmdGVyRG91YmxlRGFzaCkgY29udGludWU7XG4gICAgICBpZiAoc2tpcE5leHQpIHtcbiAgICAgICAgc2tpcE5leHQgPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi53snYAg7J20IGFyZ+unjCDsiqTtgrVcbiAgICAgICAgaWYgKGFyZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAtLW9wdGlvbiB2YWx1ZSDtmJXsi53snbjsp4Ag7ZmV7J24OiDri6TsnYwgYXJn6rCAIC0t66GcIOyLnOyeke2VmOyngCDslYrsnLzrqbQg6rCS7J20IOyeiOuKlCDqsoNcbiAgICAgICAgY29uc3QgbmV4dEFyZyA9IHByb2Nlc3MuYXJndltpICsgMV07XG4gICAgICAgIGlmIChuZXh0QXJnICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItLVwiKSAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIHNraXBOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKGFyZyk7XG4gICAgfVxuXG4gICAgLy8gYnVpbGQvZGV2IOuqheugueyWtOqwgCDshJzruIzsu6Trp6jrk5wg7JeG7J20IO2YuOy2nOuQoCDrlYwgXCJhbGxcIuydhCDquLDrs7jqsJLsnLzroZwg7LaU6rCA7ZWp64uI64ukLlxuICAgIC8vIOyYiDogYHNvbmFtdSBidWlsZGAg4oaSIGBzb25hbXUgYnVpbGQgYWxsYCwgYHNvbmFtdSBkZXZgIOKGkiBgc29uYW11IGRldiBhbGxgXG4gICAgY29uc3QgY21kID0gZmlsdGVyZWRBcmd2WzJdO1xuICAgIGlmICgoY21kID09PSBcImJ1aWxkXCIgfHwgY21kID09PSBcImRldlwiKSAmJiBmaWx0ZXJlZEFyZ3YubGVuZ3RoID09PSAzKSB7XG4gICAgICBmaWx0ZXJlZEFyZ3YucHVzaChcImFsbFwiKTtcbiAgICB9XG5cbiAgICAvLyB0ZXN0IOy7pOunqOuTnOuKlCDqsIDrs4Ag7J247J6QKO2MjOydvOuqhSwgLS1wYXR0ZXJuIOuTsSnrpbwg67Cb7Jy866+A66GcIHRzaWNsaeulvCDsmrDtmoztlanri4jri6QuXG4gICAgaWYgKGNtZCA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybiB0ZXN0Q29tbWFuZCgpO1xuICAgIH1cblxuICAgIGF3YWl0IHRzaWNsaShmaWx0ZXJlZEFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcIiN0YXJnZXRzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgICAgbmFtZTogXCIjdGFyZ2V0c1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICN0YXJnZXRzXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogXCJEZXZlbG9wbWVudFwiLCB2YWx1ZTogXCJkZXZlbG9wbWVudFwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlN0YWdpbmdcIiwgdmFsdWU6IFwic3RhZ2luZ1wiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlByb2R1Y3Rpb25cIiwgdmFsdWU6IFwicHJvZHVjdGlvblwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmVcIiwgdmFsdWU6IFwiZml4dHVyZVwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlRlc3RcIiwgdmFsdWU6IFwidGVzdFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJnZW5cIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJmZXRjaFwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImV4cGxvcmVcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJhcHBseVwiLCBcIiN0YXJnZXRzXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwiZ2VuZXJhdGVcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJwcmFjdGljZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwiZW50aXR5XCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxfdGVzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2xpc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJjb25lXCIsIFwiZ2VuXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzeW5jXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJhcGlcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJhbGxcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJzdGFydFwiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwiaW5kZXhcIl0sXG4gICAgICAgIFtcInRlc3RcIl0sXG4gICAgICAgIFtcImF1dGhcIiwgXCJnZW5lcmF0ZVwiXSxcbiAgICAgICAgW1wiYXV0aFwiLCBcImFkZC1jb21wYW5pb25zXCJdLFxuICAgICAgXSxcbiAgICAgIHJ1bm5lcnM6IHtcbiAgICAgICAgbWlncmF0ZV9zdGF0dXMsXG4gICAgICAgIG1pZ3JhdGVfcnVuLFxuICAgICAgICBtaWdyYXRlX2FwcGx5LFxuICAgICAgICBtaWdyYXRlX2dlbmVyYXRlLFxuICAgICAgICBmaXh0dXJlX2luaXQsXG4gICAgICAgIGZpeHR1cmVfaW1wb3J0LFxuICAgICAgICBmaXh0dXJlX3N5bmMsXG4gICAgICAgIGZpeHR1cmVfZ2VuLFxuICAgICAgICBmaXh0dXJlX2ZldGNoLFxuICAgICAgICBmaXh0dXJlX2V4cGxvcmUsXG4gICAgICAgIHN0dWJfcHJhY3RpY2UsXG4gICAgICAgIHN0dWJfZW50aXR5LFxuICAgICAgICBzY2FmZm9sZF9tb2RlbCxcbiAgICAgICAgc2NhZmZvbGRfbW9kZWxfdGVzdCxcbiAgICAgICAgc2NhZmZvbGRfdmlld19saXN0LFxuICAgICAgICBzY2FmZm9sZF92aWV3X2Zvcm0sXG4gICAgICAgIGNvbmVfZ2VuLFxuICAgICAgICBzeW5jLFxuICAgICAgICBidWlsZF9hbGwsXG4gICAgICAgIGJ1aWxkX2FwaSxcbiAgICAgICAgYnVpbGRfd2ViLFxuICAgICAgICBkZXZfYWxsLFxuICAgICAgICBkZXZfYXBpLFxuICAgICAgICBkZXZfd2ViLFxuICAgICAgICBzdGFydCxcbiAgICAgICAgc2tpbGxzX3N5bmMsXG4gICAgICAgIHNraWxsc19pbmRleCxcbiAgICAgICAgdGVzdDogdGVzdENvbW1hbmQsXG4gICAgICAgIGF1dGhfZ2VuZXJhdGUsXG4gICAgICAgIFwiYXV0aF9hZGQtY29tcGFuaW9uc1wiOiBhdXRoX2FkZF9jb21wYW5pb25zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICpcbiAqIGAtLWZvcmNlYCDsmLXshZjsnbQg7KO87Ja07KeA66m0IGxvY2vsnYQg66y07Iuc7ZWY6rOgIO2SgC3si7Htgazrpbwg7IiY7ZaJ7ZWp64uI64ukLlxuICogZ2l0IHBvc3QtbWVyZ2UgaG9va+ydtOuCmCBDSeyXkOyEnCDrp6QgcHVsbCDtm4Qg7J6Q64+ZIOyLpO2Wie2VoCDsiJgg7J6I64+E66GdIOuFuOy2nC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luYygpIHtcbiAgY29uc3QgeyBmbGFncyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG4gIGlmIChmbGFncy5oYXMoXCJmb3JjZVwiKSkge1xuICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuZm9yY2VTeW5jKCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgU29uYW11LnN5bmNlci5zeW5jKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkg6rCc67CcIOyEnOuyhOulvCDsi6TtlontlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqIGRldl9hbGzqs7wgZGV2X2FwaeyXkOyEnCDqs7XsnKDtlanri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvdHMtbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG1yLWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L3RzLWxvYWRlcuyZgCBAc29uYW11LWtpdC9obXItaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBzcGF3bkFwaURldlNlcnZlcihvcHRpb25zPzogeyBleHRyYUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9obXItcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG1yLWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG9vayxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1lbmFibGUtc291cmNlLW1hcHNcIiwgLy8g6re466as6rOgIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZWcIO2UjOuemOq3uOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9cjpyZXN0YXJ0OlJlc3RhcnQgc2VydmVyXCIsIC8vIHIg64iE66W066m0IOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuICAgICAgXCItLW9uLWtleT1jOmNsZWFyOkNsZWFyIHNjcmVlblwiLCAvLyBjIOuIhOultOuptCDthLDrr7jrhJAg7ZmU66m07J2EIOyngOybjOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBsb2NrIOygnOqxsCDtm4Qg7J6s7Iuc7J6RIOKGkiDsg4gg7ZSE66Gc7IS47Iqk6rCAIOu2gO2KuOyKpO2KuOueqeyXkOyEnCDtkoAt7Iux7YGsLiBmb3JjZSBzeW5jIENMSeulvCBzaGVsbOuhnCDrtoDrpbTrqbQg7IK07JWE7J6I64qUIOyEnOuyhOydmCB3YXRjaGVyIO2Pre2SjeydtCA6cmVzdGFydOyZgCDstqnrj4ztlbQg7IOB7YOcIOydtOyDgS5cblxuICAgICAgXCItLW9uLWtleT1lbnRlcjpzaGVsbChlY2hvIGhpKTpLZXkgYmluZGluZyB0ZXN0XCIsIC8vIGVudGVy66W8IGtleeuhnCDsk7gg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9Y3RybCtmIGN0cmwrZjpzaGVsbChnaXQgcHVsbCAmJiBwbnBtIGluc3RhbGwgJiYgcG5wbSAtLWZpbHRlciBzb25hbXUgYnVpbGQgJiYgZWNobyAnU29uYW11IGlzIG5vdyB1cC10by1kYXRlIScpOnJlc3RhcnQ6UHVsbCAmIGluc3RhbGwgJiBidWlsZCAmIHJlc3RhcnRcIiwgLy8gbW9kaWZpZXLsmYDsnZgg7KGw7ZWpLCDqt7jrpqzqs6Ag65GQIOqwnOydmCBjaG9yZOulvCDsgqzsmqntlaAg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIGVudHJ5UG9pbnQsIC8vIOuniOyngOunieycvOuhnCDsi6TsoJwg7Iuk7ZaJ7ZWgIOyKpO2BrOumve2KuOydmCDqsr3roZzrpbwg64SY6rKo7KSN64uI64ukLlxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz8gXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsIC8vIOyWmOqwgCDsnojslrTslbwgSE1S7J20IO2ZnOyEse2ZlOuQqeuLiOuLpC5cbiAgICAgICAgQVBJX1JPT1RfUEFUSDogYXBpUm9vdCwgLy8g7J20IOqyveuhnOqwgCBobXItaG9va+ydmCDro6jtirgg65SU66CJ7Yag66as6rCAIOuQqeuLiOuLpC5cbiAgICAgICAgLi4ub3B0aW9ucz8uZXh0cmFFbnYsXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgLy8g7KKF66OMIOyymOumrFxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlxcblxcbvCfkYsgU2h1dHRpbmcgZG93bi4uLlwiKSk7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgY2xlYW51cCk7XG5cbiAgc2VydmVyUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFNlcnZlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoY29kZSB8fCAxKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gZGV2IC8gcG5wbSBkZXYgYWxsIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq47JeQIOuMgO2VtCBITVIg7KeA7JuQ7ZWY64qUIOqwnOuwnCDshJzrsoTrpbwg652E7JuM7KSN64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRldl9hbGwoKSB7XG4gIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gIGNvbnN0IHsgdmVyc2lvbiB9ID0gcmVxdWlyZShcIi4uLy4uL3BhY2thZ2UuanNvblwiKTtcbiAgY29uc29sZS5sb2coYPCfjLIgU29uYW11IHYke3ZlcnNpb259XFxuYCk7XG4gIHNwYXduQXBpRGV2U2VydmVyKCk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgYXBpIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogQVBJIOyghOyaqSDqsJzrsJwg7ISc67KE66W8IOudhOybgeuLiOuLpC5cbiAqIGRldl9hbGzqs7wg6rGw7J2YIOuPmeydvO2VmOuQmCwg7Ya17ZWpIOybuSDshJzrsoTrpbwg67mE7Zmc7ISx7ZmU7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRldl9hcGkoKSB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwiU3RhcnRpbmcgU29uYW11IEFQSS1vbmx5IGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuICBzcGF3bkFwaURldlNlcnZlcih7XG4gICAgZXh0cmFFbnY6IHsgU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI6IFwieWVzXCIgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogVml0ZSDqsJzrsJwg7ISc67KE66W8IOuLqOuPheycvOuhnCDsi6Ttlontlanri4jri6QuXG4gKiAtLSDrkqTsnZgg7J247J6Q64qUIFZpdGXsl5Ag6re464yA66GcIOyghOuLrOuQqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXZfd2ViKCkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdlYiDrlJTroInthqDrpqzrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7d2ViUGF0aH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyAtLSDrkqTsnZgg7J247J6QIOy2lOy2nFxuICBjb25zdCBkb3VibGVEYXNoSW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZihcIi0tXCIpO1xuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBkb3VibGVEYXNoSW5kZXggIT09IC0xID8gcHJvY2Vzcy5hcmd2LnNsaWNlKGRvdWJsZURhc2hJbmRleCArIDEpIDogW107XG5cbiAgY29uc3Qgdml0ZUFyZ3MgPSBbXCJleGVjXCIsIFwidml0ZVwiLCAuLi5wYXNzdGhyb3VnaEFyZ3NdO1xuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwiU3RhcnRpbmcgVml0ZSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcblxuICBjb25zdCB2aXRlUHJvY2VzcyA9IHNwYXduKFwicG5wbVwiLCB2aXRlQXJncywge1xuICAgIGN3ZDogd2ViUGF0aCxcbiAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gIH0pO1xuXG4gIHZpdGVQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDApO1xuICB9KTtcblxuICAvLyBTSUdJTlQvU0lHVEVSTSDsi5wgVml0ZSDtlITroZzshLjsiqTrpbwgZ3JhY2VmdWxseSDsooXro4ztlanri4jri6QuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFtcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIl0gYXMgY29uc3QpIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgdml0ZVByb2Nlc3Mua2lsbChzaWduYWwpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQVBJIOu5jOuTnCDshKTsoJUg7YyM7J28IOqyveuhnOulvCDqsrDsoJXtlanri4jri6QuXG4gKiDtlITroZzsoJ3tirgg66Oo7Yq47JeQIGB0c2Rvd24uY29uZmlnLnRzYOqwgCDsnojsnLzrqbQg6re46rKD7J2ELCDsl4bsnLzrqbQgc29uYW11IOq4sOuzuCDshKTsoJXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpQnVpbGRDb25maWdQYXRoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRzZG93bi5jb25maWcudHNcIik7XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKGxvY2FsQ29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIHRzZG93bi5jb25maWcudHMgZnJvbSBwcm9qZWN0IHJvb3QuLi5cIikpO1xuICAgICAgcmV0dXJuIGxvY2FsQ29uZmlnUGF0aDtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyBkZWZhdWx0IHRzZG93biBBUEkgY29uZmlnIGZyb20gc29uYW11IHBhY2thZ2UuLi5cIikpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwidHNkb3duLmFwaS5jb25maWcudHNcIik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJTZXR0aW5nIHVwIEFQSSBidWlsZCBjb25maWcgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHNvbmFtdSBidWlsZCAvIHNvbmFtdSBidWlsZCBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBidWlsZF9hcGkgKyBidWlsZF93ZWLsnZgg7ZWp7ISx7J6F64uI64ukLiBXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuptCBXZWIg67mM65Oc66W8IOyKpO2Cte2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYWxsKCkge1xuICBhd2FpdCBidWlsZF9hcGkoKTtcbiAgYXdhaXQgYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FwaSgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCBjb25maWdGaWxlUGF0aCA9IGF3YWl0IHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoKTtcblxuICBjb25zdCBhcGlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgQVBJX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHsgY29uZmlnRmlsZVBhdGggfSB9KTtcbiAgICB9XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJBUElcIiwgdHJ1ZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIHdlYiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIFdlYiDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX3dlYih7IHNraXBJZk1pc3NpbmcgPSBmYWxzZSB9ID0ge30pIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3QsIFwid2ViXCIpO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJQYXRoKSkpIHtcbiAgICBpZiAoc2tpcElmTWlzc2luZykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIldlYiDrlJTroInthqDrpqzqsIAg7JeG7Jy866+A66GcIFdlYiDruYzrk5zrpbwg6rG064SI65yB64uI64ukLlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoYHdlYiDrlJTroInthqDrpqzrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7d2ViUGF0aH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCB3ZWJTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgV0VCX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHt9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCB0cnVlLCBEYXRlLm5vdygpIC0gd2ViU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gd2ViU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHByZS1idWlsZCwgYnVpbGQsIHBvc3QtYnVpbGQg64uo6rOE66W8IOyInOywqOyggeycvOuhnCDsi6Ttlontlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHM8VD4oXG4gIGFydGlmYWN0OiBCdWlsZEFydGlmYWN0PFQ+LFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nOyBidWlsZENvbW1hbmRBcmdzOiBUIH0sXG4pIHtcbiAgY29uc3Qgc3RlcHMgPSBbXG4gICAgeyBuYW1lOiBcInByZS1idWlsZFwiLCBjbWQ6IGFydGlmYWN0LnByZUJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgICB7IG5hbWU6IFwiYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5idWlsZENvbW1hbmQob3B0aW9ucy5idWlsZENvbW1hbmRBcmdzKSB9LFxuICAgIHsgbmFtZTogXCJwb3N0LWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucG9zdEJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgXS5maWx0ZXIoKHN0ZXApID0+IHN0ZXAuY21kKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RlcCA9IHN0ZXBzW2ldO1xuICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHN0ZXBzLmxlbmd0aCAtIDE7XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHN0ZXAuY21kKTtcbiAgICAgIHByaW50VGFza1N0YXJ0KHN0ZXAubmFtZSwgc3RlcC5jbWQsIGlzTGFzdCk7XG4gICAgICBhd2FpdCBleGVjV2l0aExpbmVQcmVmaXgoc3RlcC5jbWQsIHsgY3dkOiBvcHRpb25zLmN3ZCB9KTtcbiAgICAgIHByaW50VGFza1N1Y2Nlc3Moc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByaW50VGFza0ZhaWxlZChzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RlcC5uYW1lfSBmYWlsZWRgLCB7IGNhdXNlOiBlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc3RhcnQg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDruYzrk5zrkJwg7ZSE66Gc7KCd7Yq466W8IOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDruYzrk5zrkJwg6rKw6rO866y8KGRpc3Qg65SU66CJ7Yag66as7J2YIGluZGV4LmpzIOyXlO2KuOumrO2PrOyduO2KuCnsnbQg7JeG64uk66m0IOyLpO2WieydhCDspJHri6jtlanri4jri6QuXG4gKiDshozsiqTrp7Ug7KeA7JuQ6rO8IGRvdGVudiDsp4Dsm5DsnYQg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydCgpIHtcbiAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgY29uc3QgeyB2ZXJzaW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpO1xuICBjb25zb2xlLmxvZyhg8J+MsiBTb25hbXUgdiR7dmVyc2lvbn1cXG5gKTtcblxuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogcG5wbSBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCBnZXRNaWdyYXRlUnVuVGFyZ2V0cygpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9nZW5lcmF0ZSgpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGNvbnN0IHsgY29ubnMgfSA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICBjb25zdCBoYXNTdGF0dXMwID0gY29ubnMuc29tZSgoY29ubikgPT4gY29ubi5zdGF0dXMgPT09IDApO1xuICBpZiAoIWhhc1N0YXR1czApIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCLrp4jsnbTqt7jroIjsnbTshZgg7YyM7J287J2EIOyDneyEse2VmOugpOuptCDquLDsobQg66eI7J206re466CI7J207IWY7J20IOy1nOyGjCDtlZjrgpjsnZggRELsl5Ag66qo65GQIOyggeyaqeuQmOyWtCDsnojslrTslbwg7ZWp64uI64ukLlwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgY29ubiBvZiBjb25ucykge1xuICAgICAgaWYgKGNvbm4ucGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICAke2Nvbm4ubmFtZX06IHBlbmRpbmcgJHtjb25uLnBlbmRpbmcubGVuZ3RofeqwnGApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgY291bnQgPSBhd2FpdCBtaWdyYXRvci5nZW5lcmF0ZVByZXBhcmVkQ29kZXMoKTtcbiAgaWYgKGNvdW50ID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGAke2NvdW50feqwnOydmCDrp4jsnbTqt7jroIjsnbTshZgg7YyM7J287J20IOyDneyEseuQmOyXiOyKteuLiOuLpC5gKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9zdGF0dXMoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgLy8gc3RhdHVzO1xuICBjb25zb2xlLmxvZyhzdGF0dXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2luaXQoKSB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1tnZXRTb25hbXVFbnZpcm9ubWVudCgpXTtcbiAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCIoUkVNT1RFKSBGaXh0dXJlIERCXCIsXG4gICAgICBjb25maWc6IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiKExPQ0FMKSBUZXN0aW5nIERCXCIsXG4gICAgICBjb25maWc6IFNvbmFtdS5kYkNvbmZpZy50ZXN0LFxuICAgICAgdG9Ta2lwOiAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZW1vdGVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIGNvbnN0IGxvY2FsQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICByZXR1cm4gcmVtb3RlQ29ubi5ob3N0ID09PSBsb2NhbENvbm4uaG9zdCAmJiByZW1vdGVDb25uLmRhdGFiYXNlID09PSBsb2NhbENvbm4uZGF0YWJhc2U7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gIF0gYXMge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgY29uZmlnOiBLbmV4LkNvbmZpZztcbiAgICB0b1NraXA/OiBib29sZWFuO1xuICB9W107XG5cbiAgLy8gMS4g6riw7KSAREIg7Iqk7YKk66eI66W8IOuNpO2UhFxuICBjb25zb2xlLmxvZyhcIkRVTVAuLi5cIik7XG4gIGNvbnN0IGR1bXBGaWxlbmFtZSA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtJHtEYXRlLm5vdygpfS5zcWxgO1xuICBjb25zdCBzcmNDb25uID0gc3JjQ29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICBjb25zdCBtaWdyYXRpb25zRHVtcCA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtbWlncmF0aW9ucy0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGV4ZWNTeW5jKFxuICAgIGBteXNxbGR1bXAgLWgke3NyY0Nvbm4uaG9zdH0gLXUke3NyY0Nvbm4udXNlcn0gLXAke3NyY0Nvbm4ucGFzc3dvcmR9IC0tc2luZ2xlLXRyYW5zYWN0aW9uIC1kIC0tbm8tY3JlYXRlLWRiIC0tdHJpZ2dlcnMgJHtzcmNDb25uLmRhdGFiYXNlfSA+ICR7ZHVtcEZpbGVuYW1lfWAsXG4gICk7XG4gIGNvbnN0IF9kYiA9IGtuZXgoc3JjQ29uZmlnKTtcbiAgY29uc3QgW1ttaWdyYXRpb25zXV0gPSBhd2FpdCBfZGIucmF3KFxuICAgIFwiU0VMRUNUIENPVU5UKCopIGFzIGNvdW50IEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWEgPSA/IEFORCB0YWJsZV9uYW1lID0gJ2tuZXhfbWlncmF0aW9ucydcIixcbiAgICBbc3JjQ29ubi5kYXRhYmFzZV0sXG4gICk7XG4gIGlmIChtaWdyYXRpb25zLmNvdW50ID4gMCkge1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9IGtuZXhfbWlncmF0aW9ucyBrbmV4X21pZ3JhdGlvbnNfbG9jayA+ICR7bWlncmF0aW9uc0R1bXB9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gMi4g64yA7IOBREIg6rCB6rCB7JeQIOuMgO2VmOyXrCDsobTsnqzsl6zrtoAg7ZmV7J24IO2bhCDrtpPquLBcbiAgZm9yIChjb25zdCB7IGxhYmVsLCBjb25maWcsIHRvU2tpcCB9IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBjb25uID0gY29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuXG4gICAgaWYgKHRvU2tpcCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2xhYmVsfTogU2tpcHBlZCFgKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IGtuZXgoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi4oKGNvbmZpZy5jb25uZWN0aW9uID8/IHt9KSBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLFxuICAgICAgICBkYXRhYmFzZTogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBbW3Jvd11dID0gYXdhaXQgZGIucmF3KGBTSE9XIERBVEFCQVNFUyBMSUtFIFwiJHtjb25uLmRhdGFiYXNlfVwiYCk7XG4gICAgaWYgKHJvdykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAke2xhYmVsfTogRGF0YWJhc2UgXCIke2Nvbm4uZGF0YWJhc2V9XCIgQWxyZWFkeSBleGlzdHNgKSk7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgU1lOQyB0byAke2xhYmVsfS4uLmApO1xuICAgIGNvbnN0IG15c3FsQ21kID0gYG15c3FsIC1oJHtjb25uLmhvc3R9IC11JHtjb25uLnVzZXJ9IC1wJHtjb25uLnBhc3N3b3JkfWA7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXGAke2Nvbm4uZGF0YWJhc2V9XFxgJ2ApO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAtZSAnQ1JFQVRFIERBVEFCQVNFIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9ICR7Y29ubi5kYXRhYmFzZX0gPCAke2R1bXBGaWxlbmFtZX1gKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKG1pZ3JhdGlvbnNEdW1wKSkge1xuICAgICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9ICR7Y29ubi5kYXRhYmFzZX0gPCAke21pZ3JhdGlvbnNEdW1wfWApO1xuICAgIH1cblxuICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGF3YWl0IF9kYi5kZXN0cm95KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIHJlY29yZElkczogbnVtYmVyW10pIHtcbiAgYXdhaXQgc2V0dXBGaXh0dXJlTWFuYWdlcigpO1xuXG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmltcG9ydEZpeHR1cmUoZW50aXR5SWQsIHJlY29yZElkcyk7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9zeW5jKCkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZ2VuIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9nZW4oKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMocHJvY2Vzcy5hcmd2KTtcbiAgYXdhaXQgZml4dHVyZUdlbkNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogZml4dHVyZSBmZXRjaCDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZmV0Y2goKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMocHJvY2Vzcy5hcmd2KTtcbiAgYXdhaXQgZml4dHVyZUZldGNoQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGV4cGxvcmUg66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2V4cGxvcmUoKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMocHJvY2Vzcy5hcmd2KTtcbiAgYXdhaXQgZml4dHVyZUV4cGxvcmVDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIOqwhOuLqO2VnCDsmLXshZgg7YyM7IScXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhcbiAgYXJndjogc3RyaW5nW10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9IHtcbiAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdPiAmIHsgXzogc3RyaW5nW10gfSA9IHsgXzogW10gfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuXG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZy5zbGljZSgyKTtcblxuICAgICAgaWYgKGtleS5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgY29uc3QgW2ssIHZdID0ga2V5LnNwbGl0KFwiPVwiKTtcbiAgICAgICAgb3B0aW9uc1trXSA9IHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG4gICAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDEpO1xuICAgICAgY29uc3QgbmV4dCA9IGFyZ3ZbaSArIDFdO1xuXG4gICAgICBpZiAobmV4dCAmJiAhbmV4dC5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICBvcHRpb25zW2tleV0gPSBuZXh0O1xuICAgICAgICBpKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zW2tleV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zLl8ucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX3ByYWN0aWNlKG5hbWU6IHN0cmluZykge1xuICBjb25zdCBwcmFjdGljZURpciA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwicHJhY3RpY2VzXCIpO1xuICBjb25zdCBmaWxlTmFtZXMgPSBhd2FpdCByZWFkZGlyKHByYWN0aWNlRGlyKTtcblxuICBjb25zdCBtYXhTZXFObyA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHByYWN0aWNlRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHByYWN0aWNlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJlZFNlcXMgPSBmaWxlTmFtZXNcbiAgICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5zdGFydHNXaXRoKFwicFwiKSAmJiBmaWxlTmFtZS5lbmRzV2l0aChcIi50c1wiKSlcbiAgICAgIC5tYXAoKGZpbGVOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IFssIHNlcU5vXSA9IGZpbGVOYW1lLm1hdGNoKC9ecChbMC05XSspLS8pID8/IFtcIjBcIiwgXCIwXCJdO1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoc2VxTm8pO1xuICAgICAgfSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYiAtIGEpO1xuXG4gICAgaWYgKGZpbHRlcmVkU2Vxcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyZWRTZXFzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9KSgpO1xuXG4gIGNvbnN0IGN1cnJlbnRTZXFObyA9IG1heFNlcU5vICsgMTtcbiAgY29uc3QgZmlsZU5hbWUgPSBgcCR7Y3VycmVudFNlcU5vfS0ke25hbWV9LnRzYDtcbiAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihwcmFjdGljZURpciwgZmlsZU5hbWUpO1xuXG4gIGNvbnN0IGNvZGUgPSBbXG4gICAgYGltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnNvbGUuY2xlYXIoKTtgLFxuICAgIGBjb25zb2xlLmxvZyhcIiR7ZmlsZU5hbWV9XCIpO2AsXG4gICAgXCJcIixcbiAgICBgU29uYW11LnJ1blNjcmlwdChhc3luYyAoKSA9PiB7YCxcbiAgICBgIC8vIFRPRE9gLFxuICAgIGB9KTtgLFxuICAgIFwiXCIsXG4gIF0uam9pbihcIlxcblwiKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGRzdFBhdGgsIGNvZGUpO1xuXG4gIGV4ZWNTeW5jKGBjb2RlICR7ZHN0UGF0aH1gKTtcblxuICBjb25zdCBydW5Db2RlID0gYHlhcm4gbm9kZSAtciBkb3RlbnYvY29uZmlnIC0tZW5hYmxlLXNvdXJjZS1tYXBzIGRpc3QvcHJhY3RpY2VzLyR7ZmlsZU5hbWUucmVwbGFjZShcbiAgICBcIi50c1wiLFxuICAgIFwiLmpzXCIsXG4gICl9YDtcbiAgY29uc29sZS5sb2coYCR7Y2hhbGsuYmx1ZShydW5Db2RlKX0gY29waWVkIHRvIGNsaXBib2FyZC5gKTtcbiAgZXhlY1N5bmMoYGVjaG8gXCIke3J1bkNvZGV9XCIgfCBwYmNvcHlgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3R1Yl9lbnRpdHkoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7IGVudGl0eUlkLCB0aXRsZTogZW50aXR5SWQgfSk7XG5cbiAgY29uc3QgeyBmbGFncyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG4gIGNvbnN0IHVzZUFJID0gZmxhZ3MuaGFzKFwiYWlcIik7XG4gIGNvbnN0IG5vQ29uZXMgPSBmbGFncy5oYXMoXCJuby1jb25lc1wiKTtcblxuICAvLyAtLW5vLWNvbmVzOiBjb25lIOyDneyEsSDsiqTtgrVcbiAgaWYgKG5vQ29uZXMpIHtcbiAgICBjb25zb2xlLmxvZyhg4pyTIEVudGl0eSAnJHtlbnRpdHlJZH0nIGNyZWF0ZWQgd2l0aG91dCBjb25lc2ApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyAtLWFpOiBMTE3snLzroZwgY29uZSDsg53shLFcbiAgaWYgKHVzZUFJKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkYCk7XG4gICAgY29uc29sZS5sb2coYPCfjJ8gR2VuZXJhdGluZyBBSS1wb3dlcmVkIGNvbmVzLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgICA6IFwia29cIjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiBmYWxzZSxcbiAgICAgICAgb25seUVtcHR5OiBmYWxzZSxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGDinIUgRG9uZSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQU5USFJPUElDX0FQSV9LRVlcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBSZW1vdmUgLS1haSBmbGFnIHRvIHVzZSB0ZW1wbGF0ZSBjb25lcyBpbnN0ZWFkYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g6riw67O4OiDthZztlIzrpr8gY29uZSDsnpDrj5kg7IOd7ISxXG4gIC8vIExMTSDsl4bsnbQgZmFrZXItbWFwcGluZ3MudHPrpbwg7Zmc7Jqp7ZWY7JesIOq4sOuzuCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gIC8vIOydtOulvCDthrXtlbQgQU5USFJPUElDX0FQSV9LRVnqsIAg7JeG7Ja064+EIFNvbmFtdeulvCDsgqzsmqntlaAg7IiYIOyeiOycvOupsCxcbiAgLy8g7IOd7ISx65CcIO2FnO2UjOumvyBjb25l7J2AIOuCmOykkeyXkCAnY29uZSBnZW4nIOuqheugueyWtOuhnCBBSeulvCDthrXtlbQg7JeF6re466CI7J2065Oc7ZWgIOyImCDsnojsirXri4jri6QuXG4gIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgdGVtcGxhdGUgY29uZXMuLi5gKTtcbiAgYXdhaXQgZW50aXR5LmdlbmVyYXRlVGVtcGxhdGVDb25lcygpO1xuICBjb25zb2xlLmxvZyhg4pyTIEVudGl0eSAnJHtlbnRpdHlJZH0nIGNyZWF0ZWQgd2l0aCB0ZW1wbGF0ZSBjb25lc2ApO1xuICBjb25zb2xlLmxvZyhg8J+SoSBUaXA6IFJ1biAncG5wbSBzb25hbXUgY29uZSBnZW4gJHtlbnRpdHlJZH0nIHRvIGltcHJvdmUgd2l0aCBBSWApO1xufVxuXG4vKipcbiAqIEFJ66W8IOyCrOyaqe2VmOyXrCBlbnRpdHnsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWY6rGw64KYIOyXheq3uOugiOydtOuTnO2VqeuLiOuLpC5cbiAqXG4gKiDsmLXshZg6XG4gKiAtIC0tcmVnZW5lcmF0ZTog7KCE7LK0IOyerOyDneyEsSAo6riw7KG0IGNvbmUg642u7Ja07JOw6riwKVxuICogLSAtLWxvY2FsZSA8a298ZW58amE+OiDsg53shLEg7Ja47Ja0IOyngOyglVxuICogLSDquLDrs7g6IG9ubHlFbXB0eSDrqqjrk5wgKOq4sOyhtCBmaXh0dXJlSGludCDrs7TsobQpXG4gKlxuICogQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUIChzb25hbXUuc2VjcmV0LnRzIOuYkOuKlCDtmZjqsr3rs4DsiJgpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbmVfZ2VuKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IHsgZmxhZ3MsIG9wdGlvbnMgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuXG4gIC8vIC0tYWxsIOyYteyFmDog66qo65OgIGVudGl0eSBjb25lIOyDneyEsVxuICBpZiAoZmxhZ3MuaGFzKFwiYWxsXCIpIHx8IGVudGl0eUlkID09PSBcImFsbFwiKSB7XG4gICAgY29uc3QgYWxsRW50aXRpZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCk7XG4gICAgY29uc29sZS5sb2coYPCfjJ8gR2VuZXJhdGluZyBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2FsbEVudGl0aWVzLmxlbmd0aH0gZW50aXRpZXMuLi5cXG5gKTtcblxuICAgIGxldCB0b3RhbFRva2VucyA9IDA7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgYWxsRW50aXRpZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQcm9jZXNzaW5nICR7ZW50aXR5LmlkfS4uLmApO1xuICAgICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICAgICAgY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgICA6IFwia29cIjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgb25seUVtcHR5OiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRvdGFsVG9rZW5zICs9IHJlc3VsdC50b2tlbnNVc2VkO1xuICAgICAgICBjb25zb2xlLmxvZyhgICDinJMgJHtlbnRpdHkuaWR9ICgke3Jlc3VsdC50b2tlbnNVc2VkfSB0b2tlbnMpXFxuYCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgZXJyb3JzLnB1c2goYCR7ZW50aXR5LmlkfTogJHttZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgIOKclyAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1cXG5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgXFxu4pyFIERvbmUhIFRvdGFsOiAke3RvdGFsVG9rZW5zfSB0b2tlbnMgdXNlZGApO1xuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAodG90YWxUb2tlbnMgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCBlbnRpdGllcyAoJHtlcnJvcnMubGVuZ3RofSk6YCk7XG4gICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvcnMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDri6jsnbwgZW50aXR5IGNvbmUg7IOd7ISxXG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgaWYgKCFlbnRpdHkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1vZGUgPSBmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpID8gXCJyZWdlbmVyYXRpbmdcIiA6IFwiZ2VuZXJhdGluZ1wiO1xuICBjb25zb2xlLmxvZyhcbiAgICBg8J+MnyAke21vZGUgPT09IFwicmVnZW5lcmF0aW5nXCIgPyBcIlJlZ2VuZXJhdGluZ1wiIDogXCJHZW5lcmF0aW5nXCJ9IEFJLXBvd2VyZWQgY29uZXMgZm9yICR7ZW50aXR5SWR9Li4uYCxcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IG9wdGlvbnMubG9jYWxlIHx8IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCIgPyBjb25maWdMb2NhbGUgOiBcImtvXCI7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBsb2NhbGUsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUhICgke3Jlc3VsdC50b2tlbnNVc2VkfSB0b2tlbnMgdXNlZClgKTtcblxuICAgIC8vIO2GoO2BsCDruYTsmqkg6rOE7IKwICjrjIDrnrXsoIHsnbgg7LaU7KCVKVxuICAgIC8vIENsYXVkZSBTb25uZXQgNC41OiBpbnB1dCAkMy9NIHRva2Vucywgb3V0cHV0ICQxNS9NIHRva2Vuc1xuICAgIC8vIOqwhOuLqO2VmOqyjCDtj4nqt6AgJDkvTSB0b2tlbnProZwg6rOE7IKwXG4gICAgY29uc3QgZXN0aW1hdGVkQ29zdCA9IChyZXN1bHQudG9rZW5zVXNlZCAqIDkpIC8gMV8wMDBfMDAwO1xuICAgIGNvbnNvbGUubG9nKGDwn5KwIEVzdGltYXRlZCBjb3N0OiB+JCR7ZXN0aW1hdGVkQ29zdC50b0ZpeGVkKDQpfWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgVG8gdXNlIEFJLXBvd2VyZWQgY29uZSBnZW5lcmF0aW9uOmApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgICAxLiBHZXQgYW4gQVBJIGtleSBmcm9tIGh0dHBzOi8vY29uc29sZS5hbnRocm9waWMuY29tL2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGAgICAyLiBBZGQgaXQgdG8gc29uYW11LnNlY3JldC50cyBvciBzZXQgQU5USFJPUElDX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGVgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUmF0ZSBsaW1pdFwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFBsZWFzZSB3YWl0IGEgbW9tZW50IGFuZCB0cnkgYWdhaW4uYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgdG8gZ2VuZXJhdGUgY29uZXM6IFVua25vd24gZXJyb3JgKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWwoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbFwiLCB7XG4gICAgZW50aXR5SWQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbF90ZXN0KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxfdGVzdFwiLCB7XG4gICAgZW50aXR5SWQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF92aWV3X2xpc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJ2aWV3X2xpc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICAgIGV4dHJhOiB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF92aWV3X2Zvcm0oZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJ2aWV3X2Zvcm1cIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOqzteyLnSBTa2lsbHPrpbwg66Gc7LusIO2UhOuhnOygne2KuCDrmJDripQg6riA66Gc67KMIH4vLmNsYXVkZS/roZwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICpcbiAqIC0tZ2xvYmFsIO2UjOuemOq3uDogfi8uY2xhdWRlL+yXkCDrj5nquLDtmZQgKO2UhOuhnOygne2KuCDsg53shLEg7KCEIOyCrOyaqSDqsIDriqUpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jKCkge1xuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgaXNHbG9iYWwgPSBmbGFncy5oYXMoXCJnbG9iYWxcIik7XG5cbiAgLy8g6rCc67CcIO2ZmOqyvSAtIGNsaS50czogc29uYW11L21vZHVsZXMvc29uYW11L3NyYy9iaW4vY2xpLnRzXG4gIC8vIOu5jOuTnCDtm4QgLSBjbGkuanM6IG5vZGVfbW9kdWxlcy9zb25hbXUvZGlzdC9iaW4vY2xpLmpzICjsi6TsoJwg7Iuk7ZaJKVxuICAvLyBza2lsbHMg7JyE7LmYOiBub2RlX21vZHVsZXMvc29uYW11L3NyYy9za2lsbHMgKG5wbSDrsLDtj6wg7IucKVxuICBjb25zdCBzb3VyY2VCYXNlID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcInNraWxsc1wiKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHNvdXJjZUJhc2UpKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlNraWxscyBzb3VyY2Ugbm90IGZvdW5kIGluIHNvbmFtdSBwYWNrYWdlLlwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzR2xvYmFsKSB7XG4gICAgYXdhaXQgc2tpbGxzX3N5bmNfdG8ob3MuaG9tZWRpcigpLCB7XG4gICAgICB1c2VTeW1saW5rOiBmYWxzZSxcbiAgICAgIHNvdXJjZUJhc2UsXG4gICAgfSk7XG5cbiAgICAvLyDqtazrsoTsoITsnbQg7ISk7LmY7ZWcIC9zb25hbXUtc2tpbGxzIOy7pOunqOuTnCDsoJzqsbAuXG4gICAgLy8g7IiY64+ZIOyKpO2CrCDrqZTribTripQg7J6Q64+ZIGRpc2NvdmVyeeyZgCBBR0VOVFMubWQg7Iqk7YKsIOyduOuNseyKpOuhnCDrjIDssrTrkJDsirXri4jri6QuXG4gICAgYXdhaXQgcm0ocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgXCIuY2xhdWRlXCIsIFwiY29tbWFuZHNcIiwgXCJzb25hbXUtc2tpbGxzLm1kXCIpLCB7IGZvcmNlOiB0cnVlIH0pO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuICBHbG9iYWwgc3luYyBjb21wbGV0ZSDihpIgfi8uYWdlbnRzL3NraWxscy9gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFRoZXNlIHNraWxscyBhcmUgYXZhaWxhYmxlIGluIGV2ZXJ5IGFnZW50IHNlc3Npb24uYCkpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuZGltKFxuICAgICAgICBgICBPbmNlIGEgcHJvamVjdCBpcyBjcmVhdGVkLCBydW4gJ3BucG0gc29uYW11IHNraWxscyBzeW5jJyBmb3IgcHJvamVjdC1sb2NhbCBzeW5jLmAsXG4gICAgICApLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgc2tpbGxzX3N5bmNfdG8oZmluZFByb2plY3RSb290KCksIHtcbiAgICAgIHVzZVN5bWxpbms6IHRydWUsXG4gICAgICBjcmVhdGVTZXR0aW5nczogdHJ1ZSxcbiAgICAgIHNvdXJjZUJhc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiDrkZAg6rK966Gc6rCAIOyLrOuzvOumrSDrp4Htgazrpbwg65Sw6528IOqwmeydgCDsi6TssrTrpbwg6rCA66as7YKk64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZXNUb1NhbWVEaXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHJlYWxwYXRoKGEpKSA9PT0gKGF3YWl0IHJlYWxwYXRoKGIpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogYC5jbGF1ZGUvPGVudHJ5PmDqsIAgYC4uLy5hZ2VudHMvPGVudHJ5PmDrpbwg6rCA66as7YKk64+E66GdIOuztOyepe2VqeuLiOuLpC5cbiAqXG4gKiDsm5Drs7jsnYAg7JeQ7J207KCE7Yq4IOykkeumveyduCBgLmFnZW50cy9g7JeQIOuRkOqzoCwgQ2xhdWRlIENvZGXsmqkgYC5jbGF1ZGUvYOuKlCDsi6zrs7zrpq1cbiAqIOunge2BrOuhnOunjCDsl7DqsrDtlanri4jri6QuIOydtCDsoIDsnqXshozsnZggYENMQVVERS5tZCAtPiBBR0VOVFMubWRgIOq3nOyVveqzvCDqsJnsnYAg67Cp7Iud7J6F64uI64ukLlxuICog7J2066+4IOyLrOuzvOumrSDrp4HtgazqsIAg7JWE64uMIOyLpOyytOqwgCDsnojsnLzrqbQg7IKs7Jqp7J6QIO2MjOydvOydvCDsiJgg7J6I7Jy866+A66GcIOqxtOuTnOumrOyngCDslYrsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpbmtDbGF1ZGVFbnRyeShyb290OiBzdHJpbmcsIHJlbGF0aXZlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gYC5jbGF1ZGVgIOyekOyytOqwgCBgLmFnZW50c2Drpbwg6rCA66as7YKk64qUIOyLrOuzvOumrSDrp4Htgazsnbgg7KCA7J6l7IaM7JeQ7ISc64qUIOuRkCDqsr3roZzqsIBcbiAgLy8g6rCZ7J2AIOyLpOyytOulvCDqsIDrpqztgrXri4jri6QuIOydtOuVjCDrp4Htgazrpbwg6rG466m0IOybkOuzuOydhCDsnpDquLAg7J6Q7Iug7J2EIOqwgOumrO2CpOuKlFxuICAvLyDrp4HtgazroZwg642u7Ja07JOw6rKMIOuQmOuvgOuhnCDslYTrrLTqsoPrj4Qg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgaWYgKGF3YWl0IHJlc29sdmVzVG9TYW1lRGlyKHBhdGguam9pbihyb290LCBcIi5jbGF1ZGVcIiksIHBhdGguam9pbihyb290LCBcIi5hZ2VudHNcIikpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0ID0gcGF0aC5qb2luKHJvb3QsIFwiLmNsYXVkZVwiLCByZWxhdGl2ZSk7XG4gIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihyb290LCBcIi5hZ2VudHNcIiwgcmVsYXRpdmUpO1xuXG4gIGxldCBleGlzdGluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGV4aXN0aW5nID0gYXdhaXQgcmVhZGxpbmsodGFyZ2V0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g7Ius67O866atIOunge2BrOqwgCDslYTri4jqsbDrgpgg7KG07J6s7ZWY7KeAIOyViuydjFxuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQgJiYgKGF3YWl0IGV4aXN0cyh0YXJnZXQpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXQpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcm0odGFyZ2V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGF3YWl0IHN5bWxpbmsocGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUodGFyZ2V0KSwgc291cmNlKSwgdGFyZ2V0LCBcImRpclwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICog7Iqk7YKs7J2EIOuwsOy5mO2VoCDtlITroZzsoJ3tirgg66Oo7Yq466W8IOywvuyKteuLiOuLpC5cbiAqXG4gKiBTb25hbXUg7ZSE66Gc7KCd7Yq464qUIOuRkCDqsIDsp4Ag66CI7J207JWE7JuD7J20IOqzteyhtO2VqeuLiOuLpC5cbiAqXG4gKiAtIGA8cm9vdD4vYXBpYCAgICAgICAgICAo7JiIOiBleGFtcGxlcy9taW9tb2NrKVxuICogLSBgPHJvb3Q+L3BhY2thZ2VzL2FwaWAgKGNyZWF0ZS1zb25hbXXqsIAg7IOd7ISx7ZWY64qUIOugiOydtOyVhOybgylcbiAqXG4gKiBgZmluZEFwcFJvb3RQYXRoKClg64qUIGFwaeydmCDrtoDrqqjrpbwg6re464yA66GcIOuPjOugpOyjvOuvgOuhnCDtm4TsnpDsl5DshJwgYDxyb290Pi9wYWNrYWdlc2DqsIBcbiAqIOuCmOyYpOqzoCwgYGZpbmRXb3Jrc3BhY2VSb290KClg64qUIHBucG0td29ya3NwYWNlLnlhbWzsnYQg7LC+7JWEIOyYrOudvOqwgOuvgOuhnCDrqqjrhbjroIjtj6zsl5BcbiAqIOuToCDtlITroZzsoJ3tirjsl5DshJwg67CU6rmlIOyggOyepeyGjOqwgCDsnqHtnpnri4jri6QuIGFwaeydmCDrtoDrqqjqsIAgYHBhY2thZ2VzYOuptCDtlZwg64uo6rOEIOuNlFxuICog7Jis65286rCA64qUIOuwqeyLneycvOuhnCDrkZAg6rK97Jqw66W8IOuqqOuRkCDrp57stqXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBjb25zdCBhcGlQYXJlbnQgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgcmV0dXJuIHBhdGguYmFzZW5hbWUoYXBpUGFyZW50KSA9PT0gXCJwYWNrYWdlc1wiID8gcGF0aC5kaXJuYW1lKGFwaVBhcmVudCkgOiBhcGlQYXJlbnQ7XG59XG5cbi8qKlxuICog6rWs67KE7KCE7J20IOuCqOq4tCBgc2tpbGxzL3NvbmFtdWAg7Y+J66m0IOuUlOugie2GoOumrOulvCDsoJzqsbDtlanri4jri6QuXG4gKlxuICog7JiI7KCE7JeQ64qUIOuqqOuToCDsiqTtgqwg66y47ISc66W8IGBza2lsbHMvc29uYW11LyoubWRgIO2VnCDrlJTroInthqDrpqzsl5Ag67O17IKs7ZaI7Iq164uI64ukLlxuICog7KeA6riI7J2AIGBzb25hbXVg6rCAIOudvOyasO2MhSDthYzsnbTruJTsnYQg64u07J2AIOujqO2KuCDsiqTtgqwg7J2066aE7J206528IOqyveuhnOqwgCDqsrnsuZjripTrjbAsXG4gKiDrgqjslYQg7J6I64qUIOq1rOuyhOyghCDrlJTroInthqDrpqzsl5DripQg7IKt7KCc65CcIOusuOyEnOulvCDqsIDrpqztgqTripQg7JibIFNLSUxMLm1k6rCAIOuTpOyWtCDsnojslrRcbiAqIOq3uOuMgOuhnCDrkZDrqbQg64Kh7J2AIOudvOyasO2MhSDthYzsnbTruJTsnbQg7Iqk7YKs66GcIOqzhOyGjSDroZzrk5zrkKnri4jri6QuXG4gKlxuICog7Ius67O866atIOunge2BrOuKlCDsoJXsg4Eg67Cw7LmYIOqyveuhnOyXkOyEnCDsspjrpqztlZjrr4DroZwg6rG065Oc66as7KeAIOyViuyKteuLiOuLpC4g7LWc7IOB7JyE7JeQXG4gKiBTS0lMTC5tZCDsmbjsnZggYC5tZGDqsIAg7J6I7Jy866m0IOq1rOuyhOyghCDsgrDstpzrrLzroZwg7YyQ7KCV7ZWp64uI64ukIOKAlCDsg4gg66Oo7Yq4IOyKpO2CrOydgFxuICogU0tJTEwubWQg7ZWY64KY66eMIOqwgOynkeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTGVnYWN5RmxhdFNraWxsRGlyKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGJhc2Ugb2YgW1wiLmFnZW50c1wiLCBcIi5jbGF1ZGVcIl0pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ocm9vdCwgYmFzZSwgXCJza2lsbHNcIiwgXCJzb25hbXVcIik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVhZGxpbmsodGFyZ2V0KTtcbiAgICAgIGNvbnRpbnVlOyAvLyDsi6zrs7zrpq0g66eB7YGs64qUIOygleyDgSDqsr3roZzsl5DshJwg6rCx7Iug65Cp64uI64ukXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsi6zrs7zrpq0g66eB7YGs6rCAIOyVhOuLmFxuICAgIH1cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh0YXJnZXQpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcih0YXJnZXQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTGVnYWN5RG9jcyA9IGVudHJpZXMuc29tZSgoZSkgPT4gZS5lbmRzV2l0aChcIi5tZFwiKSAmJiBlICE9PSBcIlNLSUxMLm1kXCIpO1xuICAgIGlmICghaGFzTGVnYWN5RG9jcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0odGFyZ2V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDinJMgUmVtb3ZlZCBsZWdhY3kgJHtiYXNlfS9za2lsbHMvc29uYW11IChmbGF0IGxheW91dClgKSk7XG4gIH1cbn1cblxuLyoqXG4gKiDrsLDsuZgg64yA7IOBIOyKpO2CrCDrlJTroInthqDrpqzrpbwg64KY7Je07ZWp64uI64ukLlxuICpcbiAqIOyXkOydtOyghO2KuOuKlCBgc2tpbGxzLzxuYW1lPi9TS0lMTC5tZGAg64uo7JyE66GcIOyKpO2CrOydhCDsnbjsi53tlZjrr4DroZwsXG4gKiBTS0lMTC5tZOulvCDqsIDsp4Qg65SU66CJ7Yag66as66eMIOuMgOyDgeycvOuhnCDsgrzsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RTa2lsbERpcnMoc291cmNlQmFzZT86IHN0cmluZyk6IFByb21pc2U8eyBzb3VyY2U6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXT4ge1xuICBpZiAoIXNvdXJjZUJhc2UgfHwgIShhd2FpdCBleGlzdHMoc291cmNlQmFzZSkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoc291cmNlQmFzZSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCByZXN1bHQ6IHsgc291cmNlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkgfHwgIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcInNvbmFtdVwiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5qb2luKHNvdXJjZSwgXCJTS0lMTC5tZFwiKSkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2goeyBzb3VyY2UsIG5hbWU6IGVudHJ5Lm5hbWUgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xufVxuXG4vKipcbiAqIO2UhOuhnOygne2KuCjrmJDripQg7ZmIKSDro6jtirjsl5Agc2tpbGxz66W8IOuPmeq4sO2ZlO2VmOuKlCDqs7XthrUg66Gc7KeB7J6F64uI64ukLlxuICpcbiAqIOybkOuzuOydgCBgLmFnZW50cy9g7JeQIOuRkOqzoCBgLmNsYXVkZS9g7JeQ64qUIOyLrOuzvOumrSDrp4Htgazrp4wg6rKB64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfc3luY190byhcbiAgcm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgdXNlU3ltbGluazogYm9vbGVhbjtcbiAgICBjcmVhdGVTZXR0aW5ncz86IGJvb2xlYW47XG4gICAgc291cmNlQmFzZT86IHN0cmluZztcbiAgfSxcbikge1xuICBjb25zdCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4ocm9vdCwgXCIuYWdlbnRzXCIpO1xuICBjb25zdCBza2lsbHNSb290ID0gcGF0aC5qb2luKGFnZW50c0RpciwgXCJza2lsbHNcIik7XG4gIGF3YWl0IG1rZGlyKHNraWxsc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGF3YWl0IHJlbW92ZUxlZ2FjeUZsYXRTa2lsbERpcihyb290KTtcblxuICAvLyDsl5DsnbTsoITtirjripQgc2tpbGxzLzxuYW1lPi9TS0lMTC5tZCDri6jsnITroZwg7Iqk7YKs7J2EIOyduOyLne2VmOuvgOuhnCDqsIHqsIEg67OE64+EIOuwsOy5mO2VtOyVvCDtlanri4jri6QuXG4gIGNvbnN0IHRhcmdldHMgPSBhd2FpdCBsaXN0U2tpbGxEaXJzKG9wdGlvbnMuc291cmNlQmFzZSk7XG5cbiAgZm9yIChjb25zdCB7IHNvdXJjZSwgbmFtZSB9IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCB0YXJnZXREaXIgPSBwYXRoLmpvaW4oc2tpbGxzUm9vdCwgbmFtZSk7XG5cbiAgICAvLyBleGlzdHMoKeuKlCBicm9rZW4gc3ltbGlua+ulvCDqsJDsp4DtlZjsp4Ag66q77ZWY66+A66GcIHJt7J2EIOustOyhsOqxtCDsi5zrj4Ttlanri4jri6RcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcm0odGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDtjIzsnbzsnbQg7JeG7Jy866m0IOustOyLnFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVzZVN5bWxpbmspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bWxpbmsoc291cmNlLCB0YXJnZXREaXIsIFwiZGlyXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgYOKaoCBTeW1saW5rIGZhaWxlZCAoJHtuYW1lfSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAgIEZhbGxpbmcgYmFjayB0byBjb3B5Li4uYCkpO1xuICAgICAgICBhd2FpdCBza2lsbHNDb3B5KHNvdXJjZSwgdGFyZ2V0RGlyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2tpbGxzQ29weShzb3VyY2UsIHRhcmdldERpcik7XG4gICAgfVxuXG4gICAgYXdhaXQgbGlua0NsYXVkZUVudHJ5KHJvb3QsIHBhdGguam9pbihcInNraWxsc1wiLCBuYW1lKSk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhcbiAgICBjaGFsay5ncmVlbihcbiAgICAgIGDinJMgU2tpbGxzICR7b3B0aW9ucy51c2VTeW1saW5rID8gXCJsaW5rZWRcIiA6IFwiY29waWVkXCJ9IOKGkiAuYWdlbnRzL3NraWxscy8gKCR7dGFyZ2V0cy5sZW5ndGh9KTogJHt0YXJnZXRzLm1hcCgodCkgPT4gdC5uYW1lKS5qb2luKFwiLCBcIil9YCxcbiAgICApLFxuICApO1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgLmNsYXVkZS9za2lsbHMvKiBzeW1saW5rZWQgZm9yIENsYXVkZSBDb2RlYCkpO1xuXG4gIC8vIHNldHRpbmdzLmxvY2FsLmpzb24g4oCUIENsYXVkZSBDb2RlIOyghOyaqSDtjIzsnbzsnbTrr4DroZwgLmNsYXVkZS/sl5Ag7KeB7KCRIOuRoeuLiOuLpC5cbiAgLy8gcHJvamVjdC1sb2NhbCDrqqjrk5zsl5DshJzrp4wsIOyXhuydhCDrlYzrp4wg7IOd7ISx7ZWp64uI64ukLlxuICBpZiAob3B0aW9ucy5jcmVhdGVTZXR0aW5ncykge1xuICAgIGF3YWl0IG1rZGlyKHBhdGguam9pbihyb290LCBcIi5jbGF1ZGVcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHNldHRpbmdzTG9jYWxQYXRoID0gcGF0aC5qb2luKHJvb3QsIFwiLmNsYXVkZVwiLCBcInNldHRpbmdzLmxvY2FsLmpzb25cIik7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNldHRpbmdzTG9jYWxQYXRoKSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzQ29udGVudCA9IHtcbiAgICAgICAgICBob29rczoge1xuICAgICAgICAgICAgUG9zdFRvb2xVc2U6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hdGNoZXI6IFwiRWRpdHxXcml0ZXxNdWx0aUVkaXRcIixcbiAgICAgICAgICAgICAgICBob29rczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogXCJwbnBtIGNoZWNrIDI+JjEgfCBoZWFkIC02MFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoc2V0dGluZ3NMb2NhbFBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzQ29udGVudCwgbnVsbCwgMil9XFxuYCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgLmNsYXVkZS9zZXR0aW5ncy5sb2NhbC5qc29uIGNyZWF0ZWRgKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGNyZWF0ZSBzZXR0aW5ncy5sb2NhbC5qc29uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShg4o+tIC5jbGF1ZGUvc2V0dGluZ3MubG9jYWwuanNvbiBhbHJlYWR5IGV4aXN0cyAocHJlc2VydmVkKWApKTtcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhcbiAgICBjaGFsay5kaW0oXG4gICAgICBgXFxuICBUbyBhbHNvIHdyaXRlIHRoZSBza2lsbCBpbmRleCBpbnRvIHRoaXMgcHJvamVjdCdzIEFHRU5UUy5tZCwgcnVuICdzb25hbXUgc2tpbGxzIGluZGV4Jy5gLFxuICAgICksXG4gICk7XG59XG5cbi8qKlxuICog66Oo7Yq4IOyKpO2CrChgc29uYW11YCnsnZgg65287Jqw7YyFIO2FjOydtOu4lOqzvCDqs7XthrUg6rec7JW97J2EIO2UhOuhnOygne2KuCBBR0VOVFMubWTsl5Ag7JSB64uI64ukLlxuICpcbiAqIOqwnOuzhCDsiqTtgqzsnZggZGVzY3JpcHRpb27snYAg6rCB7J6Q7J2YIOuwnOuPmSDsiJzqsITsl5Drp4wg6rG466as66+A66GcLCDslrTripAg7Iqk7YKs7JeQ64+EIOunnuyngFxuICog7JWK64qUIOyekeyXheyXkOyEnOuKlCDslYTrrLTqsoPrj4Qg7JWIIOqxuOumveuLiOuLpC4g7IOB7IucIOuhnOuTnOuQmOuKlCBBR0VOVFMubWTsl5Ag7J24642x7Iqk66W8IOuRkOuptFxuICog6re4IOqzteuwseydhCDrqZTsmrgg7IiYIOyeiOyKteuLiOuLpC5cbiAqXG4gKiDri6Trp4wg7IKs7Jqp7J6Q7J2YIOyXkOydtOyghO2KuCDtlITroaztlITtirgg7YyM7J287J2EIOqzoOy5mOuKlCDrj5nsnpHsnbTrr4DroZwgYHNraWxscyBzeW5jYOyXkFxuICog7Y+s7ZWo7ZWY7KeAIOyViuqzoCwg7IKs7Jqp7J6Q6rCAIOuqheyLnOyggeycvOuhnCDsi6TtlontlaAg65WM66eMIOyImO2Wie2VqeuLiOuLpC5cbiAqIGA8IS0tIFNPTkFNVTpTVEFSVCAtLT5gIH4gYDwhLS0gU09OQU1VOkVORCAtLT5gIOq1rOqwhOunjCDqsLHsi6DtlZjrqbAg64KY66i47KeA64qUIOuztOyhtO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX2luZGV4KCkge1xuICBjb25zdCBhcHBSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnN0IHNvdXJjZUJhc2UgPSBwYXRoLnJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwic3JjXCIsIFwic2tpbGxzXCIpO1xuICBjb25zdCByb290U2tpbGwgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJzb25hbXVcIiwgXCJTS0lMTC5tZFwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMocm9vdFNraWxsKSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJSb290IHNraWxsIG5vdCBmb3VuZCBpbiBzb25hbXUgcGFja2FnZS5cIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGZyb250bWF0dGVy64qUIOyKpO2CrCDrqZTtg4DrjbDsnbTthLDsnbTrr4DroZwg7KO87J6FIOuMgOyDgeyXkOyEnCDsoJzsmbjtlanri4jri6RcbiAgY29uc3QgYm9keSA9IChhd2FpdCByZWFkRmlsZShyb290U2tpbGwsIFwidXRmLThcIikpLnJlcGxhY2UoL14tLS1cXG5bXFxzXFxTXSo/XFxuLS0tXFxuKy8sIFwiXCIpO1xuXG4gIGNvbnN0IHN0YXJ0TWFya2VyID0gXCI8IS0tIFNPTkFNVTpTVEFSVCAtLT5cIjtcbiAgY29uc3QgZW5kTWFya2VyID0gXCI8IS0tIFNPTkFNVTpFTkQgLS0+XCI7XG4gIGNvbnN0IHNlY3Rpb24gPSBgJHtzdGFydE1hcmtlcn1cXG4ke2JvZHkudHJpbSgpfVxcbiR7ZW5kTWFya2VyfWA7XG5cbiAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIkFHRU5UUy5tZFwiKTtcbiAgY29uc3QgZXhpc3RpbmcgPSAoYXdhaXQgZXhpc3RzKHRhcmdldFBhdGgpKSA/IGF3YWl0IHJlYWRGaWxlKHRhcmdldFBhdGgsIFwidXRmLThcIikgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IG5leHQ6IHN0cmluZztcbiAgbGV0IGFjdGlvbjogc3RyaW5nO1xuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIG5leHQgPSBgJHtzZWN0aW9ufVxcbmA7XG4gICAgYWN0aW9uID0gXCJjcmVhdGVkXCI7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RhcnRJZHggPSBleGlzdGluZy5pbmRleE9mKHN0YXJ0TWFya2VyKTtcbiAgICBjb25zdCBlbmRJZHggPSBleGlzdGluZy5pbmRleE9mKGVuZE1hcmtlcik7XG4gICAgaWYgKHN0YXJ0SWR4ICE9PSAtMSAmJiBlbmRJZHggIT09IC0xICYmIHN0YXJ0SWR4IDwgZW5kSWR4KSB7XG4gICAgICBuZXh0ID0gZXhpc3Rpbmcuc2xpY2UoMCwgc3RhcnRJZHgpICsgc2VjdGlvbiArIGV4aXN0aW5nLnNsaWNlKGVuZElkeCArIGVuZE1hcmtlci5sZW5ndGgpO1xuICAgICAgYWN0aW9uID0gXCJ1cGRhdGVkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQgPSBgJHtleGlzdGluZy50cmltRW5kKCl9XFxuXFxuJHtzZWN0aW9ufVxcbmA7XG4gICAgICBhY3Rpb24gPSBcImFwcGVuZGVkXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5leHQgPT09IGV4aXN0aW5nKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGDij60gQUdFTlRTLm1kIGFscmVhZHkgdXAgdG8gZGF0ZWApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0UGF0aCwgbmV4dCk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQUdFTlRTLm1kICR7YWN0aW9ufSAoU29uYW11IG1hcmtlciByZWdpb24pYCkpO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oYXBwUm9vdCwgXCJDTEFVREUubWRcIikpKSkge1xuICAgIGF3YWl0IHN5bWxpbmsoXCJBR0VOVFMubWRcIiwgcGF0aC5qb2luKGFwcFJvb3QsIFwiQ0xBVURFLm1kXCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgQ0xBVURFLm1kIOKGkiBBR0VOVFMubWRgKSk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgUmVtb3ZlIHRoZSBtYXJrZXIgcmVnaW9uIHRvIHVuZG8uYCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBza2lsbHNDb3B5KHNyYzogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjcChzcmMsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIGNvcGllZGApKTtcbiAgfSBjYXRjaCAoY29weUVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgYOKclyBGYWlsZWQgdG8gY29weSBza2lsbHM6ICR7Y29weUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjb3B5RXJyb3IubWVzc2FnZSA6IFN0cmluZyhjb3B5RXJyb3IpfWAsXG4gICAgICApLFxuICAgICk7XG4gICAgdGhyb3cgY29weUVycm9yO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGF1dGhfZ2VuZXJhdGUoKSB7XG4gIC8vIC0tcGx1Z2lucyDsmLXshZgg7YyM7IuxXG4gIGNvbnN0IHBsdWdpbnNBcmcgPSBwcm9jZXNzLmFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChcIi0tcGx1Z2luc1wiKSk7XG4gIGNvbnN0IHBsdWdpbnM6IEJldHRlckF1dGhQbHVnaW5JZFtdID0gW107XG5cbiAgaWYgKHBsdWdpbnNBcmcpIHtcbiAgICBjb25zdCBwbHVnaW5WYWx1ZSA9IHBsdWdpbnNBcmcuaW5jbHVkZXMoXCI9XCIpXG4gICAgICA/IHBsdWdpbnNBcmcuc3BsaXQoXCI9XCIpWzFdXG4gICAgICA6IHByb2Nlc3MuYXJndltwcm9jZXNzLmFyZ3YuaW5kZXhPZihwbHVnaW5zQXJnKSArIDFdO1xuXG4gICAgaWYgKHBsdWdpblZhbHVlKSB7XG4gICAgICBjb25zdCBwbHVnaW5JZHMgPSBwbHVnaW5WYWx1ZS5zcGxpdChcIixcIikubWFwKChwKSA9PiBwLnRyaW0oKSk7XG5cbiAgICAgIGZvciAoY29uc3QgaWQgb2YgcGx1Z2luSWRzKSB7XG4gICAgICAgIGlmIChpc1ZhbGlkUGx1Z2luSWQoaWQpKSB7XG4gICAgICAgICAgcGx1Z2lucy5wdXNoKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBVbmtub3duIHBsdWdpbjogJHtpZH1gKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFN1cHBvcnRlZCBwbHVnaW5zOiAke1NVUFBPUlRFRF9QTFVHSU5fSURTLmpvaW4oXCIsIFwiKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgR2VuZXJhdGluZyBiZXR0ZXItYXV0aCBlbnRpdGllcy4uLlxcblwiKSk7XG5cbiAgaWYgKHBsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBQbHVnaW5zOiAke3BsdWdpbnMuam9pbihcIiwgXCIpfWApKTtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzKHsgcGx1Z2lucyB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBhdXRoIGFkZC1jb21wYW5pb25zIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog6riw7KG0IO2UhOuhnOygne2KuOydmCBlbnRpdHkuanNvbuyXkCBmaXh0dXJlQ29tcGFuaW9uc+ulvCDshozquIkg7LaU6rCA7ZWp64uI64ukLlxuICpcbiAqIOydtOuvuCBmaXh0dXJlQ29tcGFuaW9uc+qwgCDsnojripQgZW50aXR564qUIOyKpO2Cte2VqeuLiOuLpCAo642u7Ja07JOw6riwIOyXhuydjCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF1dGhfYWRkX2NvbXBhbmlvbnMoKSB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwi8J+UkCBBZGRpbmcgZml4dHVyZUNvbXBhbmlvbnMgdG8gYmV0dGVyLWF1dGggZW50aXRpZXMuLi5cXG5cIikpO1xuICBhd2FpdCBhZGRDb21wYW5pb25zVG9FbnRpdGllcygpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXFxu4pyFIERvbmUhXCIpKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQXVCc0M7b0JBS2tCO1NBQ1g7Y0FDRztxQkFDVztrQkFRN0I7Y0FDWTtXQUN1QjtBQU9qRSxJQUFJOzs7O0FBS0osU0FBUyxnQkFBZ0IsT0FBaUIsUUFBUSxNQUdoRDtDQUNBLE1BQU0sd0JBQVEsSUFBSSxJQUFZO0NBQzlCLE1BQU0sVUFBa0MsQ0FBQztDQUV6QyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7RUFDcEMsTUFBTSxNQUFNLEtBQUs7RUFDakIsSUFBSSxDQUFDLElBQUksV0FBVyxJQUFJLEdBQUc7RUFHM0IsSUFBSSxJQUFJLFNBQVMsR0FBRyxHQUFHO0dBQ3JCLE1BQU0sQ0FBQyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRztHQUMzQyxRQUFRLE9BQU87R0FDZjtFQUNGO0VBR0EsTUFBTSxVQUFVLEtBQUssSUFBSTtFQUN6QixJQUFJLFdBQVcsQ0FBQyxRQUFRLFdBQVcsSUFBSSxLQUFLLENBQUMsUUFBUSxXQUFXLEdBQUcsR0FBRztHQUNwRSxRQUFRLElBQUksTUFBTSxDQUFDLEtBQUs7R0FDeEI7RUFDRixPQUVFLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0NBRTFCO0NBRUEsT0FBTztFQUFFO0VBQU87Q0FBUTtBQUMxQjtBQUVBLGVBQWUsWUFBWTtDQUV6QixJQUFJLENBRGM7RUFBQztFQUFPO0VBQVM7RUFBUztFQUFVO0NBQU0sQ0FBQyxDQUFDLFNBQVMsUUFBUSxLQUFLLE1BQU0sRUFDckYsR0FDSCxNQUFNLE9BQU8sS0FBSyxPQUFPLEtBQUs7Q0FHaEMsSUFBSTtFQUlGLE1BQU0sZUFBeUIsQ0FBQztFQUNoQyxJQUFJLFdBQVc7RUFDZixJQUFJLGtCQUFrQjtFQUN0QixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSztHQUM1QyxNQUFNLE1BQU0sUUFBUSxLQUFLO0dBQ3pCLElBQUksUUFBUSxNQUFNO0lBQ2hCLGtCQUFrQjtJQUNsQjtHQUNGO0dBQ0EsSUFBSSxpQkFBaUI7R0FDckIsSUFBSSxVQUFVO0lBQ1osV0FBVztJQUNYO0dBQ0Y7R0FDQSxJQUFJLElBQUksV0FBVyxJQUFJLEdBQUc7SUFFeEIsSUFBSSxJQUFJLFNBQVMsR0FBRyxHQUNsQjtJQUdGLE1BQU0sVUFBVSxRQUFRLEtBQUssSUFBSTtJQUNqQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLFdBQVcsSUFBSSxLQUFLLENBQUMsUUFBUSxXQUFXLEdBQUcsR0FDakUsV0FBVztJQUViO0dBQ0Y7R0FDQSxhQUFhLEtBQUssR0FBRztFQUN2QjtFQUlBLE1BQU0sTUFBTSxhQUFhO0VBQ3pCLEtBQUssUUFBUSxXQUFXLFFBQVEsVUFBVSxhQUFhLFdBQVcsR0FDaEUsYUFBYSxLQUFLLEtBQUs7RUFJekIsSUFBSSxRQUFRLFFBQ1YsT0FBTyxZQUFZO0VBR3JCLE1BQU0sT0FBTyxjQUFjO0dBQ3pCLE9BQU87SUFDTCxhQUFhO0tBQ1gsTUFBTTtLQUNOLE1BQU07S0FDTixTQUFTO0tBQ1QsU0FBUyxjQUFjLGdCQUFnQixDQUFDLENBQUMsS0FBSyxjQUFjO01BQzFELE9BQU87TUFDUCxPQUFPO0tBQ1QsRUFBRTtJQUNKO0lBQ0EsY0FBYztJQUNkLFNBQVM7SUFDVCxZQUFZO0tBQ1YsTUFBTTtLQUNOLE1BQU07S0FDTixTQUFTO0tBQ1QsU0FBUztNQUNQO09BQUUsT0FBTztPQUFlLE9BQU87TUFBYztNQUM3QztPQUFFLE9BQU87T0FBVyxPQUFPO01BQVU7TUFDckM7T0FBRSxPQUFPO09BQWMsT0FBTztNQUFhO01BQzNDO09BQUUsT0FBTztPQUFXLE9BQU87TUFBVTtNQUNyQztPQUFFLE9BQU87T0FBUSxPQUFPO01BQU87S0FDakM7SUFDRjtHQUNGO0dBQ0EsTUFBTTtJQUNKLENBQUMsV0FBVyxNQUFNO0lBQ2xCO0tBQUM7S0FBVztLQUFVO0tBQWE7SUFBWTtJQUMvQyxDQUFDLFdBQVcsTUFBTTtJQUNsQixDQUFDLFdBQVcsS0FBSztJQUNqQixDQUFDLFdBQVcsT0FBTztJQUNuQixDQUFDLFdBQVcsU0FBUztJQUNyQixDQUFDLFdBQVcsS0FBSztJQUNqQjtLQUFDO0tBQVc7S0FBUztJQUFVO0lBQy9CLENBQUMsV0FBVyxVQUFVO0lBQ3RCLENBQUMsV0FBVyxRQUFRO0lBQ3BCO0tBQUM7S0FBUTtLQUFZO0lBQU87SUFDNUI7S0FBQztLQUFRO0tBQVU7SUFBTztJQUMxQjtLQUFDO0tBQVk7S0FBUztJQUFXO0lBQ2pDO0tBQUM7S0FBWTtLQUFjO0lBQVc7SUFDdEM7S0FBQztLQUFZO0tBQWE7SUFBVztJQUNyQztLQUFDO0tBQVk7S0FBYTtJQUFXO0lBQ3JDO0tBQUM7S0FBUTtLQUFPO0lBQVc7SUFDM0IsQ0FBQyxNQUFNO0lBQ1AsQ0FBQyxTQUFTLEtBQUs7SUFDZixDQUFDLFNBQVMsS0FBSztJQUNmLENBQUMsU0FBUyxLQUFLO0lBQ2YsQ0FBQyxPQUFPLEtBQUs7SUFDYixDQUFDLE9BQU8sS0FBSztJQUNiLENBQUMsT0FBTyxLQUFLO0lBQ2IsQ0FBQyxPQUFPO0lBQ1IsQ0FBQyxVQUFVLE1BQU07SUFDakIsQ0FBQyxVQUFVLE9BQU87SUFDbEIsQ0FBQyxNQUFNO0lBQ1AsQ0FBQyxRQUFRLFVBQVU7SUFDbkIsQ0FBQyxRQUFRLGdCQUFnQjtHQUMzQjtHQUNBLFNBQVM7SUFDUDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQSxNQUFNO0lBQ047SUFDQSx1QkFBdUI7R0FDekI7RUFDRixDQUFDO0NBQ0gsVUFBVTtFQUNSLE1BQU0sT0FBTyxRQUFRO0NBQ3ZCO0FBQ0Y7QUFFQSxVQUFVLENBQUMsQ0FBQyxRQUFRLFlBQVk7Q0FDOUIsTUFBTSxlQUFlLFFBQVE7QUFDL0IsQ0FBQzs7Ozs7Ozs7QUFTRCxlQUFlLE9BQU87Q0FDcEIsTUFBTSxFQUFFLFVBQVUsZ0JBQWdCO0NBQ2xDLElBQUksTUFBTSxJQUFJLE9BQU8sR0FDbkIsTUFBTSxPQUFPLE9BQU8sVUFBVTtNQUU5QixNQUFNLE9BQU8sT0FBTyxLQUFLO0FBRTdCOzs7Ozs7Ozs7Ozs7O0FBY0EsU0FBUyxrQkFBa0IsU0FBaUQ7Q0FDMUUsTUFBTSxVQUFVLGdCQUFnQjtDQUNoQyxNQUFNLGFBQWE7Q0FJbkIsTUFBTSxtQkFBbUIsY0FBYyxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsUUFDdEQsbUNBQ0Y7Q0FFQSxNQUFNLGdCQUFnQixNQUNwQixRQUFRLFVBQ1I7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLHVCQUF1QixLQUFLLEtBQUssU0FBUyxhQUFhLEVBQUU7RUFFekQ7RUFDQTtFQUNBO0NBQ0YsR0FDQTtFQUNFLEtBQUs7RUFDTCxPQUFPO0VBQ1AsS0FBSztHQUNILEdBQUcsUUFBUTtHQUNYLFVBQVUsUUFBUSxJQUFJLFlBQVk7R0FDbEMsS0FBSztHQUNMLGVBQWU7R0FDZixHQUFHLFNBQVM7RUFDZDtDQUNGLENBQ0Y7Q0FHQSxNQUFNLGdCQUFnQjtFQUNwQixRQUFRLElBQUksTUFBTSxPQUFPLHlCQUF5QixDQUFDO0VBQ25ELGNBQWMsS0FBSyxTQUFTO0VBQzVCLFFBQVEsS0FBSyxDQUFDO0NBQ2hCO0NBRUEsUUFBUSxHQUFHLFVBQVUsT0FBTztDQUM1QixRQUFRLEdBQUcsV0FBVyxPQUFPO0NBRTdCLGNBQWMsR0FBRyxTQUFTLFNBQVM7RUFDakMsSUFBSSxTQUFTLEdBQUc7R0FDZCxRQUFRLE1BQU0sTUFBTSxJQUFJLDJCQUEyQixNQUFNLENBQUM7R0FDMUQsUUFBUSxLQUFLLFFBQVEsQ0FBQztFQUN4QjtDQUNGLENBQUM7QUFDSDs7Ozs7OztBQVFBLFNBQVMsVUFBVTtDQUVqQixNQUFNLEVBQUUsWUFEUSxjQUFjLE9BQU8sS0FBSyxHQUN0QixDQUFBLENBQVEsb0JBQW9CO0NBQ2hELFFBQVEsSUFBSSxjQUFjLFFBQVEsR0FBRztDQUNyQyxrQkFBa0I7QUFDcEI7Ozs7Ozs7O0FBU0EsU0FBUyxVQUFVO0NBQ2pCLFFBQVEsSUFBSSxNQUFNLE9BQU8sS0FBSywwQ0FBMEMsQ0FBQztDQUN6RSxrQkFBa0IsRUFDaEIsVUFBVSxFQUFFLCtCQUErQixNQUFNLEVBQ25ELENBQUM7QUFDSDs7Ozs7Ozs7QUFTQSxlQUFlLFVBQVU7Q0FDdkIsTUFBTSxVQUFVLGdCQUFnQjtDQUNoQyxNQUFNLFVBQVUsS0FBSyxLQUFLLFNBQVMsS0FBSztDQUV4QyxJQUFJLENBQUUsTUFBTSxPQUFPLE9BQU8sR0FBSTtFQUM1QixRQUFRLE1BQU0sd0JBQXdCLFNBQVM7RUFDL0MsUUFBUSxLQUFLLENBQUM7Q0FDaEI7Q0FHQSxNQUFNLGtCQUFrQixRQUFRLEtBQUssUUFBUSxJQUFJO0NBR2pELE1BQU0sV0FBVztFQUFDO0VBQVE7RUFBUSxHQUZWLG9CQUFvQixLQUFLLFFBQVEsS0FBSyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQztDQUV4QztDQUVwRCxRQUFRLElBQUksTUFBTSxPQUFPLEtBQUssK0JBQStCLENBQUM7Q0FFOUQsTUFBTSxjQUFjLE1BQU0sUUFBUSxVQUFVO0VBQzFDLEtBQUs7RUFDTCxPQUFPO0NBQ1QsQ0FBQztDQUVELFlBQVksR0FBRyxTQUFTLFNBQVM7RUFDL0IsUUFBUSxLQUFLLFFBQVEsQ0FBQztDQUN4QixDQUFDO0NBR0QsS0FBSyxNQUFNLFVBQVUsQ0FBQyxVQUFVLFNBQVMsR0FDdkMsUUFBUSxHQUFHLGNBQWM7RUFDdkIsWUFBWSxLQUFLLE1BQU07Q0FDekIsQ0FBQztBQUVMOzs7OztBQU1BLGVBQWUsNEJBQTZDO0NBQzFELE1BQU0sa0JBQWtCLEtBQUssS0FBSyxRQUFRLElBQUksR0FBRyxrQkFBa0I7Q0FFbkUsSUFBSTtFQUNGLElBQUksTUFBTSxPQUFPLGVBQWUsR0FBRztHQUNqQyxRQUFRLElBQUksTUFBTSxJQUFJLDZDQUE2QyxDQUFDO0dBQ3BFLE9BQU87RUFDVDtFQUVBLFFBQVEsSUFBSSxNQUFNLElBQUksd0RBQXdELENBQUM7RUFDL0UsT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLFNBQVMsTUFBTSxNQUFNLHNCQUFzQjtDQUMxRSxTQUFTLE9BQU87RUFDZCxRQUFRLE1BQU0sTUFBTSxJQUFJLHFDQUFxQyxHQUFHLEtBQUs7RUFDckUsUUFBUSxLQUFLLENBQUM7Q0FDaEI7QUFDRjs7Ozs7QUFNQSxlQUFlLFlBQVk7Q0FDekIsTUFBTSxVQUFVO0NBQ2hCLE1BQU0sVUFBVSxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQ3pDOzs7Ozs7O0FBUUEsZUFBZSxZQUFZO0NBQ3pCLE1BQU0sVUFBVSxnQkFBZ0I7Q0FDaEMsTUFBTSxpQkFBaUIsTUFBTSwwQkFBMEI7Q0FFdkQsTUFBTSxlQUFlLEtBQUssSUFBSTtDQUM5QixJQUFJO0VBQ0YsS0FBSyxNQUFNLFlBQVksZUFBZTtHQUNwQyxNQUFNLE1BQU0sS0FBSyxLQUFLLFNBQVMsU0FBUyxXQUFXO0dBQ25ELGdCQUFnQixTQUFTLE1BQU0sU0FBUyxhQUFhLEdBQUc7R0FFeEQsTUFBTSxjQUFjLFVBQVU7SUFBRTtJQUFLLGtCQUFrQixFQUFFLGVBQWU7R0FBRSxDQUFDO0VBQzdFO0VBQ0Esa0JBQWtCLE9BQU8sTUFBTSxLQUFLLElBQUksSUFBSSxZQUFZO0NBQzFELFNBQVMsR0FBRztFQUNWLGtCQUFrQixPQUFPLE9BQU8sS0FBSyxJQUFJLElBQUksWUFBWTtFQUN6RCxRQUFRLE1BQU0sQ0FBQztFQUNmLFFBQVEsS0FBSyxDQUFDO0NBQ2hCO0FBQ0Y7Ozs7Ozs7QUFRQSxlQUFlLFVBQVUsRUFBRSxnQkFBZ0IsVUFBVSxDQUFDLEdBQUc7Q0FDdkQsTUFBTSxVQUFVLGdCQUFnQjtDQUNoQyxNQUFNLFVBQVUsS0FBSyxLQUFLLFNBQVMsS0FBSztDQUV4QyxJQUFJLENBQUUsTUFBTSxPQUFPLE9BQU8sR0FBSTtFQUM1QixJQUFJLGVBQWU7R0FDakIsUUFBUSxJQUFJLE1BQU0sS0FBSywrQkFBK0IsQ0FBQztHQUN2RDtFQUNGO0VBQ0EsUUFBUSxNQUFNLHdCQUF3QixTQUFTO0VBQy9DLFFBQVEsS0FBSyxDQUFDO0NBQ2hCO0NBRUEsTUFBTSxlQUFlLEtBQUssSUFBSTtDQUM5QixJQUFJO0VBQ0YsS0FBSyxNQUFNLFlBQVksZUFBZTtHQUNwQyxNQUFNLE1BQU0sS0FBSyxLQUFLLFNBQVMsU0FBUyxXQUFXO0dBQ25ELGdCQUFnQixTQUFTLE1BQU0sU0FBUyxhQUFhLEdBQUc7R0FFeEQsTUFBTSxjQUFjLFVBQVU7SUFBRTtJQUFLLGtCQUFrQixDQUFDO0dBQUUsQ0FBQztFQUM3RDtFQUNBLGtCQUFrQixPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksWUFBWTtDQUMxRCxTQUFTLEdBQUc7RUFDVixrQkFBa0IsT0FBTyxPQUFPLEtBQUssSUFBSSxJQUFJLFlBQVk7RUFDekQsUUFBUSxNQUFNLENBQUM7RUFDZixRQUFRLEtBQUssQ0FBQztDQUNoQjtBQUNGOzs7O0FBS0EsZUFBZSxjQUNiLFVBQ0EsU0FDQTtDQUNBLE1BQU0sUUFBUTtFQUNaO0dBQUUsTUFBTTtHQUFhLEtBQUssU0FBUyxrQkFBa0I7RUFBRTtFQUN2RDtHQUFFLE1BQU07R0FBUyxLQUFLLFNBQVMsYUFBYSxRQUFRLGdCQUFnQjtFQUFFO0VBQ3RFO0dBQUUsTUFBTTtHQUFjLEtBQUssU0FBUyxtQkFBbUI7RUFBRTtDQUMzRCxDQUFDLENBQUMsUUFBUSxTQUFTLEtBQUssR0FBRztDQUUzQixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7RUFDckMsTUFBTSxPQUFPLE1BQU07RUFDbkIsTUFBTSxTQUFTLE1BQU0sTUFBTSxTQUFTO0VBRXBDLElBQUk7R0FDRixPQUFPLEtBQUssR0FBRztHQUNmLGVBQWUsS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNO0dBQzFDLE1BQU0sbUJBQW1CLEtBQUssS0FBSyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUM7R0FDdkQsaUJBQWlCLEtBQUssTUFBTSxNQUFNO0VBQ3BDLFNBQVMsR0FBRztHQUNWLGdCQUFnQixLQUFLLE1BQU0sTUFBTTtHQUNqQyxNQUFNLElBQUksTUFBTSxHQUFHLEtBQUssS0FBSyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7RUFDckQ7Q0FDRjtBQUNGOzs7Ozs7Ozs7O0FBV0EsZUFBZSxRQUFRO0NBRXJCLE1BQU0sRUFBRSxZQURRLGNBQWMsT0FBTyxLQUFLLEdBQ3RCLENBQUEsQ0FBUSxvQkFBb0I7Q0FDaEQsUUFBUSxJQUFJLGNBQWMsUUFBUSxHQUFHO0NBRXJDLE1BQU0sVUFBVSxnQkFBZ0I7Q0FDaEMsTUFBTSxhQUFhO0NBRW5CLElBQUksQ0FBRSxNQUFNLE9BQU8sVUFBVSxHQUFJO0VBQy9CLFFBQVEsSUFBSSxNQUFNLElBQUksR0FBRyxXQUFXLDZDQUE2QyxDQUFDO0VBQ2xGLFFBQVEsSUFBSSxNQUFNLEtBQUssd0JBQXdCLENBQUM7RUFDaEQ7Q0FDRjtDQUVBLE1BQU0sRUFBRSxVQUFVLE1BQU0sT0FBTztDQUMvQixNQUFNLGdCQUFnQixNQUNwQixRQUFRLFVBQ1I7RUFBQztFQUF3QjtFQUFNO0VBQWlCO0NBQVUsR0FDMUQ7RUFDRSxLQUFLO0VBQ0wsT0FBTztDQUNULENBQ0Y7Q0FFQSxRQUFRLEdBQUcsZ0JBQWdCO0VBQ3pCLGNBQWMsS0FBSyxTQUFTO0VBQzVCLFFBQVEsS0FBSyxDQUFDO0NBQ2hCLENBQUM7QUFDSDtBQUVBLGVBQWUsZ0JBQWdCO0NBRTdCLFdBQVcsSUFBSSxTQUFTO0FBQzFCO0FBRUEsZUFBZSxzQkFBc0I7Q0FDbkMsZUFBZSxLQUFLO0FBQ3RCO0FBRUEsZUFBZSxjQUFjLFNBQW1DO0NBQzlELE1BQU0sY0FBYztDQUNwQixNQUFNLFNBQVMsVUFBVSxTQUFTLE9BQU87QUFDM0M7QUFFQSxlQUFlLGNBQWM7Q0FDM0IsTUFBTSxjQUFjO0NBQ3BCLE1BQU0sU0FBUyxVQUFVLFNBQVMscUJBQXFCLENBQUM7QUFDMUQ7QUFFQSxlQUFlLG1CQUFtQjtDQUNoQyxNQUFNLGNBQWM7Q0FFcEIsTUFBTSxFQUFFLFVBQVUsTUFBTSxTQUFTLFVBQVU7Q0FFM0MsSUFBSSxDQURlLE1BQU0sTUFBTSxTQUFTLEtBQUssV0FBVyxDQUNuRCxHQUFZO0VBQ2YsUUFBUSxJQUNOLE1BQU0sSUFDSix5REFDRixDQUNGO0VBQ0EsS0FBSyxNQUFNLFFBQVEsT0FDakIsSUFBSSxLQUFLLFFBQVEsU0FBUyxHQUN4QixRQUFRLElBQUksTUFBTSxPQUFPLEtBQUssS0FBSyxLQUFLLFlBQVksS0FBSyxRQUFRLE9BQU8sRUFBRSxDQUFDO0VBRy9FLFFBQVEsS0FBSyxDQUFDO0NBQ2hCO0NBRUEsTUFBTSxRQUFRLE1BQU0sU0FBUyxzQkFBc0I7Q0FDbkQsSUFBSSxRQUFRLEdBQ1YsUUFBUSxJQUFJLE1BQU0sTUFBTSxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFFN0Q7QUFFQSxlQUFlLGlCQUFpQjtDQUM5QixNQUFNLGNBQWM7Q0FFcEIsTUFBTSxTQUFTLE1BQU0sU0FBUyxVQUFVO0NBRXhDLFFBQVEsSUFBSSxNQUFNO0FBQ3BCO0FBRUEsZUFBZSxlQUFlO0NBQzVCLE1BQU0sWUFBWSxPQUFPLFNBQVMscUJBQXFCO0NBQ3ZELE1BQU0sVUFBVSxDQUNkO0VBQ0UsT0FBTztFQUNQLFFBQVEsT0FBTyxTQUFTO0NBQzFCLEdBQ0E7RUFDRSxPQUFPO0VBQ1AsUUFBUSxPQUFPLFNBQVM7RUFDeEIsZUFBZTtHQUNiLE1BQU0sYUFBYSxPQUFPLFNBQVMsUUFBUTtHQUMzQyxNQUFNLFlBQVksT0FBTyxTQUFTLEtBQUs7R0FDdkMsT0FBTyxXQUFXLFNBQVMsVUFBVSxRQUFRLFdBQVcsYUFBYSxVQUFVO0VBQ2pGLEVBQUEsQ0FBRztDQUNMLENBQ0Y7Q0FPQSxRQUFRLElBQUksU0FBUztDQUNyQixNQUFNLGVBQWUsNEJBQTRCLEtBQUssSUFBSSxFQUFFO0NBQzVELE1BQU0sVUFBVSxVQUFVO0NBQzFCLE1BQU0saUJBQWlCLHVDQUF1QyxLQUFLLElBQUksRUFBRTtDQUN6RSxTQUNFLGVBQWUsUUFBUSxLQUFLLEtBQUssUUFBUSxLQUFLLEtBQUssUUFBUSxTQUFTLHFEQUFxRCxRQUFRLFNBQVMsS0FBSyxjQUNqSjtDQUNBLE1BQU0sTUFBTSxLQUFLLFNBQVM7Q0FDMUIsTUFBTSxDQUFDLENBQUMsZUFBZSxNQUFNLElBQUksSUFDL0IscUhBQ0EsQ0FBQyxRQUFRLFFBQVEsQ0FDbkI7Q0FDQSxJQUFJLFdBQVcsUUFBUSxHQUNyQixTQUNFLGVBQWUsUUFBUSxLQUFLLEtBQUssUUFBUSxLQUFLLEtBQUssUUFBUSxTQUFTLGtEQUFrRCxRQUFRLFNBQVMsMENBQTBDLGdCQUNuTDtDQUlGLEtBQUssTUFBTSxFQUFFLE9BQU8sUUFBUSxZQUFZLFNBQVM7RUFDL0MsTUFBTSxPQUFPLE9BQU87RUFFcEIsSUFBSSxXQUFXLE1BQU07R0FDbkIsUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDO0dBQzNDO0VBQ0Y7RUFFQSxNQUFNLEtBQUssS0FBSztHQUNkLEdBQUc7R0FDSCxZQUFZO0lBQ1YsR0FBSyxPQUFPLGNBQWMsQ0FBQztJQUMzQixVQUFVO0dBQ1o7RUFDRixDQUFDO0VBQ0QsTUFBTSxDQUFDLENBQUMsUUFBUSxNQUFNLEdBQUcsSUFBSSx3QkFBd0IsS0FBSyxTQUFTLEVBQUU7RUFDckUsSUFBSSxLQUFLO0dBQ1AsUUFBUSxJQUFJLE1BQU0sT0FBTyxHQUFHLE1BQU0sY0FBYyxLQUFLLFNBQVMsaUJBQWlCLENBQUM7R0FDaEYsTUFBTSxHQUFHLFFBQVE7R0FDakI7RUFDRjtFQUVBLFFBQVEsSUFBSSxXQUFXLE1BQU0sSUFBSTtFQUNqQyxNQUFNLFdBQVcsV0FBVyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0VBQy9ELFNBQVMsR0FBRyxTQUFTLGlDQUFpQyxLQUFLLFNBQVMsSUFBSTtFQUN4RSxTQUFTLEdBQUcsU0FBUyx5QkFBeUIsS0FBSyxTQUFTLElBQUk7RUFDaEUsU0FBUyxHQUFHLFNBQVMsR0FBRyxLQUFLLFNBQVMsS0FBSyxjQUFjO0VBQ3pELElBQUksTUFBTSxPQUFPLGNBQWMsR0FDN0IsU0FBUyxHQUFHLFNBQVMsR0FBRyxLQUFLLFNBQVMsS0FBSyxnQkFBZ0I7RUFHN0QsTUFBTSxHQUFHLFFBQVE7Q0FDbkI7Q0FFQSxNQUFNLElBQUksUUFBUTtBQUNwQjtBQUVBLGVBQWUsZUFBZSxVQUFrQixXQUFxQjtDQUNuRSxNQUFNLG9CQUFvQjtDQUUxQixNQUFNLGVBQWUsY0FBYyxVQUFVLFNBQVM7Q0FDdEQsTUFBTSxlQUFlLEtBQUs7QUFDNUI7QUFFQSxlQUFlLGVBQWU7Q0FDNUIsTUFBTSxvQkFBb0I7Q0FFMUIsTUFBTSxlQUFlLEtBQUs7QUFDNUI7Ozs7O0FBTUEsZUFBZSxjQUFjO0NBRTNCLE1BQU0sa0JBRFUsYUFBYSxRQUFRLElBQ2IsQ0FBTztBQUNqQzs7Ozs7QUFNQSxlQUFlLGdCQUFnQjtDQUU3QixNQUFNLG9CQURVLGFBQWEsUUFBUSxJQUNYLENBQU87QUFDbkM7Ozs7O0FBTUEsZUFBZSxrQkFBa0I7Q0FFL0IsTUFBTSxzQkFEVSxhQUFhLFFBQVEsSUFDVCxDQUFPO0FBQ3JDOzs7O0FBS0EsU0FBUyxhQUNQLE1BQytEO0NBQy9ELE1BQU0sVUFBeUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUV2RixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7RUFDcEMsTUFBTSxNQUFNLEtBQUs7RUFFakIsSUFBSSxJQUFJLFdBQVcsSUFBSSxHQUFHO0dBQ3hCLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQztHQUV2QixJQUFJLElBQUksU0FBUyxHQUFHLEdBQUc7SUFDckIsTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLE1BQU0sR0FBRztJQUM1QixRQUFRLEtBQUs7R0FDZixPQUFPO0lBQ0wsTUFBTSxPQUFPLEtBQUssSUFBSTtJQUN0QixJQUFJLFFBQVEsQ0FBQyxLQUFLLFdBQVcsSUFBSSxHQUFHO0tBQ2xDLFFBQVEsT0FBTztLQUNmO0lBQ0YsT0FDRSxRQUFRLE9BQU87R0FFbkI7RUFDRixPQUFPLElBQUksSUFBSSxXQUFXLEdBQUcsR0FBRztHQUM5QixNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUM7R0FDdkIsTUFBTSxPQUFPLEtBQUssSUFBSTtHQUV0QixJQUFJLFFBQVEsQ0FBQyxLQUFLLFdBQVcsR0FBRyxHQUFHO0lBQ2pDLFFBQVEsT0FBTztJQUNmO0dBQ0YsT0FDRSxRQUFRLE9BQU87RUFFbkIsT0FDRSxRQUFRLEVBQUUsS0FBSyxHQUFHO0NBRXRCO0NBRUEsT0FBTztBQUNUO0FBRUEsZUFBZSxjQUFjLE1BQWM7Q0FDekMsTUFBTSxjQUFjLEtBQUssS0FBSyxPQUFPLGFBQWEsT0FBTyxXQUFXO0NBQ3BFLE1BQU0sWUFBWSxNQUFNLFFBQVEsV0FBVztDQXVCM0MsTUFBTSxXQUFXLElBREksT0FwQkcsWUFBWTtFQUNsQyxJQUFJLENBQUUsTUFBTSxPQUFPLFdBQVcsR0FDNUIsTUFBTSxNQUFNLGFBQWEsRUFBRSxXQUFXLEtBQUssQ0FBQztFQUc5QyxNQUFNLGVBQWUsVUFDbEIsUUFBUSxhQUFhLFNBQVMsV0FBVyxHQUFHLEtBQUssU0FBUyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQzFFLEtBQUssYUFBYTtHQUNqQixNQUFNLEdBQUcsU0FBUyxTQUFTLE1BQU0sYUFBYSxLQUFLLENBQUMsS0FBSyxHQUFHO0dBQzVELE9BQU8sU0FBUyxLQUFLO0VBQ3ZCLENBQUMsQ0FBQyxDQUNELFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQztFQUUzQixJQUFJLGFBQWEsU0FBUyxHQUN4QixPQUFPLGFBQWE7RUFHdEIsT0FBTztDQUNULEVBQUEsQ0FBRyxJQUU2QixFQUNFLEdBQUcsS0FBSztDQUMxQyxNQUFNLFVBQVUsS0FBSyxLQUFLLGFBQWEsUUFBUTtDQWEvQyxNQUFNLFVBQVUsU0FYSDtFQUNYO0VBQ0E7RUFDQTtFQUNBLGdCQUFnQixTQUFTO0VBQ3pCO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Q0FDRixDQUFDLENBQUMsS0FBSyxJQUNrQixDQUFJO0NBRTdCLFNBQVMsUUFBUSxTQUFTO0NBRTFCLE1BQU0sVUFBVSxrRUFBa0UsU0FBUyxRQUN6RixPQUNBLEtBQ0Y7Q0FDQSxRQUFRLElBQUksR0FBRyxNQUFNLEtBQUssT0FBTyxFQUFFLHNCQUFzQjtDQUN6RCxTQUFTLFNBQVMsUUFBUSxXQUFXO0FBQ3ZDO0FBRUEsZUFBZSxZQUFZLFVBQWtCO0NBQzNDLE1BQU0sT0FBTyxPQUFPLGFBQWE7RUFBRTtFQUFVLE9BQU87Q0FBUyxDQUFDO0NBRTlELE1BQU0sRUFBRSxVQUFVLGdCQUFnQjtDQUNsQyxNQUFNLFFBQVEsTUFBTSxJQUFJLElBQUk7Q0FJNUIsSUFIZ0IsTUFBTSxJQUFJLFVBR3RCLEdBQVM7RUFDWCxRQUFRLElBQUksYUFBYSxTQUFTLHdCQUF3QjtFQUMxRDtDQUNGO0NBRUEsTUFBTSxFQUFFLGtCQUFrQixNQUFNLE9BQU87Q0FDdkMsTUFBTSxTQUFTLGNBQWMsSUFBSSxRQUFRO0NBQ3pDLElBQUksQ0FBQyxRQUFRO0VBQ1gsUUFBUSxNQUFNLHFCQUFxQixVQUFVO0VBQzdDO0NBQ0Y7Q0FHQSxJQUFJLE9BQU87RUFDVCxRQUFRLElBQUksYUFBYSxTQUFTLFVBQVU7RUFDNUMsUUFBUSxJQUFJLG1DQUFtQztFQUMvQyxJQUFJO0dBQ0YsTUFBTSxlQUFlLE9BQU8sT0FBTyxNQUFNO0dBQ3pDLE1BQU0sU0FDSixpQkFBaUIsUUFBUSxpQkFBaUIsUUFBUSxpQkFBaUIsT0FDL0QsZUFDQTtHQUVOLE1BQU0sU0FBUyxNQUFNLE9BQU8sY0FBYztJQUN4QyxrQkFBa0I7SUFDbEIsV0FBVztJQUNYO0dBQ0YsQ0FBQztHQUVELFFBQVEsSUFBSSxXQUFXLE9BQU8sV0FBVyxTQUFTO0VBQ3BELFNBQVMsT0FBTztHQUNkLElBQUksaUJBQWlCLFNBQVMsTUFBTSxRQUFRLFNBQVMsbUJBQW1CLEdBQUc7SUFDekUsUUFBUSxNQUFNLE9BQU8sTUFBTSxTQUFTO0lBQ3BDLFFBQVEsTUFBTSxxREFBcUQ7R0FDckUsT0FDRSxNQUFNO0VBRVY7RUFDQTtDQUNGO0NBTUEsUUFBUSxJQUFJLGlDQUFpQztDQUM3QyxNQUFNLE9BQU8sc0JBQXNCO0NBQ25DLFFBQVEsSUFBSSxhQUFhLFNBQVMsOEJBQThCO0NBQ2hFLFFBQVEsSUFBSSxxQ0FBcUMsU0FBUyxxQkFBcUI7QUFDakY7Ozs7Ozs7Ozs7O0FBWUEsZUFBZSxTQUFTLFVBQWtCO0NBQ3hDLE1BQU0sRUFBRSxrQkFBa0IsTUFBTSxPQUFPO0NBQ3ZDLE1BQU0sRUFBRSxPQUFPLFlBQVksZ0JBQWdCO0NBRzNDLElBQUksTUFBTSxJQUFJLEtBQUssS0FBSyxhQUFhLE9BQU87RUFDMUMsTUFBTSxjQUFjLGNBQWMsZUFBZTtFQUNqRCxRQUFRLElBQUksc0NBQXNDLFlBQVksT0FBTyxlQUFlO0VBRXBGLElBQUksY0FBYztFQUNsQixNQUFNLFNBQW1CLENBQUM7RUFFMUIsS0FBSyxNQUFNLFVBQVUsYUFDbkIsSUFBSTtHQUNGLFFBQVEsSUFBSSxjQUFjLE9BQU8sR0FBRyxJQUFJO0dBQ3hDLE1BQU0sZUFBZSxRQUFRLFVBQVUsT0FBTyxPQUFPLE1BQU07R0FDM0QsTUFBTSxTQUNKLGlCQUFpQixRQUFRLGlCQUFpQixRQUFRLGlCQUFpQixPQUMvRCxlQUNBO0dBRU4sTUFBTSxTQUFTLE1BQU0sT0FBTyxjQUFjO0lBQ3hDLGtCQUFrQixDQUFDLE1BQU0sSUFBSSxZQUFZO0lBQ3pDLFdBQVcsQ0FBQyxNQUFNLElBQUksWUFBWTtJQUNsQztHQUNGLENBQUM7R0FFRCxlQUFlLE9BQU87R0FDdEIsUUFBUSxJQUFJLE9BQU8sT0FBTyxHQUFHLElBQUksT0FBTyxXQUFXLFdBQVc7RUFDaEUsU0FBUyxPQUFPO0dBQ2QsTUFBTSxVQUFVLGlCQUFpQixRQUFRLE1BQU0sVUFBVTtHQUN6RCxPQUFPLEtBQUssR0FBRyxPQUFPLEdBQUcsSUFBSSxTQUFTO0dBQ3RDLFFBQVEsTUFBTSxPQUFPLE9BQU8sR0FBRyxJQUFJLFFBQVEsR0FBRztFQUNoRDtFQUdGLFFBQVEsSUFBSSxvQkFBb0IsWUFBWSxhQUFhO0VBQ3pELE1BQU0sZ0JBQWlCLGNBQWMsSUFBSztFQUMxQyxRQUFRLElBQUksd0JBQXdCLGNBQWMsUUFBUSxDQUFDLEdBQUc7RUFFOUQsSUFBSSxPQUFPLFNBQVMsR0FBRztHQUNyQixRQUFRLE1BQU0sd0JBQXdCLE9BQU8sT0FBTyxHQUFHO0dBQ3ZELEtBQUssTUFBTSxPQUFPLFFBQ2hCLFFBQVEsTUFBTSxPQUFPLEtBQUs7RUFFOUI7RUFDQTtDQUNGO0NBR0EsTUFBTSxTQUFTLGNBQWMsSUFBSSxRQUFRO0NBQ3pDLElBQUksQ0FBQyxRQUFRO0VBQ1gsUUFBUSxNQUFNLHFCQUFxQixVQUFVO0VBQzdDO0NBQ0Y7Q0FFQSxNQUFNLE9BQU8sTUFBTSxJQUFJLFlBQVksSUFBSSxpQkFBaUI7Q0FDeEQsUUFBUSxJQUNOLE1BQU0sU0FBUyxpQkFBaUIsaUJBQWlCLGFBQWEsd0JBQXdCLFNBQVMsSUFDakc7Q0FFQSxJQUFJO0VBQ0YsTUFBTSxlQUFlLFFBQVEsVUFBVSxPQUFPLE9BQU8sTUFBTTtFQUMzRCxNQUFNLFNBQ0osaUJBQWlCLFFBQVEsaUJBQWlCLFFBQVEsaUJBQWlCLE9BQU8sZUFBZTtFQUUzRixNQUFNLFNBQVMsTUFBTSxPQUFPLGNBQWM7R0FDeEMsa0JBQWtCLENBQUMsTUFBTSxJQUFJLFlBQVk7R0FDekMsV0FBVyxDQUFDLE1BQU0sSUFBSSxZQUFZO0dBQ2xDO0VBQ0YsQ0FBQztFQUVELFFBQVEsSUFBSSxZQUFZLE9BQU8sV0FBVyxjQUFjO0VBS3hELE1BQU0sZ0JBQWlCLE9BQU8sYUFBYSxJQUFLO0VBQ2hELFFBQVEsSUFBSSx3QkFBd0IsY0FBYyxRQUFRLENBQUMsR0FBRztDQUNoRSxTQUFTLE9BQU87RUFDZCxJQUFJLGlCQUFpQixPQUNuQixJQUFJLE1BQU0sUUFBUSxTQUFTLG1CQUFtQixHQUFHO0dBQy9DLFFBQVEsTUFBTSxPQUFPLE1BQU0sU0FBUztHQUNwQyxRQUFRLE1BQU0seUNBQXlDO0dBQ3ZELFFBQVEsTUFBTSwwREFBMEQ7R0FDeEUsUUFBUSxNQUNOLGdGQUNGO0VBQ0YsT0FBTyxJQUFJLE1BQU0sUUFBUSxTQUFTLFlBQVksR0FBRztHQUMvQyxRQUFRLE1BQU0sT0FBTyxNQUFNLFNBQVM7R0FDcEMsUUFBUSxNQUFNLDBDQUEwQztFQUMxRCxPQUNFLFFBQVEsTUFBTSxpQ0FBaUMsTUFBTSxTQUFTO09BR2hFLFFBQVEsTUFBTSw2Q0FBNkM7Q0FFL0Q7QUFDRjtBQUVBLGVBQWUsZUFBZSxVQUFrQjtDQUM5QyxNQUFNLE9BQU8sT0FBTyxpQkFBaUIsU0FBUyxFQUM1QyxTQUNGLENBQUM7QUFDSDtBQUVBLGVBQWUsb0JBQW9CLFVBQWtCO0NBQ25ELE1BQU0sT0FBTyxPQUFPLGlCQUFpQixjQUFjLEVBQ2pELFNBQ0YsQ0FBQztBQUNIO0FBRUEsZUFBZSxtQkFBbUIsVUFBa0I7Q0FDbEQsTUFBTSxPQUFPLE9BQU8saUJBQWlCLGFBQWE7RUFDaEQ7RUFDQSxPQUFPO0NBQ1QsQ0FBQztBQUNIO0FBRUEsZUFBZSxtQkFBbUIsVUFBa0I7Q0FDbEQsTUFBTSxPQUFPLE9BQU8saUJBQWlCLGFBQWEsRUFDaEQsU0FDRixDQUFDO0FBQ0g7Ozs7Ozs7QUFRQSxlQUFlLGNBQWM7Q0FDM0IsTUFBTSxFQUFFLFVBQVUsZ0JBQWdCO0NBQ2xDLE1BQU0sV0FBVyxNQUFNLElBQUksUUFBUTtDQUtuQyxNQUFNLGFBQWEsS0FBSyxRQUFRLE9BQU8sS0FBSyxTQUFTLE1BQU0sTUFBTSxPQUFPLFFBQVE7Q0FDaEYsSUFBSSxDQUFFLE1BQU0sT0FBTyxVQUFVLEdBQUk7RUFDL0IsUUFBUSxJQUFJLE1BQU0sT0FBTyw0Q0FBNEMsQ0FBQztFQUN0RTtDQUNGO0NBRUEsSUFBSSxVQUFVO0VBQ1osTUFBTSxlQUFlLEdBQUcsUUFBUSxHQUFHO0dBQ2pDLFlBQVk7R0FDWjtFQUNGLENBQUM7RUFJRCxNQUFNLEdBQUcsS0FBSyxLQUFLLEdBQUcsUUFBUSxHQUFHLFdBQVcsWUFBWSxrQkFBa0IsR0FBRyxFQUFFLE9BQU8sS0FBSyxDQUFDO0VBRTVGLFFBQVEsSUFBSSxNQUFNLEtBQUssOENBQThDLENBQUM7RUFDdEUsUUFBUSxJQUFJLE1BQU0sSUFBSSxzREFBc0QsQ0FBQztFQUM3RSxRQUFRLElBQ04sTUFBTSxJQUNKLG9GQUNGLENBQ0Y7Q0FDRixPQUNFLE1BQU0sZUFBZSxnQkFBZ0IsR0FBRztFQUN0QyxZQUFZO0VBQ1osZ0JBQWdCO0VBQ2hCO0NBQ0YsQ0FBQztBQUVMOzs7O0FBS0EsZUFBZSxrQkFBa0IsR0FBVyxHQUE2QjtDQUN2RSxJQUFJO0VBQ0YsT0FBUSxNQUFNLFNBQVMsQ0FBQyxNQUFRLE1BQU0sU0FBUyxDQUFDO0NBQ2xELFFBQVE7RUFDTixPQUFPO0NBQ1Q7QUFDRjs7Ozs7Ozs7QUFTQSxlQUFlLGdCQUFnQixNQUFjLFVBQW9DO0NBSS9FLElBQUksTUFBTSxrQkFBa0IsS0FBSyxLQUFLLE1BQU0sU0FBUyxHQUFHLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQyxHQUNoRixPQUFPO0NBR1QsTUFBTSxTQUFTLEtBQUssS0FBSyxNQUFNLFdBQVcsUUFBUTtDQUNsRCxNQUFNLFNBQVMsS0FBSyxLQUFLLE1BQU0sV0FBVyxRQUFRO0NBRWxELElBQUk7Q0FDSixJQUFJO0VBQ0YsV0FBVyxNQUFNLFNBQVMsTUFBTTtDQUNsQyxRQUFRLENBRVI7Q0FFQSxJQUFJLGFBQWEsVUFBYyxNQUFNLE9BQU8sTUFBTSxHQUNoRCxPQUFPO0NBR1QsTUFBTSxNQUFNLEtBQUssUUFBUSxNQUFNLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztDQUNyRCxNQUFNLEdBQUcsUUFBUTtFQUFFLFdBQVc7RUFBTSxPQUFPO0NBQUssQ0FBQztDQUNqRCxNQUFNLFFBQVEsS0FBSyxTQUFTLEtBQUssUUFBUSxNQUFNLEdBQUcsTUFBTSxHQUFHLFFBQVEsS0FBSztDQUN4RSxPQUFPO0FBQ1Q7Ozs7Ozs7Ozs7Ozs7O0FBZUEsU0FBUyxrQkFBMEI7Q0FDakMsTUFBTSxZQUFZLGdCQUFnQjtDQUNsQyxPQUFPLEtBQUssU0FBUyxTQUFTLE1BQU0sYUFBYSxLQUFLLFFBQVEsU0FBUyxJQUFJO0FBQzdFOzs7Ozs7Ozs7Ozs7O0FBY0EsZUFBZSx5QkFBeUIsTUFBNkI7Q0FDbkUsS0FBSyxNQUFNLFFBQVEsQ0FBQyxXQUFXLFNBQVMsR0FBRztFQUN6QyxNQUFNLFNBQVMsS0FBSyxLQUFLLE1BQU0sTUFBTSxVQUFVLFFBQVE7RUFFdkQsSUFBSTtHQUNGLE1BQU0sU0FBUyxNQUFNO0dBQ3JCO0VBQ0YsUUFBUSxDQUVSO0VBRUEsSUFBSSxDQUFFLE1BQU0sT0FBTyxNQUFNLEdBQ3ZCO0VBR0YsSUFBSTtFQUNKLElBQUk7R0FDRixVQUFVLE1BQU0sUUFBUSxNQUFNO0VBQ2hDLFFBQVE7R0FDTjtFQUNGO0VBR0EsSUFBSSxDQURrQixRQUFRLE1BQU0sTUFBTSxFQUFFLFNBQVMsS0FBSyxLQUFLLE1BQU0sVUFDaEUsR0FDSDtFQUdGLE1BQU0sR0FBRyxRQUFRO0dBQUUsV0FBVztHQUFNLE9BQU87RUFBSyxDQUFDO0VBQ2pELFFBQVEsSUFBSSxNQUFNLE9BQU8sb0JBQW9CLEtBQUssNkJBQTZCLENBQUM7Q0FDbEY7QUFDRjs7Ozs7OztBQVFBLGVBQWUsY0FBYyxZQUFrRTtDQUM3RixJQUFJLENBQUMsY0FBYyxDQUFFLE1BQU0sT0FBTyxVQUFVLEdBQzFDLE9BQU8sQ0FBQztDQUdWLE1BQU0sVUFBVSxNQUFNLFFBQVEsWUFBWSxFQUFFLGVBQWUsS0FBSyxDQUFDO0NBQ2pFLE1BQU0sU0FBNkMsQ0FBQztDQUVwRCxLQUFLLE1BQU0sU0FBUyxTQUFTO0VBQzNCLElBQUksQ0FBQyxNQUFNLFlBQVksS0FBSyxDQUFDLE1BQU0sS0FBSyxXQUFXLFFBQVEsR0FDekQ7RUFFRixNQUFNLFNBQVMsS0FBSyxLQUFLLFlBQVksTUFBTSxJQUFJO0VBQy9DLElBQUksQ0FBRSxNQUFNLE9BQU8sS0FBSyxLQUFLLFFBQVEsVUFBVSxDQUFDLEdBQzlDO0VBRUYsT0FBTyxLQUFLO0dBQUU7R0FBUSxNQUFNLE1BQU07RUFBSyxDQUFDO0NBQzFDO0NBRUEsT0FBTyxPQUFPLE1BQU0sR0FBRyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFDO0FBQzNEOzs7Ozs7QUFPQSxlQUFlLGVBQ2IsTUFDQSxTQUtBO0NBQ0EsTUFBTSxZQUFZLEtBQUssS0FBSyxNQUFNLFNBQVM7Q0FDM0MsTUFBTSxhQUFhLEtBQUssS0FBSyxXQUFXLFFBQVE7Q0FDaEQsTUFBTSxNQUFNLFlBQVksRUFBRSxXQUFXLEtBQUssQ0FBQztDQUUzQyxNQUFNLHlCQUF5QixJQUFJO0NBR25DLE1BQU0sVUFBVSxNQUFNLGNBQWMsUUFBUSxVQUFVO0NBRXRELEtBQUssTUFBTSxFQUFFLFFBQVEsVUFBVSxTQUFTO0VBQ3RDLE1BQU0sWUFBWSxLQUFLLEtBQUssWUFBWSxJQUFJO0VBRzVDLElBQUk7R0FDRixNQUFNLEdBQUcsV0FBVztJQUFFLFdBQVc7SUFBTSxPQUFPO0dBQUssQ0FBQztFQUN0RCxRQUFRLENBRVI7RUFFQSxJQUFJLFFBQVEsWUFDVixJQUFJO0dBQ0YsTUFBTSxRQUFRLFFBQVEsV0FBVyxLQUFLO0VBQ3hDLFNBQVMsT0FBTztHQUNkLFFBQVEsSUFDTixNQUFNLE9BQ0oscUJBQXFCLEtBQUssS0FBSyxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLLEdBQ3RGLENBQ0Y7R0FDQSxRQUFRLElBQUksTUFBTSxPQUFPLDJCQUEyQixDQUFDO0dBQ3JELE1BQU0sV0FBVyxRQUFRLFNBQVM7RUFDcEM7T0FFQSxNQUFNLFdBQVcsUUFBUSxTQUFTO0VBR3BDLE1BQU0sZ0JBQWdCLE1BQU0sS0FBSyxLQUFLLFVBQVUsSUFBSSxDQUFDO0NBQ3ZEO0NBRUEsUUFBUSxJQUNOLE1BQU0sTUFDSixZQUFZLFFBQVEsYUFBYSxXQUFXLFNBQVMsc0JBQXNCLFFBQVEsT0FBTyxLQUFLLFFBQVEsS0FBSyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQ3JJLENBQ0Y7Q0FDQSxRQUFRLElBQUksTUFBTSxJQUFJLDhDQUE4QyxDQUFDO0NBSXJFLElBQUksUUFBUSxnQkFBZ0I7RUFDMUIsTUFBTSxNQUFNLEtBQUssS0FBSyxNQUFNLFNBQVMsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0VBQzNELE1BQU0sb0JBQW9CLEtBQUssS0FBSyxNQUFNLFdBQVcscUJBQXFCO0VBQzFFLElBQUksQ0FBRSxNQUFNLE9BQU8saUJBQWlCLEdBQ2xDLElBQUk7R0FnQkYsTUFBTSxVQUFVLG1CQUFtQixHQUFHLEtBQUssVUFBVSxFQWRuRCxPQUFPLEVBQ0wsYUFBYSxDQUNYO0lBQ0UsU0FBUztJQUNULE9BQU8sQ0FDTDtLQUNFLE1BQU07S0FDTixTQUFTO0lBQ1gsQ0FDRjtHQUNGLENBQ0YsRUFDRixFQUVtRCxHQUFpQixNQUFNLENBQUMsRUFBRSxHQUFHO0dBQ2xGLFFBQVEsSUFBSSxNQUFNLE1BQU0sdUNBQXVDLENBQUM7RUFDbEUsU0FBUyxPQUFPO0dBQ2QsUUFBUSxNQUNOLE1BQU0sSUFDSiwyQ0FBMkMsaUJBQWlCLFFBQVEsTUFBTSxVQUFVLE9BQU8sS0FBSyxHQUNsRyxDQUNGO0VBQ0Y7T0FFQSxRQUFRLElBQUksTUFBTSxJQUFJLDBEQUEwRCxDQUFDO0NBRXJGO0NBRUEsUUFBUSxJQUNOLE1BQU0sSUFDSiw2RkFDRixDQUNGO0FBQ0Y7Ozs7Ozs7Ozs7OztBQWFBLGVBQWUsZUFBZTtDQUM1QixNQUFNLFVBQVUsZ0JBQWdCO0NBQ2hDLE1BQU0sYUFBYSxLQUFLLFFBQVEsT0FBTyxLQUFLLFNBQVMsTUFBTSxNQUFNLE9BQU8sUUFBUTtDQUNoRixNQUFNLFlBQVksS0FBSyxLQUFLLFlBQVksVUFBVSxVQUFVO0NBRTVELElBQUksQ0FBRSxNQUFNLE9BQU8sU0FBUyxHQUFJO0VBQzlCLFFBQVEsSUFBSSxNQUFNLE9BQU8seUNBQXlDLENBQUM7RUFDbkU7Q0FDRjtDQUdBLE1BQU0sUUFBUSxNQUFNLFNBQVMsV0FBVyxPQUFPLEVBQUEsQ0FBRyxRQUFRLDBCQUEwQixFQUFFO0NBRXRGLE1BQU0sY0FBYztDQUNwQixNQUFNLFlBQVk7Q0FDbEIsTUFBTSxVQUFVLEdBQUcsWUFBWSxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUk7Q0FFbkQsTUFBTSxhQUFhLEtBQUssS0FBSyxTQUFTLFdBQVc7Q0FDakQsTUFBTSxXQUFZLE1BQU0sT0FBTyxVQUFVLElBQUssTUFBTSxTQUFTLFlBQVksT0FBTyxJQUFJO0NBRXBGLElBQUk7Q0FDSixJQUFJO0NBQ0osSUFBSSxhQUFhLFFBQVc7RUFDMUIsT0FBTyxHQUFHLFFBQVE7RUFDbEIsU0FBUztDQUNYLE9BQU87RUFDTCxNQUFNLFdBQVcsU0FBUyxRQUFRLFdBQVc7RUFDN0MsTUFBTSxTQUFTLFNBQVMsUUFBUSxTQUFTO0VBQ3pDLElBQUksYUFBYSxNQUFNLFdBQVcsTUFBTSxXQUFXLFFBQVE7R0FDekQsT0FBTyxTQUFTLE1BQU0sR0FBRyxRQUFRLElBQUksVUFBVSxTQUFTLE1BQU0sU0FBUyxFQUFnQjtHQUN2RixTQUFTO0VBQ1gsT0FBTztHQUNMLE9BQU8sR0FBRyxTQUFTLFFBQVEsRUFBRSxNQUFNLFFBQVE7R0FDM0MsU0FBUztFQUNYO0NBQ0Y7Q0FFQSxJQUFJLFNBQVMsVUFBVTtFQUNyQixRQUFRLElBQUksTUFBTSxJQUFJLGdDQUFnQyxDQUFDO0VBQ3ZEO0NBQ0Y7Q0FFQSxNQUFNLFVBQVUsWUFBWSxJQUFJO0NBQ2hDLFFBQVEsSUFBSSxNQUFNLE1BQU0sZUFBZSxPQUFPLHdCQUF3QixDQUFDO0NBRXZFLElBQUksQ0FBRSxNQUFNLE9BQU8sS0FBSyxLQUFLLFNBQVMsV0FBVyxDQUFDLEdBQUk7RUFDcEQsTUFBTSxRQUFRLGFBQWEsS0FBSyxLQUFLLFNBQVMsV0FBVyxDQUFDO0VBQzFELFFBQVEsSUFBSSxNQUFNLElBQUkseUJBQXlCLENBQUM7Q0FDbEQ7Q0FFQSxRQUFRLElBQUksTUFBTSxJQUFJLHFDQUFxQyxDQUFDO0FBQzlEO0FBRUEsZUFBZSxXQUFXLEtBQWEsTUFBYztDQUNuRCxJQUFJO0VBQ0YsTUFBTSxHQUFHLEtBQUssTUFBTSxFQUFFLFdBQVcsS0FBSyxDQUFDO0VBQ3ZDLFFBQVEsSUFBSSxNQUFNLE1BQU0saUJBQWlCLENBQUM7Q0FDNUMsU0FBUyxXQUFXO0VBQ2xCLFFBQVEsTUFDTixNQUFNLElBQ0osNEJBQTRCLHFCQUFxQixRQUFRLFVBQVUsVUFBVSxPQUFPLFNBQVMsR0FDL0YsQ0FDRjtFQUNBLE1BQU07Q0FDUjtBQUNGO0FBRUEsZUFBZSxnQkFBZ0I7Q0FFN0IsTUFBTSxhQUFhLFFBQVEsS0FBSyxNQUFNLFFBQVEsSUFBSSxXQUFXLFdBQVcsQ0FBQztDQUN6RSxNQUFNLFVBQWdDLENBQUM7Q0FFdkMsSUFBSSxZQUFZO0VBQ2QsTUFBTSxjQUFjLFdBQVcsU0FBUyxHQUFHLElBQ3ZDLFdBQVcsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUN0QixRQUFRLEtBQUssUUFBUSxLQUFLLFFBQVEsVUFBVSxJQUFJO0VBRXBELElBQUksYUFBYTtHQUNmLE1BQU0sWUFBWSxZQUFZLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsS0FBSyxDQUFDO0dBRTVELEtBQUssTUFBTSxNQUFNLFdBQ2YsSUFBSSxnQkFBZ0IsRUFBRSxHQUNwQixRQUFRLEtBQUssRUFBRTtRQUNWO0lBQ0wsUUFBUSxJQUFJLE1BQU0sT0FBTyxxQkFBcUIsSUFBSSxDQUFDO0lBQ25ELFFBQVEsSUFBSSxNQUFNLElBQUksd0JBQXdCLHFCQUFxQixLQUFLLElBQUksR0FBRyxDQUFDO0dBQ2xGO0VBRUo7Q0FDRjtDQUVBLFFBQVEsSUFBSSxNQUFNLE9BQU8sS0FBSyx5Q0FBeUMsQ0FBQztDQUV4RSxJQUFJLFFBQVEsU0FBUyxHQUNuQixRQUFRLElBQUksTUFBTSxJQUFJLGNBQWMsUUFBUSxLQUFLLElBQUksR0FBRyxDQUFDO0NBRzNELE1BQU0sMkJBQTJCLEVBQUUsUUFBUSxDQUFDO0FBQzlDOzs7Ozs7O0FBUUEsZUFBZSxzQkFBc0I7Q0FDbkMsUUFBUSxJQUFJLE1BQU0sT0FBTyxLQUFLLDBEQUEwRCxDQUFDO0NBQ3pGLE1BQU0sd0JBQXdCO0NBQzlCLFFBQVEsSUFBSSxNQUFNLEtBQUssV0FBVyxDQUFDO0FBQ3JDIn0=
|
|
852
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibW9kdWxlXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGtuZXggZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBhZGRDb21wYW5pb25zVG9FbnRpdGllcywgZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMgfSBmcm9tIFwiLi4vYXV0aC9hdXRoLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgaXNWYWxpZFBsdWdpbklkLCBTVVBQT1JURURfUExVR0lOX0lEUyB9IGZyb20gXCIuLi9hdXRoL3BsdWdpbnMvZW50aXR5LWRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCB9IGZyb20gXCIuLi9hdXRoL3BsdWdpbnMvZW50aXR5LWRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52XCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIFdFQl9BUlRJRkFDVFMgfSBmcm9tIFwiLi9idWlsZC1jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgQnVpbGRBcnRpZmFjdCB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZml4dHVyZUV4cGxvcmVDb21tYW5kLCBmaXh0dXJlRmV0Y2hDb21tYW5kLCBmaXh0dXJlR2VuQ29tbWFuZCB9IGZyb20gXCIuL2ZpeHR1cmVcIjtcbmltcG9ydCB7IGdldE1pZ3JhdGVSdW5UYXJnZXRzIH0gZnJvbSBcIi4vbWlncmF0ZS10YXJnZXRzXCI7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gXCIuL3Rlc3QtY29tbWFuZFwiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG4vKipcbiAqIENMSSDsmLXshZjsnYQg7YyM7Iux7ZWY64qUIO2XrO2NvCDtlajsiJhcbiAqL1xuZnVuY3Rpb24gcGFyc2VDbGlPcHRpb25zKGFyZ3Y6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KToge1xuICBmbGFnczogU2V0PHN0cmluZz47IC8vIC0tcmVnZW5lcmF0ZSwgLS1haSwgLS1uby1jb25lcyDrk7FcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgLy8gLS1sb2NhbGUga28g65OxXG59IHtcbiAgY29uc3QgZmxhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG4gICAgaWYgKCFhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSBjb250aW51ZTtcblxuICAgIC8vIC0tb3B0aW9uPXZhbHVlIO2YleyLnVxuICAgIGlmIChhcmcuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmcuc2xpY2UoMikuc3BsaXQoXCI9XCIpO1xuICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyAtLW9wdGlvbiB2YWx1ZSDtmJXsi53snbjsp4Ag7ZmV7J24XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3ZbaSArIDFdO1xuICAgIGlmIChuZXh0QXJnICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItLVwiKSAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgb3B0aW9uc1thcmcuc2xpY2UoMildID0gbmV4dEFyZztcbiAgICAgIGkrKzsgLy8g64uk7J2MIGFyZ+uKlCDqsJLsnbTrr4DroZwg7Iqk7YK1XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIC0tZmxhZyDtmJXsi51cbiAgICAgIGZsYWdzLmFkZChhcmcuc2xpY2UoMikpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZsYWdzLCBvcHRpb25zIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAgY29uc3Qgbm90VG9Jbml0ID0gW1wiZGV2XCIsIFwiYnVpbGRcIiwgXCJzdGFydFwiLCBcInNraWxsc1wiLCBcInRlc3RcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHRzaWNsaeuKlCDsoJXtmZXtlZwg66qF66C57Ja0IOunpOy5reunjCDsp4Dsm5DtlZjrr4DroZwsIC0t66GcIOyLnOyeke2VmOuKlCDsmLXshZjqs7wg6re4IOqwkuydhCDtlYTthLDrp4Htlanri4jri6QuXG4gICAgLy8g7Ji17IWYIO2MjOyLseydgCDqsIEgcnVubmVyIO2VqOyImOyXkOyEnCDsm5Drs7ggcHJvY2Vzcy5hcmd266W8IOyCrOyaqe2VmOyXrCDsiJjtlontlanri4jri6QuXG4gICAgLy8gXCItLVwiKGJhcmUgZG91YmxlIGRhc2gp64qUIHBhc3N0aHJvdWdoIOq1rOu2hOyekOydtOuvgOuhnCwg6re4IOuSpOydmCDrqqjrk6Ag7J247J6Q64+EIOygnOyZuO2VqeuLiOuLpC5cbiAgICBjb25zdCBmaWx0ZXJlZEFyZ3Y6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNraXBOZXh0ID0gZmFsc2U7XG4gICAgbGV0IGFmdGVyRG91YmxlRGFzaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07XG4gICAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgICAgYWZ0ZXJEb3VibGVEYXNoID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXJEb3VibGVEYXNoKSBjb250aW51ZTtcbiAgICAgIGlmIChza2lwTmV4dCkge1xuICAgICAgICBza2lwTmV4dCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgIC8vIC0tb3B0aW9uPXZhbHVlIO2YleyLneydgCDsnbQgYXJn66eMIOyKpO2CtVxuICAgICAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbg6IOuLpOydjCBhcmfqsIAgLS3roZwg7Iuc7J6R7ZWY7KeAIOyViuycvOuptCDqsJLsnbQg7J6I64qUIOqyg1xuICAgICAgICBjb25zdCBuZXh0QXJnID0gcHJvY2Vzcy5hcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgc2tpcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZC9kZXYg66qF66C57Ja06rCAIOyEnOu4jOy7pOunqOuTnCDsl4bsnbQg7Zi47Lac65CgIOuVjCBcImFsbFwi7J2EIOq4sOuzuOqwkuycvOuhnCDstpTqsIDtlanri4jri6QuXG4gICAgLy8g7JiIOiBgc29uYW11IGJ1aWxkYCDihpIgYHNvbmFtdSBidWlsZCBhbGxgLCBgc29uYW11IGRldmAg4oaSIGBzb25hbXUgZGV2IGFsbGBcbiAgICBjb25zdCBjbWQgPSBmaWx0ZXJlZEFyZ3ZbMl07XG4gICAgaWYgKChjbWQgPT09IFwiYnVpbGRcIiB8fCBjbWQgPT09IFwiZGV2XCIpICYmIGZpbHRlcmVkQXJndi5sZW5ndGggPT09IDMpIHtcbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKFwiYWxsXCIpO1xuICAgIH1cblxuICAgIC8vIHRlc3Qg7Luk66eo65Oc64qUIOqwgOuzgCDsnbjsnpAo7YyM7J2866qFLCAtLXBhdHRlcm4g65OxKeulvCDrsJvsnLzrr4DroZwgdHNpY2xp66W8IOyasO2ajO2VqeuLiOuLpC5cbiAgICBpZiAoY21kID09PSBcInRlc3RcIikge1xuICAgICAgcmV0dXJuIHRlc3RDb21tYW5kKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdHNpY2xpKGZpbHRlcmVkQXJndiwge1xuICAgICAgdHlwZXM6IHtcbiAgICAgICAgXCIjZW50aXR5SWRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXV0b2NvbXBsZXRlXCIsXG4gICAgICAgICAgbmFtZTogXCIjZW50aXR5SWRcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjZW50aXR5SWRcIixcbiAgICAgICAgICBjaG9pY2VzOiBFbnRpdHlNYW5hZ2VyLmdldEFsbFBhcmVudElkcygpLm1hcCgoZW50aXR5SWQpID0+ICh7XG4gICAgICAgICAgICB0aXRsZTogZW50aXR5SWQsXG4gICAgICAgICAgICB2YWx1ZTogZW50aXR5SWQsXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgICBcIiNyZWNvcmRJZHNcIjogXCJudW1iZXJbXVwiLFxuICAgICAgICBcIiNuYW1lXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwiI3RhcmdldHNcIjoge1xuICAgICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgICBuYW1lOiBcIiN0YXJnZXRzXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI3RhcmdldHNcIixcbiAgICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkRldmVsb3BtZW50XCIsIHZhbHVlOiBcImRldmVsb3BtZW50XCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiU3RhZ2luZ1wiLCB2YWx1ZTogXCJzdGFnaW5nXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiUHJvZHVjdGlvblwiLCB2YWx1ZTogXCJwcm9kdWN0aW9uXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZVwiLCB2YWx1ZTogXCJmaXh0dXJlXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiVGVzdFwiLCB2YWx1ZTogXCJ0ZXN0XCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImdlblwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImZldGNoXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZXhwbG9yZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImFwcGx5XCIsIFwiI3RhcmdldHNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJnZW5lcmF0ZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInN0YXR1c1wiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcInByYWN0aWNlXCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJlbnRpdHlcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbF90ZXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfbGlzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2Zvcm1cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcImNvbmVcIiwgXCJnZW5cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInN5bmNcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwiYWxsXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwiYXBpXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcInN0YXJ0XCJdLFxuICAgICAgICBbXCJza2lsbHNcIiwgXCJzeW5jXCJdLFxuICAgICAgICBbXCJ0ZXN0XCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiZ2VuZXJhdGVcIl0sXG4gICAgICAgIFtcImF1dGhcIiwgXCJhZGQtY29tcGFuaW9uc1wiXSxcbiAgICAgIF0sXG4gICAgICBydW5uZXJzOiB7XG4gICAgICAgIG1pZ3JhdGVfc3RhdHVzLFxuICAgICAgICBtaWdyYXRlX3J1bixcbiAgICAgICAgbWlncmF0ZV9hcHBseSxcbiAgICAgICAgbWlncmF0ZV9nZW5lcmF0ZSxcbiAgICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgICBmaXh0dXJlX2ltcG9ydCxcbiAgICAgICAgZml4dHVyZV9zeW5jLFxuICAgICAgICBmaXh0dXJlX2dlbixcbiAgICAgICAgZml4dHVyZV9mZXRjaCxcbiAgICAgICAgZml4dHVyZV9leHBsb3JlLFxuICAgICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgICBzdHViX2VudGl0eSxcbiAgICAgICAgc2NhZmZvbGRfbW9kZWwsXG4gICAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICAgIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgICAgc2NhZmZvbGRfdmlld19mb3JtLFxuICAgICAgICBjb25lX2dlbixcbiAgICAgICAgc3luYyxcbiAgICAgICAgYnVpbGRfYWxsLFxuICAgICAgICBidWlsZF9hcGksXG4gICAgICAgIGJ1aWxkX3dlYixcbiAgICAgICAgZGV2X2FsbCxcbiAgICAgICAgZGV2X2FwaSxcbiAgICAgICAgZGV2X3dlYixcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIHNraWxsc19zeW5jOiBza2lsbHNNaWdyYXRpb25Ob3RpY2UsXG4gICAgICAgIHRlc3Q6IHRlc3RDb21tYW5kLFxuICAgICAgICBhdXRoX2dlbmVyYXRlLFxuICAgICAgICBcImF1dGhfYWRkLWNvbXBhbmlvbnNcIjogYXV0aF9hZGRfY29tcGFuaW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgU29uYW11LmRlc3Ryb3koKTtcbiAgfVxufVxuXG5ib290c3RyYXAoKS5maW5hbGx5KGFzeW5jICgpID0+IHtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuZGVzdHJveSgpO1xufSk7XG5cbi8qKlxuICogcG5wbSBzeW5jIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq466W8IOyLse2BrO2VqeuLiOuLpC5cbiAqXG4gKiBgLS1mb3JjZWAg7Ji17IWY7J20IOyjvOyWtOyngOuptCBsb2Nr7J2EIOustOyLnO2VmOqzoCDtkoAt7Iux7YGs66W8IOyImO2Wie2VqeuLiOuLpC5cbiAqIGdpdCBwb3N0LW1lcmdlIGhvb2vsnbTrgpggQ0nsl5DshJwg66ekIHB1bGwg7ZuEIOyekOuPmSDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSDrhbjstpwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmMoKSB7XG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBpZiAoZmxhZ3MuaGFzKFwiZm9yY2VcIikpIHtcbiAgICBhd2FpdCBTb25hbXUuc3luY2VyLmZvcmNlU3luYygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuc3luYygpO1xuICB9XG59XG5cbi8qKlxuICog7J207KCEIOyDneyEsSDtlITroZzsoJ3tirjsnZggcG9zdGluc3RhbGzsnbQg7JeF6re466CI7J2065Oc66W8IOunieyngCDslYrrj4TroZ0g6rWsIOuqheugueunjCDslYjsoITtlZjqsowg7KKF66OM7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNNaWdyYXRpb25Ob3RpY2UoKSB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIidzb25hbXUgc2tpbGxzIHN5bmMnIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXCIpKTtcbiAgY29uc29sZS5sb2coXG4gICAgY2hhbGsuY3lhbihcIkluc3RhbGwgU29uYW11IHNraWxscyB3aXRoICducHggc2tpbGxzQGxhdGVzdCBhZGQgY2FydGFub3ZhLWFpL3NraWxscycuXCIpLFxuICApO1xufVxuXG4vKipcbiAqIEFQSSDqsJzrsJwg7ISc67KE66W8IOyLpO2Wie2VmOuKlCDqs7XthrUg66Gc7KeB7J6F64uI64ukLlxuICogZGV2X2FsbOqzvCBkZXZfYXBp7JeQ7IScIOqzteycoO2VqeuLiOuLpC5cbiAqXG4gKiBUeXBlU2NyaXB066W8IOuwlOuhnCDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSBAc29uYW11LWtpdC90cy1sb2FkZXLrpbwsXG4gKiBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBAc29uYW11LWtpdC9obXItaG9va+ydhCBpbXBvcnTtlZjrqbAsXG4gKiDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VtCAtLWVuYWJsZS1zb3VyY2UtbWFwcyDtlIzrnpjqt7jrpbwg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrlYwgQHNvbmFtdS1raXQvdHMtbG9hZGVy7JmAIEBzb25hbXUta2l0L2htci1ob29r64qUIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65iQ7ZWcIOyLpO2WieyXkCDsgqzsmqntlZjripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuuPhCDrp4jssKzqsIDsp4DroZwgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkOyEnOuKlCDsnbQg7IS4IO2MqO2CpOyngOulvCDsp4HsoJEg7ISk7LmY7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHNwYXduQXBpRGV2U2VydmVyKG9wdGlvbnM/OiB7IGV4dHJhRW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwic3JjL2luZGV4LnRzXCI7XG5cbiAgLy8g7J20IHNvbmFtdSDtjKjtgqTsp4DqsIAgZGVwZW5kZW5jaWVz66GcIOqwgOyngOqzoCDsnojripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBiaW4vcnVuLmpz66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgLy8g7J20IOqyveuhnCgvYmluL3J1bi5qcynripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBwYWNrYWdlLmpzb27snZggYmluIO2VhOuTnOyXkCDrqoXsi5zrkJjslrQg7J6I64qUIOq3uOqyg+qzvCDqsJnsirXri4jri6QuXG4gIGNvbnN0IGhvdFJ1bm5lckJpblBhdGggPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcbiAgICBcIkBzb25hbXUta2l0L2htci1ydW5uZXIvYmluL3J1bi5qc1wiLFxuICApO1xuXG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLCAvLyBub2RlXG4gICAgW1xuICAgICAgaG90UnVubmVyQmluUGF0aCwgLy8g7J2066CH6rKMIO2VtOyEnCBob3QtcnVubmVy66W8IOyLpO2Wie2VmOq1rOyalFxuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLCAvLyDsnbTtlZggaG90LXJ1bm5lcuyXkOqyjCDrhJjqsqjspIQg7J247J6Q65Ok7J6F64uI64ukLlxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvdHMtbG9hZGVyLXJlZ2lzdGVyXCIsIC8vIFR5cGVTY3JpcHQg7ISc7Y+s7Yq466W8IOychO2VnCDroZzrjZQsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS9obXItaG9vay1yZWdpc3RlclwiLCAvLyBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VnCBob29rLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCAvLyDqt7jrpqzqs6Ag7IaM7Iqk66e1IOyngOybkOydhCDsnITtlZwg7ZSM656Y6re47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1yOnJlc3RhcnQ6UmVzdGFydCBzZXJ2ZXJcIiwgLy8gciDriITrpbTrqbQg7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG4gICAgICBcIi0tb24ta2V5PWM6Y2xlYXI6Q2xlYXIgc2NyZWVuXCIsIC8vIGMg64iE66W066m0IO2EsOuvuOuEkCDtmZTrqbTsnYQg7KeA7JuM7KSY7JqULlxuICAgICAgYC0tb24ta2V5PWY6c2hlbGwocm0gJHtwYXRoLmpvaW4oYXBpUm9vdCwgXCJzb25hbXUubG9ja1wiKX0pOnJlc3RhcnQ6Rm9yY2UgcmVzdGFydGAsIC8vIGYg64iE66W066m0IGxvY2sg7KCc6rGwIO2bhCDsnqzsi5zsnpEg4oaSIOyDiCDtlITroZzshLjsiqTqsIAg67aA7Yq47Iqk7Yq4656p7JeQ7IScIO2SgC3si7HtgawuIGZvcmNlIHN5bmMgQ0xJ66W8IHNoZWxs66GcIOu2gOultOuptCDsgrTslYTsnojripQg7ISc67KE7J2YIHdhdGNoZXIg7Y+t7ZKN7J20IDpyZXN0YXJ07JmAIOy2qeuPjO2VtCDsg4Htg5wg7J207IOBLlxuXG4gICAgICBcIi0tb24ta2V5PWVudGVyOnNoZWxsKGVjaG8gaGkpOktleSBiaW5kaW5nIHRlc3RcIiwgLy8gZW50ZXLrpbwga2V566GcIOyTuCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1jdHJsK2YgY3RybCtmOnNoZWxsKGdpdCBwdWxsICYmIHBucG0gaW5zdGFsbCAmJiBwbnBtIC0tZmlsdGVyIHNvbmFtdSBidWlsZCAmJiBlY2hvICdTb25hbXUgaXMgbm93IHVwLXRvLWRhdGUhJyk6cmVzdGFydDpQdWxsICYgaW5zdGFsbCAmIGJ1aWxkICYgcmVzdGFydFwiLCAvLyBtb2RpZmllcuyZgOydmCDsobDtlaksIOq3uOumrOqzoCDrkZAg6rCc7J2YIGNob3Jk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgZW50cnlQb2ludCwgLy8g66eI7KeA66eJ7Jy866GcIOyLpOygnCDsi6TtlontlaAg7Iqk7YGs66a97Yq47J2YIOqyveuhnOulvCDrhJjqsqjspI3ri4jri6QuXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE5PREVfRU5WOiBwcm9jZXNzLmVudi5OT0RFX0VOViA/PyBcImRldmVsb3BtZW50XCIsXG4gICAgICAgIEhPVDogXCJ5ZXNcIiwgLy8g7JaY6rCAIOyeiOyWtOyVvCBITVLsnbQg7Zmc7ISx7ZmU65Cp64uI64ukLlxuICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290LCAvLyDsnbQg6rK966Gc6rCAIGhtci1ob29r7J2YIOujqO2KuCDrlJTroInthqDrpqzqsIAg65Cp64uI64ukLlxuICAgICAgICAuLi5vcHRpb25zPy5leHRyYUVudixcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXFxuXFxu8J+RiyBTaHV0dGluZyBkb3duLi4uXCIpKTtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICBzZXJ2ZXJQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgLyBwbnBtIGRldiBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjsl5Ag64yA7ZW0IEhNUiDsp4Dsm5DtlZjripQg6rCc67CcIOyEnOuyhOulvCDrnYTsm4zspI3ri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FsbCgpIHtcbiAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgY29uc3QgeyB2ZXJzaW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpO1xuICBjb25zb2xlLmxvZyhg8J+MsiBTb25hbXUgdiR7dmVyc2lvbn1cXG5gKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7KCE7JqpIOqwnOuwnCDshJzrsoTrpbwg652E7JuB64uI64ukLlxuICogZGV2X2FsbOqzvCDqsbDsnZgg64+Z7J287ZWY65CYLCDthrXtlakg7Ju5IOyEnOuyhOulvCDruYTtmZzshLHtmZTtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FwaSgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgQVBJLW9ubHkgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKHtcbiAgICBleHRyYUVudjogeyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQjogXCJ5ZXNcIiB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBWaXRlIOqwnOuwnCDshJzrsoTrpbwg64uo64+F7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqIC0tIOuSpOydmCDsnbjsnpDripQgVml0ZeyXkCDqt7jrjIDroZwg7KCE64us65Cp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldl93ZWIoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIC0tIOuSpOydmCDsnbjsnpAg7LaU7LacXG4gIGNvbnN0IGRvdWJsZURhc2hJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKFwiLS1cIik7XG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IGRvdWJsZURhc2hJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoZG91YmxlRGFzaEluZGV4ICsgMSkgOiBbXTtcblxuICBjb25zdCB2aXRlQXJncyA9IFtcImV4ZWNcIiwgXCJ2aXRlXCIsIC4uLnBhc3N0aHJvdWdoQXJnc107XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBWaXRlIGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIGNvbnN0IHZpdGVQcm9jZXNzID0gc3Bhd24oXCJwbnBtXCIsIHZpdGVBcmdzLCB7XG4gICAgY3dkOiB3ZWJQYXRoLFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgdml0ZVByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIC8vIFNJR0lOVC9TSUdURVJNIOyLnCBWaXRlIO2UhOuhnOyEuOyKpOulvCBncmFjZWZ1bGx5IOyiheujjO2VqeuLiOuLpC5cbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICB2aXRlUHJvY2Vzcy5raWxsKHNpZ25hbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkg67mM65OcIOyEpOyglSDtjIzsnbwg6rK966Gc66W8IOqysOygle2VqeuLiOuLpC5cbiAqIO2UhOuhnOygne2KuCDro6jtirjsl5AgYHRzZG93bi5jb25maWcudHNg6rCAIOyeiOycvOuptCDqt7jqsoPsnYQsIOyXhuycvOuptCBzb25hbXUg6riw67O4IOyEpOygleydhCDsgqzsmqntlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidHNkb3duLmNvbmZpZy50c1wiKTtcblxuICB0cnkge1xuICAgIGlmIChhd2FpdCBleGlzdHMobG9jYWxDb25maWdQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgdHNkb3duLmNvbmZpZy50cyBmcm9tIHByb2plY3Qgcm9vdC4uLlwiKSk7XG4gICAgICByZXR1cm4gbG9jYWxDb25maWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIGRlZmF1bHQgdHNkb3duIEFQSSBjb25maWcgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJ0c2Rvd24uYXBpLmNvbmZpZy50c1wiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlNldHRpbmcgdXAgQVBJIGJ1aWxkIGNvbmZpZyBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogc29uYW11IGJ1aWxkIC8gc29uYW11IGJ1aWxkIGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIGJ1aWxkX2FwaSArIGJ1aWxkX3dlYuydmCDtlanshLHsnoXri4jri6QuIFdlYiDrlJTroInthqDrpqzqsIAg7JeG7Jy866m0IFdlYiDruYzrk5zrpbwg7Iqk7YK17ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZF9hbGwoKSB7XG4gIGF3YWl0IGJ1aWxkX2FwaSgpO1xuICBhd2FpdCBidWlsZF93ZWIoeyBza2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgYXBpIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogQVBJIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYXBpKCkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gYXdhaXQgcmVzb2x2ZUFwaUJ1aWxkQ29uZmlnUGF0aCgpO1xuXG4gIGNvbnN0IGFwaVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBBUElfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczogeyBjb25maWdGaWxlUGF0aCB9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogV2ViIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZyA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgZmFsc2UsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCB7IHZlcnNpb24gfSA9IHJlcXVpcmUoXCIuLi8uLi9wYWNrYWdlLmpzb25cIik7XG4gIGNvbnNvbGUubG9nKGDwn4yyIFNvbmFtdSB2JHt2ZXJzaW9ufVxcbmApO1xuXG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwiZGlzdC9pbmRleC5qc1wiO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyhlbnRyeVBvaW50KSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7ZW50cnlQb2ludH0gbm90IGZvdW5kLiBQbGVhc2UgYnVpbGQgeW91ciBwcm9qZWN0IGZpcnN0LmApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiUnVuOiBwbnBtIHNvbmFtdSBidWlsZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwiY2hpbGRfcHJvY2Vzc1wiKTtcbiAgY29uc3Qgc2VydmVyUHJvY2VzcyA9IHNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgW1wiLS1lbmFibGUtc291cmNlLW1hcHNcIiwgXCItclwiLCBcImRvdGVudi9jb25maWdcIiwgZW50cnlQb2ludF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0sXG4gICk7XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCAoKSA9PiB7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cE1pZ3JhdG9yKCkge1xuICAvLyBtaWdyYXRvclxuICBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEZpeHR1cmVNYW5hZ2VyKCkge1xuICBGaXh0dXJlTWFuYWdlci5pbml0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfYXBwbHkodGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcbiAgYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKFwiYXBwbHlcIiwgdGFyZ2V0cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfcnVuKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIGdldE1pZ3JhdGVSdW5UYXJnZXRzKCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2dlbmVyYXRlKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3QgeyBjb25ucyB9ID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIGNvbnN0IGhhc1N0YXR1czAgPSBjb25ucy5zb21lKChjb25uKSA9PiBjb25uLnN0YXR1cyA9PT0gMCk7XG4gIGlmICghaGFzU3RhdHVzMCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIuuniOydtOq3uOugiOydtOyFmCDtjIzsnbzsnYQg7IOd7ISx7ZWY66Ck66m0IOq4sOyhtCDrp4jsnbTqt7jroIjsnbTshZjsnbQg7LWc7IaMIO2VmOuCmOydmCBEQuyXkCDrqqjrkZAg7KCB7Jqp65CY7Ja0IOyeiOyWtOyVvCDtlanri4jri6QuXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBjb25uIG9mIGNvbm5zKSB7XG4gICAgICBpZiAoY29ubi5wZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAgICR7Y29ubi5uYW1lfTogcGVuZGluZyAke2Nvbm4ucGVuZGluZy5sZW5ndGh96rCcYCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBjb3VudCA9IGF3YWl0IG1pZ3JhdG9yLmdlbmVyYXRlUHJlcGFyZWRDb2RlcygpO1xuICBpZiAoY291bnQgPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCR7Y291bnR96rCc7J2YIOuniOydtOq3uOugiOydtOyFmCDtjIzsnbzsnbQg7IOd7ISx65CY7JeI7Iq164uI64ukLmApKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3N0YXR1cygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICAvLyBzdGF0dXM7XG4gIGNvbnNvbGUubG9nKHN0YXR1cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW5pdCgpIHtcbiAgY29uc3Qgc3JjQ29uZmlnID0gU29uYW11LmRiQ29uZmlnW2dldFNvbmFtdUVudmlyb25tZW50KCldO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbi8qKlxuICogZml4dHVyZSBnZW4g66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2dlbigpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9mZXRjaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZXhwbG9yZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICog6rCE64uo7ZWcIOyYteyFmCDtjIzshJxcbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zKFxuICBhcmd2OiBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0ge1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9ID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDIpO1xuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCBbaywgdl0gPSBrZXkuc3BsaXQoXCI9XCIpO1xuICAgICAgICBvcHRpb25zW2tdID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG5cbiAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuXy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBiIC0gYSk7XG5cbiAgICBpZiAoZmlsdGVyZWRTZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZFNlcXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgY3VycmVudFNlcU5vID0gbWF4U2VxTm8gKyAxO1xuICBjb25zdCBmaWxlTmFtZSA9IGBwJHtjdXJyZW50U2VxTm99LSR7bmFtZX0udHNgO1xuICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHByYWN0aWNlRGlyLCBmaWxlTmFtZSk7XG5cbiAgY29uc3QgY29kZSA9IFtcbiAgICBgaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgXCJcIixcbiAgICBgY29uc29sZS5jbGVhcigpO2AsXG4gICAgYGNvbnNvbGUubG9nKFwiJHtmaWxlTmFtZX1cIik7YCxcbiAgICBcIlwiLFxuICAgIGBTb25hbXUucnVuU2NyaXB0KGFzeW5jICgpID0+IHtgLFxuICAgIGAgLy8gVE9ET2AsXG4gICAgYH0pO2AsXG4gICAgXCJcIixcbiAgXS5qb2luKFwiXFxuXCIpO1xuICBhd2FpdCB3cml0ZUZpbGUoZHN0UGF0aCwgY29kZSk7XG5cbiAgZXhlY1N5bmMoYGNvZGUgJHtkc3RQYXRofWApO1xuXG4gIGNvbnN0IHJ1bkNvZGUgPSBgeWFybiBub2RlIC1yIGRvdGVudi9jb25maWcgLS1lbmFibGUtc291cmNlLW1hcHMgZGlzdC9wcmFjdGljZXMvJHtmaWxlTmFtZS5yZXBsYWNlKFxuICAgIFwiLnRzXCIsXG4gICAgXCIuanNcIixcbiAgKX1gO1xuICBjb25zb2xlLmxvZyhgJHtjaGFsay5ibHVlKHJ1bkNvZGUpfSBjb3BpZWQgdG8gY2xpcGJvYXJkLmApO1xuICBleGVjU3luYyhgZWNobyBcIiR7cnVuQ29kZX1cIiB8IHBiY29weWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX2VudGl0eShlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgZW50aXR5SWQsIHRpdGxlOiBlbnRpdHlJZCB9KTtcblxuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgdXNlQUkgPSBmbGFncy5oYXMoXCJhaVwiKTtcbiAgY29uc3Qgbm9Db25lcyA9IGZsYWdzLmhhcyhcIm5vLWNvbmVzXCIpO1xuXG4gIC8vIC0tbm8tY29uZXM6IGNvbmUg7IOd7ISxIOyKpO2CtVxuICBpZiAobm9Db25lcykge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZCB3aXRob3V0IGNvbmVzYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgaWYgKCFlbnRpdHkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIC0tYWk6IExMTeycvOuhnCBjb25lIOyDneyEsVxuICBpZiAodXNlQUkpIHtcbiAgICBjb25zb2xlLmxvZyhg4pyTIEVudGl0eSAnJHtlbnRpdHlJZH0nIGNyZWF0ZWRgKTtcbiAgICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIEFJLXBvd2VyZWQgY29uZXMuLi5gKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgY29uc3QgbG9jYWxlID1cbiAgICAgICAgY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgIDogXCJrb1wiO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6IGZhbHNlLFxuICAgICAgICBvbmx5RW1wdHk6IGZhbHNlLFxuICAgICAgICBsb2NhbGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coYOKchSBEb25lICgke3Jlc3VsdC50b2tlbnNVc2VkfSB0b2tlbnMpYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFJlbW92ZSAtLWFpIGZsYWcgdG8gdXNlIHRlbXBsYXRlIGNvbmVzIGluc3RlYWRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDquLDrs7g6IO2FnO2UjOumvyBjb25lIOyekOuPmSDsg53shLFcbiAgLy8gTExNIOyXhuydtCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgLy8g7J2066W8IO2Gte2VtCBBTlRIUk9QSUNfQVBJX0tFWeqwgCDsl4bslrTrj4QgU29uYW1166W8IOyCrOyaqe2VoCDsiJgg7J6I7Jy866mwLFxuICAvLyDsg53shLHrkJwg7YWc7ZSM66a/IGNvbmXsnYAg64KY7KSR7JeQICdjb25lIGdlbicg66qF66C57Ja066GcIEFJ66W8IO2Gte2VtCDsl4Xqt7jroIjsnbTrk5ztlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgY29uc29sZS5sb2coYPCfjJ8gR2VuZXJhdGluZyB0ZW1wbGF0ZSBjb25lcy4uLmApO1xuICBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKCk7XG4gIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZCB3aXRoIHRlbXBsYXRlIGNvbmVzYCk7XG4gIGNvbnNvbGUubG9nKGDwn5KhIFRpcDogUnVuICdwbnBtIHNvbmFtdSBjb25lIGdlbiAke2VudGl0eUlkfScgdG8gaW1wcm92ZSB3aXRoIEFJYCk7XG59XG5cbi8qKlxuICogQUnrpbwg7IKs7Jqp7ZWY7JesIGVudGl0eeydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlZjqsbDrgpgg7JeF6re466CI7J2065Oc7ZWp64uI64ukLlxuICpcbiAqIOyYteyFmDpcbiAqIC0gLS1yZWdlbmVyYXRlOiDsoITssrQg7J6s7IOd7ISxICjquLDsobQgY29uZSDrja7slrTsk7DquLApXG4gKiAtIC0tbG9jYWxlIDxrb3xlbnxqYT46IOyDneyEsSDslrjslrQg7KeA7KCVXG4gKiAtIOq4sOuzuDogb25seUVtcHR5IOuqqOuTnCAo6riw7KG0IGZpeHR1cmVIaW50IOuztOyhtClcbiAqXG4gKiBBTlRIUk9QSUNfQVBJX0tFWSDtlYTsmpQgKHNvbmFtdS5zZWNyZXQudHMg65iQ64qUIO2ZmOqyveuzgOyImClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZV9nZW4oZW50aXR5SWQ6IHN0cmluZykge1xuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgeyBmbGFncywgb3B0aW9ucyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG5cbiAgLy8gLS1hbGwg7Ji17IWYOiDrqqjrk6AgZW50aXR5IGNvbmUg7IOd7ISxXG4gIGlmIChmbGFncy5oYXMoXCJhbGxcIikgfHwgZW50aXR5SWQgPT09IFwiYWxsXCIpIHtcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcbiAgICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIEFJLXBvd2VyZWQgY29uZXMgZm9yICR7YWxsRW50aXRpZXMubGVuZ3RofSBlbnRpdGllcy4uLlxcbmApO1xuXG4gICAgbGV0IHRvdGFsVG9rZW5zID0gMDtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coYFByb2Nlc3NpbmcgJHtlbnRpdHkuaWR9Li4uYCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IG9wdGlvbnMubG9jYWxlIHx8IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICAgICAgY29uc3QgbG9jYWxlID1cbiAgICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgICAgIDogXCJrb1wiO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG90YWxUb2tlbnMgKz0gcmVzdWx0LnRva2Vuc1VzZWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIOKckyAke2VudGl0eS5pZH0gKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylcXG5gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICBlcnJvcnMucHVzaChgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAg4pyXICR7ZW50aXR5LmlkfTogJHttZXNzYWdlfVxcbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG7inIUgRG9uZSEgVG90YWw6ICR7dG90YWxUb2tlbnN9IHRva2VucyB1c2VkYCk7XG4gICAgY29uc3QgZXN0aW1hdGVkQ29zdCA9ICh0b3RhbFRva2VucyAqIDkpIC8gMV8wMDBfMDAwO1xuICAgIGNvbnNvbGUubG9nKGDwn5KwIEVzdGltYXRlZCBjb3N0OiB+JCR7ZXN0aW1hdGVkQ29zdC50b0ZpeGVkKDQpfWApO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIGVudGl0aWVzICgke2Vycm9ycy5sZW5ndGh9KTpgKTtcbiAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgIC0gJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOuLqOydvCBlbnRpdHkgY29uZSDsg53shLFcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbW9kZSA9IGZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIikgPyBcInJlZ2VuZXJhdGluZ1wiIDogXCJnZW5lcmF0aW5nXCI7XG4gIGNvbnNvbGUubG9nKFxuICAgIGDwn4yfICR7bW9kZSA9PT0gXCJyZWdlbmVyYXRpbmdcIiA/IFwiUmVnZW5lcmF0aW5nXCIgOiBcIkdlbmVyYXRpbmdcIn0gQUktcG93ZXJlZCBjb25lcyBmb3IgJHtlbnRpdHlJZH0uLi5gLFxuICApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIiA/IGNvbmZpZ0xvY2FsZSA6IFwia29cIjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgb25seUVtcHR5OiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgIGxvY2FsZSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinIUgRG9uZSEgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucyB1c2VkKWApO1xuXG4gICAgLy8g7Yag7YGwIOu5hOyaqSDqs4TsgrAgKOuMgOueteyggeyduCDstpTsoJUpXG4gICAgLy8gQ2xhdWRlIFNvbm5ldCA0LjU6IGlucHV0ICQzL00gdG9rZW5zLCBvdXRwdXQgJDE1L00gdG9rZW5zXG4gICAgLy8g6rCE64uo7ZWY6rKMIO2Pieq3oCAkOS9NIHRva2Vuc+uhnCDqs4TsgrBcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHJlc3VsdC50b2tlbnNVc2VkICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQU5USFJPUElDX0FQSV9LRVlcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBUbyB1c2UgQUktcG93ZXJlZCBjb25lIGdlbmVyYXRpb246YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgIDEuIEdldCBhbiBBUEkga2V5IGZyb20gaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vYCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYCAgIDIuIEFkZCBpdCB0byBzb25hbXUuc2VjcmV0LnRzIG9yIHNldCBBTlRIUk9QSUNfQVBJX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSYXRlIGxpbWl0XCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUGxlYXNlIHdhaXQgYSBtb21lbnQgYW5kIHRyeSBhZ2Fpbi5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgdG8gZ2VuZXJhdGUgY29uZXM6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogVW5rbm93biBlcnJvcmApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX3ZpZXdfbGlzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcInZpZXdfbGlzdFwiLCB7XG4gICAgZW50aXR5SWQsXG4gICAgZXh0cmE6IHVuZGVmaW5lZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX3ZpZXdfZm9ybShlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcInZpZXdfZm9ybVwiLCB7XG4gICAgZW50aXR5SWQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhdXRoX2dlbmVyYXRlKCkge1xuICAvLyAtLXBsdWdpbnMg7Ji17IWYIO2MjOyLsVxuICBjb25zdCBwbHVnaW5zQXJnID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoXCItLXBsdWdpbnNcIikpO1xuICBjb25zdCBwbHVnaW5zOiBCZXR0ZXJBdXRoUGx1Z2luSWRbXSA9IFtdO1xuXG4gIGlmIChwbHVnaW5zQXJnKSB7XG4gICAgY29uc3QgcGx1Z2luVmFsdWUgPSBwbHVnaW5zQXJnLmluY2x1ZGVzKFwiPVwiKVxuICAgICAgPyBwbHVnaW5zQXJnLnNwbGl0KFwiPVwiKVsxXVxuICAgICAgOiBwcm9jZXNzLmFyZ3ZbcHJvY2Vzcy5hcmd2LmluZGV4T2YocGx1Z2luc0FyZykgKyAxXTtcblxuICAgIGlmIChwbHVnaW5WYWx1ZSkge1xuICAgICAgY29uc3QgcGx1Z2luSWRzID0gcGx1Z2luVmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIHBsdWdpbklkcykge1xuICAgICAgICBpZiAoaXNWYWxpZFBsdWdpbklkKGlkKSkge1xuICAgICAgICAgIHBsdWdpbnMucHVzaChpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgVW5rbm93biBwbHVnaW46ICR7aWR9YCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBTdXBwb3J0ZWQgcGx1Z2luczogJHtTVVBQT1JURURfUExVR0lOX0lEUy5qb2luKFwiLCBcIil9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5SQIEdlbmVyYXRpbmcgYmV0dGVyLWF1dGggZW50aXRpZXMuLi5cXG5cIikpO1xuXG4gIGlmIChwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgUGx1Z2luczogJHtwbHVnaW5zLmpvaW4oXCIsIFwiKX1gKSk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyh7IHBsdWdpbnMgfSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgYXV0aCBhZGQtY29tcGFuaW9ucyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOq4sOyhtCDtlITroZzsoJ3tirjsnZggZW50aXR5Lmpzb27sl5AgZml4dHVyZUNvbXBhbmlvbnPrpbwg7IaM6riJIOy2lOqwgO2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrr7ggZml4dHVyZUNvbXBhbmlvbnPqsIAg7J6I64qUIGVudGl0eeuKlCDsiqTtgrXtlanri4jri6QgKOuNruyWtOyTsOq4sCDsl4bsnYwpLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRoX2FkZF9jb21wYW5pb25zKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgQWRkaW5nIGZpeHR1cmVDb21wYW5pb25zIHRvIGJldHRlci1hdXRoIGVudGl0aWVzLi4uXFxuXCIpKTtcbiAgYXdhaXQgYWRkQ29tcGFuaW9uc1RvRW50aXRpZXMoKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlxcbuKchSBEb25lIVwiKSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQVlzQztvQkFLa0I7U0FDWDtjQUNHO3FCQUNXO2tCQVE3QjtjQUNZO1dBQ3VCO0FBT2pFLElBQUk7Ozs7QUFLSixTQUFTLGdCQUFnQixPQUFpQixRQUFRLE1BR2hEO0NBQ0EsTUFBTSx3QkFBUSxJQUFJLElBQVk7Q0FDOUIsTUFBTSxVQUFrQyxDQUFDO0NBRXpDLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztFQUNwQyxNQUFNLE1BQU0sS0FBSztFQUNqQixJQUFJLENBQUMsSUFBSSxXQUFXLElBQUksR0FBRztFQUczQixJQUFJLElBQUksU0FBUyxHQUFHLEdBQUc7R0FDckIsTUFBTSxDQUFDLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHO0dBQzNDLFFBQVEsT0FBTztHQUNmO0VBQ0Y7RUFHQSxNQUFNLFVBQVUsS0FBSyxJQUFJO0VBQ3pCLElBQUksV0FBVyxDQUFDLFFBQVEsV0FBVyxJQUFJLEtBQUssQ0FBQyxRQUFRLFdBQVcsR0FBRyxHQUFHO0dBQ3BFLFFBQVEsSUFBSSxNQUFNLENBQUMsS0FBSztHQUN4QjtFQUNGLE9BRUUsTUFB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
|