@tscircuit/eval 0.0.472 → 0.0.474

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/lib/index.js CHANGED
@@ -932,6 +932,8 @@ function resolveNodeModule(modulePath, fsMap, basePath) {
932
932
  }
933
933
 
934
934
  // webworker/import-node-module.ts
935
+ import Debug3 from "debug";
936
+ var debug3 = Debug3("tsci:eval:import-node-module");
935
937
  var importNodeModule = async (importName, ctx, depth = 0) => {
936
938
  const { preSuppliedImports } = ctx;
937
939
  if (preSuppliedImports[importName]) {
@@ -939,6 +941,26 @@ var importNodeModule = async (importName, ctx, depth = 0) => {
939
941
  }
940
942
  const resolvedNodeModulePath = resolveNodeModule(importName, ctx.fsMap, "");
941
943
  if (!resolvedNodeModulePath) {
944
+ const platform = ctx.circuit?.platform;
945
+ if (platform?.nodeModulesResolver) {
946
+ debug3(`Attempting to resolve "${importName}" using nodeModulesResolver`);
947
+ try {
948
+ const fileContent = await platform.nodeModulesResolver(importName);
949
+ if (fileContent) {
950
+ debug3(`Successfully resolved "${importName}" via nodeModulesResolver`);
951
+ const syntheticPath = `node_modules/${importName}.ts`;
952
+ ctx.fsMap[syntheticPath] = fileContent;
953
+ await importLocalFile(syntheticPath, ctx, depth);
954
+ preSuppliedImports[importName] = preSuppliedImports[syntheticPath];
955
+ const unprefixedPath2 = syntheticPath.replace(/^node_modules\//, "");
956
+ preSuppliedImports[unprefixedPath2] = preSuppliedImports[syntheticPath];
957
+ return;
958
+ }
959
+ debug3(`nodeModulesResolver returned null for "${importName}"`);
960
+ } catch (error) {
961
+ debug3(`nodeModulesResolver failed for "${importName}":`, error);
962
+ }
963
+ }
942
964
  throw new Error(`Node module "${importName}" not found`);
943
965
  }
944
966
  await importLocalFile(resolvedNodeModulePath, ctx, depth);
@@ -960,8 +982,8 @@ var importNodeModule = async (importName, ctx, depth = 0) => {
960
982
  };
961
983
 
962
984
  // webworker/import-npm-package.ts
963
- import Debug3 from "debug";
964
- var debug3 = Debug3("tsci:eval:import-npm-package");
985
+ import Debug4 from "debug";
986
+ var debug4 = Debug4("tsci:eval:import-npm-package");
965
987
  function extractPackagePathFromJSDelivr(url) {
966
988
  const prefix = "https://cdn.jsdelivr.net/npm/";
967
989
  if (url.startsWith(prefix)) {
@@ -970,7 +992,7 @@ function extractPackagePathFromJSDelivr(url) {
970
992
  return url;
971
993
  }
972
994
  async function importNpmPackage(importName, ctx, depth = 0) {
973
- debug3(`importing npm package: ${importName}`);
995
+ debug4(`importing npm package: ${importName}`);
974
996
  const { preSuppliedImports } = ctx;
975
997
  if (preSuppliedImports[importName]) return;
976
998
  const npmCdnUrl = `https://cdn.jsdelivr.net/npm/${importName}/+esm`;
@@ -1022,10 +1044,10 @@ ${ctx.logger.stringifyLogs()}`
1022
1044
  }
1023
1045
 
1024
1046
  // webworker/import-eval-path.ts
1025
- import Debug4 from "debug";
1026
- var debug4 = Debug4("tsci:eval:import-eval-path");
1047
+ import Debug5 from "debug";
1048
+ var debug5 = Debug5("tsci:eval:import-eval-path");
1027
1049
  async function importEvalPath(importName, ctx, depth = 0, opts = {}) {
1028
- debug4("importEvalPath called with:", {
1050
+ debug5("importEvalPath called with:", {
1029
1051
  importName,
1030
1052
  depth,
1031
1053
  opts
@@ -1033,7 +1055,7 @@ async function importEvalPath(importName, ctx, depth = 0, opts = {}) {
1033
1055
  ctx.logger.info(
1034
1056
  `importEvalPath("${importName}", {cwd: "${opts.cwd}", depth: ${depth}})`
1035
1057
  );
1036
- debug4(`${" ".repeat(depth)}\u27A1\uFE0F`, importName);
1058
+ debug5(`${" ".repeat(depth)}\u27A1\uFE0F`, importName);
1037
1059
  const { preSuppliedImports } = ctx;
1038
1060
  if (preSuppliedImports[importName]) {
1039
1061
  ctx.logger.info(`Import "${importName}" in preSuppliedImports[1]`);
@@ -1093,6 +1115,22 @@ ${ctx.logger.stringifyLogs()}`
1093
1115
  ctx.logger.info(`importNodeModule("${importName}")`);
1094
1116
  return importNodeModule(importName, ctx, depth);
1095
1117
  }
1118
+ if (!importName.startsWith(".") && !importName.startsWith("/") && !importName.startsWith("@tsci/")) {
1119
+ const platform = ctx.circuit?.platform;
1120
+ if (platform?.nodeModulesResolver) {
1121
+ ctx.logger.info(
1122
+ `importNodeModule("${importName}") via nodeModulesResolver`
1123
+ );
1124
+ try {
1125
+ await importNodeModule(importName, ctx, depth);
1126
+ return;
1127
+ } catch (error) {
1128
+ ctx.logger.info(
1129
+ `nodeModulesResolver failed for "${importName}", falling back to npm CDN`
1130
+ );
1131
+ }
1132
+ }
1133
+ }
1096
1134
  if (importName.startsWith("@tsci/")) {
1097
1135
  ctx.logger.info(`importSnippet("${importName}")`);
1098
1136
  return importSnippet(importName, ctx, depth);
@@ -1109,8 +1147,8 @@ ${ctx.logger.stringifyLogs()}`
1109
1147
  }
1110
1148
 
1111
1149
  // lib/runner/setupDefaultEntrypointIfNeeded.ts
1112
- import Debug5 from "debug";
1113
- var debug5 = Debug5("tsci:eval:setupDefaultEntrypointIfNeeded");
1150
+ import Debug6 from "debug";
1151
+ var debug6 = Debug6("tsci:eval:setupDefaultEntrypointIfNeeded");
1114
1152
  var setupDefaultEntrypointIfNeeded = (opts) => {
1115
1153
  if (!opts.entrypoint && !opts.mainComponentPath) {
1116
1154
  if ("index.tsx" in opts.fsMap) {
@@ -1153,7 +1191,7 @@ var setupDefaultEntrypointIfNeeded = (opts) => {
1153
1191
  .filter(([name]) => !name.startsWith("use"))
1154
1192
  .map(([_, component]) => component)[0] || (() => null);`}
1155
1193
 
1156
- ${debug5.enabled ? `
1194
+ ${debug6.enabled ? `
1157
1195
  console.log({ UserComponents })
1158
1196
  console.log("ComponentToRender " + ComponentToRender.toString(), { ComponentToRender })
1159
1197
  ` : ""}
@@ -1178,7 +1216,7 @@ var enhanceRootCircuitHasNoChildrenError = (error, entrypoint) => {
1178
1216
  };
1179
1217
 
1180
1218
  // lib/runner/CircuitRunner.ts
1181
- import Debug6 from "debug";
1219
+ import Debug7 from "debug";
1182
1220
 
1183
1221
  // lib/shared/obj-path.ts
1184
1222
  function getObjectPaths(obj, prefix = "") {
@@ -1223,7 +1261,7 @@ function setValueAtPath(obj, path, value) {
1223
1261
  }
1224
1262
 
1225
1263
  // lib/runner/CircuitRunner.ts
1226
- var debug6 = Debug6("tsci:eval:CircuitRunner");
1264
+ var debug7 = Debug7("tsci:eval:CircuitRunner");
1227
1265
  var CircuitRunner = class {
1228
1266
  constructor(configuration = {}) {
1229
1267
  this._executionContext = null;
@@ -1241,15 +1279,15 @@ var CircuitRunner = class {
1241
1279
  async executeWithFsMap(ogOpts) {
1242
1280
  const opts = { ...ogOpts };
1243
1281
  if (this._circuitRunnerConfiguration.verbose) {
1244
- Debug6.enable("tsci:eval:*");
1282
+ Debug7.enable("tsci:eval:*");
1245
1283
  }
1246
- debug6("executeWithFsMap called with:", {
1284
+ debug7("executeWithFsMap called with:", {
1247
1285
  entrypoint: opts.entrypoint,
1248
1286
  fsMapKeys: Object.keys(opts.fsMap),
1249
1287
  name: opts.name
1250
1288
  });
1251
1289
  setupDefaultEntrypointIfNeeded(opts);
1252
- debug6("entrypoint after setupDefaultEntrypointIfNeeded:", {
1290
+ debug7("entrypoint after setupDefaultEntrypointIfNeeded:", {
1253
1291
  entrypoint: opts.entrypoint
1254
1292
  });
1255
1293
  this._executionContext = createExecutionContext(
@@ -1271,7 +1309,7 @@ var CircuitRunner = class {
1271
1309
  ;
1272
1310
  globalThis.__tscircuit_circuit = this._executionContext.circuit;
1273
1311
  const entrypoint = opts.entrypoint.startsWith("./") ? opts.entrypoint : `./${opts.entrypoint}`;
1274
- debug6("final entrypoint:", entrypoint);
1312
+ debug7("final entrypoint:", entrypoint);
1275
1313
  await importEvalPath(entrypoint, this._executionContext);
1276
1314
  }
1277
1315
  async execute(code, opts = {}) {
@@ -1722,4 +1760,4 @@ export {
1722
1760
  runTscircuitCode,
1723
1761
  runTscircuitModule
1724
1762
  };
1725
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cC50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvdHNjb25maWdQYXRocy50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvc2hhcmVkL29iai1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0Q29kZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdE1vZHVsZS50cyIsICIuLi8uLi9saWIvd29ya2VyLnRzIiwgIi4uLy4uL2xpYi9nZXRQb3NzaWJsZUVudHJ5cG9pbnRDb21wb25lbnRQYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdENvcmUgZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0TWF0aFV0aWxzIGZyb20gXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcImxpYi9nZXRQbGF0Zm9ybUNvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnIH0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpleGVjdXRpb24tY29udGV4dFwiKVxuXG5pbnRlcmZhY2UgU3RvcmVkTG9nZ2VyIHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBnZXRMb2dzOiAoKSA9PiBBcnJheTx7IG1zZzogc3RyaW5nIH0+XG4gIHN0cmluZ2lmeUxvZ3M6ICgpID0+IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxuICBsb2dnZXI6IFN0b3JlZExvZ2dlclxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG4gIGltcG9ydFN0YWNrOiBzdHJpbmdbXVxuICBjdXJyZW50bHlJbXBvcnRpbmc6IFNldDxzdHJpbmc+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICB3ZWJXb3JrZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBvcHRzOiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHBsYXRmb3JtPzogUGxhdGZvcm1Db25maWdcbiAgICBwcm9qZWN0Q29uZmlnPzogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz5cbiAgICBkZWJ1Z05hbWVzcGFjZT86IHN0cmluZ1xuICB9ID0ge30sXG4pOiBFeGVjdXRpb25Db250ZXh0IHtcbiAgZ2xvYmFsVGhpcy5SZWFjdCA9IFJlYWN0XG5cbiAgY29uc3QgYmFzZVBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpXG4gIGNvbnN0IHBsYXRmb3JtID0gb3B0cy5wcm9qZWN0Q29uZmlnXG4gICAgPyB7IC4uLmJhc2VQbGF0Zm9ybSwgLi4ub3B0cy5wcm9qZWN0Q29uZmlnIH1cbiAgICA6IGJhc2VQbGF0Zm9ybVxuXG4gIGlmIChwbGF0Zm9ybS5wYXJ0c0VuZ2luZURpc2FibGVkKSB7XG4gICAgcGxhdGZvcm0ucGFydHNFbmdpbmUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNpcmN1aXQgPSBuZXcgUm9vdENpcmN1aXQoe1xuICAgIHBsYXRmb3JtLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIGlmIChvcHRzLmRlYnVnTmFtZXNwYWNlKSB7XG4gICAgY2lyY3VpdC5lbmFibGVEZWJ1ZyhvcHRzLmRlYnVnTmFtZXNwYWNlKVxuICB9XG5cbiAgY29uc3QgbG9nczogQXJyYXk8eyBtc2c6IHN0cmluZyB9PiA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBmc01hcDoge30sXG4gICAgZW50cnlwb2ludDogXCJcIixcbiAgICBsb2dnZXI6IHtcbiAgICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9ncy5wdXNoKHsgbXNnOiBtZXNzYWdlIH0pXG4gICAgICB9LFxuICAgICAgZ2V0TG9nczogKCkgPT4gbG9ncyxcbiAgICAgIHN0cmluZ2lmeUxvZ3M6ICgpID0+IGxvZ3MubWFwKChsb2cpID0+IGxvZy5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgfSxcbiAgICBwcmVTdXBwbGllZEltcG9ydHM6IHtcbiAgICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IHRzY2lyY3VpdENvcmUsXG4gICAgICB0c2NpcmN1aXQ6IHRzY2lyY3VpdENvcmUsXG4gICAgICBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiOiB0c2NpcmN1aXRNYXRoVXRpbHMsXG4gICAgICByZWFjdDogUmVhY3QsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBmaWxlUGF0aFRvUmVzb2x2ZSA9IGAke2Jhc2VVcmx9LyR7aW1wb3J0UGF0aH1gXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoVG9SZXNvbHZlKVxuXG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRGaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkRmlsZVBhdGgpIVxuICB9XG5cbiAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQod2l0aEV4dCkhXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKFxuICBpbXBvcnRQYXRoOiBzdHJpbmcsXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKGNvbnN0IFthbGlhc10gb2YgT2JqZWN0LmVudHJpZXMocGF0aHMpKSB7XG4gICAgY29uc3QgaGFzV2lsZGNhcmQgPSBhbGlhcy5pbmNsdWRlcyhcIipcIilcbiAgICBpZiAoaGFzV2lsZGNhcmQpIHtcbiAgICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBhbGlhcy5zcGxpdChcIipcIilcbiAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBpbXBvcnRQYXRoLmVuZHNXaXRoKHN1ZmZpeCB8fCBcIlwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW1wb3J0UGF0aCA9PT0gYWxpYXMpIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHR5cGUge1xuICBDaXJjdWl0UnVubmVyQXBpLFxuICBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IG5vcm1hbGl6ZUZzTWFwIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgZ2V0VHNDb25maWcgfSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCJ3ZWJ3b3JrZXIvaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuaW1wb3J0IHsgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yIH0gZnJvbSBcImxpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IHNldFZhbHVlQXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOkNpcmN1aXRSdW5uZXJcIilcblxuZXhwb3J0IGNsYXNzIENpcmN1aXRSdW5uZXIgaW1wbGVtZW50cyBDaXJjdWl0UnVubmVyQXBpIHtcbiAgX2V4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQ+IHwgbnVsbCA9IG51bGxcbiAgX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uOiBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBzbmlwcGV0c0FwaUJhc2VVcmw6IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiLFxuICAgIGNqc1JlZ2lzdHJ5VXJsOiBcImh0dHBzOi8vY2pzLnRzY2lyY3VpdC5jb21cIixcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgfVxuICBfZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsICgoLi4uYXJnczogYW55W10pID0+IHZvaWQpW10+ID0ge31cbiAgX2RlYnVnTmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uOiBQYXJ0aWFsPENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uPiA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gXCIwLjAuMFwiXG4gIH1cblxuICBhc3luYyBleGVjdXRlV2l0aEZzTWFwKG9nT3B0czoge1xuICAgIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gICAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBuYW1lPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub2dPcHRzIH1cblxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBEZWJ1Zy5lbmFibGUoXCJ0c2NpOmV2YWw6KlwiKVxuICAgIH1cblxuICAgIGRlYnVnKFwiZXhlY3V0ZVdpdGhGc01hcCBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICB9KVxuXG4gICAgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkKG9wdHMpXG5cbiAgICBkZWJ1ZyhcImVudHJ5cG9pbnQgYWZ0ZXIgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgfSlcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXAgPSBub3JtYWxpemVGc01hcChvcHRzLmZzTWFwKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtvcHRzLmVudHJ5cG9pbnQhXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRyeXBvaW50IFwiJHtvcHRzLmVudHJ5cG9pbnR9XCIgbm90IGZvdW5kYClcbiAgICB9XG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgY29uc3QgZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCEuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IG9wdHMuZW50cnlwb2ludFxuICAgICAgOiBgLi8ke29wdHMuZW50cnlwb2ludH1gXG5cbiAgICBkZWJ1ZyhcImZpbmFsIGVudHJ5cG9pbnQ6XCIsIGVudHJ5cG9pbnQpXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbXCJlbnRyeXBvaW50LnRzeFwiXSA9IGNvZGVcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChcIi4vZW50cnlwb2ludC50c3hcIiwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21wb25lbnQoY29tcG9uZW50OiBhbnksIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZUNvbXBvbmVudCBjYWxsZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBudWxsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZURlYnVnKG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVidWdOYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyBhbnlcbiAgICAgIGNpcmN1aXQuZW5hYmxlRGVidWc/LihuYW1lc3BhY2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEV2ZW50TGlzdGVuZXJzKGNpcmN1aXQ6IFJvb3RDaXJjdWl0KSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGxpc3RlbmVyIGFzIGFueSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBuYW1lIG9mIGEgcGF0aCwgc2ltaWxhciB0byBOb2RlLmpzIHBhdGguZGlybmFtZVxuICogV29ya3Mgb24gYm90aCBVbml4IGFuZCBXaW5kb3dzIHBhdGhzXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBleHRyYWN0IHRoZSBkaXJlY3RvcnkgZnJvbVxuICogQHJldHVybnMgVGhlIGRpcmVjdG9yeSBwYXJ0IG9mIHRoZSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcGF0aCkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gTm9ybWFsaXplIHBhdGggc2VwYXJhdG9ycyB0byBmb3J3YXJkIHNsYXNoZXNcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG5cbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXNcbiAgY29uc3QgY2xlYW5QYXRoID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuXG4gIC8vIElmIHRoZXJlIGFyZSBubyBzbGFzaGVzLCByZXR1cm4gXCIuXCJcbiAgaWYgKGNsZWFuUGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gLTEpIHJldHVybiBcIi5cIlxuXG4gIC8vIFJldHVybiBldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IHNsYXNoXG4gIHJldHVybiBjbGVhblBhdGguc3Vic3RyaW5nKDAsIGNsZWFuUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpIHx8IFwiL1wiXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG4vKipcbiAqIFJlc29sdmUgYW4gaW1wb3J0UGF0aCByZWxhdGl2ZSB0byBhIGN3ZCwgc3VwcG9ydGluZyAuLi8sIC4vIGFuZCBhYnNvbHV0ZSBwYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb25cbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IHBhcmVudERpciA9IGRpcm5hbWUoY3dkKVxuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMyksIHBhcmVudERpcilcbiAgfVxuICAvLyBIYW5kbGUgY3VycmVudCBkaXJlY3RvcnlcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgyKSwgY3dkKVxuICB9XG4gIC8vIEhhbmRsZSBhYnNvbHV0ZSBwYXRoXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgcmV0dXJuIGltcG9ydFBhdGguc2xpY2UoMSlcbiAgfVxuICAvLyBIYW5kbGUgcmVsYXRpdmUgcGF0aFxuICByZXR1cm4gYCR7Y3dkfS8ke2ltcG9ydFBhdGh9YFxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGggPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0czogeyB0c0NvbmZpZz86IFRzQ29uZmlnIHwgbnVsbCB9ID0ge30sXG4pID0+IHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvbiBwcm9wZXJseVxuICBjb25zdCByZXNvbHZlZFBhdGggPSBjd2RcbiAgICA/IHJlc29sdmVSZWxhdGl2ZVBhdGgodW5rbm93bkZpbGVQYXRoLCBjd2QpXG4gICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpIVxuICB9XG5cbiAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgY29uc3QgZXh0ZW5zaW9uID0gW1widHN4XCIsIFwidHNcIiwgXCJqc29uXCIsIFwianNcIiwgXCJqc3hcIiwgXCJvYmpcIiwgXCJnbHRmXCIsIFwiZ2xiXCJdXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgdXNpbmcgdHNjb25maWcgXCJwYXRoc1wiIG1hcHBpbmcgd2hlbiB0aGUgaW1wb3J0IGlzIG5vbi1yZWxhdGl2ZVxuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuXG4gIGlmICghdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tUGF0aHMgPSByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9uLFxuICAgICAgdHNDb25maWcsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb24sXG4gICAgICB0c0NvbmZpZyxcbiAgICB9KVxuICAgIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG4gIH1cblxuICAvLyBDaGVjayBpZiBpdCdzIGFuIGFic29sdXRlIGltcG9ydFxuICBpZiAoIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVua25vd25GaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aClcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGhPclRocm93ID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgdW5rbm93bkZpbGVQYXRoLFxuICAgIGZzTWFwT3JBbGxGaWxlUGF0aHMsXG4gICAgY3dkLFxuICAgIG9wdHMsXG4gIClcbiAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpbGUgbm90IGZvdW5kIFwiJHt1bmtub3duRmlsZVBhdGh9XCIsIGF2YWlsYWJsZSBwYXRoczpcXG5cXG4ke09iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLmpvaW4oXCIsIFwiKX1gLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRGaWxlUGF0aFxufVxuIiwgImV4cG9ydCBjb25zdCBnZXRJbXBvcnRzRnJvbUNvZGUgPSAoY29kZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAvLyBNYXRjaCBiYXNpYyBpbXBvcnQgcGF0dGVybnMgaW5jbHVkaW5nIGNvbWJpbmVkIGRlZmF1bHQgYW5kIG5hbWVzcGFjZSBpbXBvcnRzXG4gIGNvbnN0IGltcG9ydFJlZ2V4ID1cbiAgICAvXlxccyppbXBvcnRcXHMrKD86KD86W1xcd1xcc10rLFxccyopPyg/OlxcKlxccythc1xccytbXFx3XFxzXSt8XFx7W1xcc1xcdyxdK1xcfXxcXHcrKVxccytmcm9tXFxzKik/WydcIl0oLis/KVsnXCJdL2dtXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChtYXRjaCA9IGltcG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqaW1wb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKVxuICB9XG5cbiAgLy8gTWF0Y2ggcmUtZXhwb3J0c1xuICBjb25zdCByZUV4cG9ydFJlZ2V4ID1cbiAgICAvXlxccypleHBvcnRcXHMrKD86dHlwZVxccyspPyg/OlxcKlxccythc1xccytbXFx3JF0rfFxcKnxcXHtbXn1dK1xcfSlcXHMrZnJvbVxccypbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IHJlRXhwb3J0TWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqZXhwb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKHJlRXhwb3J0TWF0Y2hbMV0pXG4gIH1cblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsQ29tcGlsZWRKcyhcbiAgY29tcGlsZWRDb2RlOiBzdHJpbmcsXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY3dkPzogc3RyaW5nLFxuKSB7XG4gIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X3JlcXVpcmUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChuYW1lLCBwcmVTdXBwbGllZEltcG9ydHMsIGN3ZClcblxuICAgIGNvbnN0IGhhc1Jlc29sdmVkRmlsZVBhdGggPVxuICAgICAgcmVzb2x2ZWRGaWxlUGF0aCAmJiBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aF1cblxuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW25hbWVdICYmICFoYXNSZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCBcIiR7bmFtZX1cIiBub3QgZm91bmQgJHtjd2QgPyBgaW4gXCIke2N3ZH1cImAgOiBcIlwifWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSB8fCBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aCFdXG4gICAgcmV0dXJuIG5ldyBQcm94eShtb2QsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgaWYgKHByb3AgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRlZmF1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5fX2VzTW9kdWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9wID09PSBcIl9fZXNNb2R1bGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ29tcG9uZW50IFwiJHtTdHJpbmcocHJvcCl9XCIgaXMgbm90IGV4cG9ydGVkIGJ5IFwiJHtuYW1lfVwiYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF1cbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGZ1bmN0aW9uQm9keSA9IGBcbiAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgdmFyIHJlcXVpcmUgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X3JlcXVpcmU7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHMgfTtcbiAgdmFyIGNpcmN1aXQgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X2NpcmN1aXQ7XG4gICR7Y29tcGlsZWRDb2RlfTtcbiAgcmV0dXJuIG1vZHVsZTtgLnRyaW0oKVxuICByZXR1cm4gRnVuY3Rpb24oZnVuY3Rpb25Cb2R5KS5jYWxsKGdsb2JhbFRoaXMpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBpc1N0YXRpY0Fzc2V0UGF0aCB9IGZyb20gXCJsaWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcIi4vdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5pbXBvcnQgeyBLaWNhZFRvQ2lyY3VpdEpzb25Db252ZXJ0ZXIgfSBmcm9tIFwia2ljYWQtdG8tY2lyY3VpdC1qc29uXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbG9jYWwtZmlsZVwiKVxuXG5leHBvcnQgY29uc3QgaW1wb3J0TG9jYWxGaWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGRlYnVnKFwiaW1wb3J0TG9jYWxGaWxlIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgfSlcblxuICBjb25zdCB7IGZzTWFwLCBwcmVTdXBwbGllZEltcG9ydHMsIGltcG9ydFN0YWNrLCBjdXJyZW50bHlJbXBvcnRpbmcgfSA9IGN0eFxuXG4gIGNvbnN0IGZzUGF0aCA9IHJlc29sdmVGaWxlUGF0aE9yVGhyb3coaW1wb3J0TmFtZSwgZnNNYXAsIHVuZGVmaW5lZCwge1xuICAgIHRzQ29uZmlnOiBjdHgudHNDb25maWcsXG4gIH0pXG4gIGRlYnVnKFwiZnNQYXRoOlwiLCBmc1BhdGgpXG4gIGlmIChjdXJyZW50bHlJbXBvcnRpbmcuaGFzKGZzUGF0aCkpIHtcbiAgICBjb25zdCBjeWNsZVN0YXJ0SW5kZXggPSBpbXBvcnRTdGFjay5pbmRleE9mKGZzUGF0aClcbiAgICBjb25zdCBjeWNsZVBhdGggPVxuICAgICAgY3ljbGVTdGFydEluZGV4ID49IDBcbiAgICAgICAgPyBpbXBvcnRTdGFjay5zbGljZShjeWNsZVN0YXJ0SW5kZXgpLmNvbmNhdChmc1BhdGgpXG4gICAgICAgIDogWy4uLmltcG9ydFN0YWNrLCBmc1BhdGhdXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgd2hpbGUgaW1wb3J0aW5nIFwiJHtmc1BhdGh9XCIuIFRoZSBmb2xsb3dpbmcgaW1wb3J0IGNoYWluIGZvcm1zIGEgY3ljbGU6XFxuXFxuJHtjeWNsZVBhdGguam9pbihcbiAgICAgICAgXCIgLT4gXCIsXG4gICAgICApfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKCFjdHguZnNNYXBbZnNQYXRoXSkge1xuICAgIGRlYnVnKFwiZnNQYXRoIG5vdCBmb3VuZCBpbiBmc01hcDpcIiwgZnNQYXRoKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZnNQYXRofVwiIG5vdCBmb3VuZGApXG4gIH1cbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBmc01hcFtmc1BhdGhdXG4gIGRlYnVnKFwiZmlsZUNvbnRlbnQ6XCIsIGZpbGVDb250ZW50Py5zbGljZSgwLCAxMDApKVxuICBjdXJyZW50bHlJbXBvcnRpbmcuYWRkKGZzUGF0aClcbiAgaW1wb3J0U3RhY2sucHVzaChmc1BhdGgpXG4gIHRyeSB7XG4gICAgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDoganNvbkRhdGEsXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfcGNiXCIpKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyKClcbiAgICAgIGNvbnZlcnRlci5hZGRGaWxlKGZzUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICBjb252ZXJ0ZXIucnVuVW50aWxGaW5pc2hlZCgpXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGNvbnZlcnRlci5nZXRPdXRwdXQoKVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGNpcmN1aXRKc29uOiBjaXJjdWl0SnNvbixcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3RhdGljQXNzZXRQYXRoKGZzUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgIC8vIFVzZSBwcm9qZWN0QmFzZVVybCBmb3Igc3RhdGljIGZpbGUgaW1wb3J0c1xuICAgICAgY29uc3Qgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgIGZzUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgPyBmc1BhdGguc2xpY2UoMikgOiBmc1BhdGhcbiAgICAgIH1gXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDogc3RhdGljVXJsLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICAgIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGZpbGVDb250ZW50KVxuXG4gICAgICBmb3IgKGNvbnN0IGltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChpbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICAgICAgY3dkOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKVxuICAgICAgICBkZWJ1ZyhcImV2YWxDb21waWxlZEpzIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgICAgY29kZTogdHJhbnNmb3JtZWRDb2RlLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgZGlybmFtZTogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBpbXBvcnRSdW5SZXN1bHQgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgKVxuICAgICAgICBkZWJ1ZyhcImltcG9ydFJ1blJlc3VsdDpcIiwge1xuICAgICAgICAgIGZzUGF0aCxcbiAgICAgICAgICBpbXBvcnRSdW5SZXN1bHQsXG4gICAgICAgIH0pXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgICAgLy8gRm9yIC5qcyBmaWxlcywgZXNwZWNpYWxseSBmcm9tIG5vZGVfbW9kdWxlcywgd2UgbmVlZCB0byB0cmFuc2Zvcm0gdGhlbVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aCksXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgKS5leHBvcnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICAgIClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaW1wb3J0U3RhY2sucG9wKClcbiAgICBjdXJyZW50bHlJbXBvcnRpbmcuZGVsZXRlKGZzUGF0aClcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUyA9IFtcbiAgXCIuZ2xiXCIsXG4gIFwiLmtpY2FkX21vZFwiLFxuICBcIi5nbHRmXCIsXG4gIFwiLm9ialwiLFxuICBcIi5zdGxcIixcbl1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdGljQXNzZXRQYXRoID0gKHBhdGg6IHN0cmluZykgPT5cbiAgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBwYXRoLmVuZHNXaXRoKGV4dCkpXG4iLCAiaW1wb3J0IHsgdHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybSBhcyBTdWNyYXNlVHJhbnNmb3JtIH0gZnJvbSBcInN1Y3Jhc2VcIlxuXG5jb25zdCBUU19FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHNcIiwgXCIudHN4XCIsIFwiLm10c1wiLCBcIi5jdHNcIl0pXG5jb25zdCBKU1hfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzeFwiLCBcIi5qc3hcIiwgXCIudHNcIl0pXG5cbmNvbnN0IHN0cmlwUXVlcnlBbmRIYXNoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCI/XCIpXG4gIGNvbnN0IGhhc2hJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIjXCIpXG5cbiAgbGV0IGVuZEluZGV4ID0gZmlsZVBhdGgubGVuZ3RoXG5cbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xICYmIGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IE1hdGgubWluKHF1ZXJ5SW5kZXgsIGhhc2hJbmRleClcbiAgfSBlbHNlIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gcXVlcnlJbmRleFxuICB9IGVsc2UgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IGhhc2hJbmRleFxuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKDAsIGVuZEluZGV4KVxufVxuXG5jb25zdCBnZXRFeHRlbnNpb24gPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHN0cmlwUXVlcnlBbmRIYXNoKGZpbGVQYXRoKVxuICBjb25zdCBsYXN0RG90SW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi5cIilcblxuICBpZiAobGFzdERvdEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSxcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIiksXG4gIClcblxuICBpZiAobGFzdFNsYXNoSW5kZXggPiBsYXN0RG90SW5kZXgpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNsaWNlKGxhc3REb3RJbmRleCkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZVBhdGgpXG5cbiAgY29uc3QgdHJhbnNmb3JtczogU3VjcmFzZVRyYW5zZm9ybVtdID0gW1wiaW1wb3J0c1wiXVxuXG4gIGlmIChUU19FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy51bnNoaWZ0KFwidHlwZXNjcmlwdFwiKVxuICB9XG5cbiAgaWYgKEpTWF9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwianN4XCIpXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3Jtc1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgPSAoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybXMgPSBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oY29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG59XG5cbmludGVyZmFjZSBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICBiYXNlUGF0aDogc3RyaW5nXG4gIG1vZHVsZVBhdGg6IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBmc01hcCxcbiAgICBleHRlbnNpb25zOiBbXCIuanNcIiwgXCIuanN4XCIsIFwiLnRzXCIsIFwiLnRzeFwiLCBcIi5qc29uXCJdLFxuICAgIGJhc2VQYXRoLFxuICAgIG1vZHVsZVBhdGgsXG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLCBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCkge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9L3BhY2thZ2UuanNvbmBcbiAgaWYgKCFjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgYXMgUGFja2FnZUpzb25cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoXG4gIHBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGN0eC5mc01hcFtwYXRoXSkgcmV0dXJuIHBhdGhcblxuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHBhdGhXaXRoRXh0ID0gcGF0aC5yZXBsYWNlKC9cXC5qcyR8XFwuanN4JC8sIFwiXCIpICsgZXh0XG4gICAgaWYgKGN0eC5mc01hcFtwYXRoV2l0aEV4dF0pIHJldHVybiBwYXRoV2l0aEV4dFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgZXhwb3J0UGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBmdWxsRXhwb3J0UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtleHBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbEV4cG9ydFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcGFja2FnZUpzb24uZXhwb3J0cykgcmV0dXJuIG51bGxcblxuICAvLyBIYW5kbGUgZGVmYXVsdCBleHBvcnQgY29uZGl0aW9uXG4gIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzW1wiLlwiXVxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBkZWZhdWx0RXhwb3J0KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0RXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZGVmYXVsdEV4cG9ydCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBleHBvcnRzXG4gIGNvbnN0IHN1YnBhdGhFeHBvcnQgPSByZW1haW5pbmdQYXRoXG4gICAgPyBwYWNrYWdlSnNvbi5leHBvcnRzW2AuLyR7cmVtYWluaW5nUGF0aH1gXVxuICAgIDogbnVsbFxuICBpZiAoc3VicGF0aEV4cG9ydCAmJiB0eXBlb2Ygc3VicGF0aEV4cG9ydCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBzdWJwYXRoRXhwb3J0LCBjdHgpXG4gICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb25kaXRpb25hbCBleHBvcnRzXG4gIGNvbnN0IGltcG9ydEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCJpbXBvcnRcIl1cbiAgaWYgKFxuICAgIHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiZcbiAgICBpbXBvcnRFeHBvcnQgJiZcbiAgICB0eXBlb2YgaW1wb3J0RXhwb3J0ID09PSBcInN0cmluZ1wiXG4gICkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBpbXBvcnRFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09IFwiLlwiID8gXCJcIiA6IGAke3NlYXJjaFBhdGh9L2B9bm9kZV9tb2R1bGVzLyR7c2NvcGV9YFxuXG4gIC8vIFRyeSB0byBmaW5kIHBhY2thZ2UuanNvblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGgsIGN0eClcbiAgaWYgKHBhY2thZ2VKc29uKSB7XG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIGV4cG9ydHMgZmllbGRcbiAgICBjb25zdCBleHBvcnRzUmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgcmVtYWluaW5nUGF0aCxcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGV4cG9ydHNSZXNvbHV0aW9uKSByZXR1cm4gZXhwb3J0c1Jlc29sdXRpb25cblxuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBtYWluL21vZHVsZSBmaWVsZHNcbiAgICBjb25zdCBlbnRyeVBvaW50UmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRW50cnlQb2ludChcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZW50cnlQb2ludFJlc29sdXRpb24pIHJldHVybiBlbnRyeVBvaW50UmVzb2x1dGlvblxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyByZW1haW5pbmcgcGF0aFxuICBjb25zdCByZW1haW5pbmdQYXRoUmVzb2x1dGlvbiA9IHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICByZW1haW5pbmdQYXRoLFxuICAgIGN0eCxcbiAgKVxuICBpZiAocmVtYWluaW5nUGF0aFJlc29sdXRpb24pIHJldHVybiByZW1haW5pbmdQYXRoUmVzb2x1dGlvblxuXG4gIC8vIElmIG5vdCBmb3VuZCBhbmQgd2UgaGF2ZSBhIHBhcmVudCBkaXJlY3RvcnksIHRyeSB0aGVyZVxuICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShzZWFyY2hQYXRoKVxuICBpZiAocGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoICE9PSBzZWFyY2hQYXRoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKHBhcmVudFBhdGgsIGN0eClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZShcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KG1vZHVsZVBhdGgsIGZzTWFwLCBiYXNlUGF0aClcbiAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKGN0eC5iYXNlUGF0aCwgY3R4KVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcblxuZXhwb3J0IGNvbnN0IGltcG9ydE5vZGVNb2R1bGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHguZnNNYXAsIFwiXCIpXG5cbiAgaWYgKCFyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBub3QgZm91bmRgKVxuICB9XG5cbiAgLy8gVXNlIGltcG9ydExvY2FsRmlsZSB0byBoYW5kbGUgdGhlIG5vZGUgbW9kdWxlXG4gIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZE5vZGVNb2R1bGVQYXRoLCBjdHgsIGRlcHRoKVxuXG4gIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZSdzIGV4cG9ydHNcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gTWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeCBmb3IgZGlyZWN0IGltcG9ydHNcbiAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID1cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBIYW5kbGUgaW5kZXggZmlsZXMgc3BlY2lhbGx5XG4gIGlmIChcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzeFwiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHNcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LmpzXCIpXG4gICkge1xuICAgIGNvbnN0IGRpclBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL1xcL2luZGV4XFwuKHRzeD98anMpJC8sIFwiXCIpXG4gICAgY29uc3QgdW5wcmVmaXhlZERpclBhdGggPSBkaXJQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkRGlyUGF0aF0gPVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgICAvLyBIYW5kbGUgc2NvcGVkIHBhY2thZ2VzXG4gICAgaWYgKHVucHJlZml4ZWREaXJQYXRoLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzY29wZVBhcnRzID0gdW5wcmVmaXhlZERpclBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBzY29wZWROYW1lID0gYCR7c2NvcGVQYXJ0c1swXX0vJHtzY29wZVBhcnRzWzFdfWBcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Njb3BlZE5hbWVdID1cbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZShcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBkZWJ1ZyhgaW1wb3J0aW5nIG5wbSBwYWNrYWdlOiAke2ltcG9ydE5hbWV9YClcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIGNvbnN0IG5wbUNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7aW1wb3J0TmFtZX0vK2VzbWBcblxuICBsZXQgZmluYWxVcmw6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBjb25zdCB7IGNvbnRlbnQsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKG5wbUNkblVybClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICBmaW5hbFVybCA9IHJlcy51cmxcbiAgICAgIGlmICghcmVzLm9rKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmZXRjaCBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIGpzZGVsaXZyOiAke3Jlcy5zdGF0dXNUZXh0fVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgcmV0dXJuIHsgY29udGVudDogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY29udGVudDogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgbnBtIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgY29uc3QgZmluYWxJbXBvcnROYW1lID0gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKGZpbmFsVXJsISlcbiAgY29uc3QgY3dkID0gZGlybmFtZShmaW5hbEltcG9ydE5hbWUpXG5cbiAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoY29udGVudCEpXG4gIGZvciAoY29uc3Qgc3ViSW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW3N1YkltcG9ydE5hbWVdKSB7XG4gICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChzdWJJbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICBjd2QsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ldmFsLXBhdGhcIilcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEV2YWxQYXRoKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuICBvcHRzOiB7XG4gICAgY3dkPzogc3RyaW5nXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzFdYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzJdYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChkZXB0aCA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1heCBkZXB0aCBmb3IgaW1wb3J0cyByZWFjaGVkICgzMCkgSW1wb3J0IFBhdGg6ICR7Y3R4LmltcG9ydFN0YWNrLmpvaW4oXCIgLT4gXCIpfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9ucG0vXCIpKSB7XG4gICAgY29uc3QgcGtnTmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZSgvXlxcL25wbVxcLy8sIFwiXCIpLnJlcGxhY2UoL1xcL1xcK2VzbSQvLCBcIlwiKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZShcIiR7cGtnTmFtZX1cIilgKVxuICAgIGF3YWl0IGltcG9ydE5wbVBhY2thZ2UocGtnTmFtZSwgY3R4LCBkZXB0aClcbiAgICBjb25zdCBwa2cgPSBwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV1cbiAgICBpZiAocGtnKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwa2dcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCxcbiAgICB7IHRzQ29uZmlnOiBjdHgudHNDb25maWcgfSxcbiAgKVxuICBpZiAocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydExvY2FsRmlsZShcIiR7cmVzb2x2ZWRMb2NhbEltcG9ydFBhdGh9XCIpYClcbiAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgsIGN0eCwgZGVwdGgpXG4gICAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSAod2hpY2ggbWlnaHQgYmUgYSB0c2NvbmZpZyBwYXRoIGFsaWFzKSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgaWYgKGltcG9ydE5hbWUgIT09IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGhdXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBwYXR0ZXJuIGJ1dCBmYWlsZWQgdG8gcmVzb2x2ZVxuICAvLyBJZiBzbywgdGhyb3cgYW4gZXJyb3IgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8gbnBtXG4gIGNvbnN0IHRzQ29uZmlnID0gY3R4LnRzQ29uZmlnID8/IGdldFRzQ29uZmlnKGN0eC5mc01hcClcbiAgaWYgKCFjdHgudHNDb25maWcgJiYgdHNDb25maWcpIHtcbiAgICBjdHgudHNDb25maWcgPSB0c0NvbmZpZ1xuICB9XG4gIGlmIChtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihpbXBvcnROYW1lLCB0c0NvbmZpZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIGFsaWFzIGJ1dCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYW4gZXhpc3RpbmcgZmlsZSR7b3B0cy5jd2QgPyBgIGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cblxuICAvLyBUcnkgdG8gcmVzb2x2ZSBmcm9tIG5vZGVfbW9kdWxlc1xuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QgfHwgXCJcIixcbiAgKVxuICBpZiAocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aD1cIiR7cmVzb2x2ZWROb2RlTW9kdWxlUGF0aH1cImApXG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROb2RlTW9kdWxlKFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydFNuaXBwZXQoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0U25pcHBldChpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgaWYgKCFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROcG1QYWNrYWdlKFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydE5wbVBhY2thZ2UoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVW5yZXNvbHZlZCBpbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgJHtvcHRzLmN3ZCA/IGBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gIClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGhPclRocm93IH0gZnJvbSBcIi4vcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOnNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiKVxuXG5leHBvcnQgY29uc3Qgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkID0gKG9wdHM6IHtcbiAgZW50cnlwb2ludD86IHN0cmluZ1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50TmFtZT86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbn0pID0+IHtcbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgIW9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBpZiAoXCJpbmRleC50c3hcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c3hcIlxuICAgIH0gZWxzZSBpZiAoXCJpbmRleC50c1wiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzXCJcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgT2JqZWN0LmtleXMob3B0cy5mc01hcCkuZmlsdGVyKChrKSA9PiBrLmVuZHNXaXRoKFwiLnRzeFwiKSkubGVuZ3RoID09PSAxXG4gICAgKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gT2JqZWN0LmtleXMob3B0cy5mc01hcClbMF1cbiAgICB9IGVsc2UgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IG9wdHMuZnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudClcbiAgICAgICAgaWYgKGNvbmZpZy5tYWluRW50cnlwb2ludCkge1xuICAgICAgICAgIG9wdHMuZW50cnlwb2ludCA9IGNvbmZpZy5tYWluRW50cnlwb2ludFxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSB0c2NpcmN1aXQuY29uZmlnLmpzb246XCIsIGUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZW50cnlwb2ludCBvciBtYWluQ29tcG9uZW50UGF0aCBtdXN0IGJlIHByb3ZpZGVkIChubyBpbmRleCBmaWxlLCBjb3VsZCBub3QgaW5mZXIgZW50cnlwb2ludClcIixcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiBvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgb3B0cy5lbnRyeXBvaW50ID0gXCJlbnRyeXBvaW50LnRzeFwiXG4gICAgY29uc3QgbWFpbkNvbXBvbmVudENvZGUgPVxuICAgICAgb3B0cy5mc01hcFtyZXNvbHZlRmlsZVBhdGhPclRocm93KG9wdHMubWFpbkNvbXBvbmVudFBhdGgsIG9wdHMuZnNNYXApXVxuICAgIGlmICghbWFpbkNvbXBvbmVudENvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1haW4gY29tcG9uZW50IHBhdGggXCIke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCIgbm90IGZvdW5kIGluIGZzTWFwLiBBdmFpbGFibGUgcGF0aHM6ICR7T2JqZWN0LmtleXMob3B0cy5mc01hcCkuam9pbihcIiwgXCIpfWAsXG4gICAgICApXG4gICAgfVxuICAgIG9wdHMuZnNNYXBbb3B0cy5lbnRyeXBvaW50XSA9IGBcbiAgICAgaW1wb3J0ICogYXMgVXNlckNvbXBvbmVudHMgZnJvbSBcIi4vJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiO1xuICAgICAgICAgIFxuICAgICAgJHtcbiAgICAgICAgb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICAgICAgICAgID8gYFxuICAgICAgICBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzW1wiJHtvcHRzLm1haW5Db21wb25lbnROYW1lfVwiXVxuICAgICAgICBgXG4gICAgICAgICAgOiBgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50cy5kZWZhdWx0IHx8IFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKFVzZXJDb21wb25lbnRzKVxuICAgICAgICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcInVzZVwiKSlcbiAgICAgICAgICAubWFwKChbXywgY29tcG9uZW50XSkgPT4gY29tcG9uZW50KVswXSB8fCAoKCkgPT4gbnVsbCk7YFxuICAgICAgfVxuXG4gICAgICAgICAgICR7XG4gICAgICAgICAgICAgZGVidWcuZW5hYmxlZFxuICAgICAgICAgICAgICAgPyBgXG4gICAgIGNvbnNvbGUubG9nKHsgVXNlckNvbXBvbmVudHMgfSlcbiAgICAgY29uc29sZS5sb2coXCJDb21wb25lbnRUb1JlbmRlciBcIiArIENvbXBvbmVudFRvUmVuZGVyLnRvU3RyaW5nKCksICB7IENvbXBvbmVudFRvUmVuZGVyIH0pXG4gICAgIGBcbiAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICB9XG5cbiAgICAgIGNpcmN1aXQuYWRkKCAgICAgICBcbiAgICAgICAgICA8Q29tcG9uZW50VG9SZW5kZXIgJHtvcHRzLm1haW5Db21wb25lbnRQcm9wcyA/IGB7Li4uJHtKU09OLnN0cmluZ2lmeShvcHRzLm1haW5Db21wb25lbnRQcm9wcywgbnVsbCwgMil9fWAgOiBcIlwifSAvPiBcbiAgICAgICk7XG5gXG4gIH1cblxuICBpZiAoIW9wdHMubmFtZSAmJiBvcHRzLm1haW5Db21wb25lbnROYW1lKSB7XG4gICAgb3B0cy5uYW1lID0gb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmcsXG4pID0+IHtcbiAgaWYgKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICBlbnRyeXBvaW50ICYmXG4gICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJvb3RDaXJjdWl0IGhhcyBubyBjaGlsZHJlblwiKSAmJlxuICAgICFlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdcImVudHJ5cG9pbnRcIjonKVxuICApIHtcbiAgICBjb25zdCBlbnRyeXBvaW50TWVzc2FnZSA9IGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IGVudHJ5cG9pbnQuc2xpY2UoMilcbiAgICAgIDogZW50cnlwb2ludFxuICAgIGVycm9yLm1lc3NhZ2UgPSBgJHtlcnJvci5tZXNzYWdlfS4gXCJlbnRyeXBvaW50XCI6IFwiJHtlbnRyeXBvaW50TWVzc2FnZX1cIiBpcyBzZXQgaW4gdGhlIHJ1bm5lciBjb25maWd1cmF0aW9uLCBlbnRyeXBvaW50cyBtdXN0IGNvbnRhaW4gXCJjaXJjdWl0LmFkZCguLi4pXCIsIHlvdSBtaWdodCBiZSBsb29raW5nIHRvIHVzZSBtYWluQ29tcG9uZW50UGF0aCBpbnN0ZWFkIGlmIHlvdXIgZmlsZSBleHBvcnRzIGEgY29tcG9uZW50LmBcbiAgfVxuXG4gIHJldHVybiBlcnJvclxufVxuIiwgIi8qKlxuICogR2V0IGFsbCBwYXRocyBvZiBhbiBvYmplY3RcbiAqXG4gKiBnZXRPYmplY3RQYXRocyh7IGE6IHsgYjogMiwgYzogeyBkOiAzIH0gfSwgZTogNSB9KVxuICpcbiAqIC8vIE91dHB1dDogWydhLmInLCAnYS5jLmQnLCAnZSddXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RQYXRocyhcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwcmVmaXggPSBcIlwiLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldXG4gICAgY29uc3QgcGF0aCA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHN1YlBhdGhzID0gZ2V0T2JqZWN0UGF0aHModmFsdWUsIHBhdGgpXG4gICAgICBwYXRocy5wdXNoKC4uLnN1YlBhdGhzKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhdGhzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUF0UGF0aChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICB9XG4gIHJldHVybiBjdXJyZW50XG59XG4vKipcbiAqIFNldCBhIHZhbHVlIGF0IGEgcGF0aCBpbiBhbiBvYmplY3RcbiAqXG4gKiBzZXRWYWx1ZUF0UGF0aCh7IGE6IHsgYjogMiB9IH0sIFwiYS5jLmRcIiwgNSlcbiAqXG4gKiAvLyBPdXRwdXQ6IHsgYTogeyBiOiAyLCBjOiB7IGQ6IDUgfSB9IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQXRQYXRoKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbikge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuXG4gICAgLy8gSWYgd2UncmUgYXQgdGhlIGxhc3Qga2V5LCBzZXQgdGhlIHZhbHVlLlxuICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCBvciBpcyBub3QgYW4gb2JqZWN0IChhdm9pZCBvdmVyd3JpdGluZyBhcnJheXMpLCBjcmVhdGUgYSBuZXcgb2JqZWN0XG4gICAgICBpZiAoXG4gICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSB8fFxuICAgICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KGN1cnJlbnRba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSB7fVxuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IENpcmN1aXRSdW5uZXIgfSBmcm9tIFwiLi9DaXJjdWl0UnVubmVyXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRzY2lyY3VpdENvZGUoXG4gIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcsXG4gIG9wdHM/OiBPbWl0PFBhcmFtZXRlcnM8Q2lyY3VpdFJ1bm5lcltcImV4ZWN1dGVXaXRoRnNNYXBcIl0+WzBdLCBcImZzTWFwXCI+LFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICFmaWxlc3lzdGVtT3JDb2RlU3RyaW5nLmluY2x1ZGVzKFwiZXhwb3J0XCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgXCJleHBvcnRcIiBrZXl3b3JkIHdhc24ndCBmb3VuZCBpbiB5b3VyIHByb3ZpZGVkIGNvZGUuIFlvdSBuZWVkIHRvIGV4cG9ydCBhIGNvbXBvbmVudCBpbiB5b3VyIGNvZGUsIGUuZy5cXG5cXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXFxuICA8cmVzaXN0b3IgbmFtZT1cIlIxXCIgcmVzaXN0YW5jZT1cIjFrXCIgLz5cXG4pYCxcbiAgICApXG4gIH1cbiAgY29uc3QgZmlsZXN5c3RlbSA9XG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBcInVzZXItY29kZS50c3hcIjogZmlsZXN5c3RlbU9yQ29kZVN0cmluZyB9XG4gICAgICA6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmdcblxuICBjb25zdCBjaXJjdWl0UnVubmVyID0gbmV3IENpcmN1aXRSdW5uZXIoKVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgZnNNYXA6IGZpbGVzeXN0ZW0sXG4gICAgLi4ub3B0cyxcbiAgfSlcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgcmV0dXJuIGF3YWl0IGNpcmN1aXRSdW5uZXIuZ2V0Q2lyY3VpdEpzb24oKVxufVxuIiwgImltcG9ydCB7IHJ1blRzY2lyY3VpdENvZGUgfSBmcm9tIFwiLi9ydW5Uc2NpcmN1aXRDb2RlXCJcblxuZXhwb3J0IGNvbnN0IHJ1blRzY2lyY3VpdE1vZHVsZSA9IGFzeW5jIChcbiAgbW9kdWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBleHBvcnROYW1lPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIW1vZHVsZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIG1vZHVsZSA9IGBAdHNjaS8ke21vZHVsZS5yZXBsYWNlKC9cXC8vLCBcIi5cIil9YFxuICB9XG4gIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgcnVuVHNjaXJjdWl0Q29kZShcbiAgICB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBleHBvcnRzIHRoYXQgYXJlIG5vdCB0aGUgZGVmYXVsdCBleHBvcnQgYnkgc2Nhbm5pbmdcbiAgICAgIC8vIG90aGVyRXhwb3J0cyBmb3IgY29tcG9uZW50c1xuICAgICAgXCJ1c2VyLWNvZGUudHN4XCI6IGBcbiAgICBpbXBvcnQgTW9kdWxlLCAqIGFzIG90aGVyRXhwb3J0cyBmcm9tIFwiJHttb2R1bGV9XCI7XG5cbiAgICBsZXQgZXhwb3J0TmFtZSA9IFwiJHtvcHRzLmV4cG9ydE5hbWUgPz8gXCJcIn1cIlxuXG4gICAgaWYgKCghTW9kdWxlIHx8IHR5cGVvZiBNb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgJiYgIUJvb2xlYW4oZXhwb3J0TmFtZSkpIHtcbiAgICAgIGV4cG9ydE5hbWUgPSBPYmplY3Qua2V5cyhvdGhlckV4cG9ydHMpLmZpbHRlcihrZXkgPT4ga2V5WzBdID09PSBrZXlbMF0udG9VcHBlckNhc2UoKSAmJiB0eXBlb2Ygb3RoZXJFeHBvcnRzW2tleV0gPT09IFwiZnVuY3Rpb25cIilbMF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gZXhwb3J0TmFtZSA/IG90aGVyRXhwb3J0c1tleHBvcnROYW1lXSA6IE1vZHVsZVxuXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxgTm8gZXhwb3J0IGZvdW5kIGZvciBtb2R1bGUgXCJcXCR7bW9kdWxlfVwiICh0cmllZCBcIlxcJHtleHBvcnROYW1lID8/IFwiZGVmYXVsdFwifVwiKVxcYClcbiAgICB9XG5cbiAgICBleHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0O1xuICAgIGAsXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWluQ29tcG9uZW50UHJvcHM6IG9wdHMucHJvcHMsXG4gICAgfSxcbiAgKVxuICByZXR1cm4gY2lyY3VpdEpzb25cbn1cbiIsICJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB7IGdldE9iamVjdFBhdGhzLCBnZXRWYWx1ZUF0UGF0aCB9IGZyb20gXCIuL3NoYXJlZC9vYmotcGF0aFwiXG5cbmV4cG9ydCB0eXBlIHsgQ2lyY3VpdFdlYldvcmtlciwgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxuICB9XG4gIHZhciBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyID0gYXN5bmMgKFxuICBjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFdlYldvcmtlckNvbmZpZ3VyYXRpb24+LFxuKTogUHJvbWlzZTxDaXJjdWl0V2ViV29ya2VyPiA9PiB7XG4gIC8vIEtpbGwgZXhpc3RpbmcgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZSBpZiBwcmVzZW50XG4gIGNvbnN0IGV4aXN0aW5nV29ya2VyID0gZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSXG4gIGlmIChleGlzdGluZ1dvcmtlciAmJiB0eXBlb2YgZXhpc3RpbmdXb3JrZXIua2lsbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBLaWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UuLi5cIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nV29ya2VyLmtpbGwoKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiW1dvcmtlcl0gRXJyb3Iga2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlOlwiLFxuICAgICAgICAgIGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUga2V5IGlzIGNsZWFyZWQgZXZlbiBpZiBraWxsIHRocm93cyBhbiBlcnJvclxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gZXhpc3RpbmdXb3JrZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbV29ya2VyXSBDcmVhdGluZyBjaXJjdWl0IHdlYiB3b3JrZXIgd2l0aCBjb25maWc6XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgIClcbiAgfVxuXG4gIGxldCB3b3JrZXJCbG9iVXJsID1cbiAgICBjb25maWd1cmF0aW9uLndlYldvcmtlckJsb2JVcmwgPz8gY29uZmlndXJhdGlvbi53ZWJXb3JrZXJVcmxcblxuICBpZiAoIXdvcmtlckJsb2JVcmwpIHtcbiAgICBjb25zdCBjZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L2V2YWxAJHtjb25maWd1cmF0aW9uLmV2YWxWZXJzaW9uID8/IFwibGF0ZXN0XCJ9L2Rpc3Qvd2Vid29ya2VyL2VudHJ5cG9pbnQuanNgXG5cbiAgICBjb25zdCB3b3JrZXJCbG9iID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChjZG5VcmwpLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSlcbiAgICB3b3JrZXJCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh3b3JrZXJCbG9iKVxuICB9XG5cbiAgY29uc3QgcmF3V29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJCbG9iVXJsLCB7IHR5cGU6IFwibW9kdWxlXCIgfSlcbiAgbGV0IHdvcmtlckluaXRFcnJvcjogYW55XG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIEVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgICB3b3JrZXJJbml0RXJyb3IgPSBldmVudFxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gVW5oYW5kbGVkIHJlamVjdGlvbiBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZWVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBNZXNzYWdlIGVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgfSlcbiAgY29uc3QgZWFybHlNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBNZXNzYWdlIGluIHdvcmtlclwiLCBldmVudClcbiAgfVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZWFybHlNZXNzYWdlSGFuZGxlcilcblxuICAvLyBIYW5kbGUgZmV0Y2ggcmVxdWVzdHMgZnJvbSB0aGUgd29ya2VyXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBhc3luYyAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhXG4gICAgaWYgKGRhdGE/LnR5cGUgIT09IFwid29ya2VyX2ZldGNoXCIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChkYXRhLmlucHV0LCBkYXRhLmluaXQpXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcIndvcmtlcl9mZXRjaF9yZXN1bHRcIixcbiAgICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgICB9KSgpLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIHN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICBpZiAod29ya2VySW5pdEVycm9yKSB7XG4gICAgdGhyb3cgd29ya2VySW5pdEVycm9yXG4gIH1cblxuICBjb25zdCBjb21saW5rV29ya2VyID0gQ29tbGluay53cmFwPEludGVybmFsV2ViV29ya2VyQXBpPihyYXdXb3JrZXIpXG5cbiAgcmF3V29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGVscGVyIHRvIHNlcmlhbGl6ZSBSZWFjdCBlbGVtZW50cyBmb3IgY3Jvc3Mtd29ya2VyIGNvbW11bmljYXRpb25cbiAgZnVuY3Rpb24gc2VyaWFsaXplUmVhY3RFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZWxlbWVudFxuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgUmVhY3QgZWxlbWVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19pc1NlcmlhbGl6ZWRSZWFjdEVsZW1lbnQ6IHRydWUsXG4gICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgcHJvcHM6IHNlcmlhbGl6ZVByb3BzKGVsZW1lbnQucHJvcHMpLFxuICAgICAgICBrZXk6IGVsZW1lbnQua2V5LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICBmdW5jdGlvbiBzZXJpYWxpemVQcm9wcyhwcm9wczogYW55KTogYW55IHtcbiAgICBpZiAoIXByb3BzIHx8IHR5cGVvZiBwcm9wcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHByb3BzXG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZDogYW55ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiY2hpbGRyZW5cIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gdmFsdWUubWFwKHNlcmlhbGl6ZVJlYWN0RWxlbWVudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJpYWxpemVkW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZFxuICB9XG5cbiAgLy8gQ29uZGl0aW9uYWxseSBvdmVycmlkZSBnbG9iYWwgZmV0Y2ggaW5zaWRlIHRoZSB3b3JrZXIgdG8gcm91dGUgdGhyb3VnaCB0aGUgcGFyZW50XG4gIC8vIE9ubHkgZW5hYmxlIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgdmlhIGNvbmZpZ3VyYXRpb25cbiAgaWYgKGNvbmZpZ3VyYXRpb24uZW5hYmxlRmV0Y2hQcm94eSkge1xuICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7IHR5cGU6IFwib3ZlcnJpZGVfZ2xvYmFsX2ZldGNoXCIgfSlcbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCkge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0U25pcHBldHNBcGlCYXNlVXJsKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKVxuICB9XG5cbiAgY29uc3QgbWF5YmVQcm94eSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gQ29tbGluay5wcm94eSh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2V0T2JqZWN0UGF0aHMoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkpIHtcbiAgICAgIGF3YWl0IGNvbWxpbmtXb3JrZXJcbiAgICAgICAgLnNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkoXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtYXliZVByb3h5KGdldFZhbHVlQXRQYXRoKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHBhdGgpKSxcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igc2V0dGluZyBwbGF0Zm9ybSBjb25maWcgcHJvcGVydHkgJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG4gIGlmIChjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2V0T2JqZWN0UGF0aHMoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSkge1xuICAgICAgYXdhaXQgY29tbGlua1dvcmtlclxuICAgICAgICAuc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWF5YmVQcm94eShnZXRWYWx1ZUF0UGF0aChjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsIHBhdGgpKSxcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igc2V0dGluZyBwcm9qZWN0IGNvbmZpZyBwcm9wZXJ0eSAke3BhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBsZXQgaXNUZXJtaW5hdGVkID0gZmFsc2VcblxuICAvLyBDcmVhdGUgYSB3cmFwcGVyIHRoYXQgaGFuZGxlcyBldmVudHMgZGlyZWN0bHkgdGhyb3VnaCBjaXJjdWl0IGluc3RhbmNlXG4gIGNvbnN0IHdyYXBwZXI6IENpcmN1aXRXZWJXb3JrZXIgPSB7XG4gICAgY2xlYXJFdmVudExpc3RlbmVyczogY29tbGlua1dvcmtlci5jbGVhckV2ZW50TGlzdGVuZXJzLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZW5hYmxlRGVidWc6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGVuYWJsZURlYnVnXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5lbmFibGVEZWJ1Zy5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICB2ZXJzaW9uOiBjb21saW5rV29ya2VyLnZlcnNpb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBleGVjdXRlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIGV4ZWN1dGVDb21wb25lbnQ6IGFzeW5jIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlQ29tcG9uZW50XCIsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCBwYXNzIGl0IGFzLWlzICh3aWxsIGJlIHByb3hpZWQgYnkgQ29tbGluaylcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKGNvbXBvbmVudClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIFJlYWN0IGVsZW1lbnQsIHNlcmlhbGl6ZSBpdCB0byBhIHJlY29uc3RydWN0YWJsZSBmb3JtYXRcbiAgICAgIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBjb21wb25lbnQudHlwZSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkRWxlbWVudCA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudChjb21wb25lbnQpXG4gICAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShcbiAgICAgICAgICBzZXJpYWxpemVkRWxlbWVudCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgIH0sXG4gICAgZXhlY3V0ZVdpdGhGc01hcDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVdpdGhGc01hcFwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlV2l0aEZzTWFwLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHJlbmRlclVudGlsU2V0dGxlZDogY29tbGlua1dvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBnZXRDaXJjdWl0SnNvbjogY29tbGlua1dvcmtlci5nZXRDaXJjdWl0SnNvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3QgcHJveGllZENhbGxiYWNrID0gQ29tbGluay5wcm94eShjYWxsYmFjaylcbiAgICAgIGNvbWxpbmtXb3JrZXIub24oZXZlbnQgYXMgUm9vdENpcmN1aXRFdmVudE5hbWUsIHByb3hpZWRDYWxsYmFjaylcbiAgICB9LFxuICAgIGtpbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbWxpbmtXb3JrZXJbQ29tbGluay5yZWxlYXNlUHJveHldKClcbiAgICAgIHJhd1dvcmtlci50ZXJtaW5hdGUoKVxuICAgICAgaXNUZXJtaW5hdGVkID0gdHJ1ZVxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gd3JhcHBlcikge1xuICAgICAgICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICB9XG4gIDsod3JhcHBlciBhcyBhbnkpLl9fcmF3V29ya2VyID0gcmF3V29ya2VyXG4gIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHdyYXBwZXJcbiAgcmV0dXJuIHdyYXBwZXJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL3J1bm5lci9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCBjb25zdCBnZXRQb3NzaWJsZUVudHJ5cG9pbnRDb21wb25lbnRQYXRocyA9IChcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW3BhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZzTWFwKSkge1xuICAgIG5vcm1hbGl6ZWRGc01hcFtub3JtYWxpemVGaWxlUGF0aChwYXRoKV0gPSBjb250ZW50XG4gIH1cblxuICBjb25zdCBwb3NzaWJsZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gbm9ybWFsaXplZEZzTWFwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2Uobm9ybWFsaXplZEZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdKVxuICAgICAgaWYgKHR5cGVvZiBjb25maWcubWFpbkVudHJ5cG9pbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcG9zc2libGUuYWRkKG5vcm1hbGl6ZUZpbGVQYXRoKGNvbmZpZy5tYWluRW50cnlwb2ludCkpXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBpZ25vcmUgKi9cbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHN4XCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c3hcIilcbiAgaWYgKG5vcm1hbGl6ZWRGc01hcFtcImluZGV4LnRzXCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c1wiKVxuXG4gIGNvbnN0IGNpcmN1aXRGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIuY2lyY3VpdC50c3hcIiksXG4gIClcbiAgZm9yIChjb25zdCBmaWxlIG9mIGNpcmN1aXRGaWxlcykge1xuICAgIHBvc3NpYmxlLmFkZChmaWxlKVxuICB9XG5cbiAgY29uc3QgdHN4RmlsZXMgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkRnNNYXApLmZpbHRlcigoaykgPT5cbiAgICBrLmVuZHNXaXRoKFwiLnRzeFwiKSxcbiAgKVxuICBpZiAodHN4RmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcG9zc2libGUuYWRkKHRzeEZpbGVzWzBdKVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20ocG9zc2libGUpXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxtQkFBbUI7QUFFNUIsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSxXQUFXO0FBQ3ZCLFlBQVksd0JBQXdCOzs7QUNDN0IsSUFBTSxnQ0FBZ0MsQ0FDM0MsbUJBQ3VCO0FBRXZCLE1BQUksUUFBUSxlQUFlLE1BQU0sZ0JBQWdCO0FBQ2pELE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUl6QixVQUFRLGVBQWU7QUFBQSxJQUNyQjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLE1BQU8sUUFBTyxNQUFNLENBQUM7QUFFekIsU0FBTztBQUNUOzs7QUNoQk8sSUFBTSxxQ0FBcUMsQ0FDaEQsc0JBQ1c7QUFDWCxNQUFJLGtCQUFrQixTQUFTLEtBQUssR0FBRztBQUNyQyxXQUFPLGtCQUFrQixRQUFR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QixjQUFjLGVBQWUsS0FBSyxhQUFhO0FBQUEsSUFDL0QsSUFBSSxDQUFDLE9BQWUsYUFBdUM7QUFDekQsWUFBTSxrQkFBMEIsY0FBTSxRQUFRO0FBQzlDLG9CQUFjLEdBQUcsT0FBK0IsZUFBZTtBQUFBLElBQ2pFO0FBQUEsSUFDQSxNQUFNLFlBQVk7QUFDaEIsb0JBQXNCLG9CQUFZLEVBQUU7QUFDcEMsZ0JBQVUsVUFBVTtBQUNwQixxQkFBZTtBQUNmLFVBQUksV0FBVyxvQ0FBb0MsU0FBUztBQUMxRCxtQkFBVyxrQ0FBa0M7QUFBQSxNQUMvQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0MsRUFBQyxRQUFnQixjQUFjO0FBQ2hDLGFBQVcsa0NBQWtDO0FBQzdDLFNBQU87QUFDVDs7O0FDalJPLElBQU0sc0NBQXNDLENBQ2pELFVBQ2E7QUFDYixRQUFNLGtCQUEwQyxDQUFDO0FBQ2pELGFBQVcsQ0FBQyxNQUFNLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQ25ELG9CQUFnQixrQkFBa0IsSUFBSSxDQUFDLElBQUk7QUFBQSxFQUM3QztBQUVBLFFBQU0sV0FBVyxvQkFBSSxJQUFZO0FBRWpDLE1BQUksMkJBQTJCLGlCQUFpQjtBQUM5QyxRQUFJO0FBQ0YsWUFBTSxTQUFTLEtBQUssTUFBTSxnQkFBZ0IsdUJBQXVCLENBQUM7QUFDbEUsVUFBSSxPQUFPLE9BQU8sbUJBQW1CLFVBQVU7QUFDN0MsaUJBQVMsSUFBSSxrQkFBa0IsT0FBTyxjQUFjLENBQUM7QUFBQSxNQUN2RDtBQUFBLElBQ0YsUUFBUTtBQUFBLElBRVI7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsV0FBVyxFQUFHLFVBQVMsSUFBSSxXQUFXO0FBQzFELE1BQUksZ0JBQWdCLFVBQVUsRUFBRyxVQUFTLElBQUksVUFBVTtBQUV4RCxRQUFNLGVBQWUsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUN4RCxFQUFFLFNBQVMsY0FBYztBQUFBLEVBQzNCO0FBQ0EsYUFBVyxRQUFRLGNBQWM7QUFDL0IsYUFBUyxJQUFJLElBQUk7QUFBQSxFQUNuQjtBQUVBLFFBQU0sV0FBVyxPQUFPLEtBQUssZUFBZSxFQUFFO0FBQUEsSUFBTyxDQUFDLE1BQ3BELEVBQUUsU0FBUyxNQUFNO0FBQUEsRUFDbkI7QUFDQSxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLGFBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQztBQUFBLEVBQzFCO0FBRUEsU0FBTyxNQUFNLEtBQUssUUFBUTtBQUM1QjsiLAogICJuYW1lcyI6IFsiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiaW1wb3J0TmFtZSIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyJdCn0K
1763
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cC50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvdHNjb25maWdQYXRocy50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvc2hhcmVkL29iai1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0Q29kZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdE1vZHVsZS50cyIsICIuLi8uLi9saWIvd29ya2VyLnRzIiwgIi4uLy4uL2xpYi9nZXRQb3NzaWJsZUVudHJ5cG9pbnRDb21wb25lbnRQYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdENvcmUgZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0TWF0aFV0aWxzIGZyb20gXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcImxpYi9nZXRQbGF0Zm9ybUNvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnIH0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpleGVjdXRpb24tY29udGV4dFwiKVxuXG5pbnRlcmZhY2UgU3RvcmVkTG9nZ2VyIHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBnZXRMb2dzOiAoKSA9PiBBcnJheTx7IG1zZzogc3RyaW5nIH0+XG4gIHN0cmluZ2lmeUxvZ3M6ICgpID0+IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxuICBsb2dnZXI6IFN0b3JlZExvZ2dlclxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG4gIGltcG9ydFN0YWNrOiBzdHJpbmdbXVxuICBjdXJyZW50bHlJbXBvcnRpbmc6IFNldDxzdHJpbmc+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICB3ZWJXb3JrZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBvcHRzOiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHBsYXRmb3JtPzogUGxhdGZvcm1Db25maWdcbiAgICBwcm9qZWN0Q29uZmlnPzogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz5cbiAgICBkZWJ1Z05hbWVzcGFjZT86IHN0cmluZ1xuICB9ID0ge30sXG4pOiBFeGVjdXRpb25Db250ZXh0IHtcbiAgZ2xvYmFsVGhpcy5SZWFjdCA9IFJlYWN0XG5cbiAgY29uc3QgYmFzZVBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpXG4gIGNvbnN0IHBsYXRmb3JtID0gb3B0cy5wcm9qZWN0Q29uZmlnXG4gICAgPyB7IC4uLmJhc2VQbGF0Zm9ybSwgLi4ub3B0cy5wcm9qZWN0Q29uZmlnIH1cbiAgICA6IGJhc2VQbGF0Zm9ybVxuXG4gIGlmIChwbGF0Zm9ybS5wYXJ0c0VuZ2luZURpc2FibGVkKSB7XG4gICAgcGxhdGZvcm0ucGFydHNFbmdpbmUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNpcmN1aXQgPSBuZXcgUm9vdENpcmN1aXQoe1xuICAgIHBsYXRmb3JtLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIGlmIChvcHRzLmRlYnVnTmFtZXNwYWNlKSB7XG4gICAgY2lyY3VpdC5lbmFibGVEZWJ1ZyhvcHRzLmRlYnVnTmFtZXNwYWNlKVxuICB9XG5cbiAgY29uc3QgbG9nczogQXJyYXk8eyBtc2c6IHN0cmluZyB9PiA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBmc01hcDoge30sXG4gICAgZW50cnlwb2ludDogXCJcIixcbiAgICBsb2dnZXI6IHtcbiAgICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9ncy5wdXNoKHsgbXNnOiBtZXNzYWdlIH0pXG4gICAgICB9LFxuICAgICAgZ2V0TG9nczogKCkgPT4gbG9ncyxcbiAgICAgIHN0cmluZ2lmeUxvZ3M6ICgpID0+IGxvZ3MubWFwKChsb2cpID0+IGxvZy5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgfSxcbiAgICBwcmVTdXBwbGllZEltcG9ydHM6IHtcbiAgICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IHRzY2lyY3VpdENvcmUsXG4gICAgICB0c2NpcmN1aXQ6IHRzY2lyY3VpdENvcmUsXG4gICAgICBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiOiB0c2NpcmN1aXRNYXRoVXRpbHMsXG4gICAgICByZWFjdDogUmVhY3QsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBmaWxlUGF0aFRvUmVzb2x2ZSA9IGAke2Jhc2VVcmx9LyR7aW1wb3J0UGF0aH1gXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoVG9SZXNvbHZlKVxuXG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRGaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkRmlsZVBhdGgpIVxuICB9XG5cbiAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQod2l0aEV4dCkhXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKFxuICBpbXBvcnRQYXRoOiBzdHJpbmcsXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKGNvbnN0IFthbGlhc10gb2YgT2JqZWN0LmVudHJpZXMocGF0aHMpKSB7XG4gICAgY29uc3QgaGFzV2lsZGNhcmQgPSBhbGlhcy5pbmNsdWRlcyhcIipcIilcbiAgICBpZiAoaGFzV2lsZGNhcmQpIHtcbiAgICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBhbGlhcy5zcGxpdChcIipcIilcbiAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBpbXBvcnRQYXRoLmVuZHNXaXRoKHN1ZmZpeCB8fCBcIlwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW1wb3J0UGF0aCA9PT0gYWxpYXMpIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHR5cGUge1xuICBDaXJjdWl0UnVubmVyQXBpLFxuICBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IG5vcm1hbGl6ZUZzTWFwIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgZ2V0VHNDb25maWcgfSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCJ3ZWJ3b3JrZXIvaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuaW1wb3J0IHsgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yIH0gZnJvbSBcImxpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IHNldFZhbHVlQXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOkNpcmN1aXRSdW5uZXJcIilcblxuZXhwb3J0IGNsYXNzIENpcmN1aXRSdW5uZXIgaW1wbGVtZW50cyBDaXJjdWl0UnVubmVyQXBpIHtcbiAgX2V4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQ+IHwgbnVsbCA9IG51bGxcbiAgX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uOiBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBzbmlwcGV0c0FwaUJhc2VVcmw6IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiLFxuICAgIGNqc1JlZ2lzdHJ5VXJsOiBcImh0dHBzOi8vY2pzLnRzY2lyY3VpdC5jb21cIixcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgfVxuICBfZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsICgoLi4uYXJnczogYW55W10pID0+IHZvaWQpW10+ID0ge31cbiAgX2RlYnVnTmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uOiBQYXJ0aWFsPENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uPiA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gXCIwLjAuMFwiXG4gIH1cblxuICBhc3luYyBleGVjdXRlV2l0aEZzTWFwKG9nT3B0czoge1xuICAgIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gICAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBuYW1lPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub2dPcHRzIH1cblxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBEZWJ1Zy5lbmFibGUoXCJ0c2NpOmV2YWw6KlwiKVxuICAgIH1cblxuICAgIGRlYnVnKFwiZXhlY3V0ZVdpdGhGc01hcCBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICB9KVxuXG4gICAgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkKG9wdHMpXG5cbiAgICBkZWJ1ZyhcImVudHJ5cG9pbnQgYWZ0ZXIgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgfSlcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXAgPSBub3JtYWxpemVGc01hcChvcHRzLmZzTWFwKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtvcHRzLmVudHJ5cG9pbnQhXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRyeXBvaW50IFwiJHtvcHRzLmVudHJ5cG9pbnR9XCIgbm90IGZvdW5kYClcbiAgICB9XG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgY29uc3QgZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCEuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IG9wdHMuZW50cnlwb2ludFxuICAgICAgOiBgLi8ke29wdHMuZW50cnlwb2ludH1gXG5cbiAgICBkZWJ1ZyhcImZpbmFsIGVudHJ5cG9pbnQ6XCIsIGVudHJ5cG9pbnQpXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbXCJlbnRyeXBvaW50LnRzeFwiXSA9IGNvZGVcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChcIi4vZW50cnlwb2ludC50c3hcIiwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21wb25lbnQoY29tcG9uZW50OiBhbnksIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZUNvbXBvbmVudCBjYWxsZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBudWxsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZURlYnVnKG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVidWdOYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyBhbnlcbiAgICAgIGNpcmN1aXQuZW5hYmxlRGVidWc/LihuYW1lc3BhY2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEV2ZW50TGlzdGVuZXJzKGNpcmN1aXQ6IFJvb3RDaXJjdWl0KSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGxpc3RlbmVyIGFzIGFueSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBuYW1lIG9mIGEgcGF0aCwgc2ltaWxhciB0byBOb2RlLmpzIHBhdGguZGlybmFtZVxuICogV29ya3Mgb24gYm90aCBVbml4IGFuZCBXaW5kb3dzIHBhdGhzXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBleHRyYWN0IHRoZSBkaXJlY3RvcnkgZnJvbVxuICogQHJldHVybnMgVGhlIGRpcmVjdG9yeSBwYXJ0IG9mIHRoZSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcGF0aCkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gTm9ybWFsaXplIHBhdGggc2VwYXJhdG9ycyB0byBmb3J3YXJkIHNsYXNoZXNcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG5cbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXNcbiAgY29uc3QgY2xlYW5QYXRoID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuXG4gIC8vIElmIHRoZXJlIGFyZSBubyBzbGFzaGVzLCByZXR1cm4gXCIuXCJcbiAgaWYgKGNsZWFuUGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gLTEpIHJldHVybiBcIi5cIlxuXG4gIC8vIFJldHVybiBldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IHNsYXNoXG4gIHJldHVybiBjbGVhblBhdGguc3Vic3RyaW5nKDAsIGNsZWFuUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpIHx8IFwiL1wiXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG4vKipcbiAqIFJlc29sdmUgYW4gaW1wb3J0UGF0aCByZWxhdGl2ZSB0byBhIGN3ZCwgc3VwcG9ydGluZyAuLi8sIC4vIGFuZCBhYnNvbHV0ZSBwYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb25cbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IHBhcmVudERpciA9IGRpcm5hbWUoY3dkKVxuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMyksIHBhcmVudERpcilcbiAgfVxuICAvLyBIYW5kbGUgY3VycmVudCBkaXJlY3RvcnlcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgyKSwgY3dkKVxuICB9XG4gIC8vIEhhbmRsZSBhYnNvbHV0ZSBwYXRoXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgcmV0dXJuIGltcG9ydFBhdGguc2xpY2UoMSlcbiAgfVxuICAvLyBIYW5kbGUgcmVsYXRpdmUgcGF0aFxuICByZXR1cm4gYCR7Y3dkfS8ke2ltcG9ydFBhdGh9YFxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGggPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0czogeyB0c0NvbmZpZz86IFRzQ29uZmlnIHwgbnVsbCB9ID0ge30sXG4pID0+IHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvbiBwcm9wZXJseVxuICBjb25zdCByZXNvbHZlZFBhdGggPSBjd2RcbiAgICA/IHJlc29sdmVSZWxhdGl2ZVBhdGgodW5rbm93bkZpbGVQYXRoLCBjd2QpXG4gICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpIVxuICB9XG5cbiAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgY29uc3QgZXh0ZW5zaW9uID0gW1widHN4XCIsIFwidHNcIiwgXCJqc29uXCIsIFwianNcIiwgXCJqc3hcIiwgXCJvYmpcIiwgXCJnbHRmXCIsIFwiZ2xiXCJdXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgdXNpbmcgdHNjb25maWcgXCJwYXRoc1wiIG1hcHBpbmcgd2hlbiB0aGUgaW1wb3J0IGlzIG5vbi1yZWxhdGl2ZVxuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuXG4gIGlmICghdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tUGF0aHMgPSByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9uLFxuICAgICAgdHNDb25maWcsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb24sXG4gICAgICB0c0NvbmZpZyxcbiAgICB9KVxuICAgIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG4gIH1cblxuICAvLyBDaGVjayBpZiBpdCdzIGFuIGFic29sdXRlIGltcG9ydFxuICBpZiAoIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVua25vd25GaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aClcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGhPclRocm93ID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgdW5rbm93bkZpbGVQYXRoLFxuICAgIGZzTWFwT3JBbGxGaWxlUGF0aHMsXG4gICAgY3dkLFxuICAgIG9wdHMsXG4gIClcbiAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpbGUgbm90IGZvdW5kIFwiJHt1bmtub3duRmlsZVBhdGh9XCIsIGF2YWlsYWJsZSBwYXRoczpcXG5cXG4ke09iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLmpvaW4oXCIsIFwiKX1gLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRGaWxlUGF0aFxufVxuIiwgImV4cG9ydCBjb25zdCBnZXRJbXBvcnRzRnJvbUNvZGUgPSAoY29kZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAvLyBNYXRjaCBiYXNpYyBpbXBvcnQgcGF0dGVybnMgaW5jbHVkaW5nIGNvbWJpbmVkIGRlZmF1bHQgYW5kIG5hbWVzcGFjZSBpbXBvcnRzXG4gIGNvbnN0IGltcG9ydFJlZ2V4ID1cbiAgICAvXlxccyppbXBvcnRcXHMrKD86KD86W1xcd1xcc10rLFxccyopPyg/OlxcKlxccythc1xccytbXFx3XFxzXSt8XFx7W1xcc1xcdyxdK1xcfXxcXHcrKVxccytmcm9tXFxzKik/WydcIl0oLis/KVsnXCJdL2dtXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChtYXRjaCA9IGltcG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqaW1wb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKVxuICB9XG5cbiAgLy8gTWF0Y2ggcmUtZXhwb3J0c1xuICBjb25zdCByZUV4cG9ydFJlZ2V4ID1cbiAgICAvXlxccypleHBvcnRcXHMrKD86dHlwZVxccyspPyg/OlxcKlxccythc1xccytbXFx3JF0rfFxcKnxcXHtbXn1dK1xcfSlcXHMrZnJvbVxccypbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IHJlRXhwb3J0TWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqZXhwb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKHJlRXhwb3J0TWF0Y2hbMV0pXG4gIH1cblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsQ29tcGlsZWRKcyhcbiAgY29tcGlsZWRDb2RlOiBzdHJpbmcsXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY3dkPzogc3RyaW5nLFxuKSB7XG4gIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X3JlcXVpcmUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChuYW1lLCBwcmVTdXBwbGllZEltcG9ydHMsIGN3ZClcblxuICAgIGNvbnN0IGhhc1Jlc29sdmVkRmlsZVBhdGggPVxuICAgICAgcmVzb2x2ZWRGaWxlUGF0aCAmJiBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aF1cblxuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW25hbWVdICYmICFoYXNSZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCBcIiR7bmFtZX1cIiBub3QgZm91bmQgJHtjd2QgPyBgaW4gXCIke2N3ZH1cImAgOiBcIlwifWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSB8fCBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aCFdXG4gICAgcmV0dXJuIG5ldyBQcm94eShtb2QsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgaWYgKHByb3AgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRlZmF1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5fX2VzTW9kdWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9wID09PSBcIl9fZXNNb2R1bGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ29tcG9uZW50IFwiJHtTdHJpbmcocHJvcCl9XCIgaXMgbm90IGV4cG9ydGVkIGJ5IFwiJHtuYW1lfVwiYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF1cbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGZ1bmN0aW9uQm9keSA9IGBcbiAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgdmFyIHJlcXVpcmUgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X3JlcXVpcmU7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHMgfTtcbiAgdmFyIGNpcmN1aXQgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X2NpcmN1aXQ7XG4gICR7Y29tcGlsZWRDb2RlfTtcbiAgcmV0dXJuIG1vZHVsZTtgLnRyaW0oKVxuICByZXR1cm4gRnVuY3Rpb24oZnVuY3Rpb25Cb2R5KS5jYWxsKGdsb2JhbFRoaXMpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBpc1N0YXRpY0Fzc2V0UGF0aCB9IGZyb20gXCJsaWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcIi4vdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5pbXBvcnQgeyBLaWNhZFRvQ2lyY3VpdEpzb25Db252ZXJ0ZXIgfSBmcm9tIFwia2ljYWQtdG8tY2lyY3VpdC1qc29uXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbG9jYWwtZmlsZVwiKVxuXG5leHBvcnQgY29uc3QgaW1wb3J0TG9jYWxGaWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGRlYnVnKFwiaW1wb3J0TG9jYWxGaWxlIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgfSlcblxuICBjb25zdCB7IGZzTWFwLCBwcmVTdXBwbGllZEltcG9ydHMsIGltcG9ydFN0YWNrLCBjdXJyZW50bHlJbXBvcnRpbmcgfSA9IGN0eFxuXG4gIGNvbnN0IGZzUGF0aCA9IHJlc29sdmVGaWxlUGF0aE9yVGhyb3coaW1wb3J0TmFtZSwgZnNNYXAsIHVuZGVmaW5lZCwge1xuICAgIHRzQ29uZmlnOiBjdHgudHNDb25maWcsXG4gIH0pXG4gIGRlYnVnKFwiZnNQYXRoOlwiLCBmc1BhdGgpXG4gIGlmIChjdXJyZW50bHlJbXBvcnRpbmcuaGFzKGZzUGF0aCkpIHtcbiAgICBjb25zdCBjeWNsZVN0YXJ0SW5kZXggPSBpbXBvcnRTdGFjay5pbmRleE9mKGZzUGF0aClcbiAgICBjb25zdCBjeWNsZVBhdGggPVxuICAgICAgY3ljbGVTdGFydEluZGV4ID49IDBcbiAgICAgICAgPyBpbXBvcnRTdGFjay5zbGljZShjeWNsZVN0YXJ0SW5kZXgpLmNvbmNhdChmc1BhdGgpXG4gICAgICAgIDogWy4uLmltcG9ydFN0YWNrLCBmc1BhdGhdXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgd2hpbGUgaW1wb3J0aW5nIFwiJHtmc1BhdGh9XCIuIFRoZSBmb2xsb3dpbmcgaW1wb3J0IGNoYWluIGZvcm1zIGEgY3ljbGU6XFxuXFxuJHtjeWNsZVBhdGguam9pbihcbiAgICAgICAgXCIgLT4gXCIsXG4gICAgICApfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKCFjdHguZnNNYXBbZnNQYXRoXSkge1xuICAgIGRlYnVnKFwiZnNQYXRoIG5vdCBmb3VuZCBpbiBmc01hcDpcIiwgZnNQYXRoKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZnNQYXRofVwiIG5vdCBmb3VuZGApXG4gIH1cbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBmc01hcFtmc1BhdGhdXG4gIGRlYnVnKFwiZmlsZUNvbnRlbnQ6XCIsIGZpbGVDb250ZW50Py5zbGljZSgwLCAxMDApKVxuICBjdXJyZW50bHlJbXBvcnRpbmcuYWRkKGZzUGF0aClcbiAgaW1wb3J0U3RhY2sucHVzaChmc1BhdGgpXG4gIHRyeSB7XG4gICAgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDoganNvbkRhdGEsXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfcGNiXCIpKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyKClcbiAgICAgIGNvbnZlcnRlci5hZGRGaWxlKGZzUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICBjb252ZXJ0ZXIucnVuVW50aWxGaW5pc2hlZCgpXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGNvbnZlcnRlci5nZXRPdXRwdXQoKVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGNpcmN1aXRKc29uOiBjaXJjdWl0SnNvbixcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3RhdGljQXNzZXRQYXRoKGZzUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgIC8vIFVzZSBwcm9qZWN0QmFzZVVybCBmb3Igc3RhdGljIGZpbGUgaW1wb3J0c1xuICAgICAgY29uc3Qgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgIGZzUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgPyBmc1BhdGguc2xpY2UoMikgOiBmc1BhdGhcbiAgICAgIH1gXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDogc3RhdGljVXJsLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICAgIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGZpbGVDb250ZW50KVxuXG4gICAgICBmb3IgKGNvbnN0IGltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChpbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICAgICAgY3dkOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKVxuICAgICAgICBkZWJ1ZyhcImV2YWxDb21waWxlZEpzIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgICAgY29kZTogdHJhbnNmb3JtZWRDb2RlLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgZGlybmFtZTogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBpbXBvcnRSdW5SZXN1bHQgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgKVxuICAgICAgICBkZWJ1ZyhcImltcG9ydFJ1blJlc3VsdDpcIiwge1xuICAgICAgICAgIGZzUGF0aCxcbiAgICAgICAgICBpbXBvcnRSdW5SZXN1bHQsXG4gICAgICAgIH0pXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgICAgLy8gRm9yIC5qcyBmaWxlcywgZXNwZWNpYWxseSBmcm9tIG5vZGVfbW9kdWxlcywgd2UgbmVlZCB0byB0cmFuc2Zvcm0gdGhlbVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aCksXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgKS5leHBvcnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICAgIClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaW1wb3J0U3RhY2sucG9wKClcbiAgICBjdXJyZW50bHlJbXBvcnRpbmcuZGVsZXRlKGZzUGF0aClcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUyA9IFtcbiAgXCIuZ2xiXCIsXG4gIFwiLmtpY2FkX21vZFwiLFxuICBcIi5nbHRmXCIsXG4gIFwiLm9ialwiLFxuICBcIi5zdGxcIixcbl1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdGljQXNzZXRQYXRoID0gKHBhdGg6IHN0cmluZykgPT5cbiAgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBwYXRoLmVuZHNXaXRoKGV4dCkpXG4iLCAiaW1wb3J0IHsgdHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybSBhcyBTdWNyYXNlVHJhbnNmb3JtIH0gZnJvbSBcInN1Y3Jhc2VcIlxuXG5jb25zdCBUU19FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHNcIiwgXCIudHN4XCIsIFwiLm10c1wiLCBcIi5jdHNcIl0pXG5jb25zdCBKU1hfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzeFwiLCBcIi5qc3hcIiwgXCIudHNcIl0pXG5cbmNvbnN0IHN0cmlwUXVlcnlBbmRIYXNoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCI/XCIpXG4gIGNvbnN0IGhhc2hJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIjXCIpXG5cbiAgbGV0IGVuZEluZGV4ID0gZmlsZVBhdGgubGVuZ3RoXG5cbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xICYmIGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IE1hdGgubWluKHF1ZXJ5SW5kZXgsIGhhc2hJbmRleClcbiAgfSBlbHNlIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gcXVlcnlJbmRleFxuICB9IGVsc2UgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IGhhc2hJbmRleFxuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKDAsIGVuZEluZGV4KVxufVxuXG5jb25zdCBnZXRFeHRlbnNpb24gPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHN0cmlwUXVlcnlBbmRIYXNoKGZpbGVQYXRoKVxuICBjb25zdCBsYXN0RG90SW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi5cIilcblxuICBpZiAobGFzdERvdEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSxcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIiksXG4gIClcblxuICBpZiAobGFzdFNsYXNoSW5kZXggPiBsYXN0RG90SW5kZXgpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNsaWNlKGxhc3REb3RJbmRleCkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZVBhdGgpXG5cbiAgY29uc3QgdHJhbnNmb3JtczogU3VjcmFzZVRyYW5zZm9ybVtdID0gW1wiaW1wb3J0c1wiXVxuXG4gIGlmIChUU19FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy51bnNoaWZ0KFwidHlwZXNjcmlwdFwiKVxuICB9XG5cbiAgaWYgKEpTWF9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwianN4XCIpXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3Jtc1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgPSAoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybXMgPSBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oY29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG59XG5cbmludGVyZmFjZSBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICBiYXNlUGF0aDogc3RyaW5nXG4gIG1vZHVsZVBhdGg6IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBmc01hcCxcbiAgICBleHRlbnNpb25zOiBbXCIuanNcIiwgXCIuanN4XCIsIFwiLnRzXCIsIFwiLnRzeFwiLCBcIi5qc29uXCJdLFxuICAgIGJhc2VQYXRoLFxuICAgIG1vZHVsZVBhdGgsXG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLCBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCkge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9L3BhY2thZ2UuanNvbmBcbiAgaWYgKCFjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgYXMgUGFja2FnZUpzb25cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoXG4gIHBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGN0eC5mc01hcFtwYXRoXSkgcmV0dXJuIHBhdGhcblxuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHBhdGhXaXRoRXh0ID0gcGF0aC5yZXBsYWNlKC9cXC5qcyR8XFwuanN4JC8sIFwiXCIpICsgZXh0XG4gICAgaWYgKGN0eC5mc01hcFtwYXRoV2l0aEV4dF0pIHJldHVybiBwYXRoV2l0aEV4dFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgZXhwb3J0UGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBmdWxsRXhwb3J0UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtleHBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbEV4cG9ydFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcGFja2FnZUpzb24uZXhwb3J0cykgcmV0dXJuIG51bGxcblxuICAvLyBIYW5kbGUgZGVmYXVsdCBleHBvcnQgY29uZGl0aW9uXG4gIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzW1wiLlwiXVxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBkZWZhdWx0RXhwb3J0KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0RXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZGVmYXVsdEV4cG9ydCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBleHBvcnRzXG4gIGNvbnN0IHN1YnBhdGhFeHBvcnQgPSByZW1haW5pbmdQYXRoXG4gICAgPyBwYWNrYWdlSnNvbi5leHBvcnRzW2AuLyR7cmVtYWluaW5nUGF0aH1gXVxuICAgIDogbnVsbFxuICBpZiAoc3VicGF0aEV4cG9ydCAmJiB0eXBlb2Ygc3VicGF0aEV4cG9ydCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBzdWJwYXRoRXhwb3J0LCBjdHgpXG4gICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb25kaXRpb25hbCBleHBvcnRzXG4gIGNvbnN0IGltcG9ydEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCJpbXBvcnRcIl1cbiAgaWYgKFxuICAgIHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiZcbiAgICBpbXBvcnRFeHBvcnQgJiZcbiAgICB0eXBlb2YgaW1wb3J0RXhwb3J0ID09PSBcInN0cmluZ1wiXG4gICkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBpbXBvcnRFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09IFwiLlwiID8gXCJcIiA6IGAke3NlYXJjaFBhdGh9L2B9bm9kZV9tb2R1bGVzLyR7c2NvcGV9YFxuXG4gIC8vIFRyeSB0byBmaW5kIHBhY2thZ2UuanNvblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGgsIGN0eClcbiAgaWYgKHBhY2thZ2VKc29uKSB7XG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIGV4cG9ydHMgZmllbGRcbiAgICBjb25zdCBleHBvcnRzUmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgcmVtYWluaW5nUGF0aCxcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGV4cG9ydHNSZXNvbHV0aW9uKSByZXR1cm4gZXhwb3J0c1Jlc29sdXRpb25cblxuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBtYWluL21vZHVsZSBmaWVsZHNcbiAgICBjb25zdCBlbnRyeVBvaW50UmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRW50cnlQb2ludChcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZW50cnlQb2ludFJlc29sdXRpb24pIHJldHVybiBlbnRyeVBvaW50UmVzb2x1dGlvblxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyByZW1haW5pbmcgcGF0aFxuICBjb25zdCByZW1haW5pbmdQYXRoUmVzb2x1dGlvbiA9IHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICByZW1haW5pbmdQYXRoLFxuICAgIGN0eCxcbiAgKVxuICBpZiAocmVtYWluaW5nUGF0aFJlc29sdXRpb24pIHJldHVybiByZW1haW5pbmdQYXRoUmVzb2x1dGlvblxuXG4gIC8vIElmIG5vdCBmb3VuZCBhbmQgd2UgaGF2ZSBhIHBhcmVudCBkaXJlY3RvcnksIHRyeSB0aGVyZVxuICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShzZWFyY2hQYXRoKVxuICBpZiAocGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoICE9PSBzZWFyY2hQYXRoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKHBhcmVudFBhdGgsIGN0eClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZShcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KG1vZHVsZVBhdGgsIGZzTWFwLCBiYXNlUGF0aClcbiAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKGN0eC5iYXNlUGF0aCwgY3R4KVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ub2RlLW1vZHVsZVwiKVxuXG5leHBvcnQgY29uc3QgaW1wb3J0Tm9kZU1vZHVsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICBpZiAoIXJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgZGVidWcoYEF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiB1c2luZyBub2RlTW9kdWxlc1Jlc29sdmVyYClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBwbGF0Zm9ybS5ub2RlTW9kdWxlc1Jlc29sdmVyKGltcG9ydE5hbWUpXG5cbiAgICAgICAgaWYgKGZpbGVDb250ZW50KSB7XG4gICAgICAgICAgZGVidWcoYFN1Y2Nlc3NmdWxseSByZXNvbHZlZCBcIiR7aW1wb3J0TmFtZX1cIiB2aWEgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHJlc29sdmVkIGNvbnRlbnQgdG8gZnNNYXAgd2l0aCBhIHN5bnRoZXRpYyBwYXRoXG4gICAgICAgICAgLy8gQWRkIC50cyBleHRlbnNpb24gdG8gZW5zdXJlIGl0J3MgdHJlYXRlZCBhcyBhIG1vZHVsZSBmaWxlXG4gICAgICAgICAgY29uc3Qgc3ludGhldGljUGF0aCA9IGBub2RlX21vZHVsZXMvJHtpbXBvcnROYW1lfS50c2BcbiAgICAgICAgICBjdHguZnNNYXBbc3ludGhldGljUGF0aF0gPSBmaWxlQ29udGVudFxuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBmaWxlIHVzaW5nIHRoZSBub3JtYWwgZmxvd1xuICAgICAgICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShzeW50aGV0aWNQYXRoLCBjdHgsIGRlcHRoKVxuXG4gICAgICAgICAgLy8gTWFwIHRoZSBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3N5bnRoZXRpY1BhdGhdXG5cbiAgICAgICAgICAvLyBBbHNvIG1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXhcbiAgICAgICAgICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHN5bnRoZXRpY1BhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciByZXR1cm5lZCBudWxsIGZvciBcIiR7aW1wb3J0TmFtZX1cImApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiOmAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgbm90IGZvdW5kYClcbiAgfVxuXG4gIC8vIFVzZSBpbXBvcnRMb2NhbEZpbGUgdG8gaGFuZGxlIHRoZSBub2RlIG1vZHVsZVxuICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCwgY3R4LCBkZXB0aClcblxuICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGUncyBleHBvcnRzXG4gIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIE1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXggZm9yIGRpcmVjdCBpbXBvcnRzXG4gIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gSGFuZGxlIGluZGV4IGZpbGVzIHNwZWNpYWxseVxuICBpZiAoXG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c3hcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzXCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC5qc1wiKVxuICApIHtcbiAgICBjb25zdCBkaXJQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9cXC9pbmRleFxcLih0c3g/fGpzKSQvLCBcIlwiKVxuICAgIGNvbnN0IHVucHJlZml4ZWREaXJQYXRoID0gZGlyUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZERpclBhdGhdID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gICAgLy8gSGFuZGxlIHNjb3BlZCBwYWNrYWdlc1xuICAgIGlmICh1bnByZWZpeGVkRGlyUGF0aC5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgY29uc3Qgc2NvcGVQYXJ0cyA9IHVucHJlZml4ZWREaXJQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgaWYgKHNjb3BlUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVkTmFtZSA9IGAke3Njb3BlUGFydHNbMF19LyR7c2NvcGVQYXJ0c1sxXX1gXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tzY29wZWROYW1lXSA9XG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgfSBmcm9tIFwiLi90cmFuc2Zvcm0td2l0aC1zdWNyYXNlXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbnBtLXBhY2thZ2VcIilcblxuZnVuY3Rpb24gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IHByZWZpeCA9IFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9cIlxuICBpZiAodXJsLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnJlcGxhY2UoL1xcL1xcK2VzbSQvLCBcIlwiKVxuICB9XG4gIHJldHVybiB1cmxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydE5wbVBhY2thZ2UoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgZGVidWcoYGltcG9ydGluZyBucG0gcGFja2FnZTogJHtpbXBvcnROYW1lfWApXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSByZXR1cm5cblxuICBjb25zdCBucG1DZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS8ke2ltcG9ydE5hbWV9Lytlc21gXG5cbiAgbGV0IGZpbmFsVXJsOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29uc3QgeyBjb250ZW50LCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChucG1DZG5VcmwpXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgZmluYWxVcmwgPSByZXMudXJsXG4gICAgICBpZiAoIXJlcy5vaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmV0Y2ggXCIke2ltcG9ydE5hbWV9XCIgZnJvbSBqc2RlbGl2cjogJHtyZXMuc3RhdHVzVGV4dH1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNvbnRlbnQ6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIG5wbSBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW1wb3J0TmFtZSA9IGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cihmaW5hbFVybCEpXG4gIGNvbnN0IGN3ZCA9IGRpcm5hbWUoZmluYWxJbXBvcnROYW1lKVxuXG4gIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGNvbnRlbnQhKVxuICBmb3IgKGNvbnN0IHN1YkltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tzdWJJbXBvcnROYW1lXSkge1xuICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoc3ViSW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgY3dkLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShcbiAgICBjb250ZW50ISxcbiAgICBmaW5hbEltcG9ydE5hbWUgfHwgaW1wb3J0TmFtZSxcbiAgKVxuICB0cnkge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIHRyYW5zZm9ybWVkQ29kZSxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgIGN3ZCxcbiAgICApLmV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsSW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsVXJsIV0gPSBleHBvcnRzXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFdmFsIG5wbSBwYWNrYWdlIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlLm1lc3NhZ2V9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCB7IGltcG9ydFNuaXBwZXQgfSBmcm9tIFwiLi9pbXBvcnQtc25pcHBldFwiXG5pbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHsgaW1wb3J0Tm9kZU1vZHVsZSB9IGZyb20gXCIuL2ltcG9ydC1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROcG1QYWNrYWdlIH0gZnJvbSBcIi4vaW1wb3J0LW5wbS1wYWNrYWdlXCJcbmltcG9ydCB7XG4gIGdldFRzQ29uZmlnLFxuICBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybixcbn0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtZXZhbC1wYXRoXCIpXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRFdmFsUGF0aChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbiAgb3B0czoge1xuICAgIGN3ZD86IHN0cmluZ1xuICB9ID0ge30sXG4pIHtcbiAgZGVidWcoXCJpbXBvcnRFdmFsUGF0aCBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gICAgZGVwdGgsXG4gICAgb3B0cyxcbiAgfSlcbiAgY3R4LmxvZ2dlci5pbmZvKFxuICAgIGBpbXBvcnRFdmFsUGF0aChcIiR7aW1wb3J0TmFtZX1cIiwge2N3ZDogXCIke29wdHMuY3dkfVwiLCBkZXB0aDogJHtkZXB0aH19KWAsXG4gIClcblxuICBkZWJ1ZyhgJHtcIiAgXCIucmVwZWF0KGRlcHRoKX1cdTI3QTFcdUZFMEZgLCBpbXBvcnROYW1lKVxuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1sxXWApXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi4vXCIpICYmIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lLnNsaWNlKDIpXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1syXWApXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoZGVwdGggPiAzMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNYXggZGVwdGggZm9yIGltcG9ydHMgcmVhY2hlZCAoMzApIEltcG9ydCBQYXRoOiAke2N0eC5pbXBvcnRTdGFjay5qb2luKFwiIC0+IFwiKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvbnBtL1wiKSkge1xuICAgIGNvbnN0IHBrZ05hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoL15cXC9ucG1cXC8vLCBcIlwiKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke3BrZ05hbWV9XCIpYClcbiAgICBhd2FpdCBpbXBvcnROcG1QYWNrYWdlKHBrZ05hbWUsIGN0eCwgZGVwdGgpXG4gICAgY29uc3QgcGtnID0gcHJlU3VwcGxpZWRJbXBvcnRzW3BrZ05hbWVdXG4gICAgaWYgKHBrZykge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcGtnXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gICAgeyB0c0NvbmZpZzogY3R4LnRzQ29uZmlnIH0sXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRMb2NhbEZpbGUoXCIke3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRofVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoLCBjdHgsIGRlcHRoKVxuICAgIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgKHdoaWNoIG1pZ2h0IGJlIGEgdHNjb25maWcgcGF0aCBhbGlhcykgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgIGlmIChpbXBvcnROYW1lICE9PSByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID1cbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRoXVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggcGF0dGVybiBidXQgZmFpbGVkIHRvIHJlc29sdmVcbiAgLy8gSWYgc28sIHRocm93IGFuIGVycm9yIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIG5wbVxuICBjb25zdCB0c0NvbmZpZyA9IGN0eC50c0NvbmZpZyA/PyBnZXRUc0NvbmZpZyhjdHguZnNNYXApXG4gIGlmICghY3R4LnRzQ29uZmlnICYmIHRzQ29uZmlnKSB7XG4gICAgY3R4LnRzQ29uZmlnID0gdHNDb25maWdcbiAgfVxuICBpZiAobWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oaW1wb3J0TmFtZSwgdHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBhbGlhcyBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIGZpbGUke29wdHMuY3dkID8gYCBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgLy8gVHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkIHx8IFwiXCIsXG4gIClcbiAgaWYgKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYHJlc29sdmVkTm9kZU1vZHVsZVBhdGg9XCIke3Jlc29sdmVkTm9kZU1vZHVsZVBhdGh9XCJgKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICAvLyBJZiBub3QgZm91bmQgaW4gZnNNYXAgYnV0IG1pZ2h0IGJlIGEgbm9kZSBtb2R1bGUsIHRyeSBpbXBvcnROb2RlTW9kdWxlXG4gIC8vIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byB1c2Ugbm9kZU1vZHVsZXNSZXNvbHZlciBpZiBjb25maWd1cmVkXG4gIGlmIChcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKVxuICApIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICBgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIikgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgLFxuICAgICAgKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbnBtIENETmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRTbmlwcGV0KFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydFNuaXBwZXQoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmICghaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROcG1QYWNrYWdlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVucmVzb2x2ZWQgaW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiICR7b3B0cy5jd2QgPyBgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICApXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCIuL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIilcblxuZXhwb3J0IGNvbnN0IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCA9IChvcHRzOiB7XG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgbWFpbkNvbXBvbmVudFBhdGg/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59KSA9PiB7XG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmICFvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgaWYgKFwiaW5kZXgudHN4XCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHN4XCJcbiAgICB9IGVsc2UgaWYgKFwiaW5kZXgudHNcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c1wiXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLmZpbHRlcigoaykgPT4gay5lbmRzV2l0aChcIi50c3hcIikpLmxlbmd0aCA9PT0gMVxuICAgICkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApWzBdXG4gICAgfSBlbHNlIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBvcHRzLmZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpXG4gICAgICAgIGlmIChjb25maWcubWFpbkVudHJ5cG9pbnQpIHtcbiAgICAgICAgICBvcHRzLmVudHJ5cG9pbnQgPSBjb25maWcubWFpbkVudHJ5cG9pbnRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgdHNjaXJjdWl0LmNvbmZpZy5qc29uOlwiLCBlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIGVudHJ5cG9pbnQgb3IgbWFpbkNvbXBvbmVudFBhdGggbXVzdCBiZSBwcm92aWRlZCAobm8gaW5kZXggZmlsZSwgY291bGQgbm90IGluZmVyIGVudHJ5cG9pbnQpXCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIG9wdHMuZW50cnlwb2ludCA9IFwiZW50cnlwb2ludC50c3hcIlxuICAgIGNvbnN0IG1haW5Db21wb25lbnRDb2RlID1cbiAgICAgIG9wdHMuZnNNYXBbcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhvcHRzLm1haW5Db21wb25lbnRQYXRoLCBvcHRzLmZzTWFwKV1cbiAgICBpZiAoIW1haW5Db21wb25lbnRDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYWluIGNvbXBvbmVudCBwYXRoIFwiJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiIG5vdCBmb3VuZCBpbiBmc01hcC4gQXZhaWxhYmxlIHBhdGhzOiAke09iamVjdC5rZXlzKG9wdHMuZnNNYXApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBvcHRzLmZzTWFwW29wdHMuZW50cnlwb2ludF0gPSBgXG4gICAgIGltcG9ydCAqIGFzIFVzZXJDb21wb25lbnRzIGZyb20gXCIuLyR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIjtcbiAgICAgICAgICBcbiAgICAgICR7XG4gICAgICAgIG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgICAgICAgICA/IGBcbiAgICAgICAgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50c1tcIiR7b3B0cy5tYWluQ29tcG9uZW50TmFtZX1cIl1cbiAgICAgICAgYFxuICAgICAgICAgIDogYGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHMuZGVmYXVsdCB8fCBcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhVc2VyQ29tcG9uZW50cylcbiAgICAgICAgICAuZmlsdGVyKChbbmFtZV0pID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJ1c2VcIikpXG4gICAgICAgICAgLm1hcCgoW18sIGNvbXBvbmVudF0pID0+IGNvbXBvbmVudClbMF0gfHwgKCgpID0+IG51bGwpO2BcbiAgICAgIH1cblxuICAgICAgICAgICAke1xuICAgICAgICAgICAgIGRlYnVnLmVuYWJsZWRcbiAgICAgICAgICAgICAgID8gYFxuICAgICBjb25zb2xlLmxvZyh7IFVzZXJDb21wb25lbnRzIH0pXG4gICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50VG9SZW5kZXIgXCIgKyBDb21wb25lbnRUb1JlbmRlci50b1N0cmluZygpLCAgeyBDb21wb25lbnRUb1JlbmRlciB9KVxuICAgICBgXG4gICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgfVxuXG4gICAgICBjaXJjdWl0LmFkZCggICAgICAgXG4gICAgICAgICAgPENvbXBvbmVudFRvUmVuZGVyICR7b3B0cy5tYWluQ29tcG9uZW50UHJvcHMgPyBgey4uLiR7SlNPTi5zdHJpbmdpZnkob3B0cy5tYWluQ29tcG9uZW50UHJvcHMsIG51bGwsIDIpfX1gIDogXCJcIn0gLz4gXG4gICAgICApO1xuYFxuICB9XG5cbiAgaWYgKCFvcHRzLm5hbWUgJiYgb3B0cy5tYWluQ29tcG9uZW50TmFtZSkge1xuICAgIG9wdHMubmFtZSA9IG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBlbnRyeXBvaW50Pzogc3RyaW5nLFxuKSA9PiB7XG4gIGlmIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgZW50cnlwb2ludCAmJlxuICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSb290Q2lyY3VpdCBoYXMgbm8gY2hpbGRyZW5cIikgJiZcbiAgICAhZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnXCJlbnRyeXBvaW50XCI6JylcbiAgKSB7XG4gICAgY29uc3QgZW50cnlwb2ludE1lc3NhZ2UgPSBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBlbnRyeXBvaW50LnNsaWNlKDIpXG4gICAgICA6IGVudHJ5cG9pbnRcbiAgICBlcnJvci5tZXNzYWdlID0gYCR7ZXJyb3IubWVzc2FnZX0uIFwiZW50cnlwb2ludFwiOiBcIiR7ZW50cnlwb2ludE1lc3NhZ2V9XCIgaXMgc2V0IGluIHRoZSBydW5uZXIgY29uZmlndXJhdGlvbiwgZW50cnlwb2ludHMgbXVzdCBjb250YWluIFwiY2lyY3VpdC5hZGQoLi4uKVwiLCB5b3UgbWlnaHQgYmUgbG9va2luZyB0byB1c2UgbWFpbkNvbXBvbmVudFBhdGggaW5zdGVhZCBpZiB5b3VyIGZpbGUgZXhwb3J0cyBhIGNvbXBvbmVudC5gXG4gIH1cblxuICByZXR1cm4gZXJyb3Jcbn1cbiIsICIvKipcbiAqIEdldCBhbGwgcGF0aHMgb2YgYW4gb2JqZWN0XG4gKlxuICogZ2V0T2JqZWN0UGF0aHMoeyBhOiB7IGI6IDIsIGM6IHsgZDogMyB9IH0sIGU6IDUgfSlcbiAqXG4gKiAvLyBPdXRwdXQ6IFsnYS5iJywgJ2EuYy5kJywgJ2UnXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqZWN0UGF0aHMoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJlZml4ID0gXCJcIixcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuICAgIGNvbnN0IHBhdGggPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBzdWJQYXRocyA9IGdldE9iamVjdFBhdGhzKHZhbHVlLCBwYXRoKVxuICAgICAgcGF0aHMucHVzaCguLi5zdWJQYXRocylcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aHMucHVzaChwYXRoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRoc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVBdFBhdGgob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuLyoqXG4gKiBTZXQgYSB2YWx1ZSBhdCBhIHBhdGggaW4gYW4gb2JqZWN0XG4gKlxuICogc2V0VmFsdWVBdFBhdGgoeyBhOiB7IGI6IDIgfSB9LCBcImEuYy5kXCIsIDUpXG4gKlxuICogLy8gT3V0cHV0OiB7IGE6IHsgYjogMiwgYzogeyBkOiA1IH0gfSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUF0UGF0aChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4pIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cblxuICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBsYXN0IGtleSwgc2V0IHRoZSB2YWx1ZS5cbiAgICBpZiAoaSA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IGFuIG9iamVjdCAoYXZvaWQgb3ZlcndyaXRpbmcgYXJyYXlzKSwgY3JlYXRlIGEgbmV3IG9iamVjdFxuICAgICAgaWYgKFxuICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkgfHxcbiAgICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICBjdXJyZW50W2tleV0gPT09IG51bGwgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShjdXJyZW50W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge31cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDaXJjdWl0UnVubmVyIH0gZnJvbSBcIi4vQ2lyY3VpdFJ1bm5lclwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Uc2NpcmN1aXRDb2RlKFxuICBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nLFxuICBvcHRzPzogT21pdDxQYXJhbWV0ZXJzPENpcmN1aXRSdW5uZXJbXCJleGVjdXRlV2l0aEZzTWFwXCJdPlswXSwgXCJmc01hcFwiPixcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCIgJiZcbiAgICAhZmlsZXN5c3RlbU9yQ29kZVN0cmluZy5pbmNsdWRlcyhcImV4cG9ydFwiKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIFwiZXhwb3J0XCIga2V5d29yZCB3YXNuJ3QgZm91bmQgaW4geW91ciBwcm92aWRlZCBjb2RlLiBZb3UgbmVlZCB0byBleHBvcnQgYSBjb21wb25lbnQgaW4geW91ciBjb2RlLCBlLmcuXFxuXFxuZXhwb3J0IGRlZmF1bHQgKCkgPT4gKFxcbiAgPHJlc2lzdG9yIG5hbWU9XCJSMVwiIHJlc2lzdGFuY2U9XCIxa1wiIC8+XFxuKWAsXG4gICAgKVxuICB9XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPVxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiXG4gICAgICA/IHsgXCJ1c2VyLWNvZGUudHN4XCI6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgfVxuICAgICAgOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nXG5cbiAgY29uc3QgY2lyY3VpdFJ1bm5lciA9IG5ldyBDaXJjdWl0UnVubmVyKClcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgIGZzTWFwOiBmaWxlc3lzdGVtLFxuICAgIC4uLm9wdHMsXG4gIH0pXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gIHJldHVybiBhd2FpdCBjaXJjdWl0UnVubmVyLmdldENpcmN1aXRKc29uKClcbn1cbiIsICJpbXBvcnQgeyBydW5Uc2NpcmN1aXRDb2RlIH0gZnJvbSBcIi4vcnVuVHNjaXJjdWl0Q29kZVwiXG5cbmV4cG9ydCBjb25zdCBydW5Uc2NpcmN1aXRNb2R1bGUgPSBhc3luYyAoXG4gIG1vZHVsZTogc3RyaW5nLFxuICBvcHRzOiB7IHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjsgZXhwb3J0TmFtZT86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgaWYgKCFtb2R1bGUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICBtb2R1bGUgPSBgQHRzY2kvJHttb2R1bGUucmVwbGFjZSgvXFwvLywgXCIuXCIpfWBcbiAgfVxuICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHJ1blRzY2lyY3VpdENvZGUoXG4gICAge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgZXhwb3J0cyB0aGF0IGFyZSBub3QgdGhlIGRlZmF1bHQgZXhwb3J0IGJ5IHNjYW5uaW5nXG4gICAgICAvLyBvdGhlckV4cG9ydHMgZm9yIGNvbXBvbmVudHNcbiAgICAgIFwidXNlci1jb2RlLnRzeFwiOiBgXG4gICAgaW1wb3J0IE1vZHVsZSwgKiBhcyBvdGhlckV4cG9ydHMgZnJvbSBcIiR7bW9kdWxlfVwiO1xuXG4gICAgbGV0IGV4cG9ydE5hbWUgPSBcIiR7b3B0cy5leHBvcnROYW1lID8/IFwiXCJ9XCJcblxuICAgIGlmICgoIU1vZHVsZSB8fCB0eXBlb2YgTW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpICYmICFCb29sZWFuKGV4cG9ydE5hbWUpKSB7XG4gICAgICBleHBvcnROYW1lID0gT2JqZWN0LmtleXMob3RoZXJFeHBvcnRzKS5maWx0ZXIoa2V5ID0+IGtleVswXSA9PT0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgJiYgdHlwZW9mIG90aGVyRXhwb3J0c1trZXldID09PSBcImZ1bmN0aW9uXCIpWzBdXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IGV4cG9ydE5hbWUgPyBvdGhlckV4cG9ydHNbZXhwb3J0TmFtZV0gOiBNb2R1bGVcblxuICAgIGlmICghZGVmYXVsdEV4cG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxcYE5vIGV4cG9ydCBmb3VuZCBmb3IgbW9kdWxlIFwiXFwke21vZHVsZX1cIiAodHJpZWQgXCJcXCR7ZXhwb3J0TmFtZSA/PyBcImRlZmF1bHRcIn1cIilcXGApXG4gICAgfVxuXG4gICAgZXhwb3J0IGRlZmF1bHQgZGVmYXVsdEV4cG9ydDtcbiAgICBgLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFpbkNvbXBvbmVudFByb3BzOiBvcHRzLnByb3BzLFxuICAgIH0sXG4gIClcbiAgcmV0dXJuIGNpcmN1aXRKc29uXG59XG4iLCAiaW1wb3J0ICogYXMgQ29tbGluayBmcm9tIFwiY29tbGlua1wiXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9pbmRleFwiXG5pbXBvcnQgdHlwZSB7XG4gIEludGVybmFsV2ViV29ya2VyQXBpLFxuICBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBDaXJjdWl0V2ViV29ya2VyLFxufSBmcm9tIFwiLi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdEV2ZW50TmFtZSB9IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgeyBnZXRPYmplY3RQYXRocywgZ2V0VmFsdWVBdFBhdGggfSBmcm9tIFwiLi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5leHBvcnQgdHlwZSB7IENpcmN1aXRXZWJXb3JrZXIsIFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbiAgfVxuICB2YXIgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciA9IGFzeW5jIChcbiAgY29uZmlndXJhdGlvbjogUGFydGlhbDxXZWJXb3JrZXJDb25maWd1cmF0aW9uPixcbik6IFByb21pc2U8Q2lyY3VpdFdlYldvcmtlcj4gPT4ge1xuICAvLyBLaWxsIGV4aXN0aW5nIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UgaWYgcHJlc2VudFxuICBjb25zdCBleGlzdGluZ1dvcmtlciA9IGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUlxuICBpZiAoZXhpc3RpbmdXb3JrZXIgJiYgdHlwZW9mIGV4aXN0aW5nV29ya2VyLmtpbGwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gS2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlLi4uXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1dvcmtlci5raWxsKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltXb3JrZXJdIEVycm9yIGtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZTpcIixcbiAgICAgICAgICBlLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhlIGtleSBpcyBjbGVhcmVkIGV2ZW4gaWYga2lsbCB0aHJvd3MgYW4gZXJyb3JcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IGV4aXN0aW5nV29ya2VyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW1dvcmtlcl0gQ3JlYXRpbmcgY2lyY3VpdCB3ZWIgd29ya2VyIHdpdGggY29uZmlnOlwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICApXG4gIH1cblxuICBsZXQgd29ya2VyQmxvYlVybCA9XG4gICAgY29uZmlndXJhdGlvbi53ZWJXb3JrZXJCbG9iVXJsID8/IGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyVXJsXG5cbiAgaWYgKCF3b3JrZXJCbG9iVXJsKSB7XG4gICAgY29uc3QgY2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ldmFsQCR7Y29uZmlndXJhdGlvbi5ldmFsVmVyc2lvbiA/PyBcImxhdGVzdFwifS9kaXN0L3dlYndvcmtlci9lbnRyeXBvaW50LmpzYFxuXG4gICAgY29uc3Qgd29ya2VyQmxvYiA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGxldCB3b3JrZXJJbml0RXJyb3I6IGFueVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBFcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gICAgd29ya2VySW5pdEVycm9yID0gZXZlbnRcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIFVuaGFuZGxlZCByZWplY3Rpb24gaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gTWVzc2FnZSBlcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIGNvbnN0IGVhcmx5TWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gTWVzc2FnZSBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH1cbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGFuZGxlIGZldGNoIHJlcXVlc3RzIGZyb20gdGhlIHdvcmtlclxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YVxuICAgIGlmIChkYXRhPy50eXBlICE9PSBcIndvcmtlcl9mZXRjaFwiKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goZGF0YS5pbnB1dCwgZGF0YS5pbml0KVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBuYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHdvcmtlckluaXRFcnJvcikge1xuICAgIHRocm93IHdvcmtlckluaXRFcnJvclxuICB9XG5cbiAgY29uc3QgY29tbGlua1dvcmtlciA9IENvbWxpbmsud3JhcDxJbnRlcm5hbFdlYldvcmtlckFwaT4ocmF3V29ya2VyKVxuXG4gIHJhd1dvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhlbHBlciB0byBzZXJpYWxpemUgUmVhY3QgZWxlbWVudHMgZm9yIGNyb3NzLXdvcmtlciBjb21tdW5pY2F0aW9uXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVJlYWN0RWxlbWVudChlbGVtZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIFJlYWN0IGVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9faXNTZXJpYWxpemVkUmVhY3RFbGVtZW50OiB0cnVlLFxuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHByb3BzOiBzZXJpYWxpemVQcm9wcyhlbGVtZW50LnByb3BzKSxcbiAgICAgICAga2V5OiBlbGVtZW50LmtleSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplUHJvcHMocHJvcHM6IGFueSk6IGFueSB7XG4gICAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwcm9wc1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IGFueSA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHZhbHVlLm1hcChzZXJpYWxpemVSZWFjdEVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRcbiAgfVxuXG4gIC8vIENvbmRpdGlvbmFsbHkgb3ZlcnJpZGUgZ2xvYmFsIGZldGNoIGluc2lkZSB0aGUgd29ya2VyIHRvIHJvdXRlIHRocm91Z2ggdGhlIHBhcmVudFxuICAvLyBPbmx5IGVuYWJsZSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHZpYSBjb25maWd1cmF0aW9uXG4gIGlmIChjb25maWd1cmF0aW9uLmVuYWJsZUZldGNoUHJveHkpIHtcbiAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIm92ZXJyaWRlX2dsb2JhbF9mZXRjaFwiIH0pXG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFNuaXBwZXRzQXBpQmFzZVVybChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybClcbiAgfVxuXG4gIGNvbnN0IG1heWJlUHJveHkgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIENvbWxpbmsucHJveHkodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIGlmIChjb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGdldE9iamVjdFBhdGhzKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pKSB7XG4gICAgICBhd2FpdCBjb21saW5rV29ya2VyXG4gICAgICAgIC5zZXRQbGF0Zm9ybUNvbmZpZ1Byb3BlcnR5KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWF5YmVQcm94eShnZXRWYWx1ZUF0UGF0aChjb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwYXRoKSksXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHNldHRpbmcgcGxhdGZvcm0gY29uZmlnIHByb3BlcnR5ICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGdldE9iamVjdFBhdGhzKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykpIHtcbiAgICAgIGF3YWl0IGNvbWxpbmtXb3JrZXJcbiAgICAgICAgLnNldFByb2plY3RDb25maWdQcm9wZXJ0eShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1heWJlUHJveHkoZ2V0VmFsdWVBdFBhdGgoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLCBwYXRoKSksXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHNldHRpbmcgcHJvamVjdCBjb25maWcgcHJvcGVydHkgJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgbGV0IGlzVGVybWluYXRlZCA9IGZhbHNlXG5cbiAgLy8gQ3JlYXRlIGEgd3JhcHBlciB0aGF0IGhhbmRsZXMgZXZlbnRzIGRpcmVjdGx5IHRocm91Z2ggY2lyY3VpdCBpbnN0YW5jZVxuICBjb25zdCB3cmFwcGVyOiBDaXJjdWl0V2ViV29ya2VyID0ge1xuICAgIGNsZWFyRXZlbnRMaXN0ZW5lcnM6IGNvbWxpbmtXb3JrZXIuY2xlYXJFdmVudExpc3RlbmVycy5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGVuYWJsZURlYnVnOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBlbmFibGVEZWJ1Z1wiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZW5hYmxlRGVidWcuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgdmVyc2lvbjogY29tbGlua1dvcmtlci52ZXJzaW9uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZXhlY3V0ZTogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVwiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZS5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICBleGVjdXRlQ29tcG9uZW50OiBhc3luYyAoY29tcG9uZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZUNvbXBvbmVudFwiLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgcGFzcyBpdCBhcy1pcyAod2lsbCBiZSBwcm94aWVkIGJ5IENvbWxpbmspXG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBSZWFjdCBlbGVtZW50LCBzZXJpYWxpemUgaXQgdG8gYSByZWNvbnN0cnVjdGFibGUgZm9ybWF0XG4gICAgICBpZiAoY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQgPT09IFwib2JqZWN0XCIgJiYgY29tcG9uZW50LnR5cGUpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZEVsZW1lbnQgPSBzZXJpYWxpemVSZWFjdEVsZW1lbnQoY29tcG9uZW50KVxuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoXG4gICAgICAgICAgc2VyaWFsaXplZEVsZW1lbnQsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKGNvbXBvbmVudClcbiAgICB9LFxuICAgIGV4ZWN1dGVXaXRoRnNNYXA6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVXaXRoRnNNYXBcIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZVdpdGhGc01hcC5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICByZW5kZXJVbnRpbFNldHRsZWQ6IGNvbWxpbmtXb3JrZXIucmVuZGVyVW50aWxTZXR0bGVkLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZ2V0Q2lyY3VpdEpzb246IGNvbWxpbmtXb3JrZXIuZ2V0Q2lyY3VpdEpzb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHByb3hpZWRDYWxsYmFjayA9IENvbWxpbmsucHJveHkoY2FsbGJhY2spXG4gICAgICBjb21saW5rV29ya2VyLm9uKGV2ZW50IGFzIFJvb3RDaXJjdWl0RXZlbnROYW1lLCBwcm94aWVkQ2FsbGJhY2spXG4gICAgfSxcbiAgICBraWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb21saW5rV29ya2VyW0NvbWxpbmsucmVsZWFzZVByb3h5XSgpXG4gICAgICByYXdXb3JrZXIudGVybWluYXRlKClcbiAgICAgIGlzVGVybWluYXRlZCA9IHRydWVcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IHdyYXBwZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgfVxuICA7KHdyYXBwZXIgYXMgYW55KS5fX3Jhd1dvcmtlciA9IHJhd1dvcmtlclxuICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB3cmFwcGVyXG4gIHJldHVybiB3cmFwcGVyXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ydW5uZXIvbm9ybWFsaXplRnNNYXBcIlxuXG5leHBvcnQgY29uc3QgZ2V0UG9zc2libGVFbnRyeXBvaW50Q29tcG9uZW50UGF0aHMgPSAoXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBub3JtYWxpemVkRnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtwYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmc01hcCkpIHtcbiAgICBub3JtYWxpemVkRnNNYXBbbm9ybWFsaXplRmlsZVBhdGgocGF0aCldID0gY29udGVudFxuICB9XG5cbiAgY29uc3QgcG9zc2libGUgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG5vcm1hbGl6ZWRGc01hcCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKG5vcm1hbGl6ZWRGc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXSlcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLm1haW5FbnRyeXBvaW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBvc3NpYmxlLmFkZChub3JtYWxpemVGaWxlUGF0aChjb25maWcubWFpbkVudHJ5cG9pbnQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRGc01hcFtcImluZGV4LnRzeFwiXSkgcG9zc2libGUuYWRkKFwiaW5kZXgudHN4XCIpXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c1wiXSkgcG9zc2libGUuYWRkKFwiaW5kZXgudHNcIilcblxuICBjb25zdCBjaXJjdWl0RmlsZXMgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkRnNNYXApLmZpbHRlcigoaykgPT5cbiAgICBrLmVuZHNXaXRoKFwiLmNpcmN1aXQudHN4XCIpLFxuICApXG4gIGZvciAoY29uc3QgZmlsZSBvZiBjaXJjdWl0RmlsZXMpIHtcbiAgICBwb3NzaWJsZS5hZGQoZmlsZSlcbiAgfVxuXG4gIGNvbnN0IHRzeEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi50c3hcIiksXG4gIClcbiAgaWYgKHRzeEZpbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHBvc3NpYmxlLmFkZCh0c3hGaWxlc1swXSlcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKHBvc3NpYmxlKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtB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QUF1QixDQUFDO0FBQ2xFLFVBQUksT0FBTyxPQUFPLG1CQUFtQixVQUFVO0FBQzdDLGlCQUFTLElBQUksa0JBQWtCLE9BQU8sY0FBYyxDQUFDO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQWdCLFdBQVcsRUFBRyxVQUFTLElBQUksV0FBVztBQUMxRCxNQUFJLGdCQUFnQixVQUFVLEVBQUcsVUFBUyxJQUFJLFVBQVU7QUFFeEQsUUFBTSxlQUFlLE9BQU8sS0FBSyxlQUFlLEVBQUU7QUFBQSxJQUFPLENBQUMsTUFDeEQsRUFBRSxTQUFTLGNBQWM7QUFBQSxFQUMzQjtBQUNBLGFBQVcsUUFBUSxjQUFjO0FBQy9CLGFBQVMsSUFBSSxJQUFJO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFdBQVcsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUNwRCxFQUFFLFNBQVMsTUFBTTtBQUFBLEVBQ25CO0FBQ0EsTUFBSSxTQUFTLFdBQVcsR0FBRztBQUN6QixhQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFBQSxFQUMxQjtBQUVBLFNBQU8sTUFBTSxLQUFLLFFBQVE7QUFDNUI7IiwKICAibmFtZXMiOiBbIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImltcG9ydE5hbWUiLCAiRGVidWciLCAiZGVidWciLCAidW5wcmVmaXhlZFBhdGgiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciXQp9Cg==