sonamu 0.8.1 → 0.8.2

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 CHANGED
@@ -6,6 +6,7 @@ import { execSync, spawn } from "child_process";
6
6
  import { cp, mkdir, readdir, readFile, rm, symlink, writeFile } from "node:fs/promises";
7
7
  import knex from "knex";
8
8
  import { createRequire } from "module";
9
+ import os from "os";
9
10
  import path from "path";
10
11
  import process from "process";
11
12
  import { tsicli } from "tsicli";
@@ -919,11 +920,12 @@ async function scaffold_model_test(entityId) {
919
920
  }
920
921
  /**
921
922
  * pnpm sonamu skills sync 하면 실행되는 함수입니다.
922
- * 공식 Skills를 로컬 프로젝트로 동기화합니다.
923
+ * 공식 Skills를 로컬 프로젝트 또는 글로벌 ~/.claude/로 동기화합니다.
924
+ *
925
+ * --global 플래그: ~/.claude/에 동기화 (프로젝트 생성 전 사용 가능)
923
926
  */ async function skills_sync() {
924
- const workspaceRoot = await findWorkspaceRoot();
925
- const claudeDir = path.join(workspaceRoot, ".claude");
926
- const targetSkillsDir = path.join(claudeDir, "skills", "sonamu");
927
+ const { flags } = parseCliOptions();
928
+ const isGlobal = flags.has("global");
927
929
  // 개발 환경 - cli.ts: sonamu/modules/sonamu/src/bin/cli.ts
928
930
  // 빌드 후 - cli.js: node_modules/sonamu/dist/bin/cli.js (실제 실행)
929
931
  // skills 위치: node_modules/sonamu/src/skills (npm 배포 시)
@@ -934,7 +936,29 @@ async function scaffold_model_test(entityId) {
934
936
  console.log(chalk.yellow("Skills source not found in sonamu package."));
935
937
  return;
936
938
  }
937
- // 기존 디렉토리/symlink 삭제 후 symlink 생성
939
+ if (isGlobal) {
940
+ await skills_sync_to(path.join(os.homedir(), ".claude"), sourceSkillsDir, sourceClaudeMd, {
941
+ useSymlink: false,
942
+ copyProjectTemplates: false
943
+ });
944
+ console.log(chalk.cyan(`\n Global sync complete → ~/.claude/skills/sonamu/`));
945
+ console.log(chalk.dim(` These skills are available in all Claude Code sessions.`));
946
+ console.log(chalk.dim(` Once a project is created, run 'pnpm sonamu skills sync' for project-local sync.`));
947
+ } else {
948
+ const workspaceRoot = await findWorkspaceRoot();
949
+ const claudeDir = path.join(workspaceRoot, ".claude");
950
+ await skills_sync_to(claudeDir, sourceSkillsDir, sourceClaudeMd, {
951
+ useSymlink: true,
952
+ copyProjectTemplates: true,
953
+ sourceBase
954
+ });
955
+ }
956
+ }
957
+ /**
958
+ * claudeDir로 skills를 동기화하는 공통 로직입니다.
959
+ */ async function skills_sync_to(claudeDir, sourceSkillsDir, sourceClaudeMd, options) {
960
+ const targetSkillsDir = path.join(claudeDir, "skills", "sonamu");
961
+ // 기존 디렉토리/symlink 삭제 후 재생성
938
962
  // exists()는 broken symlink를 감지하지 못하므로 rm을 무조건 시도합니다
939
963
  try {
940
964
  await rm(targetSkillsDir, {
@@ -944,41 +968,38 @@ async function scaffold_model_test(entityId) {
944
968
  } catch {
945
969
  // 파일이 없으면 무시
946
970
  }
947
- // 대상 디렉토리 생성
948
971
  await mkdir(path.dirname(targetSkillsDir), {
949
972
  recursive: true
950
973
  });
951
- try {
952
- await symlink(sourceSkillsDir, targetSkillsDir, "dir");
953
- console.log(chalk.green(`✓ Skills linked (symlink)`));
954
- } catch (error) {
955
- console.log(chalk.yellow(`⚠ Symlink failed: ${error instanceof Error ? error.message : String(error)}`));
956
- console.log(chalk.yellow(` Falling back to copy...`));
974
+ if (options.useSymlink) {
957
975
  try {
958
- await cp(sourceSkillsDir, targetSkillsDir, {
959
- recursive: true
960
- });
961
- console.log(chalk.green(`✓ Skills copied`));
962
- } catch (copyError) {
963
- console.error(chalk.red(`✗ Failed to copy skills: ${copyError instanceof Error ? copyError.message : String(copyError)}`));
964
- throw copyError;
976
+ await symlink(sourceSkillsDir, targetSkillsDir, "dir");
977
+ console.log(chalk.green(`✓ Skills linked (symlink)`));
978
+ } catch (error) {
979
+ console.log(chalk.yellow(`⚠ Symlink failed: ${error instanceof Error ? error.message : String(error)}`));
980
+ console.log(chalk.yellow(` Falling back to copy...`));
981
+ await skillsCopy(sourceSkillsDir, targetSkillsDir);
965
982
  }
983
+ } else {
984
+ await skillsCopy(sourceSkillsDir, targetSkillsDir);
966
985
  }
967
986
  // project 디렉토리 초기화 (없으면 생성, 있으면 유지)
968
- const sourceProjectDir = path.join(sourceBase, "project");
969
- const targetProjectDir = path.join(claudeDir, "skills", "project");
970
- if (await exists(sourceProjectDir)) {
971
- if (!await exists(targetProjectDir)) {
972
- try {
973
- await cp(sourceProjectDir, targetProjectDir, {
974
- recursive: true
975
- });
976
- console.log(chalk.green(`✓ Project templates initialized`));
977
- } catch (error) {
978
- console.error(chalk.red(`✗ Failed to initialize project templates: ${error instanceof Error ? error.message : String(error)}`));
987
+ if (options.copyProjectTemplates && options.sourceBase) {
988
+ const sourceProjectDir = path.join(options.sourceBase, "project");
989
+ const targetProjectDir = path.join(claudeDir, "skills", "project");
990
+ if (await exists(sourceProjectDir)) {
991
+ if (!await exists(targetProjectDir)) {
992
+ try {
993
+ await cp(sourceProjectDir, targetProjectDir, {
994
+ recursive: true
995
+ });
996
+ console.log(chalk.green(`✓ Project templates initialized`));
997
+ } catch (error) {
998
+ console.error(chalk.red(`✗ Failed to initialize project templates: ${error instanceof Error ? error.message : String(error)}`));
999
+ }
1000
+ } else {
1001
+ console.log(chalk.dim(`⏭ Project templates already exist (preserved)`));
979
1002
  }
980
- } else {
981
- console.log(chalk.dim(`⏭ Project templates already exist (preserved)`));
982
1003
  }
983
1004
  }
984
1005
  // CLAUDE.md 복사/업데이트
@@ -991,7 +1012,6 @@ async function scaffold_model_test(entityId) {
991
1012
  const startMarker = "<!-- SONAMU:START -->";
992
1013
  const endMarker = "<!-- SONAMU:END -->";
993
1014
  if (targetContent.includes(startMarker) && targetContent.includes(endMarker)) {
994
- // marker 영역만 교체합니다.
995
1015
  const startIdx = targetContent.indexOf(startMarker);
996
1016
  const endIdx = targetContent.indexOf(endMarker);
997
1017
  if (startIdx !== -1 && endIdx !== -1 && startIdx < endIdx) {
@@ -1003,9 +1023,15 @@ async function scaffold_model_test(entityId) {
1003
1023
  } else {
1004
1024
  console.log(chalk.yellow(`⏭ CLAUDE.md marker positions invalid, skipped`));
1005
1025
  }
1026
+ } else {
1027
+ // 마커가 없는 기존 CLAUDE.md에 Sonamu 섹션을 추가합니다
1028
+ const appended = `${targetContent.trimEnd()}\n\n<!-- SONAMU:START -->\n${sourceContent}\n<!-- SONAMU:END -->\n`;
1029
+ await writeFile(targetClaudeMd, appended);
1030
+ console.log(chalk.green(`✓ CLAUDE.md updated (appended Sonamu section)`));
1006
1031
  }
1007
1032
  } else {
1008
- await writeFile(targetClaudeMd, sourceContent);
1033
+ const withMarkers = `<!-- SONAMU:START -->\n${sourceContent}\n<!-- SONAMU:END -->\n`;
1034
+ await writeFile(targetClaudeMd, withMarkers);
1009
1035
  console.log(chalk.green(`✓ CLAUDE.md created`));
1010
1036
  }
1011
1037
  } catch (error) {
@@ -1013,6 +1039,17 @@ async function scaffold_model_test(entityId) {
1013
1039
  }
1014
1040
  }
1015
1041
  }
1042
+ async function skillsCopy(src, dest) {
1043
+ try {
1044
+ await cp(src, dest, {
1045
+ recursive: true
1046
+ });
1047
+ console.log(chalk.green(`✓ Skills copied`));
1048
+ } catch (copyError) {
1049
+ console.error(chalk.red(`✗ Failed to copy skills: ${copyError instanceof Error ? copyError.message : String(copyError)}`));
1050
+ throw copyError;
1051
+ }
1052
+ }
1016
1053
  /**
1017
1054
  * pnpm sonamu skills create <name> 하면 실행되는 함수입니다.
1018
1055
  * 로컬 skill 초안을 생성합니다.
@@ -1175,4 +1212,4 @@ status: draft
1175
1212
  return findAppRootPath();
1176
1213
  }
1177
1214
 
1178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9IGZyb20gXCIuLi9hdXRoL2F1dGgtZ2VuZXJhdG9yXCI7XG5pbXBvcnQge1xuICB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCxcbiAgaXNWYWxpZFBsdWdpbklkLFxuICBTVVBQT1JURURfUExVR0lOX0lEUyxcbn0gZnJvbSBcIi4uL2F1dGgvcGx1Z2lucy9lbnRpdHktZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZml4dHVyZUV4cGxvcmVDb21tYW5kLCBmaXh0dXJlRmV0Y2hDb21tYW5kLCBmaXh0dXJlR2VuQ29tbWFuZCB9IGZyb20gXCIuL2ZpeHR1cmVcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuLyoqXG4gKiBDTEkg7Ji17IWY7J2EIO2MjOyLse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2xpT3B0aW9ucyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndik6IHtcbiAgZmxhZ3M6IFNldDxzdHJpbmc+OyAvLyAtLXJlZ2VuZXJhdGUsIC0tYWksIC0tbm8tY29uZXMg65OxXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IC8vIC0tbG9jYWxlIGtvIOuTsVxufSB7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkgY29udGludWU7XG5cbiAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi51cbiAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJnLnNsaWNlKDIpLnNwbGl0KFwiPVwiKTtcbiAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduFxuICAgIGNvbnN0IG5leHRBcmcgPSBhcmd2W2kgKyAxXTtcbiAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIG9wdGlvbnNbYXJnLnNsaWNlKDIpXSA9IG5leHRBcmc7XG4gICAgICBpKys7IC8vIOuLpOydjCBhcmfripQg6rCS7J2066+A66GcIOyKpO2CtVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtLWZsYWcg7ZiV7IudXG4gICAgICBmbGFncy5hZGQoYXJnLnNsaWNlKDIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmbGFncywgb3B0aW9ucyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHRzaWNsaeuKlCDsoJXtmZXtlZwg66qF66C57Ja0IOunpOy5reunjCDsp4Dsm5DtlZjrr4DroZwsIC0t66GcIOyLnOyeke2VmOuKlCDsmLXshZjqs7wg6re4IOqwkuydhCDtlYTthLDrp4Htlanri4jri6QuXG4gICAgLy8g7Ji17IWYIO2MjOyLseydgCDqsIEgcnVubmVyIO2VqOyImOyXkOyEnCDsm5Drs7ggcHJvY2Vzcy5hcmd266W8IOyCrOyaqe2VmOyXrCDsiJjtlontlanri4jri6QuXG4gICAgLy8gXCItLVwiKGJhcmUgZG91YmxlIGRhc2gp64qUIHBhc3N0aHJvdWdoIOq1rOu2hOyekOydtOuvgOuhnCwg6re4IOuSpOydmCDrqqjrk6Ag7J247J6Q64+EIOygnOyZuO2VqeuLiOuLpC5cbiAgICBjb25zdCBmaWx0ZXJlZEFyZ3Y6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNraXBOZXh0ID0gZmFsc2U7XG4gICAgbGV0IGFmdGVyRG91YmxlRGFzaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07XG4gICAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgICAgYWZ0ZXJEb3VibGVEYXNoID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXJEb3VibGVEYXNoKSBjb250aW51ZTtcbiAgICAgIGlmIChza2lwTmV4dCkge1xuICAgICAgICBza2lwTmV4dCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgIC8vIC0tb3B0aW9uPXZhbHVlIO2YleyLneydgCDsnbQgYXJn66eMIOyKpO2CtVxuICAgICAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbg6IOuLpOydjCBhcmfqsIAgLS3roZwg7Iuc7J6R7ZWY7KeAIOyViuycvOuptCDqsJLsnbQg7J6I64qUIOqyg1xuICAgICAgICBjb25zdCBuZXh0QXJnID0gcHJvY2Vzcy5hcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgc2tpcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZC9kZXYg66qF66C57Ja06rCAIOyEnOu4jOy7pOunqOuTnCDsl4bsnbQg7Zi47Lac65CgIOuVjCBcImFsbFwi7J2EIOq4sOuzuOqwkuycvOuhnCDstpTqsIDtlanri4jri6QuXG4gICAgLy8g7JiIOiBgc29uYW11IGJ1aWxkYCDihpIgYHNvbmFtdSBidWlsZCBhbGxgLCBgc29uYW11IGRldmAg4oaSIGBzb25hbXUgZGV2IGFsbGBcbiAgICBjb25zdCBjbWQgPSBmaWx0ZXJlZEFyZ3ZbMl07XG4gICAgaWYgKChjbWQgPT09IFwiYnVpbGRcIiB8fCBjbWQgPT09IFwiZGV2XCIpICYmIGZpbHRlcmVkQXJndi5sZW5ndGggPT09IDMpIHtcbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKFwiYWxsXCIpO1xuICAgIH1cblxuICAgIGF3YWl0IHRzaWNsaShmaWx0ZXJlZEFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcIiN0YXJnZXRzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgICAgbmFtZTogXCIjdGFyZ2V0c1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICN0YXJnZXRzXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogXCJEZXZlbG9wbWVudFwiLCB2YWx1ZTogXCJkZXZlbG9wbWVudF9tYXN0ZXJcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJQcm9kdWN0aW9uXCIsIHZhbHVlOiBcInByb2R1Y3Rpb25fbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZVwiLCB2YWx1ZTogXCJmaXh0dXJlXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiVGVzdFwiLCB2YWx1ZTogXCJ0ZXN0XCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImdlblwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImZldGNoXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZXhwbG9yZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImFwcGx5XCIsIFwiI3RhcmdldHNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJwcmFjdGljZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwiZW50aXR5XCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxfdGVzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2xpc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJjb25lXCIsIFwiZ2VuXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzeW5jXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJhcGlcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJhbGxcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJzdGFydFwiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwiY3JlYXRlXCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcImF1dGhcIiwgXCJnZW5lcmF0ZVwiXSxcbiAgICAgIF0sXG4gICAgICBydW5uZXJzOiB7XG4gICAgICAgIG1pZ3JhdGVfc3RhdHVzLFxuICAgICAgICBtaWdyYXRlX3J1bixcbiAgICAgICAgbWlncmF0ZV9hcHBseSxcbiAgICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgICBmaXh0dXJlX2ltcG9ydCxcbiAgICAgICAgZml4dHVyZV9zeW5jLFxuICAgICAgICBmaXh0dXJlX2dlbixcbiAgICAgICAgZml4dHVyZV9mZXRjaCxcbiAgICAgICAgZml4dHVyZV9leHBsb3JlLFxuICAgICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgICBzdHViX2VudGl0eSxcbiAgICAgICAgc2NhZmZvbGRfbW9kZWwsXG4gICAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgICAgLy8gc2NhZmZvbGRfdmlld19mb3JtLFxuICAgICAgICBjb25lX2dlbixcbiAgICAgICAgc3luYyxcbiAgICAgICAgYnVpbGRfYWxsLFxuICAgICAgICBidWlsZF9hcGksXG4gICAgICAgIGJ1aWxkX3dlYixcbiAgICAgICAgZGV2X2FsbCxcbiAgICAgICAgZGV2X2FwaSxcbiAgICAgICAgZGV2X3dlYixcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIHNraWxsc19zeW5jLFxuICAgICAgICBza2lsbHNfY3JlYXRlLFxuICAgICAgICBhdXRoX2dlbmVyYXRlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBBUEkg6rCc67CcIOyEnOuyhOulvCDsi6TtlontlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqIGRldl9hbGzqs7wgZGV2X2FwaeyXkOyEnCDqs7XsnKDtlanri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvdHMtbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG1yLWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L3RzLWxvYWRlcuyZgCBAc29uYW11LWtpdC9obXItaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBzcGF3bkFwaURldlNlcnZlcihvcHRpb25zPzogeyBleHRyYUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9obXItcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG1yLWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG9vayxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1lbmFibGUtc291cmNlLW1hcHNcIiwgLy8g6re466as6rOgIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZWcIO2UjOuemOq3uOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9cjpyZXN0YXJ0OlJlc3RhcnQgc2VydmVyXCIsIC8vIHIg64iE66W066m0IOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuICAgICAgYC0tb24ta2V5PWY6c2hlbGwocm0gJHtwYXRoLmpvaW4oYXBpUm9vdCwgXCJzb25hbXUubG9ja1wiKX0pOnJlc3RhcnQ6Rm9yY2UgcmVzdGFydGAsIC8vIGYg64iE66W066m0IHNvbmFtdS5sb2NrIO2MjOydvOydhCDsp4DsmrDqs6Ag7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG5cbiAgICAgIFwiLS1vbi1rZXk9ZW50ZXI6c2hlbGwoZWNobyBoaSk6S2V5IGJpbmRpbmcgdGVzdFwiLCAvLyBlbnRlcuulvCBrZXnroZwg7JO4IOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PWN0cmwrZiBjdHJsK2Y6c2hlbGwoZ2l0IHB1bGwgJiYgcG5wbSBpbnN0YWxsICYmIHBucG0gLS1maWx0ZXIgc29uYW11IGJ1aWxkICYmIGVjaG8gJ1NvbmFtdSBpcyBub3cgdXAtdG8tZGF0ZSEnKTpyZXN0YXJ0OlB1bGwgJiBpbnN0YWxsICYgYnVpbGQgJiByZXN0YXJ0XCIsIC8vIG1vZGlmaWVy7JmA7J2YIOyhsO2VqSwg6re466as6rOgIOuRkCDqsJzsnZggY2hvcmTrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBlbnRyeVBvaW50LCAvLyDrp4jsp4Drp4nsnLzroZwg7Iuk7KCcIOyLpO2Wie2VoCDsiqTtgazrpr3tirjsnZgg6rK966Gc66W8IOuEmOqyqOykjeuLiOuLpC5cbiAgICBdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgTk9ERV9FTlY6IFwiZGV2ZWxvcG1lbnRcIixcbiAgICAgICAgSE9UOiBcInllc1wiLCAvLyDslpjqsIAg7J6I7Ja07JW8IEhNUuydtCDtmZzshLHtmZTrkKnri4jri6QuXG4gICAgICAgIEFQSV9ST09UX1BBVEg6IGFwaVJvb3QsIC8vIOydtCDqsr3roZzqsIAgaG1yLWhvb2vsnZgg66Oo7Yq4IOuUlOugie2GoOumrOqwgCDrkKnri4jri6QuXG4gICAgICAgIC4uLm9wdGlvbnM/LmV4dHJhRW52LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBTZXJ2ZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiAvIHBucG0gZGV2IGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBkZXZfYWxsKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlN0YXJ0aW5nIFNvbmFtdSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7KCE7JqpIOqwnOuwnCDshJzrsoTrpbwg652E7JuB64uI64ukLlxuICogZGV2X2FsbOqzvCDqsbDsnZgg64+Z7J287ZWY65CYLCDthrXtlakg7Ju5IOyEnOuyhOulvCDruYTtmZzshLHtmZTtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FwaSgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgQVBJLW9ubHkgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKHtcbiAgICBleHRyYUVudjogeyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQjogXCJ5ZXNcIiB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBWaXRlIOqwnOuwnCDshJzrsoTrpbwg64uo64+F7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqIC0tIOuSpOydmCDsnbjsnpDripQgVml0ZeyXkCDqt7jrjIDroZwg7KCE64us65Cp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldl93ZWIoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIC0tIOuSpOydmCDsnbjsnpAg7LaU7LacXG4gIGNvbnN0IGRvdWJsZURhc2hJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKFwiLS1cIik7XG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IGRvdWJsZURhc2hJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoZG91YmxlRGFzaEluZGV4ICsgMSkgOiBbXTtcblxuICBjb25zdCB2aXRlQXJncyA9IFtcImV4ZWNcIiwgXCJ2aXRlXCIsIC4uLnBhc3N0aHJvdWdoQXJnc107XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBWaXRlIGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIGNvbnN0IHZpdGVQcm9jZXNzID0gc3Bhd24oXCJwbnBtXCIsIHZpdGVBcmdzLCB7XG4gICAgY3dkOiB3ZWJQYXRoLFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgdml0ZVByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIC8vIFNJR0lOVC9TSUdURVJNIOyLnCBWaXRlIO2UhOuhnOyEuOyKpOulvCBncmFjZWZ1bGx5IOyiheujjO2VqeuLiOuLpC5cbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICB2aXRlUHJvY2Vzcy5raWxsKHNpZ25hbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTV0Mg7ISk7KCVIO2MjOydvCDqsr3roZzrpbwg6rKw7KCV7ZWp64uI64ukLiBBUEkg67mM65OcKFNXQynsl5DshJzrp4wg7IKs7Jqp65Cp64uI64ukLlxuICog7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOq3uOqyg+ydhCwg7JeG7Jy866m0IHNvbmFtdSDquLDrs7gg7ISk7KCV7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVN3Y0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgZGVmYXVsdCAuc3djcmMgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gICAgICBzd2NGaWxlUGF0aCA9IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCIuc3djcmMucHJvamVjdC1kZWZhdWx0XCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlNldHRpbmcgdXAgc3djIGNvbmZpZyBmaWxlIGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIHN3Y0ZpbGVQYXRoO1xufVxuXG4vKipcbiAqIHNvbmFtdSBidWlsZCAvIHNvbmFtdSBidWlsZCBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBidWlsZF9hcGkgKyBidWlsZF93ZWLsnZgg7ZWp7ISx7J6F64uI64ukLiBXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuptCBXZWIg67mM65Oc66W8IOyKpO2Cte2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYWxsKCkge1xuICBhd2FpdCBidWlsZF9hcGkoKTtcbiAgYXdhaXQgYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FwaSgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCBzd2NGaWxlUGF0aCA9IGF3YWl0IHJlc29sdmVTd2NDb25maWdQYXRoKCk7XG5cbiAgY29uc3QgYXBpU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIEFQSV9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290LCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG5cbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHsgY3dkLCBidWlsZENvbW1hbmRBcmdzOiB7IGNvbmZpZ0ZpbGVQYXRoOiBzd2NGaWxlUGF0aCB9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogV2ViIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZyA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgZmFsc2UsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogcG5wbSBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbi8qKlxuICogZml4dHVyZSBnZW4g66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2dlbigpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9mZXRjaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZXhwbG9yZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICog6rCE64uo7ZWcIOyYteyFmCDtjIzshJxcbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zKFxuICBhcmd2OiBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0ge1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9ID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDIpO1xuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCBbaywgdl0gPSBrZXkuc3BsaXQoXCI9XCIpO1xuICAgICAgICBvcHRpb25zW2tdID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG5cbiAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuXy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuXG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBjb25zdCB1c2VBSSA9IGZsYWdzLmhhcyhcImFpXCIpO1xuICBjb25zdCBub0NvbmVzID0gZmxhZ3MuaGFzKFwibm8tY29uZXNcIik7XG5cbiAgLy8gLS1uby1jb25lczogY29uZSDsg53shLEg7Iqk7YK1XG4gIGlmIChub0NvbmVzKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGhvdXQgY29uZXNgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLS1haTogTExN7Jy866GcIGNvbmUg7IOd7ISxXG4gIGlmICh1c2VBSSkge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZGApO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcy4uLmApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUmVtb3ZlIC0tYWkgZmxhZyB0byB1c2UgdGVtcGxhdGUgY29uZXMgaW5zdGVhZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOuzuDog7YWc7ZSM66a/IGNvbmUg7J6Q64+ZIOyDneyEsVxuICAvLyBMTE0g7JeG7J20IGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAvLyDsnbTrpbwg7Ya17ZW0IEFOVEhST1BJQ19BUElfS0VZ6rCAIOyXhuyWtOuPhCBTb25hbXXrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnLzrqbAsXG4gIC8vIOyDneyEseuQnCDthZztlIzrpr8gY29uZeydgCDrgpjspJHsl5AgJ2NvbmUgZ2VuJyDrqoXroLnslrTroZwgQUnrpbwg7Ya17ZW0IOyXheq3uOugiOydtOuTnO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIHRlbXBsYXRlIGNvbmVzLi4uYCk7XG4gIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGggdGVtcGxhdGUgY29uZXNgKTtcbiAgY29uc29sZS5sb2coYPCfkqEgVGlwOiBSdW4gJ3BucG0gc29uYW11IGNvbmUgZ2VuICR7ZW50aXR5SWR9JyB0byBpbXByb3ZlIHdpdGggQUlgKTtcbn1cblxuLyoqXG4gKiBBSeulvCDsgqzsmqntlZjsl6wgZW50aXR57J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VmOqxsOuCmCDsl4Xqt7jroIjsnbTrk5ztlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLSAtLXJlZ2VuZXJhdGU6IOyghOyytCDsnqzsg53shLEgKOq4sOyhtCBjb25lIOuNruyWtOyTsOq4sClcbiAqIC0gLS1sb2NhbGUgPGtvfGVufGphPjog7IOd7ISxIOyWuOyWtCDsp4DsoJVcbiAqIC0g6riw67O4OiBvbmx5RW1wdHkg66qo65OcICjquLDsobQgZml4dHVyZUhpbnQg67O07KG0KVxuICpcbiAqIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalCAoc29uYW11LnNlY3JldC50cyDrmJDripQg7ZmY6rK967OA7IiYKVxuICovXG5hc3luYyBmdW5jdGlvbiBjb25lX2dlbihlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCB7IGZsYWdzLCBvcHRpb25zIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcblxuICAvLyAtLWFsbCDsmLXshZg6IOuqqOuToCBlbnRpdHkgY29uZSDsg53shLFcbiAgaWYgKGZsYWdzLmhhcyhcImFsbFwiKSB8fCBlbnRpdHlJZCA9PT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGFsbEVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcyBmb3IgJHthbGxFbnRpdGllcy5sZW5ndGh9IGVudGl0aWVzLi4uXFxuYCk7XG5cbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGFsbEVudGl0aWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyAke2VudGl0eS5pZH0uLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0b3RhbFRva2VucyArPSByZXN1bHQudG9rZW5zVXNlZDtcbiAgICAgICAgY29uc29sZS5sb2coYCAg4pyTICR7ZW50aXR5LmlkfSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKVxcbmApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgIGVycm9ycy5wdXNoKGAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICDinJcgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9XFxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFxcbuKchSBEb25lISBUb3RhbDogJHt0b3RhbFRva2Vuc30gdG9rZW5zIHVzZWRgKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHRvdGFsVG9rZW5zICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgZW50aXRpZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgLSAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g64uo7J28IGVudGl0eSBjb25lIOyDneyEsVxuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RlID0gZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSA/IFwicmVnZW5lcmF0aW5nXCIgOiBcImdlbmVyYXRpbmdcIjtcbiAgY29uc29sZS5sb2coXG4gICAgYPCfjJ8gJHttb2RlID09PSBcInJlZ2VuZXJhdGluZ1wiID8gXCJSZWdlbmVyYXRpbmdcIiA6IFwiR2VuZXJhdGluZ1wifSBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2VudGl0eUlkfS4uLmAsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiID8gY29uZmlnTG9jYWxlIDogXCJrb1wiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgbG9jYWxlLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKchSBEb25lISAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zIHVzZWQpYCk7XG5cbiAgICAvLyDthqDtgbAg67mE7JqpIOqzhOyCsCAo64yA65617KCB7J24IOy2lOyglSlcbiAgICAvLyBDbGF1ZGUgU29ubmV0IDQuNTogaW5wdXQgJDMvTSB0b2tlbnMsIG91dHB1dCAkMTUvTSB0b2tlbnNcbiAgICAvLyDqsITri6jtlZjqsowg7Y+J6regICQ5L00gdG9rZW5z66GcIOqzhOyCsFxuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAocmVzdWx0LnRva2Vuc1VzZWQgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFRvIHVzZSBBSS1wb3dlcmVkIGNvbmUgZ2VuZXJhdGlvbjpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAgMS4gR2V0IGFuIEFQSSBrZXkgZnJvbSBodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgICAgMi4gQWRkIGl0IHRvIHNvbmFtdS5zZWNyZXQudHMgb3Igc2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiBVbmtub3duIGVycm9yYCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOqzteyLnSBTa2lsbHPrpbwg66Gc7LusIO2UhOuhnOygne2KuOuhnCDrj5nquLDtmZTtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jKCkge1xuICBjb25zdCB3b3Jrc3BhY2VSb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3QoKTtcbiAgY29uc3QgY2xhdWRlRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiKTtcbiAgY29uc3QgdGFyZ2V0U2tpbGxzRGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJzb25hbXVcIik7XG5cbiAgLy8g6rCc67CcIO2ZmOqyvSAtIGNsaS50czogc29uYW11L21vZHVsZXMvc29uYW11L3NyYy9iaW4vY2xpLnRzXG4gIC8vIOu5jOuTnCDtm4QgLSBjbGkuanM6IG5vZGVfbW9kdWxlcy9zb25hbXUvZGlzdC9iaW4vY2xpLmpzICjsi6TsoJwg7Iuk7ZaJKVxuICAvLyBza2lsbHMg7JyE7LmYOiBub2RlX21vZHVsZXMvc29uYW11L3NyYy9za2lsbHMgKG5wbSDrsLDtj6wg7IucKVxuICBjb25zdCBzb3VyY2VCYXNlID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcInNraWxsc1wiKTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwic29uYW11XCIpO1xuICBjb25zdCBzb3VyY2VDbGF1ZGVNZCA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcIkNMQVVERS5tZFwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoc291cmNlU2tpbGxzRGlyKSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJTa2lsbHMgc291cmNlIG5vdCBmb3VuZCBpbiBzb25hbXUgcGFja2FnZS5cIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOyhtCDrlJTroInthqDrpqwvc3ltbGluayDsgq3soJwg7ZuEIHN5bWxpbmsg7IOd7ISxXG4gIC8vIGV4aXN0cygp64qUIGJyb2tlbiBzeW1saW5r66W8IOqwkOyngO2VmOyngCDrqrvtlZjrr4DroZwgcm3snYQg66y07KGw6rG0IOyLnOuPhO2VqeuLiOuLpFxuICB0cnkge1xuICAgIGF3YWl0IHJtKHRhcmdldFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyDtjIzsnbzsnbQg7JeG7Jy866m0IOustOyLnFxuICB9XG5cbiAgLy8g64yA7IOBIOuUlOugie2GoOumrCDsg53shLFcbiAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldFNraWxsc0RpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgc3ltbGluayhzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0RpciwgXCJkaXJcIik7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgbGlua2VkIChzeW1saW5rKWApKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFN5bWxpbmsgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKSxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICBGYWxsaW5nIGJhY2sgdG8gY29weS4uLmApKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY3Aoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgY29waWVkYCkpO1xuICAgIH0gY2F0Y2ggKGNvcHlFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGNvcHkgc2tpbGxzOiAke2NvcHlFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY29weUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoY29weUVycm9yKX1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRocm93IGNvcHlFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBwcm9qZWN0IOuUlOugie2GoOumrCDstIjquLDtmZQgKOyXhuycvOuptCDsg53shLEsIOyeiOycvOuptCDsnKDsp4ApXG4gIGNvbnN0IHNvdXJjZVByb2plY3REaXIgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJwcm9qZWN0XCIpO1xuICBjb25zdCB0YXJnZXRQcm9qZWN0RGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJwcm9qZWN0XCIpO1xuXG4gIGlmIChhd2FpdCBleGlzdHMoc291cmNlUHJvamVjdERpcikpIHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHModGFyZ2V0UHJvamVjdERpcikpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjcChzb3VyY2VQcm9qZWN0RGlyLCB0YXJnZXRQcm9qZWN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBQcm9qZWN0IHRlbXBsYXRlcyBpbml0aWFsaXplZGApKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYOKclyBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9qZWN0IHRlbXBsYXRlczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKPrSBQcm9qZWN0IHRlbXBsYXRlcyBhbHJlYWR5IGV4aXN0IChwcmVzZXJ2ZWQpYCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENMQVVERS5tZCDrs7Xsgqwv7JeF642w7J207Yq4XG4gIGlmIChhd2FpdCBleGlzdHMoc291cmNlQ2xhdWRlTWQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldENsYXVkZU1kID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJDTEFVREUubWRcIik7XG4gICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoc291cmNlQ2xhdWRlTWQsIFwidXRmLThcIik7XG5cbiAgICAgIGlmIChhd2FpdCBleGlzdHModGFyZ2V0Q2xhdWRlTWQpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZSh0YXJnZXRDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOlNUQVJUIC0tPlwiO1xuICAgICAgICBjb25zdCBlbmRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOkVORCAtLT5cIjtcbiAgICAgICAgaWYgKHRhcmdldENvbnRlbnQuaW5jbHVkZXMoc3RhcnRNYXJrZXIpICYmIHRhcmdldENvbnRlbnQuaW5jbHVkZXMoZW5kTWFya2VyKSkge1xuICAgICAgICAgIC8vIG1hcmtlciDsmIHsl63rp4wg6rWQ7LK07ZWp64uI64ukLlxuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gdGFyZ2V0Q29udGVudC5pbmRleE9mKHN0YXJ0TWFya2VyKTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2YoZW5kTWFya2VyKTtcblxuICAgICAgICAgIGlmIChzdGFydElkeCAhPT0gLTEgJiYgZW5kSWR4ICE9PSAtMSAmJiBzdGFydElkeCA8IGVuZElkeCkge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGFyZ2V0Q29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnRJZHgpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZyhlbmRJZHggKyBlbmRNYXJrZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtiZWZvcmV9JHtzdGFydE1hcmtlcn1cXG4ke3NvdXJjZUNvbnRlbnR9XFxuJHtlbmRNYXJrZXJ9JHthZnRlcn1gO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBuZXdDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIHVwZGF0ZWQgKG1hcmtlciByZWdpb24pYCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKPrSBDTEFVREUubWQgbWFya2VyIHBvc2l0aW9ucyBpbnZhbGlkLCBza2lwcGVkYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBzb3VyY2VDb250ZW50KTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgY3JlYXRlZGApKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGDinJcgRmFpbGVkIHRvIHVwZGF0ZSBDTEFVREUubWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc29uYW11IHNraWxscyBjcmVhdGUgPG5hbWU+IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog66Gc7LusIHNraWxsIOy0iOyViOydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19jcmVhdGUobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBsb2NhbERpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIiwgXCJza2lsbHNcIiwgXCJsb2NhbFwiKTtcblxuICAvLyA9PT0g7YyM7J2866qFIOqygOymnSDrsI8gU2FuaXRpemUgPT09XG4gIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIFNraWxsIG5hbWUgaXMgcmVxdWlyZWRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzYW5pdGl6ZWQgPSBuYW1lXG4gICAgLy8g6rO167Cx7J2EIO2VmOydtO2UiOycvOuhnFxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKVxuICAgIC8vIOqyveuhnCDqtazrtoTsnpAg7KCc6rGwXG4gICAgLnJlcGxhY2UoL1svXFxcXF0vZywgXCItXCIpXG4gICAgLy8gUGF0aCB0cmF2ZXJzYWwg67Cp7KeAXG4gICAgLnJlcGxhY2UoL1xcLlxcLi9nLCBcIlwiKVxuICAgIC8vIFdpbmRvd3Mg6riI7KeAIOusuOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWzw+OlwifD8qXS9nLCBcIlwiKVxuICAgIC8vIOyLnOyekS/rgZ0g7KCQLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCDsoJzqsbBcbiAgICAucmVwbGFjZSgvXlsuXFwtX10rfFsuXFwtX10rJC9nLCBcIlwiKVxuICAgIC8vIOyXsOyGjeuQnCDtlZjsnbTtlIjsnYQg7ZWY64KY66GcXG4gICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgIC8vIOyVjO2MjOuysywg7Iir7J6QLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCwg7ZWc6riA66eMIO2XiOyaqVxuICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOS1f6rCALe2eo10vZywgXCJcIik7XG5cbiAgLy8g6ri47J20IOygnO2VnFxuICBjb25zdCBNQVhfTEVOR1RIID0gMTAwO1xuICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc3Vic3RyaW5nKDAsIE1BWF9MRU5HVEgpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIE5hbWUgdHJ1bmNhdGVkIHRvICR7TUFYX0xFTkdUSH0gY2hhcmFjdGVyc2ApKTtcbiAgfVxuXG4gIC8vIFdpbmRvd3Mg7JiI7JW97Ja0IO2ZleyduFxuICBjb25zdCBSRVNFUlZFRF9OQU1FUyA9IFtcbiAgICBcIkNPTlwiLFxuICAgIFwiUFJOXCIsXG4gICAgXCJBVVhcIixcbiAgICBcIk5VTFwiLFxuICAgIFwiQ09NMVwiLFxuICAgIFwiQ09NMlwiLFxuICAgIFwiQ09NM1wiLFxuICAgIFwiQ09NNFwiLFxuICAgIFwiQ09NNVwiLFxuICAgIFwiQ09NNlwiLFxuICAgIFwiQ09NN1wiLFxuICAgIFwiQ09NOFwiLFxuICAgIFwiQ09NOVwiLFxuICAgIFwiTFBUMVwiLFxuICAgIFwiTFBUMlwiLFxuICAgIFwiTFBUM1wiLFxuICAgIFwiTFBUNFwiLFxuICAgIFwiTFBUNVwiLFxuICAgIFwiTFBUNlwiLFxuICAgIFwiTFBUN1wiLFxuICAgIFwiTFBUOFwiLFxuICAgIFwiTFBUOVwiLFxuICBdO1xuICBpZiAoUkVTRVJWRURfTkFNRVMuaW5jbHVkZXMoc2FuaXRpemVkLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgc2FuaXRpemVkID0gYHNraWxsLSR7c2FuaXRpemVkfWA7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgUmVzZXJ2ZWQgbmFtZSBkZXRlY3RlZCwgcHJlZml4ZWQgd2l0aCBcInNraWxsLVwiYCkpO1xuICB9XG5cbiAgLy8g67mIIOusuOyekOyXtCDssrTtgaxcbiAgaWYgKHNhbml0aXplZCA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIEludmFsaWQgc2tpbGwgbmFtZSBhZnRlciBzYW5pdGl6YXRpb25cIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBPcmlnaW5hbDogXCIke25hbWV9XCJgKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g67OA6rK9IOyVjOumvFxuICBpZiAoc2FuaXRpemVkICE9PSBuYW1lKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSBzYW5pdGl6ZWQ6IFwiJHtuYW1lfVwiIOKGkiBcIiR7c2FuaXRpemVkfVwiYCkpO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obG9jYWxEaXIsIGAke3Nhbml0aXplZH0ubWRgKTtcblxuICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgU2tpbGwgXCIke3Nhbml0aXplZH1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgbWtkaXIobG9jYWxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gYC0tLVxubmFtZTogJHtzYW5pdGl6ZWR9XG5jYXRlZ29yeTogb3RoZXJcbmNyZWF0ZWRfYXQ6ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX1cbnN0YXR1czogZHJhZnRcbi0tLVxuXG4jICR7c2FuaXRpemVkfVxuXG4jIyDsg4HtmalcblxuW+yWtOuWpCDrrLjsoJzsmIDripTsp4BdXG5cbiMjIO2VtOqysCDrsKnrspVcblxuW+yWtOuWu+qyjCDtlbTqsrDtlojripTsp4BdXG5cbiMjIOy9lOuTnCDsmIjsi5xcblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuLy8g7JiI7IucIOy9lOuTnFxuXFxgXFxgXFxgXG5gO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgdGVtcGxhdGUpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENyZWF0ZWQgLmNsYXVkZS9za2lsbHMvbG9jYWwvJHtzYW5pdGl6ZWR9Lm1kYCkpO1xufVxuXG4vKipcbiAqIHBucG0gc29uYW11IGF1dGggZ2VuZXJhdGUg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBiZXR0ZXItYXV0aCDsl5Tti7Dti7Drk6QoVXNlciwgU2Vzc2lvbiwgQWNjb3VudCwgVmVyaWZpY2F0aW9uKeydhCDsg53shLHtlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLS1wbHVnaW5zIHBob25lLW51bWJlciwyZmEgIO2UjOufrOq3uOyduCDsl5Tti7Dti7Drj4Qg7ZWo6ruYIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRoX2dlbmVyYXRlKCkge1xuICAvLyAtLXBsdWdpbnMg7Ji17IWYIO2MjOyLsVxuICBjb25zdCBwbHVnaW5zQXJnID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoXCItLXBsdWdpbnNcIikpO1xuICBjb25zdCBwbHVnaW5zOiBCZXR0ZXJBdXRoUGx1Z2luSWRbXSA9IFtdO1xuXG4gIGlmIChwbHVnaW5zQXJnKSB7XG4gICAgY29uc3QgcGx1Z2luVmFsdWUgPSBwbHVnaW5zQXJnLmluY2x1ZGVzKFwiPVwiKVxuICAgICAgPyBwbHVnaW5zQXJnLnNwbGl0KFwiPVwiKVsxXVxuICAgICAgOiBwcm9jZXNzLmFyZ3ZbcHJvY2Vzcy5hcmd2LmluZGV4T2YocGx1Z2luc0FyZykgKyAxXTtcblxuICAgIGlmIChwbHVnaW5WYWx1ZSkge1xuICAgICAgY29uc3QgcGx1Z2luSWRzID0gcGx1Z2luVmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIHBsdWdpbklkcykge1xuICAgICAgICBpZiAoaXNWYWxpZFBsdWdpbklkKGlkKSkge1xuICAgICAgICAgIHBsdWdpbnMucHVzaChpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgVW5rbm93biBwbHVnaW46ICR7aWR9YCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBTdXBwb3J0ZWQgcGx1Z2luczogJHtTVVBQT1JURURfUExVR0lOX0lEUy5qb2luKFwiLCBcIil9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5SQIEdlbmVyYXRpbmcgYmV0dGVyLWF1dGggZW50aXRpZXMuLi5cXG5cIikpO1xuXG4gIGlmIChwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgUGx1Z2luczogJHtwbHVnaW5zLmpvaW4oXCIsIFwiKX1gKSk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyh7IHBsdWdpbnMgfSk7XG59XG5cbi8qKlxuICog7JuM7YGs7Iqk7Y6Y7J207IqkIOujqO2KuOulvCDssL7sirXri4jri6QuXG4gKiDsmrDshKDsiJzsnIQ6IHBucG0td29ya3NwYWNlLnlhbWwgPiBDTEFVREUubWQgPiDro6jtirggcGFja2FnZS5qc29uICh3b3Jrc3BhY2VzIO2VhOuTnClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVJvb3QoKSB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIHdoaWxlIChkaXIgIT09IHBhdGguZGlybmFtZShkaXIpKSB7XG4gICAgLy8gMS4gcG5wbS13b3Jrc3BhY2UueWFtbCDtjIzsnbzsnbQg7J6I64qU7KeAIO2ZleyduC4g7J6I7Jy866m0IO2ZleyLpO2VnCBtb25vcmVwbyDro6jtirguXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcInBucG0td29ya3NwYWNlLnlhbWxcIikpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cblxuICAgIC8vIDIuIENMQVVERS5tZCDtjIzsnbzsnbQg7J6I64qU7KeAIO2ZleyduC4g7J6I7Jy866m0IO2UhOuhnOygne2KuCDro6jtirjroZwg6rCE7KO87ZWoLlxuICAgIGlmIChhd2FpdCBleGlzdHMocGF0aC5qb2luKGRpciwgXCJDTEFVREUubWRcIikpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cblxuICAgIC8vIDMuIHBhY2thZ2UuanNvbuyXkCB3b3Jrc3BhY2VzIO2VhOuTnOqwgCDsnojsnLzrqbQg66Oo7Yq4LlxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKGRpciwgXCJwYWNrYWdlLmpzb25cIik7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYWNrYWdlUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYWNrYWdlUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICAgIGlmIChwYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgICAgcmV0dXJuIGRpcjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIO2MjOyLsSDsi6TtjKjsi5wg66y07IucXG4gICAgICB9XG4gICAgfVxuICAgIGRpciA9IHBhdGguZGlybmFtZShkaXIpO1xuICB9XG5cbiAgLy8g7LC+7KeAIOuqu+2VmOuptCBhcGkg7Y+0642U7J2YIOu2gOuqqCDsgqzsmqlcbiAgcmV0dXJuIGZpbmRBcHBSb290UGF0aCgpO1xufVxuIl0sIm5hbWVzIjpbImNoYWxrIiwiZG90ZW52IiwiY29uZmlnIiwiYXNzZXJ0IiwiZXhlY1N5bmMiLCJzcGF3biIsImNwIiwibWtkaXIiLCJyZWFkZGlyIiwicmVhZEZpbGUiLCJybSIsInN5bWxpbmsiLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMiLCJpc1ZhbGlkUGx1Z2luSWQiLCJTVVBQT1JURURfUExVR0lOX0lEUyIsIkVudGl0eU1hbmFnZXIiLCJNaWdyYXRvciIsIkZpeHR1cmVNYW5hZ2VyIiwiZXhlY1dpdGhMaW5lUHJlZml4IiwicHJpbnRCdWlsZFN1bW1hcnkiLCJwcmludFRhc2tGYWlsZWQiLCJwcmludFRhc2tIZWFkZXIiLCJwcmludFRhc2tTdGFydCIsInByaW50VGFza1N1Y2Nlc3MiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJmaW5kQXBwUm9vdFBhdGgiLCJBUElfQVJUSUZBQ1RTIiwiV0VCX0FSVElGQUNUUyIsImZpeHR1cmVFeHBsb3JlQ29tbWFuZCIsImZpeHR1cmVGZXRjaENvbW1hbmQiLCJmaXh0dXJlR2VuQ29tbWFuZCIsIm1pZ3JhdG9yIiwicGFyc2VDbGlPcHRpb25zIiwiYXJndiIsImZsYWdzIiwiU2V0Iiwib3B0aW9ucyIsImkiLCJsZW5ndGgiLCJhcmciLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJrZXkiLCJ2YWx1ZSIsInNsaWNlIiwic3BsaXQiLCJuZXh0QXJnIiwiYWRkIiwiYm9vdHN0cmFwIiwibm90VG9Jbml0IiwiaW5pdCIsImZpbHRlcmVkQXJndiIsInNraXBOZXh0IiwiYWZ0ZXJEb3VibGVEYXNoIiwicHVzaCIsImNtZCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJtaWdyYXRlX2FwcGx5IiwiZml4dHVyZV9pbml0IiwiZml4dHVyZV9pbXBvcnQiLCJmaXh0dXJlX3N5bmMiLCJmaXh0dXJlX2dlbiIsImZpeHR1cmVfZmV0Y2giLCJmaXh0dXJlX2V4cGxvcmUiLCJzdHViX3ByYWN0aWNlIiwic3R1Yl9lbnRpdHkiLCJzY2FmZm9sZF9tb2RlbCIsInNjYWZmb2xkX21vZGVsX3Rlc3QiLCJjb25lX2dlbiIsInN5bmMiLCJidWlsZF9hbGwiLCJidWlsZF9hcGkiLCJidWlsZF93ZWIiLCJkZXZfYWxsIiwiZGV2X2FwaSIsImRldl93ZWIiLCJzdGFydCIsInNraWxsc19zeW5jIiwic2tpbGxzX2NyZWF0ZSIsImF1dGhfZ2VuZXJhdGUiLCJkZXN0cm95IiwiZmluYWxseSIsInN5bmNlciIsInNwYXduQXBpRGV2U2VydmVyIiwiYXBpUm9vdCIsImVudHJ5UG9pbnQiLCJob3RSdW5uZXJCaW5QYXRoIiwidXJsIiwicmVzb2x2ZSIsInNlcnZlclByb2Nlc3MiLCJleGVjUGF0aCIsImpvaW4iLCJjd2QiLCJzdGRpbyIsImVudiIsIk5PREVfRU5WIiwiSE9UIiwiQVBJX1JPT1RfUEFUSCIsImV4dHJhRW52IiwiY2xlYW51cCIsImNvbnNvbGUiLCJsb2ciLCJ5ZWxsb3ciLCJraWxsIiwiZXhpdCIsIm9uIiwiY29kZSIsImVycm9yIiwicmVkIiwiYm9sZCIsIlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCIiwiYXBwUm9vdCIsIndlYlBhdGgiLCJkb3VibGVEYXNoSW5kZXgiLCJpbmRleE9mIiwicGFzc3Rocm91Z2hBcmdzIiwidml0ZUFyZ3MiLCJ2aXRlUHJvY2VzcyIsInNpZ25hbCIsInJlc29sdmVTd2NDb25maWdQYXRoIiwic3djRmlsZVBhdGgiLCJkaW0iLCJkaXJuYW1lIiwic2tpcElmTWlzc2luZyIsImFwaVN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJhcnRpZmFjdCIsInByb2plY3RQYXRoIiwiZGVzY3JpcHRpb24iLCJydW5CdWlsZFN0ZXBzIiwiYnVpbGRDb21tYW5kQXJncyIsImNvbmZpZ0ZpbGVQYXRoIiwiZSIsImdyYXkiLCJ3ZWJTdGFydGVkQXQiLCJzdGVwcyIsInByZUJ1aWxkQ29tbWFuZCIsImJ1aWxkQ29tbWFuZCIsInBvc3RCdWlsZENvbW1hbmQiLCJmaWx0ZXIiLCJzdGVwIiwiaXNMYXN0IiwiRXJyb3IiLCJjYXVzZSIsImJsdWUiLCJzZXR1cE1pZ3JhdG9yIiwic2V0dXBGaXh0dXJlTWFuYWdlciIsInRhcmdldHMiLCJydW5BY3Rpb24iLCJsb2NhbEhvc3RzIiwiT2JqZWN0Iiwia2V5cyIsImRiQ29uZmlnIiwidGFyZ2V0IiwidGFyZ2V0Q29uZmlnIiwiaG9zdCIsImNvbm5lY3Rpb24iLCJ0b0xvd2VyQ2FzZSIsInN0YXR1cyIsImdldFN0YXR1cyIsInNyY0NvbmZpZyIsImRldmVsb3BtZW50X21hc3RlciIsImxhYmVsIiwiZml4dHVyZSIsInRlc3QiLCJ0b1NraXAiLCJyZW1vdGVDb25uIiwibG9jYWxDb25uIiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJwYXJzZU9wdGlvbnMiLCJfIiwiayIsInYiLCJuZXh0IiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwicmVjdXJzaXZlIiwiZmlsdGVyZWRTZXFzIiwiZmlsZU5hbWUiLCJlbmRzV2l0aCIsInNlcU5vIiwibWF0Y2giLCJwYXJzZUludCIsInNvcnQiLCJhIiwiYiIsImN1cnJlbnRTZXFObyIsImRzdFBhdGgiLCJydW5Db2RlIiwicmVwbGFjZSIsImNyZWF0ZUVudGl0eSIsInVzZUFJIiwiaGFzIiwibm9Db25lcyIsImVudGl0eSIsImdldCIsImNvbmZpZ0xvY2FsZSIsImkxOG4iLCJkZWZhdWx0TG9jYWxlIiwibG9jYWxlIiwicmVzdWx0IiwiZ2VuZXJhdGVDb25lcyIsInByZXNlcnZlRXhpc3RpbmciLCJvbmx5RW1wdHkiLCJ0b2tlbnNVc2VkIiwiZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIiwiYWxsRW50aXRpZXMiLCJnZXRBbGxFbnRpdGllcyIsInRvdGFsVG9rZW5zIiwiZXJyb3JzIiwiaWQiLCJlc3RpbWF0ZWRDb3N0IiwidG9GaXhlZCIsImVyciIsIm1vZGUiLCJnZW5lcmF0ZVRlbXBsYXRlIiwid29ya3NwYWNlUm9vdCIsImZpbmRXb3Jrc3BhY2VSb290IiwiY2xhdWRlRGlyIiwidGFyZ2V0U2tpbGxzRGlyIiwic291cmNlQmFzZSIsInNvdXJjZVNraWxsc0RpciIsInNvdXJjZUNsYXVkZU1kIiwiZm9yY2UiLCJncmVlbiIsIlN0cmluZyIsImNvcHlFcnJvciIsInNvdXJjZVByb2plY3REaXIiLCJ0YXJnZXRQcm9qZWN0RGlyIiwidGFyZ2V0Q2xhdWRlTWQiLCJzb3VyY2VDb250ZW50IiwidGFyZ2V0Q29udGVudCIsInN0YXJ0TWFya2VyIiwiZW5kTWFya2VyIiwic3RhcnRJZHgiLCJlbmRJZHgiLCJiZWZvcmUiLCJzdWJzdHJpbmciLCJhZnRlciIsIm5ld0NvbnRlbnQiLCJsb2NhbERpciIsInRyaW0iLCJzYW5pdGl6ZWQiLCJNQVhfTEVOR1RIIiwiUkVTRVJWRURfTkFNRVMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVQYXRoIiwidGVtcGxhdGUiLCJ0b0lTT1N0cmluZyIsInBsdWdpbnNBcmciLCJmaW5kIiwicGx1Z2lucyIsInBsdWdpblZhbHVlIiwicGx1Z2luSWRzIiwicCIsImRpciIsInBhY2thZ2VQYXRoIiwicGFja2FnZUpzb24iLCJKU09OIiwicGFyc2UiLCJ3b3Jrc3BhY2VzIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLFFBQVEsRUFBRUMsS0FBSyxRQUFRLGdCQUFnQjtBQUNoRCxTQUFTQyxFQUFFLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxF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
1215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9IGZyb20gXCIuLi9hdXRoL2F1dGgtZ2VuZXJhdG9yXCI7XG5pbXBvcnQge1xuICB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCxcbiAgaXNWYWxpZFBsdWdpbklkLFxuICBTVVBQT1JURURfUExVR0lOX0lEUyxcbn0gZnJvbSBcIi4uL2F1dGgvcGx1Z2lucy9lbnRpdHktZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZml4dHVyZUV4cGxvcmVDb21tYW5kLCBmaXh0dXJlRmV0Y2hDb21tYW5kLCBmaXh0dXJlR2VuQ29tbWFuZCB9IGZyb20gXCIuL2ZpeHR1cmVcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuLyoqXG4gKiBDTEkg7Ji17IWY7J2EIO2MjOyLse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2xpT3B0aW9ucyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndik6IHtcbiAgZmxhZ3M6IFNldDxzdHJpbmc+OyAvLyAtLXJlZ2VuZXJhdGUsIC0tYWksIC0tbm8tY29uZXMg65OxXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IC8vIC0tbG9jYWxlIGtvIOuTsVxufSB7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkgY29udGludWU7XG5cbiAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi51cbiAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJnLnNsaWNlKDIpLnNwbGl0KFwiPVwiKTtcbiAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduFxuICAgIGNvbnN0IG5leHRBcmcgPSBhcmd2W2kgKyAxXTtcbiAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIG9wdGlvbnNbYXJnLnNsaWNlKDIpXSA9IG5leHRBcmc7XG4gICAgICBpKys7IC8vIOuLpOydjCBhcmfripQg6rCS7J2066+A66GcIOyKpO2CtVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtLWZsYWcg7ZiV7IudXG4gICAgICBmbGFncy5hZGQoYXJnLnNsaWNlKDIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmbGFncywgb3B0aW9ucyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHRzaWNsaeuKlCDsoJXtmZXtlZwg66qF66C57Ja0IOunpOy5reunjCDsp4Dsm5DtlZjrr4DroZwsIC0t66GcIOyLnOyeke2VmOuKlCDsmLXshZjqs7wg6re4IOqwkuydhCDtlYTthLDrp4Htlanri4jri6QuXG4gICAgLy8g7Ji17IWYIO2MjOyLseydgCDqsIEgcnVubmVyIO2VqOyImOyXkOyEnCDsm5Drs7ggcHJvY2Vzcy5hcmd266W8IOyCrOyaqe2VmOyXrCDsiJjtlontlanri4jri6QuXG4gICAgLy8gXCItLVwiKGJhcmUgZG91YmxlIGRhc2gp64qUIHBhc3N0aHJvdWdoIOq1rOu2hOyekOydtOuvgOuhnCwg6re4IOuSpOydmCDrqqjrk6Ag7J247J6Q64+EIOygnOyZuO2VqeuLiOuLpC5cbiAgICBjb25zdCBmaWx0ZXJlZEFyZ3Y6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNraXBOZXh0ID0gZmFsc2U7XG4gICAgbGV0IGFmdGVyRG91YmxlRGFzaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07XG4gICAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgICAgYWZ0ZXJEb3VibGVEYXNoID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXJEb3VibGVEYXNoKSBjb250aW51ZTtcbiAgICAgIGlmIChza2lwTmV4dCkge1xuICAgICAgICBza2lwTmV4dCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgIC8vIC0tb3B0aW9uPXZhbHVlIO2YleyLneydgCDsnbQgYXJn66eMIOyKpO2CtVxuICAgICAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbg6IOuLpOydjCBhcmfqsIAgLS3roZwg7Iuc7J6R7ZWY7KeAIOyViuycvOuptCDqsJLsnbQg7J6I64qUIOqyg1xuICAgICAgICBjb25zdCBuZXh0QXJnID0gcHJvY2Vzcy5hcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgc2tpcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZC9kZXYg66qF66C57Ja06rCAIOyEnOu4jOy7pOunqOuTnCDsl4bsnbQg7Zi47Lac65CgIOuVjCBcImFsbFwi7J2EIOq4sOuzuOqwkuycvOuhnCDstpTqsIDtlanri4jri6QuXG4gICAgLy8g7JiIOiBgc29uYW11IGJ1aWxkYCDihpIgYHNvbmFtdSBidWlsZCBhbGxgLCBgc29uYW11IGRldmAg4oaSIGBzb25hbXUgZGV2IGFsbGBcbiAgICBjb25zdCBjbWQgPSBmaWx0ZXJlZEFyZ3ZbMl07XG4gICAgaWYgKChjbWQgPT09IFwiYnVpbGRcIiB8fCBjbWQgPT09IFwiZGV2XCIpICYmIGZpbHRlcmVkQXJndi5sZW5ndGggPT09IDMpIHtcbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKFwiYWxsXCIpO1xuICAgIH1cblxuICAgIGF3YWl0IHRzaWNsaShmaWx0ZXJlZEFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcIiN0YXJnZXRzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgICAgbmFtZTogXCIjdGFyZ2V0c1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICN0YXJnZXRzXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogXCJEZXZlbG9wbWVudFwiLCB2YWx1ZTogXCJkZXZlbG9wbWVudF9tYXN0ZXJcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJQcm9kdWN0aW9uXCIsIHZhbHVlOiBcInByb2R1Y3Rpb25fbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZVwiLCB2YWx1ZTogXCJmaXh0dXJlXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiVGVzdFwiLCB2YWx1ZTogXCJ0ZXN0XCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImdlblwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImZldGNoXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZXhwbG9yZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImFwcGx5XCIsIFwiI3RhcmdldHNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJwcmFjdGljZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwiZW50aXR5XCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxfdGVzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2xpc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJjb25lXCIsIFwiZ2VuXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzeW5jXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJhcGlcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJhbGxcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJzdGFydFwiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwiY3JlYXRlXCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcImF1dGhcIiwgXCJnZW5lcmF0ZVwiXSxcbiAgICAgIF0sXG4gICAgICBydW5uZXJzOiB7XG4gICAgICAgIG1pZ3JhdGVfc3RhdHVzLFxuICAgICAgICBtaWdyYXRlX3J1bixcbiAgICAgICAgbWlncmF0ZV9hcHBseSxcbiAgICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgICBmaXh0dXJlX2ltcG9ydCxcbiAgICAgICAgZml4dHVyZV9zeW5jLFxuICAgICAgICBmaXh0dXJlX2dlbixcbiAgICAgICAgZml4dHVyZV9mZXRjaCxcbiAgICAgICAgZml4dHVyZV9leHBsb3JlLFxuICAgICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgICBzdHViX2VudGl0eSxcbiAgICAgICAgc2NhZmZvbGRfbW9kZWwsXG4gICAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgICAgLy8gc2NhZmZvbGRfdmlld19mb3JtLFxuICAgICAgICBjb25lX2dlbixcbiAgICAgICAgc3luYyxcbiAgICAgICAgYnVpbGRfYWxsLFxuICAgICAgICBidWlsZF9hcGksXG4gICAgICAgIGJ1aWxkX3dlYixcbiAgICAgICAgZGV2X2FsbCxcbiAgICAgICAgZGV2X2FwaSxcbiAgICAgICAgZGV2X3dlYixcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIHNraWxsc19zeW5jLFxuICAgICAgICBza2lsbHNfY3JlYXRlLFxuICAgICAgICBhdXRoX2dlbmVyYXRlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBBUEkg6rCc67CcIOyEnOuyhOulvCDsi6TtlontlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqIGRldl9hbGzqs7wgZGV2X2FwaeyXkOyEnCDqs7XsnKDtlanri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvdHMtbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG1yLWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L3RzLWxvYWRlcuyZgCBAc29uYW11LWtpdC9obXItaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBzcGF3bkFwaURldlNlcnZlcihvcHRpb25zPzogeyBleHRyYUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9obXItcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG1yLWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG9vayxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1lbmFibGUtc291cmNlLW1hcHNcIiwgLy8g6re466as6rOgIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZWcIO2UjOuemOq3uOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9cjpyZXN0YXJ0OlJlc3RhcnQgc2VydmVyXCIsIC8vIHIg64iE66W066m0IOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuICAgICAgYC0tb24ta2V5PWY6c2hlbGwocm0gJHtwYXRoLmpvaW4oYXBpUm9vdCwgXCJzb25hbXUubG9ja1wiKX0pOnJlc3RhcnQ6Rm9yY2UgcmVzdGFydGAsIC8vIGYg64iE66W066m0IHNvbmFtdS5sb2NrIO2MjOydvOydhCDsp4DsmrDqs6Ag7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG5cbiAgICAgIFwiLS1vbi1rZXk9ZW50ZXI6c2hlbGwoZWNobyBoaSk6S2V5IGJpbmRpbmcgdGVzdFwiLCAvLyBlbnRlcuulvCBrZXnroZwg7JO4IOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PWN0cmwrZiBjdHJsK2Y6c2hlbGwoZ2l0IHB1bGwgJiYgcG5wbSBpbnN0YWxsICYmIHBucG0gLS1maWx0ZXIgc29uYW11IGJ1aWxkICYmIGVjaG8gJ1NvbmFtdSBpcyBub3cgdXAtdG8tZGF0ZSEnKTpyZXN0YXJ0OlB1bGwgJiBpbnN0YWxsICYgYnVpbGQgJiByZXN0YXJ0XCIsIC8vIG1vZGlmaWVy7JmA7J2YIOyhsO2VqSwg6re466as6rOgIOuRkCDqsJzsnZggY2hvcmTrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBlbnRyeVBvaW50LCAvLyDrp4jsp4Drp4nsnLzroZwg7Iuk7KCcIOyLpO2Wie2VoCDsiqTtgazrpr3tirjsnZgg6rK966Gc66W8IOuEmOqyqOykjeuLiOuLpC5cbiAgICBdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgTk9ERV9FTlY6IFwiZGV2ZWxvcG1lbnRcIixcbiAgICAgICAgSE9UOiBcInllc1wiLCAvLyDslpjqsIAg7J6I7Ja07JW8IEhNUuydtCDtmZzshLHtmZTrkKnri4jri6QuXG4gICAgICAgIEFQSV9ST09UX1BBVEg6IGFwaVJvb3QsIC8vIOydtCDqsr3roZzqsIAgaG1yLWhvb2vsnZgg66Oo7Yq4IOuUlOugie2GoOumrOqwgCDrkKnri4jri6QuXG4gICAgICAgIC4uLm9wdGlvbnM/LmV4dHJhRW52LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBTZXJ2ZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiAvIHBucG0gZGV2IGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBkZXZfYWxsKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlN0YXJ0aW5nIFNvbmFtdSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7KCE7JqpIOqwnOuwnCDshJzrsoTrpbwg652E7JuB64uI64ukLlxuICogZGV2X2FsbOqzvCDqsbDsnZgg64+Z7J287ZWY65CYLCDthrXtlakg7Ju5IOyEnOuyhOulvCDruYTtmZzshLHtmZTtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FwaSgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgQVBJLW9ubHkgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKHtcbiAgICBleHRyYUVudjogeyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQjogXCJ5ZXNcIiB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBWaXRlIOqwnOuwnCDshJzrsoTrpbwg64uo64+F7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqIC0tIOuSpOydmCDsnbjsnpDripQgVml0ZeyXkCDqt7jrjIDroZwg7KCE64us65Cp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldl93ZWIoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIC0tIOuSpOydmCDsnbjsnpAg7LaU7LacXG4gIGNvbnN0IGRvdWJsZURhc2hJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKFwiLS1cIik7XG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IGRvdWJsZURhc2hJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoZG91YmxlRGFzaEluZGV4ICsgMSkgOiBbXTtcblxuICBjb25zdCB2aXRlQXJncyA9IFtcImV4ZWNcIiwgXCJ2aXRlXCIsIC4uLnBhc3N0aHJvdWdoQXJnc107XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBWaXRlIGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIGNvbnN0IHZpdGVQcm9jZXNzID0gc3Bhd24oXCJwbnBtXCIsIHZpdGVBcmdzLCB7XG4gICAgY3dkOiB3ZWJQYXRoLFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgdml0ZVByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIC8vIFNJR0lOVC9TSUdURVJNIOyLnCBWaXRlIO2UhOuhnOyEuOyKpOulvCBncmFjZWZ1bGx5IOyiheujjO2VqeuLiOuLpC5cbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICB2aXRlUHJvY2Vzcy5raWxsKHNpZ25hbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTV0Mg7ISk7KCVIO2MjOydvCDqsr3roZzrpbwg6rKw7KCV7ZWp64uI64ukLiBBUEkg67mM65OcKFNXQynsl5DshJzrp4wg7IKs7Jqp65Cp64uI64ukLlxuICog7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOq3uOqyg+ydhCwg7JeG7Jy866m0IHNvbmFtdSDquLDrs7gg7ISk7KCV7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVN3Y0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgZGVmYXVsdCAuc3djcmMgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gICAgICBzd2NGaWxlUGF0aCA9IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCIuc3djcmMucHJvamVjdC1kZWZhdWx0XCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlNldHRpbmcgdXAgc3djIGNvbmZpZyBmaWxlIGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIHN3Y0ZpbGVQYXRoO1xufVxuXG4vKipcbiAqIHNvbmFtdSBidWlsZCAvIHNvbmFtdSBidWlsZCBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBidWlsZF9hcGkgKyBidWlsZF93ZWLsnZgg7ZWp7ISx7J6F64uI64ukLiBXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuptCBXZWIg67mM65Oc66W8IOyKpO2Cte2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYWxsKCkge1xuICBhd2FpdCBidWlsZF9hcGkoKTtcbiAgYXdhaXQgYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FwaSgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCBzd2NGaWxlUGF0aCA9IGF3YWl0IHJlc29sdmVTd2NDb25maWdQYXRoKCk7XG5cbiAgY29uc3QgYXBpU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIEFQSV9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290LCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG5cbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHsgY3dkLCBidWlsZENvbW1hbmRBcmdzOiB7IGNvbmZpZ0ZpbGVQYXRoOiBzd2NGaWxlUGF0aCB9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogV2ViIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZyA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgZmFsc2UsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogcG5wbSBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbi8qKlxuICogZml4dHVyZSBnZW4g66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2dlbigpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9mZXRjaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZXhwbG9yZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICog6rCE64uo7ZWcIOyYteyFmCDtjIzshJxcbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zKFxuICBhcmd2OiBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0ge1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9ID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDIpO1xuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCBbaywgdl0gPSBrZXkuc3BsaXQoXCI9XCIpO1xuICAgICAgICBvcHRpb25zW2tdID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG5cbiAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuXy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuXG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBjb25zdCB1c2VBSSA9IGZsYWdzLmhhcyhcImFpXCIpO1xuICBjb25zdCBub0NvbmVzID0gZmxhZ3MuaGFzKFwibm8tY29uZXNcIik7XG5cbiAgLy8gLS1uby1jb25lczogY29uZSDsg53shLEg7Iqk7YK1XG4gIGlmIChub0NvbmVzKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGhvdXQgY29uZXNgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLS1haTogTExN7Jy866GcIGNvbmUg7IOd7ISxXG4gIGlmICh1c2VBSSkge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZGApO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcy4uLmApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUmVtb3ZlIC0tYWkgZmxhZyB0byB1c2UgdGVtcGxhdGUgY29uZXMgaW5zdGVhZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOuzuDog7YWc7ZSM66a/IGNvbmUg7J6Q64+ZIOyDneyEsVxuICAvLyBMTE0g7JeG7J20IGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAvLyDsnbTrpbwg7Ya17ZW0IEFOVEhST1BJQ19BUElfS0VZ6rCAIOyXhuyWtOuPhCBTb25hbXXrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnLzrqbAsXG4gIC8vIOyDneyEseuQnCDthZztlIzrpr8gY29uZeydgCDrgpjspJHsl5AgJ2NvbmUgZ2VuJyDrqoXroLnslrTroZwgQUnrpbwg7Ya17ZW0IOyXheq3uOugiOydtOuTnO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIHRlbXBsYXRlIGNvbmVzLi4uYCk7XG4gIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGggdGVtcGxhdGUgY29uZXNgKTtcbiAgY29uc29sZS5sb2coYPCfkqEgVGlwOiBSdW4gJ3BucG0gc29uYW11IGNvbmUgZ2VuICR7ZW50aXR5SWR9JyB0byBpbXByb3ZlIHdpdGggQUlgKTtcbn1cblxuLyoqXG4gKiBBSeulvCDsgqzsmqntlZjsl6wgZW50aXR57J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VmOqxsOuCmCDsl4Xqt7jroIjsnbTrk5ztlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLSAtLXJlZ2VuZXJhdGU6IOyghOyytCDsnqzsg53shLEgKOq4sOyhtCBjb25lIOuNruyWtOyTsOq4sClcbiAqIC0gLS1sb2NhbGUgPGtvfGVufGphPjog7IOd7ISxIOyWuOyWtCDsp4DsoJVcbiAqIC0g6riw67O4OiBvbmx5RW1wdHkg66qo65OcICjquLDsobQgZml4dHVyZUhpbnQg67O07KG0KVxuICpcbiAqIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalCAoc29uYW11LnNlY3JldC50cyDrmJDripQg7ZmY6rK967OA7IiYKVxuICovXG5hc3luYyBmdW5jdGlvbiBjb25lX2dlbihlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCB7IGZsYWdzLCBvcHRpb25zIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcblxuICAvLyAtLWFsbCDsmLXshZg6IOuqqOuToCBlbnRpdHkgY29uZSDsg53shLFcbiAgaWYgKGZsYWdzLmhhcyhcImFsbFwiKSB8fCBlbnRpdHlJZCA9PT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGFsbEVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcyBmb3IgJHthbGxFbnRpdGllcy5sZW5ndGh9IGVudGl0aWVzLi4uXFxuYCk7XG5cbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGFsbEVudGl0aWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyAke2VudGl0eS5pZH0uLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0b3RhbFRva2VucyArPSByZXN1bHQudG9rZW5zVXNlZDtcbiAgICAgICAgY29uc29sZS5sb2coYCAg4pyTICR7ZW50aXR5LmlkfSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKVxcbmApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgIGVycm9ycy5wdXNoKGAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICDinJcgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9XFxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFxcbuKchSBEb25lISBUb3RhbDogJHt0b3RhbFRva2Vuc30gdG9rZW5zIHVzZWRgKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHRvdGFsVG9rZW5zICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgZW50aXRpZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgLSAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g64uo7J28IGVudGl0eSBjb25lIOyDneyEsVxuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RlID0gZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSA/IFwicmVnZW5lcmF0aW5nXCIgOiBcImdlbmVyYXRpbmdcIjtcbiAgY29uc29sZS5sb2coXG4gICAgYPCfjJ8gJHttb2RlID09PSBcInJlZ2VuZXJhdGluZ1wiID8gXCJSZWdlbmVyYXRpbmdcIiA6IFwiR2VuZXJhdGluZ1wifSBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2VudGl0eUlkfS4uLmAsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiID8gY29uZmlnTG9jYWxlIDogXCJrb1wiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgbG9jYWxlLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKchSBEb25lISAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zIHVzZWQpYCk7XG5cbiAgICAvLyDthqDtgbAg67mE7JqpIOqzhOyCsCAo64yA65617KCB7J24IOy2lOyglSlcbiAgICAvLyBDbGF1ZGUgU29ubmV0IDQuNTogaW5wdXQgJDMvTSB0b2tlbnMsIG91dHB1dCAkMTUvTSB0b2tlbnNcbiAgICAvLyDqsITri6jtlZjqsowg7Y+J6regICQ5L00gdG9rZW5z66GcIOqzhOyCsFxuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAocmVzdWx0LnRva2Vuc1VzZWQgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFRvIHVzZSBBSS1wb3dlcmVkIGNvbmUgZ2VuZXJhdGlvbjpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAgMS4gR2V0IGFuIEFQSSBrZXkgZnJvbSBodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgICAgMi4gQWRkIGl0IHRvIHNvbmFtdS5zZWNyZXQudHMgb3Igc2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiBVbmtub3duIGVycm9yYCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOqzteyLnSBTa2lsbHPrpbwg66Gc7LusIO2UhOuhnOygne2KuCDrmJDripQg6riA66Gc67KMIH4vLmNsYXVkZS/roZwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICpcbiAqIC0tZ2xvYmFsIO2UjOuemOq3uDogfi8uY2xhdWRlL+yXkCDrj5nquLDtmZQgKO2UhOuhnOygne2KuCDsg53shLEg7KCEIOyCrOyaqSDqsIDriqUpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jKCkge1xuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgaXNHbG9iYWwgPSBmbGFncy5oYXMoXCJnbG9iYWxcIik7XG5cbiAgLy8g6rCc67CcIO2ZmOqyvSAtIGNsaS50czogc29uYW11L21vZHVsZXMvc29uYW11L3NyYy9iaW4vY2xpLnRzXG4gIC8vIOu5jOuTnCDtm4QgLSBjbGkuanM6IG5vZGVfbW9kdWxlcy9zb25hbXUvZGlzdC9iaW4vY2xpLmpzICjsi6TsoJwg7Iuk7ZaJKVxuICAvLyBza2lsbHMg7JyE7LmYOiBub2RlX21vZHVsZXMvc29uYW11L3NyYy9za2lsbHMgKG5wbSDrsLDtj6wg7IucKVxuICBjb25zdCBzb3VyY2VCYXNlID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcInNraWxsc1wiKTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwic29uYW11XCIpO1xuICBjb25zdCBzb3VyY2VDbGF1ZGVNZCA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcIkNMQVVERS5tZFwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoc291cmNlU2tpbGxzRGlyKSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJTa2lsbHMgc291cmNlIG5vdCBmb3VuZCBpbiBzb25hbXUgcGFja2FnZS5cIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGF3YWl0IHNraWxsc19zeW5jX3RvKHBhdGguam9pbihvcy5ob21lZGlyKCksIFwiLmNsYXVkZVwiKSwgc291cmNlU2tpbGxzRGlyLCBzb3VyY2VDbGF1ZGVNZCwge1xuICAgICAgdXNlU3ltbGluazogZmFsc2UsXG4gICAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogZmFsc2UsXG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuICBHbG9iYWwgc3luYyBjb21wbGV0ZSDihpIgfi8uY2xhdWRlL3NraWxscy9zb25hbXUvYCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBUaGVzZSBza2lsbHMgYXJlIGF2YWlsYWJsZSBpbiBhbGwgQ2xhdWRlIENvZGUgc2Vzc2lvbnMuYCkpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuZGltKFxuICAgICAgICBgICBPbmNlIGEgcHJvamVjdCBpcyBjcmVhdGVkLCBydW4gJ3BucG0gc29uYW11IHNraWxscyBzeW5jJyBmb3IgcHJvamVjdC1sb2NhbCBzeW5jLmAsXG4gICAgICApLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gICAgY29uc3QgY2xhdWRlRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiKTtcbiAgICBhd2FpdCBza2lsbHNfc3luY190byhjbGF1ZGVEaXIsIHNvdXJjZVNraWxsc0Rpciwgc291cmNlQ2xhdWRlTWQsIHtcbiAgICAgIHVzZVN5bWxpbms6IHRydWUsXG4gICAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogdHJ1ZSxcbiAgICAgIHNvdXJjZUJhc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBjbGF1ZGVEaXLroZwgc2tpbGxz66W8IOuPmeq4sO2ZlO2VmOuKlCDqs7XthrUg66Gc7KeB7J6F64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfc3luY190byhcbiAgY2xhdWRlRGlyOiBzdHJpbmcsXG4gIHNvdXJjZVNraWxsc0Rpcjogc3RyaW5nLFxuICBzb3VyY2VDbGF1ZGVNZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgdXNlU3ltbGluazogYm9vbGVhbjtcbiAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogYm9vbGVhbjtcbiAgICBzb3VyY2VCYXNlPzogc3RyaW5nO1xuICB9LFxuKSB7XG4gIGNvbnN0IHRhcmdldFNraWxsc0RpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwic29uYW11XCIpO1xuXG4gIC8vIOq4sOyhtCDrlJTroInthqDrpqwvc3ltbGluayDsgq3soJwg7ZuEIOyerOyDneyEsVxuICAvLyBleGlzdHMoKeuKlCBicm9rZW4gc3ltbGlua+ulvCDqsJDsp4DtlZjsp4Ag66q77ZWY66+A66GcIHJt7J2EIOustOyhsOqxtCDsi5zrj4Ttlanri4jri6RcbiAgdHJ5IHtcbiAgICBhd2FpdCBybSh0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g7YyM7J287J20IOyXhuycvOuptCDrrLTsi5xcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXRTa2lsbHNEaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBpZiAob3B0aW9ucy51c2VTeW1saW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN5bWxpbmsoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIsIFwiZGlyXCIpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgbGlua2VkIChzeW1saW5rKWApKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFN5bWxpbmsgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKSxcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgRmFsbGluZyBiYWNrIHRvIGNvcHkuLi5gKSk7XG4gICAgICBhd2FpdCBza2lsbHNDb3B5KHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgc2tpbGxzQ29weShzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0Rpcik7XG4gIH1cblxuICAvLyBwcm9qZWN0IOuUlOugie2GoOumrCDstIjquLDtmZQgKOyXhuycvOuptCDsg53shLEsIOyeiOycvOuptCDsnKDsp4ApXG4gIGlmIChvcHRpb25zLmNvcHlQcm9qZWN0VGVtcGxhdGVzICYmIG9wdGlvbnMuc291cmNlQmFzZSkge1xuICAgIGNvbnN0IHNvdXJjZVByb2plY3REaXIgPSBwYXRoLmpvaW4ob3B0aW9ucy5zb3VyY2VCYXNlLCBcInByb2plY3RcIik7XG4gICAgY29uc3QgdGFyZ2V0UHJvamVjdERpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdFwiKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHMoc291cmNlUHJvamVjdERpcikpIHtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyh0YXJnZXRQcm9qZWN0RGlyKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjcChzb3VyY2VQcm9qZWN0RGlyLCB0YXJnZXRQcm9qZWN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFByb2plY3QgdGVtcGxhdGVzIGluaXRpYWxpemVkYCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvamVjdCB0ZW1wbGF0ZXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShg4o+tIFByb2plY3QgdGVtcGxhdGVzIGFscmVhZHkgZXhpc3QgKHByZXNlcnZlZClgKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ0xBVURFLm1kIOuzteyCrC/sl4XrjbDsnbTtirhcbiAgaWYgKGF3YWl0IGV4aXN0cyhzb3VyY2VDbGF1ZGVNZCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0Q2xhdWRlTWQgPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcIkNMQVVERS5tZFwiKTtcbiAgICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShzb3VyY2VDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcblxuICAgICAgaWYgKGF3YWl0IGV4aXN0cyh0YXJnZXRDbGF1ZGVNZCkpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldENsYXVkZU1kLCBcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBzdGFydE1hcmtlciA9IFwiPCEtLSBTT05BTVU6U1RBUlQgLS0+XCI7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IFwiPCEtLSBTT05BTVU6RU5EIC0tPlwiO1xuICAgICAgICBpZiAodGFyZ2V0Q29udGVudC5pbmNsdWRlcyhzdGFydE1hcmtlcikgJiYgdGFyZ2V0Q29udGVudC5pbmNsdWRlcyhlbmRNYXJrZXIpKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2Yoc3RhcnRNYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IHRhcmdldENvbnRlbnQuaW5kZXhPZihlbmRNYXJrZXIpO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ICE9PSAtMSAmJiBlbmRJZHggIT09IC0xICYmIHN0YXJ0SWR4IDwgZW5kSWR4KSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZygwLCBzdGFydElkeCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IHRhcmdldENvbnRlbnQuc3Vic3RyaW5nKGVuZElkeCArIGVuZE1hcmtlci5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2JlZm9yZX0ke3N0YXJ0TWFya2VyfVxcbiR7c291cmNlQ29udGVudH1cXG4ke2VuZE1hcmtlcn0ke2FmdGVyfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIG5ld0NvbnRlbnQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgdXBkYXRlZCAobWFya2VyIHJlZ2lvbilgKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4o+tIENMQVVERS5tZCBtYXJrZXIgcG9zaXRpb25zIGludmFsaWQsIHNraXBwZWRgKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOuniOy7pOqwgCDsl4bripQg6riw7KG0IENMQVVERS5tZOyXkCBTb25hbXUg7IS57IWY7J2EIOy2lOqwgO2VqeuLiOuLpFxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gYCR7dGFyZ2V0Q29udGVudC50cmltRW5kKCl9XFxuXFxuPCEtLSBTT05BTVU6U1RBUlQgLS0+XFxuJHtzb3VyY2VDb250ZW50fVxcbjwhLS0gU09OQU1VOkVORCAtLT5cXG5gO1xuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgYXBwZW5kZWQpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIHVwZGF0ZWQgKGFwcGVuZGVkIFNvbmFtdSBzZWN0aW9uKWApKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgd2l0aE1hcmtlcnMgPSBgPCEtLSBTT05BTVU6U1RBUlQgLS0+XFxuJHtzb3VyY2VDb250ZW50fVxcbjwhLS0gU09OQU1VOkVORCAtLT5cXG5gO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIHdpdGhNYXJrZXJzKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgY3JlYXRlZGApKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGDinJcgRmFpbGVkIHRvIHVwZGF0ZSBDTEFVREUubWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBza2lsbHNDb3B5KHNyYzogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjcChzcmMsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIGNvcGllZGApKTtcbiAgfSBjYXRjaCAoY29weUVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgYOKclyBGYWlsZWQgdG8gY29weSBza2lsbHM6ICR7Y29weUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjb3B5RXJyb3IubWVzc2FnZSA6IFN0cmluZyhjb3B5RXJyb3IpfWAsXG4gICAgICApLFxuICAgICk7XG4gICAgdGhyb3cgY29weUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIGNyZWF0ZSA8bmFtZT4g7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDroZzsu6wgc2tpbGwg7LSI7JWI7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX2NyZWF0ZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gIGNvbnN0IGxvY2FsRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiLCBcInNraWxsc1wiLCBcImxvY2FsXCIpO1xuXG4gIC8vID09PSDtjIzsnbzrqoUg6rKA7KadIOuwjyBTYW5pdGl6ZSA9PT1cbiAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgU2tpbGwgbmFtZSBpcyByZXF1aXJlZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNhbml0aXplZCA9IG5hbWVcbiAgICAvLyDqs7XrsLHsnYQg7ZWY7J207ZSI7Jy866GcXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCItXCIpXG4gICAgLy8g6rK966GcIOq1rOu2hOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWy9cXFxcXS9nLCBcIi1cIilcbiAgICAvLyBQYXRoIHRyYXZlcnNhbCDrsKnsp4BcbiAgICAucmVwbGFjZSgvXFwuXFwuL2csIFwiXCIpXG4gICAgLy8gV2luZG93cyDquIjsp4Ag66y47J6QIOygnOqxsFxuICAgIC5yZXBsYWNlKC9bPD46XCJ8PypdL2csIFwiXCIpXG4gICAgLy8g7Iuc7J6RL+uBnSDsoJAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0IOygnOqxsFxuICAgIC5yZXBsYWNlKC9eWy5cXC1fXSt8Wy5cXC1fXSskL2csIFwiXCIpXG4gICAgLy8g7Jew7IaN65CcIO2VmOydtO2UiOydhCDtlZjrgpjroZxcbiAgICAucmVwbGFjZSgvLSsvZywgXCItXCIpXG4gICAgLy8g7JWM7YyM67KzLCDsiKvsnpAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0LCDtlZzquIDrp4wg7ZeI7JqpXG4gICAgLnJlcGxhY2UoL1teYS16QS1aMC05LV/qsIAt7Z6jXS9nLCBcIlwiKTtcblxuICAvLyDquLjsnbQg7KCc7ZWcXG4gIGNvbnN0IE1BWF9MRU5HVEggPSAxMDA7XG4gIGlmIChzYW5pdGl6ZWQubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgTUFYX0xFTkdUSCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSB0cnVuY2F0ZWQgdG8gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYCkpO1xuICB9XG5cbiAgLy8gV2luZG93cyDsmIjslb3slrQg7ZmV7J24XG4gIGNvbnN0IFJFU0VSVkVEX05BTUVTID0gW1xuICAgIFwiQ09OXCIsXG4gICAgXCJQUk5cIixcbiAgICBcIkFVWFwiLFxuICAgIFwiTlVMXCIsXG4gICAgXCJDT00xXCIsXG4gICAgXCJDT00yXCIsXG4gICAgXCJDT00zXCIsXG4gICAgXCJDT000XCIsXG4gICAgXCJDT001XCIsXG4gICAgXCJDT002XCIsXG4gICAgXCJDT003XCIsXG4gICAgXCJDT004XCIsXG4gICAgXCJDT005XCIsXG4gICAgXCJMUFQxXCIsXG4gICAgXCJMUFQyXCIsXG4gICAgXCJMUFQzXCIsXG4gICAgXCJMUFQ0XCIsXG4gICAgXCJMUFQ1XCIsXG4gICAgXCJMUFQ2XCIsXG4gICAgXCJMUFQ3XCIsXG4gICAgXCJMUFQ4XCIsXG4gICAgXCJMUFQ5XCIsXG4gIF07XG4gIGlmIChSRVNFUlZFRF9OQU1FUy5pbmNsdWRlcyhzYW5pdGl6ZWQudG9VcHBlckNhc2UoKSkpIHtcbiAgICBzYW5pdGl6ZWQgPSBgc2tpbGwtJHtzYW5pdGl6ZWR9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBSZXNlcnZlZCBuYW1lIGRldGVjdGVkLCBwcmVmaXhlZCB3aXRoIFwic2tpbGwtXCJgKSk7XG4gIH1cblxuICAvLyDruYgg66y47J6Q7Je0IOyytO2BrFxuICBpZiAoc2FuaXRpemVkID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgSW52YWxpZCBza2lsbCBuYW1lIGFmdGVyIHNhbml0aXphdGlvblwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIE9yaWdpbmFsOiBcIiR7bmFtZX1cImApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDrs4Dqsr0g7JWM66a8XG4gIGlmIChzYW5pdGl6ZWQgIT09IG5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBOYW1lIHNhbml0aXplZDogXCIke25hbWV9XCIg4oaSIFwiJHtzYW5pdGl6ZWR9XCJgKSk7XG4gIH1cblxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihsb2NhbERpciwgYCR7c2FuaXRpemVkfS5tZGApO1xuXG4gIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGBTa2lsbCBcIiR7c2FuaXRpemVkfVwiIGFscmVhZHkgZXhpc3RzLmApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBta2Rpcihsb2NhbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBgLS0tXG5uYW1lOiAke3Nhbml0aXplZH1cbmNhdGVnb3J5OiBvdGhlclxuY3JlYXRlZF9hdDogJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfVxuc3RhdHVzOiBkcmFmdFxuLS0tXG5cbiMgJHtzYW5pdGl6ZWR9XG5cbiMjIOyDge2ZqVxuXG5b7Ja065akIOusuOygnOyYgOuKlOyngF1cblxuIyMg7ZW06rKwIOuwqeuylVxuXG5b7Ja065a76rKMIO2VtOqysO2WiOuKlOyngF1cblxuIyMg7L2U65OcIOyYiOyLnFxuXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG4vLyDsmIjsi5wg7L2U65OcXG5cXGBcXGBcXGBcbmA7XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCB0ZW1wbGF0ZSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ3JlYXRlZCAuY2xhdWRlL3NraWxscy9sb2NhbC8ke3Nhbml0aXplZH0ubWRgKSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgYXV0aCBnZW5lcmF0ZSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIGJldHRlci1hdXRoIOyXlO2LsO2LsOuTpChVc2VyLCBTZXNzaW9uLCBBY2NvdW50LCBWZXJpZmljYXRpb24p7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiDsmLXshZg6XG4gKiAtLXBsdWdpbnMgcGhvbmUtbnVtYmVyLDJmYSAg7ZSM65+s6re47J24IOyXlO2LsO2LsOuPhCDtlajqu5gg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF1dGhfZ2VuZXJhdGUoKSB7XG4gIC8vIC0tcGx1Z2lucyDsmLXshZgg7YyM7IuxXG4gIGNvbnN0IHBsdWdpbnNBcmcgPSBwcm9jZXNzLmFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChcIi0tcGx1Z2luc1wiKSk7XG4gIGNvbnN0IHBsdWdpbnM6IEJldHRlckF1dGhQbHVnaW5JZFtdID0gW107XG5cbiAgaWYgKHBsdWdpbnNBcmcpIHtcbiAgICBjb25zdCBwbHVnaW5WYWx1ZSA9IHBsdWdpbnNBcmcuaW5jbHVkZXMoXCI9XCIpXG4gICAgICA/IHBsdWdpbnNBcmcuc3BsaXQoXCI9XCIpWzFdXG4gICAgICA6IHByb2Nlc3MuYXJndltwcm9jZXNzLmFyZ3YuaW5kZXhPZihwbHVnaW5zQXJnKSArIDFdO1xuXG4gICAgaWYgKHBsdWdpblZhbHVlKSB7XG4gICAgICBjb25zdCBwbHVnaW5JZHMgPSBwbHVnaW5WYWx1ZS5zcGxpdChcIixcIikubWFwKChwKSA9PiBwLnRyaW0oKSk7XG5cbiAgICAgIGZvciAoY29uc3QgaWQgb2YgcGx1Z2luSWRzKSB7XG4gICAgICAgIGlmIChpc1ZhbGlkUGx1Z2luSWQoaWQpKSB7XG4gICAgICAgICAgcGx1Z2lucy5wdXNoKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBVbmtub3duIHBsdWdpbjogJHtpZH1gKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFN1cHBvcnRlZCBwbHVnaW5zOiAke1NVUFBPUlRFRF9QTFVHSU5fSURTLmpvaW4oXCIsIFwiKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgR2VuZXJhdGluZyBiZXR0ZXItYXV0aCBlbnRpdGllcy4uLlxcblwiKSk7XG5cbiAgaWYgKHBsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBQbHVnaW5zOiAke3BsdWdpbnMuam9pbihcIiwgXCIpfWApKTtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzKHsgcGx1Z2lucyB9KTtcbn1cblxuLyoqXG4gKiDsm4ztgazsiqTtjpjsnbTsiqQg66Oo7Yq466W8IOywvuyKteuLiOuLpC5cbiAqIOyasOyEoOyInOychDogcG5wbS13b3Jrc3BhY2UueWFtbCA+IENMQVVERS5tZCA+IOujqO2KuCBwYWNrYWdlLmpzb24gKHdvcmtzcGFjZXMg7ZWE65OcKVxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUm9vdCgpIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgd2hpbGUgKGRpciAhPT0gcGF0aC5kaXJuYW1lKGRpcikpIHtcbiAgICAvLyAxLiBwbnBtLXdvcmtzcGFjZS55YW1sIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZmV7Iuk7ZWcIG1vbm9yZXBvIOujqO2KuC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMi4gQ0xBVURFLm1kIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZSE66Gc7KCd7Yq4IOujqO2KuOuhnCDqsITso7ztlaguXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcIkNMQVVERS5tZFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMy4gcGFja2FnZS5qc29u7JeQIHdvcmtzcGFjZXMg7ZWE65Oc6rCAIOyeiOycvOuptCDro6jtirguXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhY2thZ2VQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgICAgaWYgKHBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgICByZXR1cm4gZGlyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8g7YyM7IuxIOyLpO2MqOyLnCDrrLTsi5xcbiAgICAgIH1cbiAgICB9XG4gICAgZGlyID0gcGF0aC5kaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyDssL7sp4Ag66q77ZWY66m0IGFwaSDtj7TrjZTsnZgg67aA66qoIOyCrOyaqVxuICByZXR1cm4gZmluZEFwcFJvb3RQYXRoKCk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJhc3NlcnQiLCJleGVjU3luYyIsInNwYXduIiwiY3AiLCJta2RpciIsInJlYWRkaXIiLCJyZWFkRmlsZSIsInJtIiwic3ltbGluayIsIndyaXRlRmlsZSIsImtuZXgiLCJjcmVhdGVSZXF1aXJlIiwib3MiLCJwYXRoIiwicHJvY2VzcyIsInRzaWNsaSIsIlNvbmFtdSIsImdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzIiwiaXNWYWxpZFBsdWdpbklkIiwiU1VQUE9SVEVEX1BMVUdJTl9JRFMiLCJFbnRpdHlNYW5hZ2VyIiwiTWlncmF0b3IiLCJGaXh0dXJlTWFuYWdlciIsImV4ZWNXaXRoTGluZVByZWZpeCIsInByaW50QnVpbGRTdW1tYXJ5IiwicHJpbnRUYXNrRmFpbGVkIiwicHJpbnRUYXNrSGVhZGVyIiwicHJpbnRUYXNrU3RhcnQiLCJwcmludFRhc2tTdWNjZXNzIiwiZXhpc3RzIiwiZmluZEFwaVJvb3RQYXRoIiwiZmluZEFwcFJvb3RQYXRoIiwiQVBJX0FSVElGQUNUUyIsIldFQl9BUlRJRkFDVFMiLCJmaXh0dXJlRXhwbG9yZUNvbW1hbmQiLCJmaXh0dXJlRmV0Y2hDb21tYW5kIiwiZml4dHVyZUdlbkNvbW1hbmQiLCJtaWdyYXRvciIsInBhcnNlQ2xpT3B0aW9ucyIsImFyZ3YiLCJmbGFncyIsIlNldCIsIm9wdGlvbnMiLCJpIiwibGVuZ3RoIiwiYXJnIiwic3RhcnRzV2l0aCIsImluY2x1ZGVzIiwia2V5IiwidmFsdWUiLCJzbGljZSIsInNwbGl0IiwibmV4dEFyZyIsImFkZCIsImJvb3RzdHJhcCIsIm5vdFRvSW5pdCIsImluaXQiLCJmaWx0ZXJlZEFyZ3YiLCJza2lwTmV4dCIsImFmdGVyRG91YmxlRGFzaCIsInB1c2giLCJjbWQiLCJ0eXBlcyIsInR5cGUiLCJuYW1lIiwibWVzc2FnZSIsImNob2ljZXMiLCJnZXRBbGxQYXJlbnRJZHMiLCJtYXAiLCJlbnRpdHlJZCIsInRpdGxlIiwiYXJncyIsInJ1bm5lcnMiLCJtaWdyYXRlX3N0YXR1cyIsIm1pZ3JhdGVfcnVuIiwibWlncmF0ZV9hcHBseSIsImZpeHR1cmVfaW5pdCIsImZpeHR1cmVfaW1wb3J0IiwiZml4dHVyZV9zeW5jIiwiZml4dHVyZV9nZW4iLCJmaXh0dXJlX2ZldGNoIiwiZml4dHVyZV9leHBsb3JlIiwic3R1Yl9wcmFjdGljZSIsInN0dWJfZW50aXR5Iiwic2NhZmZvbGRfbW9kZWwiLCJzY2FmZm9sZF9tb2RlbF90ZXN0IiwiY29uZV9nZW4iLCJzeW5jIiwiYnVpbGRfYWxsIiwiYnVpbGRfYXBpIiwiYnVpbGRfd2ViIiwiZGV2X2FsbCIsImRldl9hcGkiLCJkZXZfd2ViIiwic3RhcnQiLCJza2lsbHNfc3luYyIsInNraWxsc19jcmVhdGUiLCJhdXRoX2dlbmVyYXRlIiwiZGVzdHJveSIsImZpbmFsbHkiLCJzeW5jZXIiLCJzcGF3bkFwaURldlNlcnZlciIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiaG90UnVubmVyQmluUGF0aCIsInVybCIsInJlc29sdmUiLCJzZXJ2ZXJQcm9jZXNzIiwiZXhlY1BhdGgiLCJqb2luIiwiY3dkIiwic3RkaW8iLCJlbnYiLCJOT0RFX0VOViIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJleHRyYUVudiIsImNsZWFudXAiLCJjb25zb2xlIiwibG9nIiwieWVsbG93Iiwia2lsbCIsImV4aXQiLCJvbiIsImNvZGUiLCJlcnJvciIsInJlZCIsImJvbGQiLCJTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiIsImFwcFJvb3QiLCJ3ZWJQYXRoIiwiZG91YmxlRGFzaEluZGV4IiwiaW5kZXhPZiIsInBhc3N0aHJvdWdoQXJncyIsInZpdGVBcmdzIiwidml0ZVByb2Nlc3MiLCJzaWduYWwiLCJyZXNvbHZlU3djQ29uZmlnUGF0aCIsInN3Y0ZpbGVQYXRoIiwiZGltIiwiZGlybmFtZSIsInNraXBJZk1pc3NpbmciLCJhcGlTdGFydGVkQXQiLCJEYXRlIiwibm93IiwiYXJ0aWZhY3QiLCJwcm9qZWN0UGF0aCIsImRlc2NyaXB0aW9uIiwicnVuQnVpbGRTdGVwcyIsImJ1aWxkQ29tbWFuZEFyZ3MiLCJjb25maWdGaWxlUGF0aCIsImUiLCJncmF5Iiwid2ViU3RhcnRlZEF0Iiwic3RlcHMiLCJwcmVCdWlsZENvbW1hbmQiLCJidWlsZENvbW1hbmQiLCJwb3N0QnVpbGRDb21tYW5kIiwiZmlsdGVyIiwic3RlcCIsImlzTGFzdCIsIkVycm9yIiwiY2F1c2UiLCJibHVlIiwic2V0dXBNaWdyYXRvciIsInNldHVwRml4dHVyZU1hbmFnZXIiLCJ0YXJnZXRzIiwicnVuQWN0aW9uIiwibG9jYWxIb3N0cyIsIk9iamVjdCIsImtleXMiLCJkYkNvbmZpZyIsInRhcmdldCIsInRhcmdldENvbmZpZyIsImhvc3QiLCJjb25uZWN0aW9uIiwidG9Mb3dlckNhc2UiLCJzdGF0dXMiLCJnZXRTdGF0dXMiLCJzcmNDb25maWciLCJkZXZlbG9wbWVudF9tYXN0ZXIiLCJsYWJlbCIsImZpeHR1cmUiLCJ0ZXN0IiwidG9Ta2lwIiwicmVtb3RlQ29ubiIsImxvY2FsQ29ubiIsImRhdGFiYXNlIiwiZHVtcEZpbGVuYW1lIiwic3JjQ29ubiIsIm1pZ3JhdGlvbnNEdW1wIiwidXNlciIsInBhc3N3b3JkIiwiX2RiIiwibWlncmF0aW9ucyIsInJhdyIsImNvdW50IiwiY29ubiIsImRiIiwidW5kZWZpbmVkIiwicm93IiwibXlzcWxDbWQiLCJyZWNvcmRJZHMiLCJpbXBvcnRGaXh0dXJlIiwicGFyc2VPcHRpb25zIiwiXyIsImsiLCJ2IiwibmV4dCIsInByYWN0aWNlRGlyIiwiYXBpUm9vdFBhdGgiLCJmaWxlTmFtZXMiLCJtYXhTZXFObyIsInJlY3Vyc2l2ZSIsImZpbHRlcmVkU2VxcyIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJzZXFObyIsIm1hdGNoIiwicGFyc2VJbnQiLCJzb3J0IiwiYSIsImIiLCJjdXJyZW50U2VxTm8iLCJkc3RQYXRoIiwicnVuQ29kZSIsInJlcGxhY2UiLCJjcmVhdGVFbnRpdHkiLCJ1c2VBSSIsImhhcyIsIm5vQ29uZXMiLCJlbnRpdHkiLCJnZXQiLCJjb25maWdMb2NhbGUiLCJpMThuIiwiZGVmYXVsdExvY2FsZSIsImxvY2FsZSIsInJlc3VsdCIsImdlbmVyYXRlQ29uZXMiLCJwcmVzZXJ2ZUV4aXN0aW5nIiwib25seUVtcHR5IiwidG9rZW5zVXNlZCIsImdlbmVyYXRlVGVtcGxhdGVDb25lcyIsImFsbEVudGl0aWVzIiwiZ2V0QWxsRW50aXRpZXMiLCJ0b3RhbFRva2VucyIsImVycm9ycyIsImlkIiwiZXN0aW1hdGVkQ29zdCIsInRvRml4ZWQiLCJlcnIiLCJtb2RlIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsImlzR2xvYmFsIiwic291cmNlQmFzZSIsInNvdXJjZVNraWxsc0RpciIsInNvdXJjZUNsYXVkZU1kIiwic2tpbGxzX3N5bmNfdG8iLCJob21lZGlyIiwidXNlU3ltbGluayIsImNvcHlQcm9qZWN0VGVtcGxhdGVzIiwiY3lhbiIsIndvcmtzcGFjZVJvb3QiLCJmaW5kV29ya3NwYWNlUm9vdCIsImNsYXVkZURpciIsInRhcmdldFNraWxsc0RpciIsImZvcmNlIiwiZ3JlZW4iLCJTdHJpbmciLCJza2lsbHNDb3B5Iiwic291cmNlUHJvamVjdERpciIsInRhcmdldFByb2plY3REaXIiLCJ0YXJnZXRDbGF1ZGVNZCIsInNvdXJjZUNvbnRlbnQiLCJ0YXJnZXRDb250ZW50Iiwic3RhcnRNYXJrZXIiLCJlbmRNYXJrZXIiLCJzdGFydElkeCIsImVuZElkeCIsImJlZm9yZSIsInN1YnN0cmluZyIsImFmdGVyIiwibmV3Q29udGVudCIsImFwcGVuZGVkIiwidHJpbUVuZCIsIndpdGhNYXJrZXJzIiwic3JjIiwiZGVzdCIsImNvcHlFcnJvciIsImxvY2FsRGlyIiwidHJpbSIsInNhbml0aXplZCIsIk1BWF9MRU5HVEgiLCJSRVNFUlZFRF9OQU1FUyIsInRvVXBwZXJDYXNlIiwiZmlsZVBhdGgiLCJ0ZW1wbGF0ZSIsInRvSVNPU3RyaW5nIiwicGx1Z2luc0FyZyIsImZpbmQiLCJwbHVnaW5zIiwicGx1Z2luVmFsdWUiLCJwbHVnaW5JZHMiLCJwIiwiZGlyIiwicGFja2FnZVBhdGgiLCJwYWNrYWdlSnNvbiIsIkpTT04iLCJwYXJzZSIsIndvcmtzcGFjZXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxZQUFZLFNBQVM7QUFFNUJBLE9BQU9DLE1BQU07QUFFYixPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsUUFBUSxFQUFFQyxLQUFLLFFBQVEsZ0JBQWdCO0FBQ2hELFNBQVNDLEVBQUUsRUFBRUMsS0FBSyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsRUFBRSxFQUFFQyxPQUFPLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUNuRixPQUFPQyxVQUF5QixPQUFPO0FBQ3ZDLFNBQVNDLGFBQWEsUUFBUSxTQUFTO0FBQ3ZDLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFDeEIsT0FBT0MsYUFBYSxVQUFVO0FBQzlCLFNBQVNDLE1BQU0sUUFBUSxTQUFTO0FBQ2hDLFNBQVNDLE1BQU0sUUFBUSxrQkFBUztBQUNoQyxTQUFTQywwQkFBMEIsUUFBUSw0QkFBeUI7QUFDcEUsU0FFRUMsZUFBZSxFQUNmQyxvQkFBb0IsUUFDZiw4Q0FBcUM7QUFFNUMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxRQUFRLFFBQVEsMkJBQXdCO0FBQ2pELFNBQVNDLGNBQWMsUUFBUSxnQ0FBNkI7QUFDNUQsU0FDRUMsa0JBQWtCLEVBQ2xCQyxpQkFBaUIsRUFDakJDLGVBQWUsRUFDZkMsZUFBZSxFQUNmQyxjQUFjLEVBQ2RDLGdCQUFnQixRQUNYLDJCQUF3QjtBQUMvQixTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBQzNDLFNBQVNDLGVBQWUsRUFBRUMsZUFBZSxRQUFRLG9CQUFpQjtBQUNsRSxTQUFTQyxhQUFhLEVBQXNCQyxhQUFhLFFBQVEsb0JBQWlCO0FBQ2xGLFNBQVNDLHFCQUFxQixFQUFFQyxtQkFBbUIsRUFBRUMsaUJBQWlCLFFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -120,9 +120,9 @@
120
120
  "vite": "7.3.0",
121
121
  "vitest": "^4.0.10",
122
122
  "@sonamu-kit/hmr-hook": "^0.4.1",
123
- "@sonamu-kit/tasks": "^0.2.0",
123
+ "@sonamu-kit/hmr-runner": "^0.1.1",
124
124
  "@sonamu-kit/ts-loader": "^2.1.3",
125
- "@sonamu-kit/hmr-runner": "^0.1.1"
125
+ "@sonamu-kit/tasks": "^0.2.0"
126
126
  },
127
127
  "devDependencies": {
128
128
  "@biomejs/biome": "^2.3.13",
package/src/bin/cli.ts CHANGED
@@ -8,6 +8,7 @@ import { execSync, spawn } from "child_process";
8
8
  import { cp, mkdir, readdir, readFile, rm, symlink, writeFile } from "fs/promises";
9
9
  import knex, { type Knex } from "knex";
10
10
  import { createRequire } from "module";
11
+ import os from "os";
11
12
  import path from "path";
12
13
  import process from "process";
13
14
  import { tsicli } from "tsicli";
@@ -939,12 +940,13 @@ async function scaffold_model_test(entityId: string) {
939
940
 
940
941
  /**
941
942
  * pnpm sonamu skills sync 하면 실행되는 함수입니다.
942
- * 공식 Skills를 로컬 프로젝트로 동기화합니다.
943
+ * 공식 Skills를 로컬 프로젝트 또는 글로벌 ~/.claude/로 동기화합니다.
944
+ *
945
+ * --global 플래그: ~/.claude/에 동기화 (프로젝트 생성 전 사용 가능)
943
946
  */
944
947
  async function skills_sync() {
945
- const workspaceRoot = await findWorkspaceRoot();
946
- const claudeDir = path.join(workspaceRoot, ".claude");
947
- const targetSkillsDir = path.join(claudeDir, "skills", "sonamu");
948
+ const { flags } = parseCliOptions();
949
+ const isGlobal = flags.has("global");
948
950
 
949
951
  // 개발 환경 - cli.ts: sonamu/modules/sonamu/src/bin/cli.ts
950
952
  // 빌드 후 - cli.js: node_modules/sonamu/dist/bin/cli.js (실제 실행)
@@ -958,7 +960,45 @@ async function skills_sync() {
958
960
  return;
959
961
  }
960
962
 
961
- // 기존 디렉토리/symlink 삭제 후 symlink 생성
963
+ if (isGlobal) {
964
+ await skills_sync_to(path.join(os.homedir(), ".claude"), sourceSkillsDir, sourceClaudeMd, {
965
+ useSymlink: false,
966
+ copyProjectTemplates: false,
967
+ });
968
+ console.log(chalk.cyan(`\n Global sync complete → ~/.claude/skills/sonamu/`));
969
+ console.log(chalk.dim(` These skills are available in all Claude Code sessions.`));
970
+ console.log(
971
+ chalk.dim(
972
+ ` Once a project is created, run 'pnpm sonamu skills sync' for project-local sync.`,
973
+ ),
974
+ );
975
+ } else {
976
+ const workspaceRoot = await findWorkspaceRoot();
977
+ const claudeDir = path.join(workspaceRoot, ".claude");
978
+ await skills_sync_to(claudeDir, sourceSkillsDir, sourceClaudeMd, {
979
+ useSymlink: true,
980
+ copyProjectTemplates: true,
981
+ sourceBase,
982
+ });
983
+ }
984
+ }
985
+
986
+ /**
987
+ * claudeDir로 skills를 동기화하는 공통 로직입니다.
988
+ */
989
+ async function skills_sync_to(
990
+ claudeDir: string,
991
+ sourceSkillsDir: string,
992
+ sourceClaudeMd: string,
993
+ options: {
994
+ useSymlink: boolean;
995
+ copyProjectTemplates: boolean;
996
+ sourceBase?: string;
997
+ },
998
+ ) {
999
+ const targetSkillsDir = path.join(claudeDir, "skills", "sonamu");
1000
+
1001
+ // 기존 디렉토리/symlink 삭제 후 재생성
962
1002
  // exists()는 broken symlink를 감지하지 못하므로 rm을 무조건 시도합니다
963
1003
  try {
964
1004
  await rm(targetSkillsDir, { recursive: true, force: true });
@@ -966,48 +1006,43 @@ async function skills_sync() {
966
1006
  // 파일이 없으면 무시
967
1007
  }
968
1008
 
969
- // 대상 디렉토리 생성
970
1009
  await mkdir(path.dirname(targetSkillsDir), { recursive: true });
971
1010
 
972
- try {
973
- await symlink(sourceSkillsDir, targetSkillsDir, "dir");
974
- console.log(chalk.green(`✓ Skills linked (symlink)`));
975
- } catch (error) {
976
- console.log(
977
- chalk.yellow(`⚠ Symlink failed: ${error instanceof Error ? error.message : String(error)}`),
978
- );
979
- console.log(chalk.yellow(` Falling back to copy...`));
1011
+ if (options.useSymlink) {
980
1012
  try {
981
- await cp(sourceSkillsDir, targetSkillsDir, { recursive: true });
982
- console.log(chalk.green(`✓ Skills copied`));
983
- } catch (copyError) {
984
- console.error(
985
- chalk.red(
986
- `✗ Failed to copy skills: ${copyError instanceof Error ? copyError.message : String(copyError)}`,
987
- ),
1013
+ await symlink(sourceSkillsDir, targetSkillsDir, "dir");
1014
+ console.log(chalk.green(`✓ Skills linked (symlink)`));
1015
+ } catch (error) {
1016
+ console.log(
1017
+ chalk.yellow(`⚠ Symlink failed: ${error instanceof Error ? error.message : String(error)}`),
988
1018
  );
989
- throw copyError;
1019
+ console.log(chalk.yellow(` Falling back to copy...`));
1020
+ await skillsCopy(sourceSkillsDir, targetSkillsDir);
990
1021
  }
1022
+ } else {
1023
+ await skillsCopy(sourceSkillsDir, targetSkillsDir);
991
1024
  }
992
1025
 
993
1026
  // project 디렉토리 초기화 (없으면 생성, 있으면 유지)
994
- const sourceProjectDir = path.join(sourceBase, "project");
995
- const targetProjectDir = path.join(claudeDir, "skills", "project");
996
-
997
- if (await exists(sourceProjectDir)) {
998
- if (!(await exists(targetProjectDir))) {
999
- try {
1000
- await cp(sourceProjectDir, targetProjectDir, { recursive: true });
1001
- console.log(chalk.green(`✓ Project templates initialized`));
1002
- } catch (error) {
1003
- console.error(
1004
- chalk.red(
1005
- `✗ Failed to initialize project templates: ${error instanceof Error ? error.message : String(error)}`,
1006
- ),
1007
- );
1027
+ if (options.copyProjectTemplates && options.sourceBase) {
1028
+ const sourceProjectDir = path.join(options.sourceBase, "project");
1029
+ const targetProjectDir = path.join(claudeDir, "skills", "project");
1030
+
1031
+ if (await exists(sourceProjectDir)) {
1032
+ if (!(await exists(targetProjectDir))) {
1033
+ try {
1034
+ await cp(sourceProjectDir, targetProjectDir, { recursive: true });
1035
+ console.log(chalk.green(`✓ Project templates initialized`));
1036
+ } catch (error) {
1037
+ console.error(
1038
+ chalk.red(
1039
+ `✗ Failed to initialize project templates: ${error instanceof Error ? error.message : String(error)}`,
1040
+ ),
1041
+ );
1042
+ }
1043
+ } else {
1044
+ console.log(chalk.dim(`⏭ Project templates already exist (preserved)`));
1008
1045
  }
1009
- } else {
1010
- console.log(chalk.dim(`⏭ Project templates already exist (preserved)`));
1011
1046
  }
1012
1047
  }
1013
1048
 
@@ -1022,7 +1057,6 @@ async function skills_sync() {
1022
1057
  const startMarker = "<!-- SONAMU:START -->";
1023
1058
  const endMarker = "<!-- SONAMU:END -->";
1024
1059
  if (targetContent.includes(startMarker) && targetContent.includes(endMarker)) {
1025
- // marker 영역만 교체합니다.
1026
1060
  const startIdx = targetContent.indexOf(startMarker);
1027
1061
  const endIdx = targetContent.indexOf(endMarker);
1028
1062
 
@@ -1035,9 +1069,15 @@ async function skills_sync() {
1035
1069
  } else {
1036
1070
  console.log(chalk.yellow(`⏭ CLAUDE.md marker positions invalid, skipped`));
1037
1071
  }
1072
+ } else {
1073
+ // 마커가 없는 기존 CLAUDE.md에 Sonamu 섹션을 추가합니다
1074
+ const appended = `${targetContent.trimEnd()}\n\n<!-- SONAMU:START -->\n${sourceContent}\n<!-- SONAMU:END -->\n`;
1075
+ await writeFile(targetClaudeMd, appended);
1076
+ console.log(chalk.green(`✓ CLAUDE.md updated (appended Sonamu section)`));
1038
1077
  }
1039
1078
  } else {
1040
- await writeFile(targetClaudeMd, sourceContent);
1079
+ const withMarkers = `<!-- SONAMU:START -->\n${sourceContent}\n<!-- SONAMU:END -->\n`;
1080
+ await writeFile(targetClaudeMd, withMarkers);
1041
1081
  console.log(chalk.green(`✓ CLAUDE.md created`));
1042
1082
  }
1043
1083
  } catch (error) {
@@ -1050,6 +1090,20 @@ async function skills_sync() {
1050
1090
  }
1051
1091
  }
1052
1092
 
1093
+ async function skillsCopy(src: string, dest: string) {
1094
+ try {
1095
+ await cp(src, dest, { recursive: true });
1096
+ console.log(chalk.green(`✓ Skills copied`));
1097
+ } catch (copyError) {
1098
+ console.error(
1099
+ chalk.red(
1100
+ `✗ Failed to copy skills: ${copyError instanceof Error ? copyError.message : String(copyError)}`,
1101
+ ),
1102
+ );
1103
+ throw copyError;
1104
+ }
1105
+ }
1106
+
1053
1107
  /**
1054
1108
  * pnpm sonamu skills create <name> 하면 실행되는 함수입니다.
1055
1109
  * 로컬 skill 초안을 생성합니다.