cdk-nextjs 0.7.1 → 0.7.3

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.
@@ -11,6 +11,8 @@ exports.resolveNextSharp = resolveNextSharp;
11
11
  exports.isSharpBinaryPackage = isSharpBinaryPackage;
12
12
  exports.sharpBinaryDir = sharpBinaryDir;
13
13
  exports.listTree = listTree;
14
+ exports.nativeBinaryPlatform = nativeBinaryPlatform;
15
+ exports.findForeignNativePackages = findForeignNativePackages;
14
16
  exports.writePublicFileList = writePublicFileList;
15
17
  exports.storedSize = storedSize;
16
18
  exports.patchClientChunk = patchClientChunk;
@@ -22,6 +24,7 @@ const node_module_1 = require("node:module");
22
24
  const node_os_1 = require("node:os");
23
25
  const node_path_1 = require("node:path");
24
26
  const posix_1 = require("node:path/posix");
27
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
25
28
  const constructs_1 = require("constructs");
26
29
  // eslint-disable-next-line import/no-extraneous-dependencies
27
30
  const debug_1 = __importDefault(require("debug"));
@@ -69,7 +72,7 @@ function deploymentBuildId(manifest) {
69
72
  * @link https://nextjs.org/docs/pages/api-reference/next-config-js/output
70
73
  */
71
74
  class NextjsBuild extends constructs_1.Construct {
72
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.1" };
75
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.3" };
73
76
  /**
74
77
  * Unique id for this deployment. Used to partition cache storage and as
75
78
  * metadata for static assets in S3 bucket.
@@ -234,6 +237,7 @@ class NextjsBuild extends constructs_1.Construct {
234
237
  // for the architecture their Lambda deploys, whatever this machine is;
235
238
  // Containers run on node:24-alpine (musl).
236
239
  this.stageSharpForTarget(root, (0, node_path_1.join)(root.path, this.relativeProjectDir), `${isFunctions ? "linux" : "linuxmusl"}-${(0, get_architecture_1.toNodeArchitecture)(this.architecture)}`);
240
+ this.warnOnForeignNativeBinaries(root, `linux-${(0, get_architecture_1.toNodeArchitecture)(this.architecture)}`);
237
241
  if (isFunctions) {
238
242
  this.assertUnderLambdaLimit(root);
239
243
  }
@@ -296,6 +300,29 @@ class NextjsBuild extends constructs_1.Construct {
296
300
  }
297
301
  return roots;
298
302
  }
303
+ /**
304
+ * `next build` traces native addons from the machine it runs on, and only
305
+ * `sharp` is swapped for the target. Anything else built for another platform
306
+ * fails with MODULE_NOT_FOUND or ERR_DLOPEN_FAILED on the first request that
307
+ * loads it, so say which package at synth. A warning, not an error: some
308
+ * addons are optional (`ws`'s `bufferutil`, `fsevents`) and fall back to JS.
309
+ *
310
+ * Only the OS and CPU are checked: glibc and musl builds share a header.
311
+ */
312
+ warnOnForeignNativeBinaries(root, target) {
313
+ const foreign = findForeignNativePackages(root.path, target);
314
+ if (!foreign.length) {
315
+ return;
316
+ }
317
+ aws_cdk_lib_1.Annotations.of(this).addWarningV2("cdk-nextjs:foreignNativeBinaries", `${constants_1.LOG_PREFIX} Deployment root "${root.name}" has native binaries ` +
318
+ `built for a platform other than ${target}, which it runs on: ` +
319
+ `${foreign.join(", ")}. \`next build\` traced them from this machine, ` +
320
+ `so they fail on the first request that loads them unless the package ` +
321
+ `falls back without them. Build on ${target}, or replace each with ` +
322
+ `the ${target} variant after \`next build\` (e.g. \`npm pack\` it in ` +
323
+ `your \`buildCommand\`). See https://github.com/cdklabs/cdk-nextjs/` +
324
+ `blob/main/docs/native-dependencies-guide.md`);
325
+ }
299
326
  /**
300
327
  * Lambda enforces 250 MB unzipped at CloudFormation time, which is minutes
301
328
  * into a deploy and reports only a size. Splitting exists to stay under that
@@ -821,6 +848,80 @@ function listTree(root) {
821
848
  }
822
849
  return entries;
823
850
  }
851
+ const ELF_MACHINES = { 62: "x64", 183: "arm64" };
852
+ const MACH_O_MAGICS = [
853
+ 0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe, 0xcafebabe,
854
+ ];
855
+ /**
856
+ * The platform a native addon was compiled for, read from its header:
857
+ * `linux-<arch>`, `darwin` or `win32`, or `undefined` for a file that is none
858
+ * of those.
859
+ */
860
+ function nativeBinaryPlatform(file) {
861
+ const header = Buffer.alloc(20);
862
+ const fd = (0, node_fs_1.openSync)(file, "r");
863
+ try {
864
+ (0, node_fs_1.readSync)(fd, header, 0, header.length, 0);
865
+ }
866
+ finally {
867
+ (0, node_fs_1.closeSync)(fd);
868
+ }
869
+ const magic = header.readUInt32BE(0);
870
+ if (magic === 0x7f454c46) {
871
+ // e_machine, in the byte order EI_DATA names (2 is big-endian).
872
+ const machine = header[5] === 2 ? header.readUInt16BE(18) : header.readUInt16LE(18);
873
+ return `linux-${ELF_MACHINES[machine] ?? `machine-${machine}`}`;
874
+ }
875
+ if (MACH_O_MAGICS.includes(magic)) {
876
+ return "darwin";
877
+ }
878
+ if (header.toString("latin1", 0, 2) === "MZ") {
879
+ return "win32";
880
+ }
881
+ return undefined;
882
+ }
883
+ /**
884
+ * The packages under `root` that have `.node` addons but none built for
885
+ * `target`, so they'd fail to load there. Returned as `root`-relative paths.
886
+ *
887
+ * A package with addons for several platforms is fine as long as one of them
888
+ * is `target`: packages like `bufferutil` bundle a `darwin` and a
889
+ * `linux-x64` addon and load whichever matches the machine.
890
+ */
891
+ function findForeignNativePackages(root, target) {
892
+ const packages = new Map();
893
+ for (const entry of listTree(root)) {
894
+ if (!entry.isFile() || !entry.name.endsWith(".node"))
895
+ continue;
896
+ const platform = nativeBinaryPlatform((0, node_path_1.join)(entry.parentPath, entry.name));
897
+ if (!platform)
898
+ continue;
899
+ const pkg = packageDirOf(root, entry.parentPath);
900
+ const seen = packages.get(pkg) ?? { matches: false, foreign: false };
901
+ if (platform === target) {
902
+ seen.matches = true;
903
+ }
904
+ else {
905
+ seen.foreign = true;
906
+ }
907
+ packages.set(pkg, seen);
908
+ }
909
+ return [...packages]
910
+ .filter(([, seen]) => seen.foreign && !seen.matches)
911
+ .map(([pkg]) => (0, node_path_1.relative)(root, pkg))
912
+ .sort();
913
+ }
914
+ /** The nearest directory from `dir` up to `root` with a `package.json`. */
915
+ function packageDirOf(root, dir) {
916
+ for (let current = dir; current.startsWith(root); current = (0, node_path_1.dirname)(current)) {
917
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(current, "package.json"))) {
918
+ return current;
919
+ }
920
+ if (current === root)
921
+ break;
922
+ }
923
+ return dir;
924
+ }
824
925
  /**
825
926
  * Write {@link PUBLIC_FILES_FILE_NAME} into a deployment root's runtime
826
927
  * directory: every file under `publicDir`, listed the way the runtime would
@@ -875,4 +976,4 @@ function patchClientChunk(chunk, patch, chunkPath) {
875
976
  }
876
977
  return `${open}\n${patch}\n${PATCH_FETCH_END_MARKER}\n${original}`;
877
978
  }
878
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBeUpBLHdEQUtDO0FBR0QsOENBUUM7QUFzMEJELHdEQW1CQztBQU1ELDRDQVVDO0FBcUJELG9EQVVDO0FBY0Qsd0NBRUM7QUFVRCw0QkFZQztBQVFELGtEQUtDO0FBUUQsZ0NBUUM7QUFhRCw0Q0F3QkM7O0FBenBDRCwyREFBNEQ7QUFDNUQsNkNBQXNEO0FBQ3RELHFDQWNpQjtBQUNqQiw2Q0FBNEM7QUFDNUMscUNBQWlDO0FBQ2pDLHlDQUFzQztBQUN0QywyQ0FBb0Q7QUFFcEQsMkNBQXVDO0FBQ3ZDLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFDN0IsZ0VBS29DO0FBQ3BDLDRDQUFzRDtBQUV0RCxrREFRNkI7QUFDN0IsMERBQTBEO0FBQzFELGtEQUk0QjtBQUM1QixnRUFHbUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXREOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLDJCQUEyQixDQUFDO0FBQ3ZELDJFQUEyRTtBQUMzRSxNQUFNLHNCQUFzQixHQUFHLGtDQUFrQyxDQUFDO0FBRWxFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLHlCQUF5QixDQUFDLENBQUM7QUE4RWxEOzs7O0dBSUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxLQUF1QjtJQUM1RCxNQUFNLFdBQVcsR0FDZixLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsZ0JBQWdCO1FBQ2hELEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNyRCxPQUFPLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFBLHdDQUFxQixHQUFFLENB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LENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxLQUFLLEtBQUssc0JBQXNCLEtBQUssUUFBUSxFQUFFLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHtcbiAgRGlyZW50LFxuICBleGlzdHNTeW5jLFxuICBsc3RhdFN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgbWtkaXJTeW5jLFxuICBjcFN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgc3RhdFN5bmMsXG4gIHVubGlua1N5bmMsXG59IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgam9pbiBhcyBqb2luUG9zaXggfSBmcm9tIFwibm9kZTpwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIEZVTkNUSU9OX0dST1VQU19FTlZfVkFSLFxuICBGdW5jdGlvbkdyb3VwU3BlYyxcbiAgdmFsaWRhdGVGdW5jdGlvbkdyb3Vwcyxcbn0gZnJvbSBcIi4uL2FkYXB0ZXIvZnVuY3Rpb24tZ3JvdXBzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4uL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7XG4gIEFEQVBURVJfRElSX05BTUUsXG4gIEFEQVBURVJfTUFOSUZFU1RfVkVSU0lPTixcbiAgQWRhcHRlck1hbmlmZXN0LFxuICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gIFBVQkxJQ19GSUxFU19GSUxFX05BTUUsXG4gIFJVTlRJTUVfRElSX05BTUUsXG4gIGdyb3VwU3RhZ2luZ0Rpck5hbWUsXG59IGZyb20gXCIuLi9ydW50aW1lL21hbmlmZXN0XCI7XG5pbXBvcnQgeyByZWFkUHVibGljRmlsZXMgfSBmcm9tIFwiLi4vcnVudGltZS9wdWJsaWMtZmlsZXNcIjtcbmltcG9ydCB7XG4gIGFzc2V0UHJlZml4UGF0aCxcbiAgbm9ybWFsaXplQmFzZVBhdGgsXG4gIHJlbGF0aXZlQXNzZXRQcmVmaXgsXG59IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcbmltcG9ydCB7XG4gIGdldExhbWJkYUFyY2hpdGVjdHVyZSxcbiAgdG9Ob2RlQXJjaGl0ZWN0dXJlLFxufSBmcm9tIFwiLi4vdXRpbHMvZ2V0LWFyY2hpdGVjdHVyZVwiO1xuXG4vKipcbiAqIExhbWJkYSdzIGhhcmQgbGltaXQgb24gdGhlIHVuemlwcGVkIHNpemUgb2YgYSBmdW5jdGlvbidzIGNvZGUsIHdoaWNoXG4gKiBDbG91ZEZvcm1hdGlvbiBvbmx5IGVuZm9yY2VzIGF0IGRlcGxveSB0aW1lLiBNZWFzdXJlZCBhdCBzeW50aCBpbnN0ZWFkLCBzbyB0aGVcbiAqIGVycm9yIG5hbWVzIHRoZSBncm91cCBhbmQgYXJyaXZlcyBpbiBzZWNvbmRzIHJhdGhlciB0aGFuIG1pbnV0ZXMuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2dldHRpbmdzdGFydGVkLWxpbWl0cy5odG1sXG4gKi9cbmNvbnN0IExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUyA9IDI1MCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIE9wZW5zIHRoZSBwYXRjaCBgcGF0Y2hGZXRjaEluQ2xpZW50SnNgIHByZXBlbmRzIHRvIGEgY2xpZW50IGNodW5rLCBmb2xsb3dlZCBieVxuICogYSBoYXNoIG9mIHRoZSBwYXRjaCBpdHNlbGYsIHNvIGEgc2Vjb25kIHN5bnRoIG92ZXIgdGhlIHNhbWUgYC5uZXh0YCBpcyBhIG5vLW9wXG4gKiB3aGlsZSBvbmUgYnkgYSBjZGstbmV4dGpzIHdpdGggYSBkaWZmZXJlbnQgYHBhdGNoLWZldGNoLmpzYCByZXBsYWNlcyBpdC5cbiAqL1xuY29uc3QgUEFUQ0hfRkVUQ0hfTUFSS0VSID0gXCIvKiBjZGstbmV4dGpzOnBhdGNoLWZldGNoXCI7XG4vKiogQ2xvc2VzIHRoZSBwcmVwZW5kZWQgcGF0Y2g7IHRoZSBjaHVuaydzIG93biBjb250ZW50IHN0YXJ0cyBhZnRlciBpdC4gKi9cbmNvbnN0IFBBVENIX0ZFVENIX0VORF9NQVJLRVIgPSBcIi8qIGNkay1uZXh0anM6cGF0Y2gtZmV0Y2g6ZW5kICovXCI7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOm5leHRqcy1idWlsZFwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCdWlsZFByb3BzIHtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29tbWFuZFwiXX1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZDogTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdO1xuICAvKipcbiAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBOZXh0LmpzIGFwcGxpY2F0aW9uIGlzIGxvY2F0ZWQgZm9yIGxvY2FsIGJ1aWxkcy5cbiAgICogVGhpcyBzaG91bGQgY29udGFpbiB0aGUgcGFja2FnZS5qc29uIGFuZCBOZXh0LmpzIGFwcGxpY2F0aW9uIGZpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5za2lwQnVpbGR9XG4gICAqL1xuICByZWFkb25seSBza2lwQnVpbGQ/OiBib29sZWFuO1xuICAvKipcbiAgICogUm91dGUgZ3JvdXBzIHRvIHBhY2thZ2UgaW50byBzZXBhcmF0ZSBMYW1iZGEgZnVuY3Rpb25zLiBPbmx5IHRoZSB0d29cbiAgICogRnVuY3Rpb25zIGBOZXh0anNUeXBlYHMgcGFzcyB0aGlzOyBzZWUgYE5leHRqc0Z1bmN0aW9uR3JvdXBgLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cHM/OiBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzW107XG4gIC8qKlxuICAgKiBMYW1iZGEgYXJjaGl0ZWN0dXJlIHRoZSBGdW5jdGlvbnMgdHlwZXMgZGVwbG95LCB3aGljaCBkZWNpZGVzIHRoZSBgc2hhcnBgXG4gICAqIGJpbmFyaWVzIHN0YWdlZCBpbnRvIHRoZSBkZXBsb3ltZW50IHJvb3RzLiBJZ25vcmVkIGJ5IHRoZSBDb250YWluZXJzXG4gICAqIHR5cGVzLCB3aG9zZSBpbWFnZSBpcyBidWlsdCBmb3IgdGhlIHN5bnRoIG1hY2hpbmUuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgbWFjaGluZSBydW5uaW5nIHN5bnRoXG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2YgYSBmdW5jdGlvbiBncm91cCBgTmV4dGpzQnVpbGRgIG5lZWRzOiB3aGljaCByb3V0ZXMgaXQgb3ducy4gVGhlXG4gKiBwZXItZ3JvdXAgTGFtYmRhIGBvdmVycmlkZXNgIGFyZSBgTmV4dGpzRnVuY3Rpb25zYCcgYnVzaW5lc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRnVuY3Rpb25Hcm91cFJvdXRlcyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcm91dGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIE9uZSBzdGFnZWQgZGVwbG95bWVudCByb290LCBhbmQgdGhlIGZ1bmN0aW9uIGdyb3VwIGl0IGJlbG9uZ3MgdG8uICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RlcGxveW1lbnRSb290IHtcbiAgLyoqXG4gICAqIEdyb3VwIG5hbWUsIGBkZWZhdWx0YCBmb3IgdGhlIGltcGxpY2l0IGdyb3VwIHRoYXQgb3ducyBldmVyeSB1bmFzc2lnbmVkXG4gICAqIHJvdXRlLiBUaGUgb25seSBlbnRyeSBpcyBgZGVmYXVsdGAgd2hlbiBgZnVuY3Rpb25Hcm91cHNgIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCByb290OiB0aGUgTGFtYmRhIHppcCBhc3NldCdzIHNvdXJjZS4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUm91dGUgdGVtcGxhdGVzIHRoaXMgcm9vdCdzIHBhY2thZ2UgaG9sZHMsIGFzIHRoZSBhZGFwdGVyIGFzc2lnbmVkIHRoZW0uXG4gICAqIEVtcHR5IGlzIGxlZ2FsOiB0aGUgZGVmYXVsdCBncm91cCBzdGlsbCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAsIHRoZSBzdGF0aWNcbiAgICogZmlsZXMgdGhlIHJ1bnRpbWUgcmVhZHMgb2ZmIGRpc2ssIGFuZCBhbnl0aGluZyB0aGUgY2F0Y2gtYWxsIHJvdXRlcyB0byBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogT25lIGJlaGF2aW9yIHRoYXQgcm91dGVzIGEgZnVuY3Rpb24gZ3JvdXAncyBVUkxzIHRvIGl0LCBhcyB0aGUgYWRhcHRlclxuICogY2hlY2tlZCB0aGVtIGFnYWluc3Qgd2hhdCBlYWNoIGdyb3VwIHdhcyBwYWNrYWdlZCB3aXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvciB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gZ3JvdXAgdGhlIGJlaGF2aW9yIHJvdXRlcyB0by4gKi9cbiAgcmVhZG9ubHkgZ3JvdXA6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBncm91cCBwYXR0ZXJuIGl0IGNhbWUgZnJvbSAoYC9ibG9nLyoqYCksIG9yIHRoZSBwYXJlbnQgb2YgYW4gb3B0aW9uYWxcbiAgICogY2F0Y2gtYWxsIGEgc3VidHJlZSBwYXR0ZXJuIG1vdmVkIGludG8gdGhlIGdyb3VwIChgL2Jsb2dgIGZvclxuICAgKiBgL2Jsb2cvW1suLi5zbHVnXV1gKSwgd2hpY2ggdGhhdCBzdWJ0cmVlJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2guXG4gICAqL1xuICByZWFkb25seSByb3V0ZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJuLCBiZWZvcmUgYmFzZVBhdGggYW5kIHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoOlxuICAgKiBgYmxvZy8qYCwgYHByaWNpbmdgLCBgcHJpY2luZy9gIGZvciBhIGB0cmFpbGluZ1NsYXNoYCBhcHAsIGFuZFxuICAgKiBgX25leHQvZGF0YS88YnVpbGRJZD4vYmxvZy8qYCBmb3IgYSBncm91cCBvd25pbmcgYSBQYWdlcyBSb3V0ZXIgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdHRlcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGV2ZXJ5IGRlcGxveW1lbnQgcm9vdCBpcyBzdGFnZWQgZm9yOiB0aGUgYnVpbGQncyBgYXJjaGl0ZWN0dXJlYCwgZWxzZVxuICogdGhlIHN5bnRoIG1hY2hpbmUncy4gQ29udGFpbmVycyBpZ25vcmUgaXQ6IERvY2tlciBidWlsZHMgdGhlaXIgaW1hZ2VcbiAqIG5hdGl2ZWx5LCBzbyBpdCBjYW4gb25seSBtYXRjaCB0aGUgc3ludGggbWFjaGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveW1lbnRBcmNoaXRlY3R1cmUocHJvcHM6IE5leHRqc0J1aWxkUHJvcHMpOiBBcmNoaXRlY3R1cmUge1xuICBjb25zdCBpc0Z1bmN0aW9ucyA9XG4gICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TIHx8XG4gICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlM7XG4gIHJldHVybiAoaXNGdW5jdGlvbnMgJiYgcHJvcHMuYXJjaGl0ZWN0dXJlKSB8fCBnZXRMYW1iZGFBcmNoaXRlY3R1cmUoKTtcbn1cblxuLyoqIHtAbGluayBOZXh0anNCdWlsZC5idWlsZElkfTogTmV4dC5qcydzIGJ1aWxkIElELCBzdWZmaXhlZCB3aXRoIHRoZSBhcHAncyBgZGVwbG95bWVudElkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3ltZW50QnVpbGRJZChtYW5pZmVzdDoge1xuICByZWFkb25seSBidWlsZElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZzogeyByZWFkb25seSBkZXBsb3ltZW50SWQ6IHN0cmluZyB9O1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVwbG95bWVudElkIH0gPSBtYW5pZmVzdC5jb25maWc7XG4gIHJldHVybiBkZXBsb3ltZW50SWRcbiAgICA/IGAke21hbmlmZXN0LmJ1aWxkSWR9LSR7ZGVwbG95bWVudElkfWBcbiAgICA6IG1hbmlmZXN0LmJ1aWxkSWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljRGlyRW50cnkge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBOZXh0LmpzIGFzc2V0cy5cbiAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgZm9yIHRoaXMgZGVwbG95bWVudC4gVXNlZCB0byBwYXJ0aXRpb24gY2FjaGUgc3RvcmFnZSBhbmQgYXNcbiAgICogbWV0YWRhdGEgZm9yIHN0YXRpYyBhc3NldHMgaW4gUzMgYnVja2V0LlxuICAgKlxuICAgKiBOZXh0LmpzJ3MgYnVpbGQgSUQsIHN1ZmZpeGVkIHdpdGggdGhlIGFwcCdzIGBkZXBsb3ltZW50SWRgIHdoZW4gaXQgc2V0c1xuICAgKiBvbmUuIFRoZSBidWlsZCBJRCBhbG9uZSBpcyBub3QgdW5pcXVlIHBlciBkZXBsb3ltZW50OiBzZXR0aW5nXG4gICAqIGBkZXBsb3ltZW50SWRgIChvciBidWlsZGluZyB3aXRoIGBORVhUX0RFUExPWU1FTlRfSURgKSB0dXJucyBvbiBza2V3XG4gICAqIHByb3RlY3Rpb24sIGFuZCBuZXh0LmpzIHRoZW4gKnBpbnMqIHRoZSBidWlsZCBJRCB0byB0aGUgY29uc3RhbnRcbiAgICogYGJ1aWxkLVRmY3RzV1hwZmYyZktTYCDigJQgc2VlIGBnZXRCdWlsZElkYCBpbiBgbmV4dC9kaXN0L2J1aWxkL2luZGV4LmpzYCxcbiAgICogd2hpY2ggZG9lcyB0aGF0IGRlbGliZXJhdGVseSBzbyB0aGF0IHRvb2xpbmcgZG9pbmdcbiAgICogYC5yZXBsYWNlKGVzY2FwZWRCdWlsZElkLCDigKYpYCBzdGlsbCBoYXMgc29tZXRoaW5nIHRvIHJlcGxhY2UuIFR3b1xuICAgKiBzdWNjZXNzaXZlIGRlcGxveW1lbnRzIG9mIHN1Y2ggYW4gYXBwIHdvdWxkIHNoYXJlIG9uZSBjYWNoZSBwcmVmaXggYW5kIG9uZVxuICAgKiByZXZhbGlkYXRpb24tdGFibGUgcGFydGl0aW9uLCBhbmQgdGhlIG5ldyBvbmUgd291bGQgcmVhZCB0aGUgcHJldmlvdXNcbiAgICogb25lJ3MgcHJlcmVuZGVycy4gQXBwZW5kaW5nIHRoZSBkZXBsb3ltZW50IElEIHJlc3RvcmVzIHRoZSBcIm9uZVxuICAgKiBkZXBsb3ltZW50LCBvbmUgcGFydGl0aW9uXCIgaW52YXJpYW50IHRoYXQgSUQgZXhpc3RzIHRvIGNhcnJ5LlxuICAgKlxuICAgKiBOb3RoaW5nIHJvdXRlcyBvbiB0aGlzIHZhbHVlIOKAlCB0aGUgYC9fbmV4dC9kYXRhLzxidWlsZElkPi/igKZgIFVSTCBzcGFjZSBpc1xuICAgKiByb3V0ZWQgb24gTmV4dC5qcydzIG93biBidWlsZCBJRCwgd2hpY2ggaXMgd2hhdCB0aGUgYXBwJ3MgY2xpZW50IGJ1bmRsZXNcbiAgICogY2Fycnkg4oCUIHNvIGl0IGlzIGZyZWUgdG8gYmUgbG9uZ2VyIHRoYW4gbmV4dC5qcydzIG93bi5cbiAgICovXG4gIGJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGluaXQgY2FjaGUgZGlyZWN0b3J5XG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvLm5leHQvY2RrLW5leHRqcy1pbml0LWNhY2hlXCJcbiAgICovXG4gIGluaXRDYWNoZURpcjogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBwdWJsaWMuIFVzZSBieSBDbG91ZEZyb250L0FMQiB0byBjcmVhdGUgYmVoYXZpb3JzL3J1bGVzXG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvcHVibGljXCJcbiAgICovXG4gIHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgSmF2YVNjcmlwdCBmaWxlIE5vZGUuanMgcnVucyB0byBzZXJ2ZSByZXF1ZXN0cywgcmVsYXRpdmUgdG8gdGhlXG4gICAqIGRlcGxveW1lbnQgcm9vdC4gY2RrLW5leHRqcydzIG93biBjb250YWluZXIgc2hlbGwsIG5vdCBgbmV4dCBidWlsZGAgb3V0cHV0LFxuICAgKiBzbyBpdCBpcyB0aGUgc2FtZSBwYXRoIGZvciBldmVyeSBhcHAuXG4gICAqIEBleGFtcGxlIFwiY2RrLW5leHRqcy1ydW50aW1lL3NlcnZlci5tanNcIlxuICAgKi9cbiAgcmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSAubmV4dCBkaXJlY3RvcnkgY29udGFpbmluZyBOZXh0LmpzIGJ1aWxkIGFydGlmYWN0c1xuICAgKi9cbiAgZG90TmV4dFBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOZXh0LmpzIGFwcCdzIG93biBgYmFzZVBhdGhgIOKAlCB0aGUgVVJMIHByZWZpeCBpdCBnZW5lcmF0ZXMgaXRzIGxpbmtzIGFuZFxuICAgKiBhc3NldCBocmVmcyB1bmRlciDigJQgYXMgdGhlIGFkYXB0ZXIgbWFuaWZlc3QgcmVjb3JkZWQgaXQuIE5vcm1hbGl6ZWQgdG8gYSBiYXJlIHBhdGggc2VnbWVudCwgZW1wdHkgd2hlbiB0aGUgYXBwIHNldHMgbm9uZS4gRXhwb3NlZCBzb1xuICAgKiByb290IGNvbnN0cnVjdHMgY2FuIHJlY29uY2lsZSBpdCB3aXRoIHRoZSBDREsgYGJhc2VQYXRoYCBwcm9wLCB3aGljaCBpcyBhXG4gICAqIGRpc3RpbmN0IHRoaW5nOyBzZWUgYHJlc29sdmVCYXNlUGF0aGAuXG4gICAqL1xuICBuZXh0Q29uZmlnQmFzZVBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOZXh0LmpzIGFwcCdzIG93biBgYXNzZXRQcmVmaXhgLCBhcyBhIHBhdGggd2l0aCBhIGxlYWRpbmcgc2xhc2ggYW5kIG5vXG4gICAqIHRyYWlsaW5nIG9uZSwgZW1wdHkgd2hlbiB0aGUgYXBwIHNldHMgbm9uZSBvciBzZXRzIGFuIGFic29sdXRlIFVSTCAod2hpY2hcbiAgICogbmFtZXMgYW4gb3JpZ2luIGNkay1uZXh0anMgZG9lcyBub3Qgc2VydmUpLlxuICAgKlxuICAgKiBFeHBvc2VkIGJlY2F1c2UgaXQgaXMgdGhlIHNoYXBlIG9mIGBhc3NldFByZWZpeGAgdGhlIHJlZ2lvbmFsXG4gICAqIGBOZXh0anNUeXBlYHMgY2Fubm90IHNlcnZlIOKAlCBzZWUgYHdhcm5VbnNlcnZlZEFzc2V0UHJlZml4YC4gV2hhdCB0aGVcbiAgICogZGlzdHJpYnV0aW9uIGhhcyB0byBhbnN3ZXIgb24gaXMge0BsaW5rIG5leHRDb25maWdBc3NldFByZWZpeFBhdGh9LCB3aGljaFxuICAgKiBhbHNvIGNvdmVycyB0aGUgcGF0aCBhbiBhYnNvbHV0ZSBwcmVmaXggY2Fycmllcy5cbiAgICovXG4gIG5leHRDb25maWdBc3NldFByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgYXBwJ3MgYGFzc2V0UHJlZml4YCwgd2hpY2hldmVyIGZvcm0gaXQgdGFrZXM6IFwiL2NkblwiXG4gICAqIGZvciBib3RoIGBhc3NldFByZWZpeDogXCIvY2RuXCJgIGFuZCBgYXNzZXRQcmVmaXg6XG4gICAqIFwiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vY2RuXCJgLCBlbXB0eSB3aGVuIHRoZXJlIGlzIG5vIHBhdGggdG8gYW5zd2VyIG9uLlxuICAgKlxuICAgKiBFeHBvc2VkIGJlY2F1c2UgaXQgaXMgYSBVUkwgcHJlZml4IHRoZSBkaXN0cmlidXRpb24gaGFzIHRvIGFuc3dlciBvbjogTmV4dC5qc1xuICAgKiBlbWl0cyBgPGFzc2V0UHJlZml4Pi9fbmV4dC9zdGF0aWMvLi4uYCBmb3IgZXZlcnkgYnVuZGxlIGFuZCBjb21waWxlcyBhIHJld3JpdGVcbiAgICogdGhhdCBzZXJ2ZXMgdGhvc2UgVVJMcycgcGF0aHMgaXRzZWxmLCB3aGlsZSB0aGUgb2JqZWN0cyBsaXZlIGluIFMzIHVuZGVyXG4gICAqIGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gLlxuICAgKi9cbiAgbmV4dENvbmZpZ0Fzc2V0UHJlZml4UGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogRXZlcnkgc3RhZ2VkIGRlcGxveW1lbnQgcm9vdCwgb25lIHBlciBmdW5jdGlvbiBncm91cCwgYGRlZmF1bHRgIGZpcnN0OiB0aGVcbiAgICogc3RhZ2VkIHVuaW9uIG9mIGVhY2ggZ3JvdXAncyBzaGlwcGVkIG91dHB1dHMgYW5kIHRoZWlyIHRyYWNlZCBhc3NldHMsXG4gICAqIHdyaXR0ZW4gYnkgdGhlIGFkYXB0ZXIncyBgb25CdWlsZENvbXBsZXRlYC4gRXhhY3RseSBvbmUgZW50cnkgKG5hbWVkXG4gICAqIGBkZWZhdWx0YCwgYXQgYC5uZXh0L2Nkay1uZXh0anMtYWRhcHRlci9hcHBgKSB1bmxlc3MgYGZ1bmN0aW9uR3JvdXBzYFxuICAgKiBzcGxpdHMgdGhlIGFwcC4gVGhlIExhbWJkYSB6aXAgYXNzZXRzOyBDb250YWluZXJzIGBDT1BZYCB0aGUgYGRlZmF1bHRgIG9uZS5cbiAgICovXG4gIGRlcGxveW1lbnRSb290czogTmV4dGpzRGVwbG95bWVudFJvb3RbXTtcbiAgLyoqXG4gICAqIFdoYXQgcm91dGVzIGVhY2ggbm9uLWRlZmF1bHQgZnVuY3Rpb24gZ3JvdXAncyBVUkxzIHRvIGl0LCBtb3N0IHNwZWNpZmljXG4gICAqIGZpcnN0IOKAlCB0aGUgb3JkZXIgQ2xvdWRGcm9udCBoYXMgdG8gc2VlIHRoZW0gaW4sIHNpbmNlIGl0IHN0b3BzIGF0IHRoZVxuICAgKiBmaXJzdCBtYXRjaC4gRW1wdHkgdW5sZXNzIGBmdW5jdGlvbkdyb3Vwc2Agc3BsaXRzIHRoZSBhcHAuXG4gICAqL1xuICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzOiBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3JbXTtcbiAgLyoqXG4gICAqIEZyb20gdGhlIGRlcGxveW1lbnQgcm9vdCB0byB0aGUgTmV4dC5qcyBwcm9qZWN0IGRpciwgUE9TSVgsIGBcIlwiYCB3aGVuXG4gICAqIHRoZSBhcHAgaXMgYXQgdGhlIHJlcG8gcm9vdC4gVGhlIHJ1bnRpbWUgYGNoZGlyYHMgaGVyZTsgQ29udGFpbmVycyBwYXNzIGl0IHRvXG4gICAqIHRoZWlyIERvY2tlcmZpbGUgc28gYC5uZXh0L3N0YXRpY2AgYW5kIGBwdWJsaWNgIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuXG4gICAqIEBzZWUgQWRhcHRlck1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpclxuICAgKi9cbiAgcmVsYXRpdmVQcm9qZWN0RGlyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJjaGl0ZWN0dXJlIGV2ZXJ5IGRlcGxveW1lbnQgcm9vdCdzIG5hdGl2ZSBkZXBlbmRlbmNpZXMgKGBzaGFycGApXG4gICAqIHdlcmUgc3RhZ2VkIGZvci4gVGhlIExhbWJkYXMgZGVwbG95aW5nIHRoZW0gbXVzdCB1c2UgdGhlIHNhbWUgb25lLlxuICAgKi9cbiAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQnVpbGRQcm9wcztcbiAgcHJpdmF0ZSBidWlsZENvbW1hbmQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzQnVpbGRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZG90TmV4dFBhdGggPSBqb2luKHByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIpO1xuXG4gICAgdGhpcy5idWlsZENvbW1hbmQgPSBwcm9wcy5idWlsZENvbW1hbmQgfHwgXCJucG0gcnVuIGJ1aWxkXCI7XG5cbiAgICAvLyBTZXQgaW5pdCBjYWNoZSBkaXJlY3RvcnkgcGF0aFxuICAgIHRoaXMuaW5pdENhY2hlRGlyID0gam9pbihcbiAgICAgIHByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgXCIubmV4dFwiLFxuICAgICAgXCJjZGstbmV4dGpzLWluaXQtY2FjaGVcIixcbiAgICApO1xuXG4gICAgLy8gQmVmb3JlIHRoZSBidWlsZCwgbm90IGFmdGVyIGl0OiB0aGUgYnVpbGQgaXMgbWludXRlcyBsb25nLCBhbmQgdGhlIGVudiB2YXJcbiAgICAvLyBpdCBwYXNzZXMgZ3JvdXBzIHRocm91Z2ggaXMgb25seSBzZXQgZm9yIGEgbm9uLWVtcHR5IGFycmF5IOKAlCBzbyBhbiBpbnZhbGlkXG4gICAgLy8gYGZ1bmN0aW9uR3JvdXBzYCAoYW4gZW1wdHkgYXJyYXksIGEgcmVzZXJ2ZWQgbmFtZSwgYSBncm91cCBvd25pbmcgbm9cbiAgICAvLyByb3V0ZXMpIHdvdWxkIG90aGVyd2lzZSBiZSByZXBvcnRlZCBhcyBcInRoZSBidWlsZCBzdGFnZWQgdGhlIHdyb25nXG4gICAgLy8gZ3JvdXBzXCIsIGFmdGVyIHBheWluZyBmb3IgdGhlIGJ1aWxkLCBpbnN0ZWFkIG9mIGFzIHRoZSBwcm9wIGVycm9yIGl0IGlzLlxuICAgIGlmIChwcm9wcy5mdW5jdGlvbkdyb3Vwcykge1xuICAgICAgdmFsaWRhdGVGdW5jdGlvbkdyb3Vwcyhwcm9wcy5mdW5jdGlvbkdyb3VwcyBhcyBGdW5jdGlvbkdyb3VwU3BlY1tdKTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIGxvY2FsIGJ1aWxkIHByb2Nlc3NcbiAgICBpZiAocHJvcHMuc2tpcEJ1aWxkICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLnJ1bk5leHRCdWlsZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBTa2lwcGluZzogJHt0aGlzLmJ1aWxkQ29tbWFuZH1gKTtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCwgYmVmb3JlIGFueXRoaW5nIGVsc2UgcmVhZHMgYC5uZXh0YDogYSBtaXNzaW5nIG1hbmlmZXN0IGlzIHRoZSBvbmVcbiAgICAvLyBlcnJvciB0aGF0IG5hbWVzIHRoZSBjYXVzZSAobm8gYnVpbGQsIG9yIG9uZSB3aXRob3V0IHRoZSBhZGFwdGVyKSwgd2hlcmVcbiAgICAvLyBldmVyeSBsYXRlciByZWFkIGZhaWxzIHdpdGggYSBiYXJlIEVOT0VOVC5cbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVhZEFkYXB0ZXJNYW5pZmVzdCgpO1xuXG4gICAgLy8gRGVsaWJlcmF0ZWx5IG91dHNpZGUgdGhlIGBza2lwQnVpbGRgIGdhdGUuIFRoZSBwYXRjaCBpcyBhIHByb3BlcnR5IG9mXG4gICAgLy8gKnNlcnZpbmcqIHRocm91Z2ggQ2xvdWRGcm9udCwgbm90IG9mIHdobyByYW4gYG5leHQgYnVpbGRgOiB3aXRob3V0IGl0XG4gICAgLy8gZXZlcnkgUE9TVCB3aXRoIGEgYm9keSBpcyByZWplY3RlZCBieSB0aGUgTGFtYmRhIEZ1bmN0aW9uIFVSTCBiZWZvcmUgaXRcbiAgICAvLyByZWFjaGVzIHRoZSBhcHAgKHNlZSBgcGF0Y2hGZXRjaEluQ2xpZW50SnNgKS4gUnVubmluZyBpdCBvbmx5IGluc2lkZVxuICAgIC8vIGBydW5OZXh0QnVpbGRgIG1lYW50IGBza2lwQnVpbGQ6IHRydWVgIHNpbGVudGx5IHNoaXBwZWQgYW4gYXBwIHdob3NlXG4gICAgLy8gc2VydmVyIGFjdGlvbnMgYW5kIFBPU1Qgcm91dGUgaGFuZGxlcnMgYWxsIHJldHVybmVkIDQwMy5cbiAgICBpZiAocHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TKSB7XG4gICAgICB0aGlzLnBhdGNoRmV0Y2hJbkNsaWVudEpzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZElkID0gZGVwbG95bWVudEJ1aWxkSWQobWFuaWZlc3QpO1xuICAgIHRoaXMucHVibGljRGlyRW50cmllcyA9IHRoaXMuZ2V0TG9jYWxQdWJsaWNEaXJFbnRyaWVzKCk7XG4gICAgLy8gTmV4dC5qcydzIHJlc29sdmVkIGNvbmZpZywgdGhlIHNhbWUgb25lIGl0IHdyaXRlcyBpbnRvXG4gICAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYC5cbiAgICB0aGlzLm5leHRDb25maWdCYXNlUGF0aCA9IG5vcm1hbGl6ZUJhc2VQYXRoKG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCk7XG4gICAgdGhpcy5uZXh0Q29uZmlnQXNzZXRQcmVmaXggPSByZWxhdGl2ZUFzc2V0UHJlZml4KFxuICAgICAgbWFuaWZlc3QuY29uZmlnLmFzc2V0UHJlZml4LFxuICAgICk7XG4gICAgdGhpcy5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoID0gYXNzZXRQcmVmaXhQYXRoKFxuICAgICAgbWFuaWZlc3QuY29uZmlnLmFzc2V0UHJlZml4LFxuICAgICk7XG5cbiAgICBjb25zdCBpc0Z1bmN0aW9ucyA9XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgfHxcbiAgICAgIHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TO1xuXG4gICAgdGhpcy5yZWxhdGl2ZVByb2plY3REaXIgPSBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXI7XG4gICAgdGhpcy5yZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQgPSBqb2luUG9zaXgoUlVOVElNRV9ESVJfTkFNRSwgXCJzZXJ2ZXIubWpzXCIpO1xuICAgIHRoaXMuYXJjaGl0ZWN0dXJlID0gZGVwbG95bWVudEFyY2hpdGVjdHVyZShwcm9wcyk7XG4gICAgdGhpcy5kZXBsb3ltZW50Um9vdHMgPSB0aGlzLnJlc29sdmVEZXBsb3ltZW50Um9vdHMobWFuaWZlc3QpO1xuICAgIHRoaXMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyA9IG1hbmlmZXN0LmJlaGF2aW9ycyA/PyBbXTtcblxuICAgIC8vIE9ubHkgdGhlIFJlZ2lvbmFsQ29udGFpbmVycyBpbWFnZSBjYXJyaWVzIGBwdWJsaWMvYDogbm90aGluZyBpcyBpbiBmcm9udFxuICAgIC8vIG9mIGl0IHRvIGFuc3dlciB0aG9zZSBwYXRocyBmcm9tIFMzLiBFdmVyeSBvdGhlciB0eXBlIGxpc3RzIGl0IGhlcmUgYW5kXG4gICAgLy8gcmVhZHMgYSBmaWxlIHRoZSBlZGdlIGRpZG4ndCByb3V0ZSB0byBTMyAoYSByZXdyaXRlIG9udG8gaXQpIGZyb20gdGhlcmUuXG4gICAgY29uc3QgcHVibGljT25EaXNrID0gcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgIGlmIChwdWJsaWNPbkRpc2spIHtcbiAgICAgIC8vIEl0cyBnZW5lcmF0ZWQgRG9ja2VyZmlsZSBgQ09QWWBzIGBwdWJsaWNgLCB3aGljaCBmYWlscyB0aGUgaW1hZ2UgYnVpbGRcbiAgICAgIC8vIHdoZW4gdGhlIGFwcCBoYXMgbm9uZS4gQW4gZW1wdHkgZGlyZWN0b3J5IGlzIHdoYXQgYG5leHQgc3RhcnRgIHNlZXNcbiAgICAgIC8vIGZvciBhbiBhcHAgd2l0aG91dCBvbmUgYW55d2F5LCBhbmQgZ2l0IGRvZXNuJ3QgdHJhY2sgaXQuXG4gICAgICBta2RpclN5bmMoam9pbihwcm9wcy5idWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmRlcGxveW1lbnRSb290cykge1xuICAgICAgdGhpcy5zdGFnZVJ1bnRpbWUocm9vdC5wYXRoLCBpc0Z1bmN0aW9ucywgcHVibGljT25EaXNrKTtcbiAgICAgIC8vIEZ1bmN0aW9ucyBydW4gb24gdGhlIExhbWJkYSBtYW5hZ2VkIHJ1bnRpbWUgKEFtYXpvbiBMaW51eCAyMDIzLCBnbGliYyksXG4gICAgICAvLyBmb3IgdGhlIGFyY2hpdGVjdHVyZSB0aGVpciBMYW1iZGEgZGVwbG95cywgd2hhdGV2ZXIgdGhpcyBtYWNoaW5lIGlzO1xuICAgICAgLy8gQ29udGFpbmVycyBydW4gb24gbm9kZToyNC1hbHBpbmUgKG11c2wpLlxuICAgICAgdGhpcy5zdGFnZVNoYXJwRm9yVGFyZ2V0KFxuICAgICAgICByb290LFxuICAgICAgICBqb2luKHJvb3QucGF0aCwgdGhpcy5yZWxhdGl2ZVByb2plY3REaXIpLFxuICAgICAgICBgJHtpc0Z1bmN0aW9ucyA/IFwibGludXhcIiA6IFwibGludXhtdXNsXCJ9LSR7dG9Ob2RlQXJjaGl0ZWN0dXJlKHRoaXMuYXJjaGl0ZWN0dXJlKX1gLFxuICAgICAgKTtcblxuICAgICAgaWYgKGlzRnVuY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0VW5kZXJMYW1iZGFMaW1pdChyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluZSB1cCB0aGUgZ3JvdXBzIHRoZSBwcm9wcyBhc2tlZCBmb3Igd2l0aCB0aGUgcm9vdHMgdGhlIGJ1aWxkIGFjdHVhbGx5XG4gICAqIHN0YWdlZCwgYW5kIGZhaWwgbG91ZGx5IHdoZW4gdGhleSBkaXNhZ3JlZS5cbiAgICpcbiAgICogVGhleSBjYW4gZGlzYWdyZWUgaW4gYm90aCBkaXJlY3Rpb25zLCBhbmQgYm90aCBtZWFuIHRoZSBzYW1lIHRoaW5nIOKAlCB0aGVcbiAgICogYC5uZXh0YCBvbiBkaXNrIGNhbWUgZnJvbSBhIGJ1aWxkIHRoYXQgZGlkIG5vdCBzZWUgdGhpcyBgZnVuY3Rpb25Hcm91cHNgIOKAlFxuICAgKiBidXQgdGhlIGNhdXNlcyBkaWZmZXI6IGBza2lwQnVpbGQ6IHRydWVgIHdpdGggYSBidWlsZCBydW4gYnkgaGFuZCwgb3IgYVxuICAgKiBzdGFsZSBgLm5leHRgIGZyb20gYmVmb3JlIHRoZSBwcm9wIGNoYW5nZWQuIEVpdGhlciB3YXkgZXZlcnkgbGF0ZXIgc3ltcHRvbVxuICAgKiAoYSBMYW1iZGEgbWlzc2luZyBhbiBlbnRyeXBvaW50LCBhIENsb3VkRnJvbnQgYmVoYXZpb3IgcG9pbnRpbmcgYXQgYVxuICAgKiBmdW5jdGlvbiB0aGF0IGNhbm5vdCBzZXJ2ZSBpdCkgaXMgdGhpcywgc2V2ZXJhbCBzdGVwcyBkb3duc3RyZWFtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVwbG95bWVudFJvb3RzKFxuICAgIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4gICk6IE5leHRqc0RlcGxveW1lbnRSb290W10ge1xuICAgIGNvbnN0IHN0YWdlZCA9IG1hbmlmZXN0Lmdyb3VwcztcblxuICAgIC8vIE5hbWVzICphbmQqIHJvdXRlczogbW92aW5nIGAvcmVwb3J0cy8qKmAgaW50byBhbiBleGlzdGluZyBncm91cCBrZWVwcyB0aGVcbiAgICAvLyBuYW1lcyBhbmQgc3RpbGwgbGVhdmVzIHRoYXQgZ3JvdXAncyB6aXAgd2l0aG91dCB0aGUgcmVwb3J0cyBlbnRyeXBvaW50cy5cbiAgICAvLyBPcmRlciBpcyBub3Q6IGFzc2lnbm1lbnQgYW5kIENsb3VkRnJvbnQgYmVoYXZpb3JzIGJvdGggZ28gbW9zdCBzcGVjaWZpY1xuICAgIC8vIGZpcnN0LCBhbmQgbm8gdHdvIGRpc3RpbmN0IHBhdHRlcm5zIHRpZSBvbiBhIFVSTCAoYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLFxuICAgIC8vIHNvIHJlb3JkZXJpbmcgZ3JvdXBzIG9yIHJvdXRlcyBpcyB0aGUgc2FtZSBzcGxpdC5cbiAgICAvLyBBbHJlYWR5IHZhbGlkYXRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHNvIHRoaXMgaXMgYWJzZW50IG9yIG5vbi1lbXB0eS5cbiAgICBjb25zdCB3YW50ZWQgPSB0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzPy5sZW5ndGhcbiAgICAgID8gdG9GdW5jdGlvbkdyb3VwU3BlY3ModGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdvdCA9IG1hbmlmZXN0LmZ1bmN0aW9uR3JvdXBzO1xuXG4gICAgaWYgKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc29ydGVkR3JvdXBTcGVjcyh3YW50ZWQpKSAhPT1cbiAgICAgIEpTT04uc3RyaW5naWZ5KHNvcnRlZEdyb3VwU3BlY3MoZ290KSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cHNcXGAgYXNrcyBmb3IgYCArXG4gICAgICAgICAgYCR7d2FudGVkID8gSlNPTi5zdHJpbmdpZnkod2FudGVkKSA6IFwibm8gc3BsaXR0aW5nXCJ9IGJ1dCB0aGUgYnVpbGQgYCArXG4gICAgICAgICAgYGluICR7dGhpcy5kb3ROZXh0UGF0aH0gd2FzIHNwbGl0IGludG8gYCArXG4gICAgICAgICAgYCR7Z290ID8gSlNPTi5zdHJpbmdpZnkoZ290KSA6IFwiYSBzaW5nbGUgZGVwbG95bWVudCByb290XCJ9LiBgICtcbiAgICAgICAgICBgR3JvdXBzIGFyZSByZXNvbHZlZCBkdXJpbmcgXFxgbmV4dCBidWlsZFxcYCAoY2RrLW5leHRqcyBwYXNzZXMgdGhlbSBpbiBgICtcbiAgICAgICAgICBgdmlhICR7RlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJ9KSwgc28gdGhpcyBtZWFucyB0aGUgYnVpbGQgb3V0cHV0IGlzIGAgK1xuICAgICAgICAgIGBzdGFsZSwgb3IgXFxgc2tpcEJ1aWxkOiB0cnVlXFxgIGFuZCB0aGUgYnVpbGQgd2FzIHJ1biB3aXRob3V0IHRoYXQgYCArXG4gICAgICAgICAgYHZhcmlhYmxlIHNldC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lcyA9IHN0YWdlZCA/IE9iamVjdC5rZXlzKHN0YWdlZCkgOiBbREVGQVVMVF9GVU5DVElPTl9HUk9VUF07XG4gICAgY29uc3Qgcm9vdHMgPSBuYW1lcy5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgcGF0aDogam9pbihcbiAgICAgICAgdGhpcy5kb3ROZXh0UGF0aCxcbiAgICAgICAgQURBUFRFUl9ESVJfTkFNRSxcbiAgICAgICAgLi4uZ3JvdXBTdGFnaW5nRGlyTmFtZShzdGFnZWQgPyBuYW1lIDogdW5kZWZpbmVkKS5zcGxpdChcIi9cIiksXG4gICAgICApLFxuICAgICAgcm91dGVzOiBzdGFnZWQ/LltuYW1lXSA/PyBbXSxcbiAgICB9KSk7XG5cbiAgICAvLyBgZGVmYXVsdGAgZmlyc3QsIHNvIGFueSBcInRoZSByb290XCIgY2FsbGVyIGdldHMgdGhlIGdyb3VwIHRoYXQgb3duc1xuICAgIC8vIGV2ZXJ5dGhpbmcgdW5hc3NpZ25lZC5cbiAgICByb290cy5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQXG4gICAgICAgID8gLTFcbiAgICAgICAgOiBiLm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVBcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiByb290cykge1xuICAgICAgaWYgKCFleGlzdHNTeW5jKHJvb3QucGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFRoZSBkZXBsb3ltZW50IHJvb3QgZm9yIGZ1bmN0aW9uIGdyb3VwIGAgK1xuICAgICAgICAgICAgYFwiJHtyb290Lm5hbWV9XCIgaXMgbWlzc2luZyBmcm9tICR7cm9vdC5wYXRofSwgdGhvdWdoIHRoZSBhZGFwdGVyIGAgK1xuICAgICAgICAgICAgYG1hbmlmZXN0IGxpc3RzIGl0LiBUaGUgXFxgLm5leHRcXGAgZGlyZWN0b3J5IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIGAgK1xuICAgICAgICAgICAgYFxcYG5leHQgYnVpbGRcXGAgcmFuLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290cztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYW1iZGEgZW5mb3JjZXMgMjUwIE1CIHVuemlwcGVkIGF0IENsb3VkRm9ybWF0aW9uIHRpbWUsIHdoaWNoIGlzIG1pbnV0ZXNcbiAgICogaW50byBhIGRlcGxveSBhbmQgcmVwb3J0cyBvbmx5IGEgc2l6ZS4gU3BsaXR0aW5nIGV4aXN0cyB0byBzdGF5IHVuZGVyIHRoYXRcbiAgICogY2FwLCBzbyB0aGUgZXJyb3IgdGhhdCB0ZWxscyB5b3UgdG8gc3BsaXQgZnVydGhlciBoYXMgdG8gbmFtZSB0aGUgZ3JvdXAsIGl0c1xuICAgKiBzaXplLCBhbmQgd2hhdCB0byBkbyDigJQgYW5kIGFycml2ZSBhdCBzeW50aC5cbiAgICovXG4gIHByaXZhdGUgYXNzZXJ0VW5kZXJMYW1iZGFMaW1pdChyb290OiBOZXh0anNEZXBsb3ltZW50Um9vdCk6IHZvaWQge1xuICAgIGNvbnN0IGJ5dGVzID0gc3RvcmVkU2l6ZShyb290LnBhdGgpO1xuICAgIGRlYnVnKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gRGVwbG95bWVudCByb290IFwiJHtyb290Lm5hbWV9XCIgaXMgJHsoYnl0ZXMgLyAxZTYpLnRvRml4ZWQoMSl9IE1CIHVuemlwcGVkYCxcbiAgICApO1xuICAgIGlmIChieXRlcyA8PSBMQU1CREFfVU5aSVBQRURfTElNSVRfQllURVMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWIgPSAodmFsdWU6IG51bWJlcikgPT4gYCR7KHZhbHVlIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMCl9IE1CYDtcbiAgICBjb25zdCBpc1NwbGl0ID0gdGhpcy5kZXBsb3ltZW50Um9vdHMubGVuZ3RoID4gMTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBGdW5jdGlvbiBncm91cCBcIiR7cm9vdC5uYW1lfVwiIGlzICR7bWIoYnl0ZXMpfSB1bnppcHBlZCwgYCArXG4gICAgICAgIGBvdmVyIExhbWJkYSdzICR7bWIoTEFNQkRBX1VOWklQUEVEX0xJTUlUX0JZVEVTKX0gbGltaXQuIGAgK1xuICAgICAgICAoaXNTcGxpdFxuICAgICAgICAgID8gYFNwbGl0IGl0cyByb3V0ZXMgZnVydGhlciwgb3IgbW92ZSBzb21lIG9mIHRoZW0gaW50byBhbm90aGVyIGdyb3VwOiBgICtcbiAgICAgICAgICAgIGB0aGUgY2FwIGlzIHBlciBmdW5jdGlvbiwgc28gdGhlIHNoYXJlZCBcXGBuZXh0XFxgIGNsb3N1cmUgZXZlcnkgZ3JvdXAgYCArXG4gICAgICAgICAgICBgZHVwbGljYXRlcyBjb3N0cyBub3RoaW5nIGFnYWluc3QgYW55IHNpbmdsZSBidWRnZXQuYFxuICAgICAgICAgIDogYFVzZSB0aGUgXFxgZnVuY3Rpb25Hcm91cHNcXGAgcHJvcCB0byBwYWNrYWdlIHJvdXRlcyBpbnRvIHNlcGFyYXRlIGAgK1xuICAgICAgICAgICAgYGZ1bmN0aW9ucy4gTm90ZSB0aGF0IHNwbGl0dGluZyBvbmx5IHJlbW92ZXMgcm91dGUtbG9jYWwgY29kZSDigJQgYCArXG4gICAgICAgICAgICBgYW55dGhpbmcgcmVhY2hhYmxlIGZyb20gYSBzaGFyZWQgbGF5b3V0IG9yIHRoZSBcXGBuZXh0XFxgIHJ1bnRpbWUgaXMgYCArXG4gICAgICAgICAgICBgaW4gZXZlcnkgZ3JvdXAuYCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBtYW5pZmVzdCB0aGUgYWRhcHRlcidzIGBvbkJ1aWxkQ29tcGxldGVgIHdyb3RlLlxuICAgKlxuICAgKiBJdHMgYWJzZW5jZSBtZWFucyBgbmV4dCBidWlsZGAgcmFuIHdpdGhvdXQgY2RrLW5leHRqcydzIGFkYXB0ZXIgcmVnaXN0ZXJlZFxuICAgKiAob3Igd2l0aCBhIHN0YWxlIGBuZXh0LmNvbmZpZ2ApLCB3aGljaCBpcyB3b3J0aCBzYXlpbmcgcGxhaW5seSBoZXJlOiBldmVyeVxuICAgKiBsYXRlciBmYWlsdXJlIOKAlCBhIExhbWJkYSB0aGF0IGNhbm5vdCBmaW5kIGBtYW5pZmVzdC5qc29uYCwgYW4gZW1wdHkgYXNzZXQg4oCUXG4gICAqIGlzIHRoZSBzYW1lIGNhdXNlIHNldmVyYWwgc3RlcHMgZG93bnN0cmVhbS5cbiAgICovXG4gIHByaXZhdGUgcmVhZEFkYXB0ZXJNYW5pZmVzdCgpOiBBZGFwdGVyTWFuaWZlc3Qge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4oXG4gICAgICB0aGlzLmRvdE5leHRQYXRoLFxuICAgICAgQURBUFRFUl9ESVJfTkFNRSxcbiAgICAgIE1BTklGRVNUX0ZJTEVfTkFNRSxcbiAgICApO1xuICAgIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjZGstbmV4dGpzIGFkYXB0ZXIgbWFuaWZlc3Qgbm90IGZvdW5kIGF0ICR7bWFuaWZlc3RQYXRofS4gYCArXG4gICAgICAgICAgYFwiJHt0aGlzLmJ1aWxkQ29tbWFuZH1cIiBtdXN0IHJ1biBhIE5leHQuanMgYnVpbGQgd2l0aCBjZGstbmV4dGpzJ3MgYCArXG4gICAgICAgICAgYGFkYXB0ZXIgcmVnaXN0ZXJlZC4gY2RrLW5leHRqcyBzZXRzIFxcYE5FWFRfQURBUFRFUl9QQVRIXFxgIG9uIHRoZSBgICtcbiAgICAgICAgICBgYnVpbGQgaXQgcnVucyBpdHNlbGYsIHNvIHRoaXMgdXN1YWxseSBtZWFucyBlaXRoZXIgdGhlIGJ1aWxkIGNvbW1hbmQgYCArXG4gICAgICAgICAgYGRvZXMgbm90IHJlYWNoIFxcYG5leHQgYnVpbGRcXGAgKGEgd3JhcHBlciB0aGF0IGRyb3BzIHRoZSBlbnZpcm9ubWVudCwgYCArXG4gICAgICAgICAgYG9yIGEgY2FjaGVkIGJ1aWxkIHRoYXQgZGlkIG5vdCByZS1ydW4pLCBvciBcXGBza2lwQnVpbGQ6IHRydWVcXGAgYW5kIGAgK1xuICAgICAgICAgIGB0aGUgYnVpbGQgaGFwcGVuZWQgb3V0c2lkZSBDREsuIEZvciB0aGUgbGF0dGVyLCBzZXQgYCArXG4gICAgICAgICAgYFxcYGFkYXB0ZXJQYXRoOiByZXF1aXJlLnJlc29sdmUoXCJjZGstbmV4dGpzL2FkYXB0ZXJcIilcXGAgaW4gYCArXG4gICAgICAgICAgYG5leHQuY29uZmlnLiBBIGN1c3RvbSBcXGBkaXN0RGlyXFxgIGlzIG5vdCBzdXBwb3J0ZWQgZWl0aGVyOiBgICtcbiAgICAgICAgICBgY2RrLW5leHRqcyByZWFkcyB0aGUgYnVpbGQgZnJvbSBcXGAubmV4dFxcYC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICByZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpLFxuICAgICk7XG4gICAgaWYgKG1hbmlmZXN0LnZlcnNpb24gIT09IEFEQVBURVJfTUFOSUZFU1RfVkVSU0lPTikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBhdCAke21hbmlmZXN0UGF0aH0gaXMgdmVyc2lvbiBgICtcbiAgICAgICAgICBgJHttYW5pZmVzdC52ZXJzaW9ufSwgYnV0IHRoaXMgdmVyc2lvbiBvZiBjZGstbmV4dGpzIHJlYWRzIHZlcnNpb24gYCArXG4gICAgICAgICAgYCR7QURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OfS4gVGhlIGFkYXB0ZXIgdGhhdCB3cm90ZSBpdCBhbmQgdGhlIGAgK1xuICAgICAgICAgIGBjb25zdHJ1Y3RzIHJlYWRpbmcgaXQgY29tZSBmcm9tIHRoZSBzYW1lIHBhY2thZ2UsIHNvIHRoaXMgbWVhbnMgdHdvIGAgK1xuICAgICAgICAgIGBjZGstbmV4dGpzIHZlcnNpb25zIGFyZSBpbnN0YWxsZWQsIG9yIHRoZSBidWlsZCBvdXRwdXQgaXMgc3RhbGUuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBtYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGNkay1uZXh0anMncyBvd24gYnVuZGxlZCByZXF1ZXN0LWhhbmRsaW5nIHNoZWxsIGFuZCB0aGUgbWFuaWZlc3QgaW50b1xuICAgKiBgPGRlcGxveW1lbnRSb290Pi9jZGstbmV4dGpzLXJ1bnRpbWUvYCwgd2hpY2ggaXMgd2hlcmVcbiAgICogYGRlcGxveW1lbnRSb290T2ZgL2BkZXBsb3llZE1hbmlmZXN0UGF0aGAgZXhwZWN0IHRvIGZpbmQgdGhlbS5cbiAgICpcbiAgICogT25seSB0aGUgc2hlbGwgdGhlIGRlcGxveW1lbnQgdHlwZSBhY3R1YWxseSBydW5zIGlzIGNvcGllZCDigJQgdGhlIExhbWJkYVxuICAgKiBoYW5kbGVyIGZvciBGdW5jdGlvbnMsIHRoZSBgbm9kZTpodHRwYCBzZXJ2ZXIgZm9yIENvbnRhaW5lcnMg4oCUIHNvIG5vdGhpbmdcbiAgICogc2hpcHMgfjEuNSBNQiBvZiBkZWFkIGNvZGUgYW5kIHRoZSB0cmVlIHNheXMgd2hpY2ggdHlwZSBwcm9kdWNlZCBpdC4gQm90aFxuICAgKiBhcmUgY29waWVkIGZyb20gdGhpcyBwYWNrYWdlJ3MgYGxpYi9gLCBuZXh0IHRvIHRoZSBjb21waWxlZCBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEV2ZXJ5IGdyb3VwIGdldHMgdGhlIHNhbWUgc2hlbGwgKmFuZCB0aGUgc2FtZSBtYW5pZmVzdCo6IGEgZnVuY3Rpb24gb25seVxuICAgKiBrbm93cyB3aGljaCByb3V0ZXMgaXQgb3ducyBzbyBpdCBjYW4gc2F5IHNvIHdoZW4gbWlzcm91dGVkLCBhbmQgdGhhdCBjb21lc1xuICAgKiBmcm9tIHtAbGluayBGVU5DVElPTl9HUk9VUF9FTlZfVkFSfSwgbm90IGZyb20gYSBwZXItZ3JvdXAgbWFuaWZlc3QuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlUnVudGltZShcbiAgICBkZXBsb3ltZW50Um9vdDogc3RyaW5nLFxuICAgIGlzRnVuY3Rpb25zOiBib29sZWFuLFxuICAgIHB1YmxpY09uRGlzazogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2hlbGwgPSBpc0Z1bmN0aW9ucyA/IFwibGFtYmRhLm1qc1wiIDogXCJzZXJ2ZXIubWpzXCI7XG4gICAgY29uc3Qgc291cmNlID0gam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCJydW50aW1lXCIsIHNoZWxsKTtcblxuICAgIGNvbnN0IHJ1bnRpbWVEaXIgPSBqb2luKGRlcGxveW1lbnRSb290LCBSVU5USU1FX0RJUl9OQU1FKTtcbiAgICAvLyBSZW1vdmVkIHJhdGhlciB0aGFuIG1lcmdlZDogYSBzdGFsZSBzaGVsbCBmcm9tIHRoZSBvdGhlciBkZXBsb3ltZW50IHR5cGVcbiAgICAvLyB3b3VsZCBvdGhlcndpc2Ugc2l0IGluIHRoZSBhc3NldCBhbmQgY2hhbmdlIGl0cyBoYXNoIGZvciBubyByZWFzb24uXG4gICAgcm1TeW5jKHJ1bnRpbWVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBta2RpclN5bmMocnVudGltZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY3BTeW5jKHNvdXJjZSwgam9pbihydW50aW1lRGlyLCBzaGVsbCkpO1xuICAgIGNwU3luYyhcbiAgICAgIGpvaW4odGhpcy5kb3ROZXh0UGF0aCwgQURBUFRFUl9ESVJfTkFNRSwgTUFOSUZFU1RfRklMRV9OQU1FKSxcbiAgICAgIGpvaW4ocnVudGltZURpciwgTUFOSUZFU1RfRklMRV9OQU1FKSxcbiAgICApO1xuICAgIGlmICghcHVibGljT25EaXNrKSB7XG4gICAgICAvLyBUaGUgTGFtYmRhIHppcHMgYW5kIHRoZSBHbG9iYWxDb250YWluZXJzIGltYWdlIGRvbid0IGNhcnJ5IGBwdWJsaWMvYFxuICAgICAgLy8gKGl0cyBieXRlcyBhcmUgaW4gUzMpLCBzbyB0aGUgcnVudGltZSBjYW4ndCBsaXN0IGl0IGF0IHN0YXJ0IHRoZSB3YXlcbiAgICAgIC8vIHRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgZG9lcy5cbiAgICAgIC8vIExpc3RlZCBoZXJlLCBhZnRlciB0aGUgYnVpbGQgY29tbWFuZCwgc28gYHBvc3RidWlsZGAgb3V0cHV0IGlzIGluIGl0OlxuICAgICAgLy8gYSByZXdyaXRlIG9udG8gYSBsaXN0ZWQgZmlsZSBpcyB0aGVuIHNlcnZlZCBmcm9tIFMzIHJhdGhlciB0aGFuIDQwNGluZy5cbiAgICAgIHdyaXRlUHVibGljRmlsZUxpc3QoXG4gICAgICAgIHJ1bnRpbWVEaXIsXG4gICAgICAgIGpvaW4odGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFN0YWdlZCAke3NoZWxsfSBhbmQgJHtNQU5JRkVTVF9GSUxFX05BTUV9IGluICR7cnVudGltZURpcn1gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogYE5FWFRfQURBUFRFUl9QQVRIYCBmb3IgdGhlIGJ1aWxkLCBzbyBgYWRhcHRlclBhdGhgIGluIGBuZXh0LmNvbmZpZ2AgaXNcbiAgICogb3B0aW9uYWwuXG4gICAqXG4gICAqIE5leHQuanMgcmVhZHMgdGhlIHZhcmlhYmxlIGFzIHRoZSAqZGVmYXVsdCogdmFsdWUgb2YgYGFkYXB0ZXJQYXRoYFxuICAgKiAoYG5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc2AsIGBkZWZhdWx0Q29uZmlnYCksIHNvIGFuIGFwcCB0aGF0IGRvZXNcbiAgICogc2V0IGBhZGFwdGVyUGF0aGAgc3RpbGwgd2lucyBhbmQgbm90aGluZyBleGlzdGluZyBjaGFuZ2VzLlxuICAgKlxuICAgKiBSZXNvbHZlZCBmcm9tIHRoZSBOZXh0LmpzIGFwcCwgbm90IGZyb20gY2RrLW5leHRqcydzIG93biBgX19kaXJuYW1lYCBhbmQgbm90XG4gICAqIGxlZnQgYXMgYSBiYXJlIHNwZWNpZmllci4gQm90aCBhbHRlcm5hdGl2ZXMgd2VyZSB0cmllZCBhbmQgYm90aCBhcmUgd3Jvbmc6XG4gICAqXG4gICAqIC0gY2RrLW5leHRqcydzIG93biBsb2NhdGlvbiBsb3NlcyBiZWNhdXNlIHRoZSBhZGFwdGVyIHJlc29sdmVzIGl0cyBzaWJsaW5nXG4gICAqICAgY2FjaGUgaGFuZGxlciByZWxhdGl2ZSB0byB3aGVyZXZlciAqaXQqIHdhcyBsb2FkZWQgZnJvbS4gQW4gYWRhcHRlciBsb2FkZWRcbiAgICogICBmcm9tIG91dHNpZGUgdGhlIGFwcCdzIHRyZWUgaGFuZHMgTmV4dC5qcyBhIGBjYWNoZUhhbmRsZXJgIG91dHNpZGVcbiAgICogICBgdHVyYm9wYWNrLnJvb3RgLCB3aGljaCBUdXJib3BhY2sgcmVqZWN0cyBvdXRyaWdodCAoXCJsZWF2ZXMgdGhlIGZpbGVzeXN0ZW1cbiAgICogICByb290XCIpLlxuICAgKiAtIEEgYmFyZSBzcGVjaWZpZXIgbG9zZXMgYmVjYXVzZSBOZXh0LmpzIHJlc29sdmVzIGBhZGFwdGVyUGF0aGAgZnJvbSBpbnNpZGVcbiAgICogICBpdHMgb3duIGNvbmZpZyBsb2FkZXIsIGkuZS4gZnJvbSBgbmV4dGAncyByZWFscGF0aC4gVW5kZXIgcG5wbSB0aGF0IGlzIHRoZVxuICAgKiAgIHZpcnR1YWwgc3RvcmUgKGBub2RlX21vZHVsZXMvLnBucG0vbmV4dEDigKYvbm9kZV9tb2R1bGVzL25leHQvYCksIGFuZCB0aGVcbiAgICogICB3YWxrIHVwIGZyb20gdGhlcmUgbmV2ZXIgcmVhY2hlcyB0aGUgYXBwJ3Mgb3duIGBub2RlX21vZHVsZXNgLlxuICAgKlxuICAgKiBVbnNldCB3aGVuIGBjZGstbmV4dGpzYCBpcyBub3QgcmVzb2x2YWJsZSBmcm9tIHRoZSBhcHAsIHdoaWNoIGlzIGxlZ2l0aW1hdGU6XG4gICAqIHRoZSBOZXh0LmpzIGFwcCBhbmQgdGhlIENESyBhcHAgY2FuIGJlIHNlcGFyYXRlIHBhY2thZ2VzLCBhbmQgb25seSB0aGUgQ0RLIG9uZVxuICAgKiBuZWNlc3NhcmlseSBkZXBlbmRzIG9uIGNkay1uZXh0anMuIHtAbGluayByZWFkQWRhcHRlck1hbmlmZXN0fSByZXBvcnRzIHRoZVxuICAgKiByZXN1bHRpbmcgZmFpbHVyZSBhbmQgbmFtZXMgdGhpcyBjYXNlLlxuICAgKlxuICAgKiBPbmUgc2V0dXAgdGhpcyBjYW5ub3Qgc2VydmUsIGFuZCB0aGUgcmVhc29uIHRoaXMgcmVwbydzIG93biBleGFtcGxlcyBzdGlsbCBzZXRcbiAgICogYGFkYXB0ZXJQYXRoYDogYSBgbGluazpgL2BmaWxlOmAgZGVwZW5kZW5jeSBvbiBhIGNkay1uZXh0anMgY2hlY2tvdXQgKm91dHNpZGUqXG4gICAqIHRoZSBhcHAncyBwcm9qZWN0IHJvb3QuIFRoZSBzeW1saW5rIHJlc29sdmVzIG91dCBvZiB0aGUgcHJvamVjdCwgc28gdGhlXG4gICAqIGBjYWNoZUhhbmRsZXJgIGVzY2FwZSBhYm92ZSBhcHBsaWVzLiBTZXQgYGFkYXB0ZXJQYXRoYCBpbiBgbmV4dC5jb25maWdgIHRoZXJlXG4gICAqIOKAlCBpdCBpcyByZXNvbHZlZCBieSB0aGUgYnVpbGQsIGFmdGVyIHdoYXRldmVyIHB1dCB0aGUgYWRhcHRlciBpbiBwbGFjZS5cbiAgICovXG4gIHByaXZhdGUgYWRhcHRlclBhdGhFbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIE5FWFRfQURBUFRFUl9QQVRIOiByZXF1aXJlLnJlc29sdmUoXCJjZGstbmV4dGpzL2FkYXB0ZXJcIiwge1xuICAgICAgICAgIHBhdGhzOiBbdGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeV0sXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBcImNkay1uZXh0anMvYWRhcHRlclwiIGZyb20gYCArXG4gICAgICAgICAgYCR7dGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeX07IGxlYXZpbmcgTkVYVF9BREFQVEVSX1BBVEggdW5zZXQsIHNvIGAgK1xuICAgICAgICAgIGBuZXh0LmNvbmZpZyBtdXN0IHNldCBcXGBhZGFwdGVyUGF0aFxcYC5gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBsb2NhbCBidWlsZCBjb21tYW5kIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIHJ1bk5leHRCdWlsZCgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFJ1bm5pbmc6IFwiJHt0aGlzLmJ1aWxkQ29tbWFuZH1cIiBpbiBkaXJlY3Rvcnk6ICR7dGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeX1gLFxuICAgICk7XG5cbiAgICAvLyBDbGVhbiBleGlzdGluZyBjYWNoZSBkaXJlY3RvcnkgdG8gYXZvaWQgc3RhbGUgZGF0YSBmcm9tIHByZXZpb3VzIGJ1aWxkc1xuICAgIGlmIChleGlzdHNTeW5jKHRoaXMuaW5pdENhY2hlRGlyKSkge1xuICAgICAgcm1TeW5jKHRoaXMuaW5pdENhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICBkZWJ1ZyhgQ2xlYW5lZCBleGlzdGluZyBjYWNoZSBkaXJlY3Rvcnk6ICR7dGhpcy5pbml0Q2FjaGVEaXJ9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKHRoaXMuYnVpbGRDb21tYW5kLCB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBDREtfTkVYVEpTX0lOSVRfQ0FDSEVfRElSOiB0aGlzLmluaXRDYWNoZURpcixcbiAgICAgICAgICAuLi50aGlzLmFkYXB0ZXJQYXRoRW52KCksXG4gICAgICAgICAgLy8gYG9uQnVpbGRDb21wbGV0ZWAgcnVucyBpbnNpZGUgdGhpcyBwcm9jZXNzIGFuZCBjYW5ub3QgcmVhZCBDREtcbiAgICAgICAgICAvLyBwcm9wcywgc28gdGhlIHJlc29sdmVkIGdyb3VwcyB0cmF2ZWwgYXMgSlNPTi4gQWJzZW50IHdoZW4gbm90XG4gICAgICAgICAgLy8gc3BsaXR0aW5nLCB3aGljaCB0aGUgYWRhcHRlciByZWFkcyBhcyBcIm9uZSBkZXBsb3ltZW50IHJvb3RcIi5cbiAgICAgICAgICAuLi4odGhpcy5wcm9wcy5mdW5jdGlvbkdyb3Vwcz8ubGVuZ3RoXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBbRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJdOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgIHRvRnVuY3Rpb25Hcm91cFNwZWNzKHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHMpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTG9jYWwgYnVpbGQgZmFpbGVkOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kIGBwYXRjaC1mZXRjaC5qc2AgdG8gdGhlIGNsaWVudCBlbnRyeXBvaW50IGNodW5rcywgZm9yXG4gICAqIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgIG9ubHkuXG4gICAqXG4gICAqIFRoaXMgaXMgd2hhdCBtYWtlcyBQT1NUIHdvcmsgYXQgYWxsIG9uIHRoYXQgdHlwZS4gQ2xvdWRGcm9udCByZWFjaGVzIHRoZVxuICAgKiBzZXJ2ZXIgdGhyb3VnaCBhIExhbWJkYSBGdW5jdGlvbiBVUkwgd2l0aCBgQXV0aFR5cGU6IEFXU19JQU1gLCBzaWduZWQgYnkgYW5cbiAgICogb3JpZ2luIGFjY2VzcyBjb250cm9sLCBhbmQgQVdTIGRvY3VtZW50cyB0aGUgY29uc2VxdWVuY2U6IFwiSWYgeW91IHVzZSBQVVQgb3JcbiAgICogUE9TVCBtZXRob2RzIHdpdGggeW91ciBMYW1iZGEgZnVuY3Rpb24gVVJMLCB5b3VyIHVzZXJzIG11c3QgY29tcHV0ZSB0aGVcbiAgICogU0hBMjU2IG9mIHRoZSBib2R5IGFuZCBpbmNsdWRlIHRoZSBwYXlsb2FkIGhhc2ggdmFsdWUgb2YgdGhlIHJlcXVlc3QgYm9keSBpblxuICAgKiB0aGUgYHgtYW16LWNvbnRlbnQtc2hhMjU2YCBoZWFkZXIgd2hlbiBzZW5kaW5nIHRoZSByZXF1ZXN0IHRvIENsb3VkRnJvbnQuXG4gICAqIExhbWJkYSBkb2Vzbid0IHN1cHBvcnQgdW5zaWduZWQgcGF5bG9hZHMuXCJcbiAgICpcbiAgICogQ2xvdWRGcm9udCBzaWducyBHRVRzIGl0c2VsZiAoZW1wdHktYm9keSBoYXNoKSBidXQgd2lsbCBub3QgaGFzaCBhIGJvZHksIGFuZFxuICAgKiBhIGJyb3dzZXIgaGFzIG5vIHdheSB0byBhZGQgdGhhdCBoZWFkZXIgb24gaXRzIG93biwgc28gYW4gdW5wYXRjaGVkIGFwcFxuICAgKiBhbnN3ZXJzIGV2ZXJ5IHNlcnZlciBhY3Rpb24sIGZvcm0gc3VibWlzc2lvbiBhbmQgUE9TVCByb3V0ZSBoYW5kbGVyIHdpdGhcbiAgICogYDQwMyBJbnZhbGlkU2lnbmF0dXJlRXhjZXB0aW9uYCBiZWZvcmUgdGhlIHJlcXVlc3QgcmVhY2hlcyBOZXh0LmpzLiBUaGVcbiAgICogcGF0Y2ggaW5zdGFsbHMgYGZldGNoYC9gWE1MSHR0cFJlcXVlc3RgIHdyYXBwZXJzIHRoYXQgY29tcHV0ZSB0aGUgaGFzaC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvcHJpdmF0ZS1jb250ZW50LXJlc3RyaWN0aW5nLWFjY2Vzcy10by1sYW1iZGEuaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSBwYXRjaEZldGNoSW5DbGllbnRKcygpIHtcbiAgICBjb25zdCBzdGF0aWNDaHVua3NQYXRoID0gam9pbih0aGlzLmRvdE5leHRQYXRoLCBcInN0YXRpY1wiLCBcImNodW5rc1wiKTtcbiAgICBjb25zdCBjaHVua0ZpbGVzID0gcmVhZGRpclN5bmMoc3RhdGljQ2h1bmtzUGF0aCkuZmlsdGVyKFxuICAgICAgKGZpbGU6IHN0cmluZykgPT5cbiAgICAgICAgLy8gbWFpbi1hcHAtIGZvciB3ZWJwYWNrLCB0dXJib3BhY2stIGZvciB0dXJib1xuICAgICAgICBmaWxlLnN0YXJ0c1dpdGgoXCJtYWluLWFwcC1cIikgfHxcbiAgICAgICAgKGZpbGUuc3RhcnRzV2l0aChcInR1cmJvcGFjay1cIikgJiYgZmlsZS5lbmRzV2l0aChcIi5qc1wiKSksXG4gICAgKTtcblxuICAgIGlmIChjaHVua0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2xpZW50IHNpZGUganMgZW50cnlwb2ludCBmaWxlcyBmb3VuZFwiKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkIHRoZSBwYXRjaC1mZXRjaC5qcyBjb250ZW50XG4gICAgY29uc3QgcGF0Y2hGZXRjaFBhdGggPSBqb2luKF9fZGlybmFtZSwgXCJwYXRjaC1mZXRjaC5qc1wiKTtcbiAgICBjb25zdCBwYXRjaEZldGNoQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRjaEZldGNoUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIFByZXBlbmQgcGF0Y2gtZmV0Y2ggbG9naWMgdG8gZWFjaCBlbnRyeXBvaW50LCBvbmNlLiBOb3cgdGhhdCB0aGlzIHJ1bnNcbiAgICAvLyBvdXRzaWRlIGBydW5OZXh0QnVpbGRgLCB0aGUgc2FtZSBgLm5leHRgIGNhbiBiZSBzeW50aGVzaXplZCBtb3JlIHRoYW5cbiAgICAvLyBvbmNlIChgc2tpcEJ1aWxkOiB0cnVlYCwgYGNkayBzeW50aGAgdGhlbiBgY2RrIGRlcGxveWAsIGEgcmV0cmllZFxuICAgIC8vIGRlcGxveSksIGFuZCBwcmVwZW5kaW5nIHR3aWNlIHdvdWxkIHJlLXdyYXAgdGhlIHdyYXBwZXJzLlxuICAgIGZvciAoY29uc3QgY2h1bmtGaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgIGNvbnN0IGNodW5rRmlsZVBhdGggPSBqb2luKHN0YXRpY0NodW5rc1BhdGgsIGNodW5rRmlsZSk7XG4gICAgICBjb25zdCBwYXRjaGVkQ29udGVudCA9IHBhdGNoQ2xpZW50Q2h1bmsoXG4gICAgICAgIHJlYWRGaWxlU3luYyhjaHVua0ZpbGVQYXRoLCBcInV0Zi04XCIpLFxuICAgICAgICBwYXRjaEZldGNoQ29udGVudCxcbiAgICAgICAgY2h1bmtGaWxlUGF0aCxcbiAgICAgICk7XG4gICAgICBpZiAocGF0Y2hlZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBBbHJlYWR5IHBhdGNoZWQsIHNraXBwaW5nOiAke2NodW5rRmlsZVBhdGh9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgd3JpdGVGaWxlU3luYyhjaHVua0ZpbGVQYXRoLCBwYXRjaGVkQ29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwdWJsaWMgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBsb2NhbCBmaWxlc3lzdGVtXG4gICAqL1xuICBwcml2YXRlIGdldExvY2FsUHVibGljRGlyRW50cmllcygpOiBQdWJsaWNEaXJFbnRyeVtdIHtcbiAgICBjb25zdCBwdWJsaWNEaXJQYXRoID0gam9pbih0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMocHVibGljRGlyUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVhZGRpclN5bmMocHVibGljRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgaXNEaXJlY3Rvcnk6IGVudHJ5LmlzRGlyZWN0b3J5KCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmlwIHdoYXRldmVyIHBsYXRmb3JtLXNwZWNpZmljIFNoYXJwIGJpbmFyaWVzIGBuZXh0IGJ1aWxkYCdzIG91dHB1dCBmaWxlXG4gICAqIHRyYWNpbmcgc3RhZ2VkLCBzaW5jZSB0aGV5J3JlIHRoZSBob3N0J3MgKGUuZy4gbWFjT1MvZ2xpYmMpIHJhdGhlciB0aGFuIHRoZVxuICAgKiBkZXBsb3ltZW50IHRhcmdldCdzLCB0aGVuIGluc3RhbGwgdGhlIHRhcmdldCdzLiBTa2lwcGluZyB0aGlzIGlzIHNpbGVudDpcbiAgICogYGltYWdlT3B0aW1pemVyYCBjYXRjaGVzIHRoZSBsb2FkIGZhaWx1cmUgaW50ZXJuYWxseSBhbmQgcmV0dXJucyB0aGVcbiAgICogdW5vcHRpbWl6ZWQgb3JpZ2luYWwgd2l0aCBhbiBIVFRQIDIwMC5cbiAgICpcbiAgICogT25seSBhIHJvb3Qgd2l0aCBgc2hhcnBgIHN0YWdlZCBnZXRzIHRoZSBiaW5hcmllczogdGhlIGltYWdlIG9wdGltaXplclxuICAgKiBicmluZ3MgaXQgaW50byBgZGVmYXVsdGAsIHdoaWNoIHNlcnZlcyBldmVyeSBgL19uZXh0L2ltYWdlYCwgYW5kIGFub3RoZXJcbiAgICogZ3JvdXAgaGFzIGl0IG9ubHkgaWYgaXRzIG93biByb3V0ZXMgdXNlIGl0LiBTbyBvbmx5IGBkZWZhdWx0YCB3YXJucyB3aGVuXG4gICAqIGl0J3MgbWlzc2luZy5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VTaGFycEZvclRhcmdldChcbiAgICByb290OiBOZXh0anNEZXBsb3ltZW50Um9vdCxcbiAgICBwcm9qZWN0RGlyOiBzdHJpbmcsXG4gICAgcGxhdGZvcm06IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3Qgc2hhcnBTb3VyY2UgPSB0aGlzLnJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhyb290LnBhdGgsIHByb2plY3REaXIpO1xuICAgIGlmICghc2hhcnBTb3VyY2UpIHtcbiAgICAgIGlmIChyb290Lm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFwic2hhcnBcIiBub3QgZm91bmQgaW4gdGhlIHN0YWdlZCBidWlsZCBvdXRwdXQuIEFkZCBcInNoYXJwXCIgYXMgYSBkZXBlbmRlbmN5IG9mIHlvdXIgTmV4dC5qcyBhcHAgdG8gZW5hYmxlIGltYWdlIG9wdGltaXphdGlvbi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbGxTaGFycFBhY2thZ2VzKFxuICAgICAgc2hhcnBCaW5hcnlEaXIocm9vdC5wYXRoKSxcbiAgICAgIHRoaXMuZ2V0U2hhcnBCaW5hcnlQYWNrYWdlcyhzaGFycFNvdXJjZSwgcGxhdGZvcm0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZmluZCBhbmQgcmVtb3ZlIGV4aXN0aW5nIFNoYXJwIHBsYXRmb3JtIGJpbmFyaWVzLlxuICAgKlxuICAgKiBgcm9vdGAgaXMgd2Fsa2VkIHdob2xlIHJhdGhlciB0aGFuIGp1c3QgaXRzIGBub2RlX21vZHVsZXNgOiB0aGUgc3RhZ2VkIHRyZWVcbiAgICogaXMga2V5ZWQgYnkgcmVwby1yb290LXJlbGF0aXZlIHBhdGgsIHNvIGluIGEgbW9ub3JlcG8gdGhlIGBub2RlX21vZHVsZXNgXG4gICAqIGhvbGRpbmcgYHNoYXJwYCBpcyBzZXZlcmFsIGRpcmVjdG9yaWVzIGRvd24uIHtAbGluayBpc1NoYXJwQmluYXJ5UGFja2FnZX0gaXNcbiAgICogd2hhdCBrZWVwcyB0aGF0IGZyb20gcmVhY2hpbmcgdGhlIGFwcCdzIG93biBvdXRwdXQg4oCUIHRoZSBzdGFnZWQgcm9vdCBob2xkc1xuICAgKiB0aGUgY29tcGlsZWQgYC5uZXh0YCBhcyB3ZWxsIGFzIHRoZSBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9qZWN0RGlyIHRoZSBhcHAncyBkaXJlY3RvcnkgaW5zaWRlIGByb290YCwgd2hpY2ggYG5leHRgIGlzXG4gICAqIHJlc29sdmVkIGZyb20uXG4gICAqIEByZXR1cm5zIHRoZSBzdGFnZWQgYHNoYXJwYCBKUyB3cmFwcGVyIHRvIGluc3RhbGwgbmV4dCB0bywgZm91bmQgaW4gdGhlIHNhbWVcbiAgICogd2FsazogYSByb290IGNhbiBiZSBodW5kcmVkcyBvZiBtZWdhYnl0ZXMsIGFuZCBlYWNoIGdyb3VwIGhhcyBvbmUuXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhcbiAgICByb290OiBzdHJpbmcsXG4gICAgcHJvamVjdERpcjogc3RyaW5nLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoYXJwQ2FuZGlkYXRlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIExpbmtzIGFyZSBsaXN0ZWQsIG5vdCBmb2xsb3dlZDogZXZlcnkgbGluayBpbiBhIHN0YWdlZCByb290IHBvaW50c1xuICAgIC8vIGluc2lkZSBpdCAoYHN0YWdlRmlsZXNgIGNvcGllcyB0aGUgb25lcyB0aGF0IGRvbid0KSwgc28gaXRzIHRhcmdldCBpc1xuICAgIC8vIHdhbGtlZCBhdCBpdHMgb3duIHBhdGggYW55d2F5LCBhbmQgZm9sbG93aW5nIHRoZW0gaXMgd2hhdCBsZXQgYVxuICAgIC8vIHdvcmtzcGFjZSBjeWNsZSBoYW5nIHRoZSBzeW50aC5cbiAgICBjb25zdCBhbGxFbnRyaWVzID0gbGlzdFRyZWUocm9vdCk7XG5cbiAgICAvLyBTeW1saW5rcyBhcmUgdW5saW5rZWQsIG5vdCBgcm1TeW5jYGVkLCBhbmQgdGhleSBnbyBmaXJzdC4gcG5wbSBwb2ludHNcbiAgICAvLyBzZXZlcmFsIGxpbmtzIGF0IG9uZSBzdG9yZSBkaXJlY3RvcnksIGFuZCBgcm1TeW5jKOKApiwgeyByZWN1cnNpdmU6IHRydWUsXG4gICAgLy8gZm9yY2U6IHRydWUgfSlgICpzaWxlbnRseSBuby1vcHMqIG9uIGEgc3ltbGluayB3aG9zZSB0YXJnZXQgaXMgYWxyZWFkeVxuICAgIC8vIGdvbmUg4oCUIGBmb3JjZWAgc3dhbGxvd3MgdGhlIEVOT0VOVCBpdHMgYHJtZGlyYCBnZXRzLiBSZW1vdmluZyBhIHN0b3JlXG4gICAgLy8gZGlyZWN0b3J5IGJlZm9yZSBpdHMgbGlua3MgdGhlcmVmb3JlIGxlZnQgZGFuZ2xpbmdcbiAgICAvLyBgQGltZy9zaGFycC1kYXJ3aW4tYXJtNjRgIGVudHJpZXMgaW4gdGhlIGFzc2V0LCB3aGljaCBpcyBhIGxhdGVudCBFTk9FTlRcbiAgICAvLyBpbiB3aGF0ZXZlciBuZXh0IGZvbGxvd3MgdGhlbSAoYHNoYXJwYCBkb2VzLCB3aGVuIGl0IGxvb2tzIGZvciBiaW5hcmllcykuXG4gICAgY29uc3Qgc3ltbGlua3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZGlyZWN0b3JpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFsbEVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUgPT09IFwic2hhcnBcIikge1xuICAgICAgICBjb25zdCBwYXRoID0gam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgICAgICBzaGFycENhbmRpZGF0ZXMucHVzaChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTaGFycEJpbmFyeVBhY2thZ2UoZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgc3ltbGlua3MucHVzaChmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZGlyZWN0b3JpZXMucHVzaChmdWxsUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBSZW1vdmluZyAke3N5bWxpbmtzLmxlbmd0aH0gU2hhcnAgYmluYXJ5IHN5bWxpbmtzIGFuZCAke2RpcmVjdG9yaWVzLmxlbmd0aH0gZGlyZWN0b3JpZXNgLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHBhdGggb2Ygc3ltbGlua3MpIHtcbiAgICAgIHVubGlua1N5bmMocGF0aCk7XG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBVbmxpbmtlZDogJHtwYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIHJtU3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBSZW1vdmVkOiAke3BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlKFxuICAgICAgc2hhcnBDYW5kaWRhdGVzLFxuICAgICAgcmVzb2x2ZU5leHRTaGFycChwcm9qZWN0RGlyKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGBAaW1nL3NoYXJwLTxwbGF0Zm9ybT5gIGFuZCBgQGltZy9zaGFycC1saWJ2aXBzLTxwbGF0Zm9ybT5gXG4gICAqIHZlcnNpb25zIHRvIGluc3RhbGwgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0uXG4gICAqXG4gICAqIFRoZXNlIG11c3QgbWF0Y2ggdGhlIGBzaGFycGAgSlMgd3JhcHBlciB0aGF0IG91dHB1dCBmaWxlIHRyYWNpbmcgc3RhZ2VkOlxuICAgKiBgc2hhcnBgJ3MgYGxpYi9saWJ2aXBzLmpzYCBjb21wYXJlcyB0aGUgYmluYXJ5J3NcbiAgICogcmVwb3J0ZWQgbGlidmlwcyB2ZXJzaW9uIGFnYWluc3QgaXRzIG93biBgbWluaW11bUxpYnZpcHNWZXJzaW9uYCBhbmRcbiAgICogdGhyb3dzIGF0IGxvYWQgd2hlbiB0aGV5IGRpc2FncmVlLiBgc2hhcnBgIHBpbnMgYm90aCBpbiBpdHNcbiAgICogYG9wdGlvbmFsRGVwZW5kZW5jaWVzYCwgc28gdGhhdCBtYW5pZmVzdCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2UuXG4gICAqL1xuICBwcml2YXRlIGdldFNoYXJwQmluYXJ5UGFja2FnZXMoXG4gICAgc2hhcnBTb3VyY2U6IHN0cmluZyxcbiAgICBwbGF0Zm9ybTogc3RyaW5nLFxuICApOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXSB7XG4gICAgLy8gT25seSBmb3IgYSBiaW5hcnkgdGhlIHN0YWdlZCBgc2hhcnBgIGRvZXMgbm90IHBpbi5cbiAgICBjb25zdCBmYWxsYmFjayA9IFtcbiAgICAgIHsgbmFtZTogYHNoYXJwLWxpYnZpcHMtJHtwbGF0Zm9ybX1gLCB2ZXJzaW9uOiBcIjEuMi40XCIgfSxcbiAgICAgIHsgbmFtZTogYHNoYXJwLSR7cGxhdGZvcm19YCwgdmVyc2lvbjogXCIwLjM0LjVcIiB9LFxuICAgIF07XG5cbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICByZWFkRmlsZVN5bmMoam9pbihzaGFycFNvdXJjZSwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIiksXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbERlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9XG4gICAgICBtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fTtcblxuICAgIHJldHVybiBmYWxsYmFjay5tYXAoKHBrZykgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IG9wdGlvbmFsRGVwZW5kZW5jaWVzW2BAaW1nLyR7cGtnLm5hbWV9YF07XG4gICAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IHNoYXJwQCR7bWFuaWZlc3QudmVyc2lvbn0gZG9lcyBub3QgcGluIFwiQGltZy8ke3BrZy5uYW1lfVwiOyBmYWxsaW5nIGJhY2sgdG8gJHtwa2cudmVyc2lvbn0uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHBrZztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG5hbWU6IHBrZy5uYW1lLCB2ZXJzaW9uIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgKHdpdGggY2FjaGluZykgYW5kIGV4dHJhY3QgU2hhcnAncyBwbGF0Zm9ybS1zcGVjaWZpYyBiaW5hcnlcbiAgICogcGFja2FnZXMgaW50byBgaW1nUGF0aGAuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxTaGFycFBhY2thZ2VzKFxuICAgIGltZ1BhdGg6IHN0cmluZyxcbiAgICBwYWNrYWdlczogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhY2hlRGlyID0gam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLXNoYXJwLWNhY2hlXCIpO1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHBrZyBvZiBwYWNrYWdlcykge1xuICAgICAgY29uc3QgdGFyZ2V0RGlyID0gam9pbihpbWdQYXRoLCBwa2cubmFtZSk7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGltZy8ke3BrZy5uYW1lfS8tLyR7cGtnLm5hbWV9LSR7cGtnLnZlcnNpb259LnRnemA7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvbnNpc3RlbnQgZmlsZW5hbWUgYmFzZWQgb24gcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uXG4gICAgICBjb25zdCBjYWNoZUZpbGVOYW1lID0gYCR7cGtnLm5hbWV9LSR7cGtnLnZlcnNpb259LnRnemA7XG4gICAgICBjb25zdCBjYWNoZWRGaWxlID0gam9pbihjYWNoZURpciwgY2FjaGVGaWxlTmFtZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkIHBhY2thZ2UgY2FjaGVkOyByZS1kb3dubG9hZCBpZlxuICAgICAgLy8gYSBwcmV2aW91cyBydW4gbGVmdCBiZWhpbmQgYSB0cnVuY2F0ZWQvY29ycnVwdCBkb3dubG9hZFxuICAgICAgaWYgKGV4aXN0c1N5bmMoY2FjaGVkRmlsZSkgJiYgdGhpcy5pc0NhY2hlZEZpbGVWYWxpZChjYWNoZWRGaWxlKSkge1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBVc2luZyBjYWNoZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gZnJvbSAke2NhY2hlZEZpbGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IERvd25sb2FkaW5nICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259Li4uYCk7XG5cbiAgICAgICAgLy8gRG93bmxvYWQgdG8gYSBwcm9jZXNzLXVuaXF1ZSB0ZW1wIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LFxuICAgICAgICAvLyB0aGVuIGF0b21pY2FsbHkgcmVuYW1lIGl0IG9udG8gdGhlIHNoYXJlZCBjYWNoZSBwYXRoLiBDb25jdXJyZW50XG4gICAgICAgIC8vIHN5bnRoIHByb2Nlc3NlcyAoZS5nLiBUdXJib3JlcG8gcnVubmluZyBtdWx0aXBsZSBgY2RrYCBjb21tYW5kcylcbiAgICAgICAgLy8gc2hhcmUgdGhpcyBjYWNoZSBkaXIsIHNvIHdyaXRpbmcgZGlyZWN0bHkgdG8gYGNhY2hlZEZpbGVgIHJpc2tzXG4gICAgICAgIC8vIGFub3RoZXIgcHJvY2VzcyBleHRyYWN0aW5nIGEgaGFsZi13cml0dGVuIGZpbGUuIFJlbmFtaW5nIHdpdGhpblxuICAgICAgICAvLyB0aGUgc2FtZSBmaWxlc3lzdGVtIGlzIGF0b21pYywgc28gcmVhZGVycyBvbmx5IGV2ZXIgc2VlIGFcbiAgICAgICAgLy8gY29tcGxldGUgZmlsZSwgd2hpY2hldmVyIHByb2Nlc3Mgd2lucyB0aGUgcmFjZS5cbiAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBqb2luKFxuICAgICAgICAgIGNhY2hlRGlyLFxuICAgICAgICAgIGAke2NhY2hlRmlsZU5hbWV9LiR7cHJvY2Vzcy5waWR9LSR7cmFuZG9tQnl0ZXMoNikudG9TdHJpbmcoXCJoZXhcIil9LnRtcGAsXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gLS1mYWlsIG1ha2VzIGN1cmwgZXhpdCBub24temVybyBvbiBIVFRQIGVycm9ycyBhbmQgLS1yZXRyeVxuICAgICAgICAgIC8vIGhhbmRsZXMgdHJhbnNpZW50IGNvbm5lY3Rpb24gZHJvcHMgc28gYSBwYXJ0aWFsIHRyYW5zZmVyXG4gICAgICAgICAgLy8gaXNuJ3QgY2FjaGVkIGFzIHZhbGlkLlxuICAgICAgICAgIGV4ZWNGaWxlU3luYyhcbiAgICAgICAgICAgIFwiY3VybFwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIi1MXCIsXG4gICAgICAgICAgICAgIFwiLS1mYWlsXCIsXG4gICAgICAgICAgICAgIFwiLS1yZXRyeVwiLFxuICAgICAgICAgICAgICBcIjNcIixcbiAgICAgICAgICAgICAgXCItLXJldHJ5LWRlbGF5XCIsXG4gICAgICAgICAgICAgIFwiMVwiLFxuICAgICAgICAgICAgICBcIi1vXCIsXG4gICAgICAgICAgICAgIHRlbXBGaWxlLFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBzdGRpbzogXCJwaXBlXCIgfSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ2FjaGVkRmlsZVZhbGlkKHRlbXBGaWxlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRG93bmxvYWRlZCBmaWxlIGZvciAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufSBpcyBlbXB0eSBvciBtaXNzaW5nOiAke3RlbXBGaWxlfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbmFtZVN5bmModGVtcEZpbGUsIGNhY2hlZEZpbGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJtU3luYyh0ZW1wRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IENhY2hlZCAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufSB0byAke2NhY2hlZEZpbGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWtkaXJTeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBleGVjRmlsZVN5bmMoXG4gICAgICAgIFwidGFyXCIsXG4gICAgICAgIFtcIi14emZcIiwgY2FjaGVkRmlsZSwgXCItQ1wiLCB0YXJnZXREaXIsIFwiLS1zdHJpcC1jb21wb25lbnRzPTFcIl0sXG4gICAgICAgIHsgc3RkaW86IFwicGlwZVwiIH0sXG4gICAgICApO1xuXG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBJbnN0YWxsZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgYSBjYWNoZWQgU2hhcnAgYmluYXJ5IGFyY2hpdmUgaXMgbm9uLWVtcHR5LiBHdWFyZHMgYWdhaW5zdFxuICAgKiBhIHRydW5jYXRlZC9jb3JydXB0IGRvd25sb2FkIChlLmcuIGZyb20gYSBkcm9wcGVkIGNvbm5lY3Rpb24pIGJlaW5nXG4gICAqIHJldXNlZCBhY3Jvc3Mgc3ludGggb3BlcmF0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgaXNDYWNoZWRGaWxlVmFsaWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc3RhdFN5bmMoZmlsZVBhdGgpLnNpemUgPiAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgdHJhdmVscyB0byB0aGUgYWRhcHRlciBpbiB7QGxpbmsgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJ9LCBhbmQgd2hhdCBpdFxuICogcmVjb3JkcyBiYWNrIGFzIGBBZGFwdGVyTWFuaWZlc3QuZnVuY3Rpb25Hcm91cHNgLlxuICovXG5mdW5jdGlvbiB0b0Z1bmN0aW9uR3JvdXBTcGVjcyhcbiAgZ3JvdXBzOiBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzW10sXG4pOiBGdW5jdGlvbkdyb3VwU3BlY1tdIHtcbiAgcmV0dXJuIGdyb3Vwcy5tYXAoKHsgbmFtZSwgcm91dGVzIH0pID0+ICh7IG5hbWUsIHJvdXRlcyB9KSk7XG59XG5cbi8qKiBgZ3JvdXBzYCBpbiBhIGNhbm9uaWNhbCBvcmRlciwgZm9yIGNvbXBhcmluZyB0d28gb2YgdGhlbS4gKi9cbmZ1bmN0aW9uIHNvcnRlZEdyb3VwU3BlY3MoXG4gIGdyb3VwczogcmVhZG9ubHkgRnVuY3Rpb25Hcm91cFNwZWNbXSB8IHVuZGVmaW5lZCxcbik6IEZ1bmN0aW9uR3JvdXBTcGVjW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ3JvdXBzXG4gICAgPy5tYXAoKHsgbmFtZSwgcm91dGVzIH0pID0+ICh7IG5hbWUsIHJvdXRlczogWy4uLnJvdXRlc10uc29ydCgpIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxKSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgc3RhZ2VkIGBzaGFycGAgSlMgd3JhcHBlciBvdXQgb2YgZXZlcnkgY29weSBmb3VuZCBpbiB0aGUgdHJlZS5cbiAqXG4gKiBVbmxpa2UgYSBzdGFuZGFsb25lIGJ1aWxkIHRoZXJlIGlzIG5vIHNpbmdsZSBgbm9kZV9tb2R1bGVzYCB0byBsb29rIGluOiB0aGVcbiAqIHRyZWUgbWlycm9ycyByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aHMsIHNvIHRoZSBzZWFyY2ggaXMgYnkgZGlyZWN0b3J5IG5hbWUuXG4gKlxuICogQW4gYXBwIGNhbiBoYXZlIHR3byBgc2hhcnBgIGNvcGllcyBhdCBkaWZmZXJlbnQgdmVyc2lvbnMgKGl0cyBvd24sIGhvaXN0ZWQsXG4gKiBhbmQgbmV4dCdzLCBuZXN0ZWQgdW5kZXIgYG5leHQvbm9kZV9tb2R1bGVzYCksIGFuZCBldmVyeSBiaW5hcnkgZ29lcyBpbnRvIHRoZVxuICogb25lIHJvb3QgYEBpbWdgLCBzbyB0aGUgY29weSBwaW5uaW5nIHRoZW0gaGFzIHRvIGJlIHRoZSBvbmUgYG5leHRgJ3MgaW1hZ2VcbiAqIG9wdGltaXplciBsb2FkczogYG5leHRTaGFycGAsIHdoZW4ge0BsaW5rIHJlc29sdmVOZXh0U2hhcnB9IGZvdW5kIGl0LiBPdGhlcndpc2VcbiAqIHNob3J0ZXN0IHBhdGggd2lucyBhcyB0aGUgY2xvc2VzdCB0byBhIGhvaXN0ZWQgaW5zdGFsbCwgc29ydGVkIGZvclxuICogZGV0ZXJtaW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlKFxuICBjYW5kaWRhdGVzOiBzdHJpbmdbXSxcbiAgbmV4dFNoYXJwPzogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdXNlZCA9XG4gICAgbmV4dFNoYXJwICYmXG4gICAgY2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+XG4gICAgICBuZXh0U2hhcnAuc3RhcnRzV2l0aChyZWFscGF0aFN5bmMoY2FuZGlkYXRlKSArIHNlcCksXG4gICAgKTtcbiAgaWYgKHVzZWQpIHtcbiAgICByZXR1cm4gdXNlZDtcbiAgfVxuICBjYW5kaWRhdGVzLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID4gMSkge1xuICAgIGRlYnVnKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gTXVsdGlwbGUgc3RhZ2VkIFwic2hhcnBcIiBjb3BpZXM7IHVzaW5nICR7Y2FuZGlkYXRlc1swXX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF07XG59XG5cbi8qKlxuICogVGhlIHJlYWwgcGF0aCBvZiB0aGUgYHNoYXJwYCBlbnRyeSBwb2ludCB0aGUgc3RhZ2VkIGBuZXh0YCByZXNvbHZlcyBmcm9tXG4gKiBgcHJvamVjdERpcmAsIGB1bmRlZmluZWRgIHdoZW4gZWl0aGVyIGRvZXMgbm90IHJlc29sdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTmV4dFNoYXJwKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIGFuY2hvciBmaWxlIG5lZWRuJ3QgZXhpc3Q7IGBjcmVhdGVSZXF1aXJlYCBvbmx5IHJlYWRzIGl0cyBkaXJlY3RvcnkuXG4gICAgY29uc3QgbmV4dFBhY2thZ2UgPSBjcmVhdGVSZXF1aXJlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCBcImNkay1uZXh0anMtbmV4dC1yZXNvbHZlci5janNcIiksXG4gICAgKS5yZXNvbHZlKFwibmV4dC9wYWNrYWdlLmpzb25cIik7XG4gICAgcmV0dXJuIGNyZWF0ZVJlcXVpcmUobmV4dFBhY2thZ2UpLnJlc29sdmUoXCJzaGFycFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGVudHJ5IGBuYW1lYCBpbiBgcGFyZW50UGF0aGAgaXMgYW4gYEBpbWcvc2hhcnAtKmAgcGxhdGZvcm0gYmluYXJ5XG4gKiBwYWNrYWdlLCBvciBwbnBtJ3Mgc3RvcmUgZW50cnkgZm9yIG9uZS5cbiAqXG4gKiBUaGUgbmFtZSBhbG9uZSBpcyBub3QgZW5vdWdoIHRvIGRlbGV0ZSBhIGRpcmVjdG9yeSBieS4gQSByb3V0ZSBzZWdtZW50IGNhbGxlZFxuICogYHNoYXJwLWVkZ2VzYCBzdGFnZXMgYC5uZXh0L3NlcnZlci9hcHAvc2hhcnAtZWRnZXMvYCwgYW5kIHJlbW92aW5nIGl0IGxlZnQgdGhlXG4gKiBtYW5pZmVzdCBsaXN0aW5nIGFuIGVudHJ5cG9pbnQgdGhhdCBpcyBubyBsb25nZXIgb24gZGlzayDigJQgZXZlcnkgcmVxdWVzdCB0b1xuICogdGhhdCByb3V0ZSA1MDBpbmcgd2l0aCBcIkNvdWxkIG5vdCBsb2FkIHRoZSBlbnRyeXBvaW50XCIuIE5vciBpcyBcImEgYHNoYXJwLWBcbiAqIHBhY2thZ2VcIjogYHNoYXJwLWljb2AgYW5kIGBzaGFycC1waGFzaGAgYXJlIHVucmVsYXRlZCBkZXBlbmRlbmNpZXMsIGFuZFxuICogcmVtb3ZpbmcgdGhlbSBmYWlsZWQgdGhlIGFwcCBhdCBydW50aW1lIHdpdGggTU9EVUxFX05PVF9GT1VORC4gU28gYm90aCB0aGVcbiAqIHNjb3BlIGFuZCB0aGUgcGxhY2UgaGF2ZSB0byBtYXRjaDpcbiAqXG4gKiAtIGBub2RlX21vZHVsZXMvQGltZy9zaGFycC3igKZgLCB3aGVyZSBldmVyeSBwbGF0Zm9ybSBiaW5hcnkgYWN0dWFsbHkgbGl2ZXNcbiAqIC0gYG5vZGVfbW9kdWxlcy8ucG5wbS9AaW1nK3NoYXJwLeKApkAwLjM1LjRgLCBwbnBtJ3Mgc3RvcmUsIHdob3NlIGVudHJpZXMgYXJlXG4gKiAgIGFsc28gd2hhdCB0aGUgYEBpbWdgIGxpbmtzIHBvaW50IGF0IChgc2hhcnAtbGlidmlwcy3igKZgIG1hdGNoZXMgdGhlIHNhbWUgd2F5KVxuICpcbiAqIFRoZSBgbm9kZV9tb2R1bGVzYCBzZWdtZW50IGlzIHJlcXVpcmVkIGFzIHdlbGwsIHNvIGFuIGFwcCBkaXJlY3RvcnkgdGhhdFxuICogaGFwcGVucyB0byBiZSBjYWxsZWQgYEBpbWdgIG9yIGAucG5wbWAgaXMgc3RpbGwgbGVmdCBhbG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2hhcnBCaW5hcnlQYWNrYWdlKFxuICBwYXJlbnRQYXRoOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdtZW50cyA9IHBhcmVudFBhdGguc3BsaXQoc2VwKTtcbiAgY29uc3QgcGFyZW50ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gIGNvbnN0IHNjb3BlZCA9XG4gICAgKHBhcmVudCA9PT0gXCJAaW1nXCIgJiYgbmFtZS5zdGFydHNXaXRoKFwic2hhcnAtXCIpKSB8fFxuICAgIChwYXJlbnQgPT09IFwiLnBucG1cIiAmJiBuYW1lLnN0YXJ0c1dpdGgoXCJAaW1nK3NoYXJwLVwiKSk7XG4gIHJldHVybiBzY29wZWQgJiYgc2VnbWVudHMuaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIik7XG59XG5cbi8qKlxuICogV2hlcmUgdGhlIHRhcmdldCdzIGBAaW1nL3NoYXJwLSpgIGJpbmFyaWVzIGdvOiBgPHJvb3Q+L25vZGVfbW9kdWxlcy9AaW1nYC5cbiAqXG4gKiBOb3QgbmV4dCB0byB0aGUgc3RhZ2VkIGBzaGFycGAgcGFja2FnZS4gVW5kZXIgcG5wbSB0aGF0IGlzXG4gKiBgbm9kZV9tb2R1bGVzLy5wbnBtL3NoYXJwQHgvbm9kZV9tb2R1bGVzL0BpbWdgLCB3aGljaCBvbmx5IHRoZSBzdG9yZSBjb3B5IG9mXG4gKiBgc2hhcnBgIHJlc29sdmVzIGZyb206IGEgZGVyZWZlcmVuY2VkIGxpbmsgdG8gYHNoYXJwYCAoYSBjb3B5IGF0XG4gKiBgYXBwL25vZGVfbW9kdWxlcy9zaGFycGAsIHNheSkgbG9va3MgZm9yIGBAaW1nYCBmcm9tIGl0cyBvd24gcGF0aCBhbmQgd2Fsa3NcbiAqIHVwLCBuZXZlciBpbnRvIHRoZSBzdG9yZS4gQm90aCB0aGUgRnVuY3Rpb25zIHppcCAoYHppcERpcmVjdG9yeWApIGFuZCB0aGVcbiAqIENvbnRhaW5lcnMgYENPUFlgIGtlZXAgdGhlIGxpbmtzLCBzbyBpdCBpcyB0aGUgc3RvcmUgY29weSB0aGF0IGxvYWRzLCBhbmQgaXRzXG4gKiB3YWxrIHVwIHJlYWNoZXMgdGhlIHJvb3QgYG5vZGVfbW9kdWxlc2AgdG9vLCBzbyBpdCBzZXJ2ZXMgZWl0aGVyIGxheW91dC4gSXRcbiAqIGlzIGFsc28gd2hlcmUgbWFpbiBpbnN0YWxsZWQgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJwQmluYXJ5RGlyKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGltZ1wiKTtcbn1cblxuLyoqXG4gKiBFdmVyeSBlbnRyeSB1bmRlciBgcm9vdGAsIGxpbmtzIGxpc3RlZCBidXQgbm90IGZvbGxvd2VkLlxuICpcbiAqIEFuIGV4cGxpY2l0IHdhbGsgcmF0aGVyIHRoYW4gYHJlYWRkaXJTeW5jKHsgcmVjdXJzaXZlOiB0cnVlIH0pYCwgd2hpY2ggb25cbiAqIE5vZGUgMjQgZGVzY2VuZHMgaW50byBzeW1saW5rZWQgZGlyZWN0b3JpZXMgaXRzZWxmIGFuZCBzbyBuZXZlciByZXR1cm5zIG9uIGFcbiAqIGN5Y2xlIOKAlCB0d28gd29ya3NwYWNlIHBhY2thZ2VzIHRoYXQgbGluayBlYWNoIG90aGVyLCB3aGljaCBpcyBob3cgcG5wbSB3aXJlcyBhXG4gKiBtb25vcmVwby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RUcmVlKHJvb3Q6IHN0cmluZyk6IERpcmVudFtdIHtcbiAgY29uc3QgZW50cmllczogRGlyZW50W10gPSBbXTtcbiAgY29uc3QgcGVuZGluZyA9IFtyb290XTtcbiAgZm9yIChsZXQgZGlyID0gcGVuZGluZy5wb3AoKTsgZGlyICE9PSB1bmRlZmluZWQ7IGRpciA9IHBlbmRpbmcucG9wKCkpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcGVuZGluZy5wdXNoKGpvaW4oZGlyLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFdyaXRlIHtAbGluayBQVUJMSUNfRklMRVNfRklMRV9OQU1FfSBpbnRvIGEgZGVwbG95bWVudCByb290J3MgcnVudGltZVxuICogZGlyZWN0b3J5OiBldmVyeSBmaWxlIHVuZGVyIGBwdWJsaWNEaXJgLCBsaXN0ZWQgdGhlIHdheSB0aGUgcnVudGltZSB3b3VsZFxuICogbGlzdCBpdCBvZmYgZGlzayAoYHJlYWRQdWJsaWNGaWxlc2A6IHN5bWxpbmtzIGZvbGxvd2VkLCBgL2Atc2VwYXJhdGVkLFxuICogc29ydGVkKS4gQW4gYXBwIHdpdGhvdXQgYHB1YmxpYy9gIGdldHMgYFtdYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUHVibGljRmlsZUxpc3QocnVudGltZURpcjogc3RyaW5nLCBwdWJsaWNEaXI6IHN0cmluZykge1xuICB3cml0ZUZpbGVTeW5jKFxuICAgIGpvaW4ocnVudGltZURpciwgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRSksXG4gICAgSlNPTi5zdHJpbmdpZnkocmVhZFB1YmxpY0ZpbGVzKHB1YmxpY0RpcikpLFxuICApO1xufVxuXG4vKipcbiAqIFRvdGFsIGJ5dGVzIG9mIGEgdHJlZSBhcyBpdHMgZGVwbG95bWVudCB6aXAgc3RvcmVzIGl0LiBgemlwRGlyZWN0b3J5YCBrZWVwc1xuICogbGlua3MgYXMgbGlua3MsIHNvIGVhY2ggY291bnRzIGFzIGl0cyB0YXJnZXQgcGF0aCwgbm90IGFzIHRoZSB0YXJnZXQsIHdoaWNoXG4gKiBpcyB3YWxrZWQgYXQgaXRzIG93biBwYXRoIGFueXdheSAoZXZlcnkgbGluayBpbiBhIHN0YWdlZCByb290IHBvaW50cyBpbnNpZGVcbiAqIGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlZFNpemUocm9vdDogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0VHJlZShyb290KSkge1xuICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYnl0ZXMgKz0gbHN0YXRTeW5jKGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpLnNpemU7XG4gICAgfVxuICB9XG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBgY2h1bmtgIHdpdGggYHBhdGNoYCBwcmVwZW5kZWQgYmV0d2VlbiBgUEFUQ0hfRkVUQ0hfTUFSS0VSYCBhbmRcbiAqIGBQQVRDSF9GRVRDSF9FTkRfTUFSS0VSYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBhbHJlYWR5IGNhcnJpZXMgdGhpcyBleGFjdFxuICogcGF0Y2guXG4gKlxuICogVGhlIG9wZW5pbmcgbWFya2VyIGNhcnJpZXMgYSBoYXNoIG9mIHRoZSBwYXRjaCwgc28gYSBjaHVuayBwYXRjaGVkIGJ5IGFcbiAqIGNkay1uZXh0anMgd2hvc2UgYHBhdGNoLWZldGNoLmpzYCBkaWZmZXJzIChhbiB1cGdyYWRlLCBvdmVyIGEgYC5uZXh0YCByZXVzZWRcbiAqIHdpdGggYHNraXBCdWlsZDogdHJ1ZWApIGlzIG5vdCBtaXN0YWtlbiBmb3IgY3VycmVudDogdGhlIG9sZCBwYXRjaCBpcyBjdXQgb2ZmXG4gKiBhdCBpdHMgZW5kIG1hcmtlciBhbmQgdGhpcyBvbmUgcHV0IGluIGl0cyBwbGFjZSwgcmF0aGVyIHRoYW4gdGhlIG9sZCBvbmVcbiAqIHNoaXBwaW5nIG9yIGJvdGggc3RhY2tpbmcgdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaENsaWVudENodW5rKFxuICBjaHVuazogc3RyaW5nLFxuICBwYXRjaDogc3RyaW5nLFxuICBjaHVua1BhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShwYXRjaCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDE2KTtcbiAgY29uc3Qgb3BlbiA9IGAke1BBVENIX0ZFVENIX01BUktFUn0gJHtoYXNofSAqL2A7XG4gIGlmIChjaHVuay5zdGFydHNXaXRoKGAke29wZW59XFxuYCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCBvcmlnaW5hbCA9IGNodW5rO1xuICBpZiAoY2h1bmsuc3RhcnRzV2l0aChQQVRDSF9GRVRDSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgZW5kID0gY2h1bmsuaW5kZXhPZihgXFxuJHtQQVRDSF9GRVRDSF9FTkRfTUFSS0VSfVxcbmApO1xuICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAvLyBPbmx5IGEgcHJlLXJlbGVhc2UgY2RrLW5leHRqcyB3cm90ZSB0aGUgbWFya2VyIHdpdGhvdXQgYW4gZW5kLCBhbmRcbiAgICAgIC8vIHdoZXJlIGl0cyBwYXRjaCBzdG9wcyBjYW5ub3QgYmUgdG9sZCBmcm9tIHRoZSBjaHVuaydzIG93biBjb2RlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSAke2NodW5rUGF0aH0gY2FycmllcyBhIGNkay1uZXh0anMgZmV0Y2ggcGF0Y2ggdGhpcyBgICtcbiAgICAgICAgICBgdmVyc2lvbiBjYW5ub3QgcmVwbGFjZS4gUmUtcnVuIFxcYG5leHQgYnVpbGRcXGAgdG8gcmVnZW5lcmF0ZSBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgb3JpZ2luYWwgPSBjaHVuay5zbGljZShlbmQgKyBQQVRDSF9GRVRDSF9FTkRfTUFSS0VSLmxlbmd0aCArIDIpO1xuICB9XG4gIHJldHVybiBgJHtvcGVufVxcbiR7cGF0Y2h9XFxuJHtQQVRDSF9GRVRDSF9FTkRfTUFSS0VSfVxcbiR7b3JpZ2luYWx9YDtcbn1cbiJdfQ==
979
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBNkpBLHdEQUtDO0FBR0QsOENBUUM7QUF3MkJELHdEQW1CQztBQU1ELDRDQVVDO0FBcUJELG9EQVVDO0FBY0Qsd0NBRUM7QUFVRCw0QkFZQztBQVlELG9EQXNCQztBQVVELDhEQXNCQztBQXVCRCxrREFLQztBQVFELGdDQVFDO0FBYUQsNENBd0JDOztBQWh4Q0QsMkRBQTREO0FBQzVELDZDQUFzRDtBQUN0RCxxQ0FpQmlCO0FBQ2pCLDZDQUE0QztBQUM1QyxxQ0FBaUM7QUFDakMseUNBQXlEO0FBQ3pELDJDQUFvRDtBQUNwRCw2Q0FBMEM7QUFFMUMsMkNBQXVDO0FBQ3ZDLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFDN0IsZ0VBS29DO0FBQ3BDLDRDQUFzRDtBQUV0RCxrREFRNkI7QUFDN0IsMERBQTBEO0FBQzFELGtEQUk0QjtBQUM1QixnRUFHbUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXREOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLDJCQUEyQixDQUFDO0FBQ3ZELDJFQUEyRTtBQUMzRSxNQUFNLHNCQUFzQixHQUFHLGtDQUFrQyxDQUFDO0FBRWxFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLHlCQUF5QixDQUFDLENBQUM7QUE4RWxEOzs7O0dBSUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxLQUF1QjtJQUM1RCxNQUFNLFdBQVcsR0FDZixLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsZ0JBQWdCO1FBQ2hELEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNyRCxPQUFPLENBQUMsV0FBVyxJQUFJLEtBQUss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UUFDekMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLHNCQUFzQixJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2YscUVBQXFFO1lBQ3JFLGtFQUFrRTtZQUNsRSxNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsc0JBQVUsSUFBSSxTQUFTLHlDQUF5QztnQkFDakUsaUVBQWlFLENBQ3BFLENBQUM7UUFDSixDQUFDO1FBQ0QsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxLQUFLLEtBQUssc0JBQXNCLEtBQUssUUFBUSxFQUFFLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHtcbiAgY2xvc2VTeW5jLFxuICBEaXJlbnQsXG4gIGV4aXN0c1N5bmMsXG4gIGxzdGF0U3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbiAgcm1TeW5jLFxuICBta2RpclN5bmMsXG4gIGNwU3luYyxcbiAgb3BlblN5bmMsXG4gIHJlYWRTeW5jLFxuICByZW5hbWVTeW5jLFxuICByZWFscGF0aFN5bmMsXG4gIHN0YXRTeW5jLFxuICB1bmxpbmtTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBqb2luIGFzIGpvaW5Qb3NpeCB9IGZyb20gXCJub2RlOnBhdGgvcG9zaXhcIjtcbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIEZVTkNUSU9OX0dST1VQU19FTlZfVkFSLFxuICBGdW5jdGlvbkdyb3VwU3BlYyxcbiAgdmFsaWRhdGVGdW5jdGlvbkdyb3Vwcyxcbn0gZnJvbSBcIi4uL2FkYXB0ZXIvZnVuY3Rpb24tZ3JvdXBzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4uL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7XG4gIEFEQVBURVJfRElSX05BTUUsXG4gIEFEQVBURVJfTUFOSUZFU1RfVkVSU0lPTixcbiAgQWRhcHRlck1hbmlmZXN0LFxuICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gIFBVQkxJQ19GSUxFU19GSUxFX05BTUUsXG4gIFJVTlRJTUVfRElSX05BTUUsXG4gIGdyb3VwU3RhZ2luZ0Rpck5hbWUsXG59IGZyb20gXCIuLi9ydW50aW1lL21hbmlmZXN0XCI7XG5pbXBvcnQgeyByZWFkUHVibGljRmlsZXMgfSBmcm9tIFwiLi4vcnVudGltZS9wdWJsaWMtZmlsZXNcIjtcbmltcG9ydCB7XG4gIGFzc2V0UHJlZml4UGF0aCxcbiAgbm9ybWFsaXplQmFzZVBhdGgsXG4gIHJlbGF0aXZlQXNzZXRQcmVmaXgsXG59IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcbmltcG9ydCB7XG4gIGdldExhbWJkYUFyY2hpdGVjdHVyZSxcbiAgdG9Ob2RlQXJjaGl0ZWN0dXJlLFxufSBmcm9tIFwiLi4vdXRpbHMvZ2V0LWFyY2hpdGVjdHVyZVwiO1xuXG4vKipcbiAqIExhbWJkYSdzIGhhcmQgbGltaXQgb24gdGhlIHVuemlwcGVkIHNpemUgb2YgYSBmdW5jdGlvbidzIGNvZGUsIHdoaWNoXG4gKiBDbG91ZEZvcm1hdGlvbiBvbmx5IGVuZm9yY2VzIGF0IGRlcGxveSB0aW1lLiBNZWFzdXJlZCBhdCBzeW50aCBpbnN0ZWFkLCBzbyB0aGVcbiAqIGVycm9yIG5hbWVzIHRoZSBncm91cCBhbmQgYXJyaXZlcyBpbiBzZWNvbmRzIHJhdGhlciB0aGFuIG1pbnV0ZXMuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2dldHRpbmdzdGFydGVkLWxpbWl0cy5odG1sXG4gKi9cbmNvbnN0IExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUyA9IDI1MCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIE9wZW5zIHRoZSBwYXRjaCBgcGF0Y2hGZXRjaEluQ2xpZW50SnNgIHByZXBlbmRzIHRvIGEgY2xpZW50IGNodW5rLCBmb2xsb3dlZCBieVxuICogYSBoYXNoIG9mIHRoZSBwYXRjaCBpdHNlbGYsIHNvIGEgc2Vjb25kIHN5bnRoIG92ZXIgdGhlIHNhbWUgYC5uZXh0YCBpcyBhIG5vLW9wXG4gKiB3aGlsZSBvbmUgYnkgYSBjZGstbmV4dGpzIHdpdGggYSBkaWZmZXJlbnQgYHBhdGNoLWZldGNoLmpzYCByZXBsYWNlcyBpdC5cbiAqL1xuY29uc3QgUEFUQ0hfRkVUQ0hfTUFSS0VSID0gXCIvKiBjZGstbmV4dGpzOnBhdGNoLWZldGNoXCI7XG4vKiogQ2xvc2VzIHRoZSBwcmVwZW5kZWQgcGF0Y2g7IHRoZSBjaHVuaydzIG93biBjb250ZW50IHN0YXJ0cyBhZnRlciBpdC4gKi9cbmNvbnN0IFBBVENIX0ZFVENIX0VORF9NQVJLRVIgPSBcIi8qIGNkay1uZXh0anM6cGF0Y2gtZmV0Y2g6ZW5kICovXCI7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOm5leHRqcy1idWlsZFwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCdWlsZFByb3BzIHtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29tbWFuZFwiXX1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZDogTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdO1xuICAvKipcbiAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBOZXh0LmpzIGFwcGxpY2F0aW9uIGlzIGxvY2F0ZWQgZm9yIGxvY2FsIGJ1aWxkcy5cbiAgICogVGhpcyBzaG91bGQgY29udGFpbiB0aGUgcGFja2FnZS5qc29uIGFuZCBOZXh0LmpzIGFwcGxpY2F0aW9uIGZpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5za2lwQnVpbGR9XG4gICAqL1xuICByZWFkb25seSBza2lwQnVpbGQ/OiBib29sZWFuO1xuICAvKipcbiAgICogUm91dGUgZ3JvdXBzIHRvIHBhY2thZ2UgaW50byBzZXBhcmF0ZSBMYW1iZGEgZnVuY3Rpb25zLiBPbmx5IHRoZSB0d29cbiAgICogRnVuY3Rpb25zIGBOZXh0anNUeXBlYHMgcGFzcyB0aGlzOyBzZWUgYE5leHRqc0Z1bmN0aW9uR3JvdXBgLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cHM/OiBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzW107XG4gIC8qKlxuICAgKiBMYW1iZGEgYXJjaGl0ZWN0dXJlIHRoZSBGdW5jdGlvbnMgdHlwZXMgZGVwbG95LCB3aGljaCBkZWNpZGVzIHRoZSBgc2hhcnBgXG4gICAqIGJpbmFyaWVzIHN0YWdlZCBpbnRvIHRoZSBkZXBsb3ltZW50IHJvb3RzLiBJZ25vcmVkIGJ5IHRoZSBDb250YWluZXJzXG4gICAqIHR5cGVzLCB3aG9zZSBpbWFnZSBpcyBidWlsdCBmb3IgdGhlIHN5bnRoIG1hY2hpbmUuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgbWFjaGluZSBydW5uaW5nIHN5bnRoXG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2YgYSBmdW5jdGlvbiBncm91cCBgTmV4dGpzQnVpbGRgIG5lZWRzOiB3aGljaCByb3V0ZXMgaXQgb3ducy4gVGhlXG4gKiBwZXItZ3JvdXAgTGFtYmRhIGBvdmVycmlkZXNgIGFyZSBgTmV4dGpzRnVuY3Rpb25zYCcgYnVzaW5lc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRnVuY3Rpb25Hcm91cFJvdXRlcyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcm91dGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIE9uZSBzdGFnZWQgZGVwbG95bWVudCByb290LCBhbmQgdGhlIGZ1bmN0aW9uIGdyb3VwIGl0IGJlbG9uZ3MgdG8uICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RlcGxveW1lbnRSb290IHtcbiAgLyoqXG4gICAqIEdyb3VwIG5hbWUsIGBkZWZhdWx0YCBmb3IgdGhlIGltcGxpY2l0IGdyb3VwIHRoYXQgb3ducyBldmVyeSB1bmFzc2lnbmVkXG4gICAqIHJvdXRlLiBUaGUgb25seSBlbnRyeSBpcyBgZGVmYXVsdGAgd2hlbiBgZnVuY3Rpb25Hcm91cHNgIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCByb290OiB0aGUgTGFtYmRhIHppcCBhc3NldCdzIHNvdXJjZS4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUm91dGUgdGVtcGxhdGVzIHRoaXMgcm9vdCdzIHBhY2thZ2UgaG9sZHMsIGFzIHRoZSBhZGFwdGVyIGFzc2lnbmVkIHRoZW0uXG4gICAqIEVtcHR5IGlzIGxlZ2FsOiB0aGUgZGVmYXVsdCBncm91cCBzdGlsbCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAsIHRoZSBzdGF0aWNcbiAgICogZmlsZXMgdGhlIHJ1bnRpbWUgcmVhZHMgb2ZmIGRpc2ssIGFuZCBhbnl0aGluZyB0aGUgY2F0Y2gtYWxsIHJvdXRlcyB0byBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogT25lIGJlaGF2aW9yIHRoYXQgcm91dGVzIGEgZnVuY3Rpb24gZ3JvdXAncyBVUkxzIHRvIGl0LCBhcyB0aGUgYWRhcHRlclxuICogY2hlY2tlZCB0aGVtIGFnYWluc3Qgd2hhdCBlYWNoIGdyb3VwIHdhcyBwYWNrYWdlZCB3aXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvciB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gZ3JvdXAgdGhlIGJlaGF2aW9yIHJvdXRlcyB0by4gKi9cbiAgcmVhZG9ubHkgZ3JvdXA6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBncm91cCBwYXR0ZXJuIGl0IGNhbWUgZnJvbSAoYC9ibG9nLyoqYCksIG9yIHRoZSBwYXJlbnQgb2YgYW4gb3B0aW9uYWxcbiAgICogY2F0Y2gtYWxsIGEgc3VidHJlZSBwYXR0ZXJuIG1vdmVkIGludG8gdGhlIGdyb3VwIChgL2Jsb2dgIGZvclxuICAgKiBgL2Jsb2cvW1suLi5zbHVnXV1gKSwgd2hpY2ggdGhhdCBzdWJ0cmVlJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2guXG4gICAqL1xuICByZWFkb25seSByb3V0ZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJuLCBiZWZvcmUgYmFzZVBhdGggYW5kIHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoOlxuICAgKiBgYmxvZy8qYCwgYHByaWNpbmdgLCBgcHJpY2luZy9gIGZvciBhIGB0cmFpbGluZ1NsYXNoYCBhcHAsIGFuZFxuICAgKiBgX25leHQvZGF0YS88YnVpbGRJZD4vYmxvZy8qYCBmb3IgYSBncm91cCBvd25pbmcgYSBQYWdlcyBSb3V0ZXIgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdHRlcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGV2ZXJ5IGRlcGxveW1lbnQgcm9vdCBpcyBzdGFnZWQgZm9yOiB0aGUgYnVpbGQncyBgYXJjaGl0ZWN0dXJlYCwgZWxzZVxuICogdGhlIHN5bnRoIG1hY2hpbmUncy4gQ29udGFpbmVycyBpZ25vcmUgaXQ6IERvY2tlciBidWlsZHMgdGhlaXIgaW1hZ2VcbiAqIG5hdGl2ZWx5LCBzbyBpdCBjYW4gb25seSBtYXRjaCB0aGUgc3ludGggbWFjaGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveW1lbnRBcmNoaXRlY3R1cmUocHJvcHM6IE5leHRqc0J1aWxkUHJvcHMpOiBBcmNoaXRlY3R1cmUge1xuICBjb25zdCBpc0Z1bmN0aW9ucyA9XG4gICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TIHx8XG4gICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlM7XG4gIHJldHVybiAoaXNGdW5jdGlvbnMgJiYgcHJvcHMuYXJjaGl0ZWN0dXJlKSB8fCBnZXRMYW1iZGFBcmNoaXRlY3R1cmUoKTtcbn1cblxuLyoqIHtAbGluayBOZXh0anNCdWlsZC5idWlsZElkfTogTmV4dC5qcydzIGJ1aWxkIElELCBzdWZmaXhlZCB3aXRoIHRoZSBhcHAncyBgZGVwbG95bWVudElkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3ltZW50QnVpbGRJZChtYW5pZmVzdDoge1xuICByZWFkb25seSBidWlsZElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZzogeyByZWFkb25seSBkZXBsb3ltZW50SWQ6IHN0cmluZyB9O1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVwbG95bWVudElkIH0gPSBtYW5pZmVzdC5jb25maWc7XG4gIHJldHVybiBkZXBsb3ltZW50SWRcbiAgICA/IGAke21hbmlmZXN0LmJ1aWxkSWR9LSR7ZGVwbG95bWVudElkfWBcbiAgICA6IG1hbmlmZXN0LmJ1aWxkSWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljRGlyRW50cnkge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBOZXh0LmpzIGFzc2V0cy5cbiAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgZm9yIHRoaXMgZGVwbG95bWVudC4gVXNlZCB0byBwYXJ0aXRpb24gY2FjaGUgc3RvcmFnZSBhbmQgYXNcbiAgICogbWV0YWRhdGEgZm9yIHN0YXRpYyBhc3NldHMgaW4gUzMgYnVja2V0LlxuICAgKlxuICAgKiBOZXh0LmpzJ3MgYnVpbGQgSUQsIHN1ZmZpeGVkIHdpdGggdGhlIGFwcCdzIGBkZXBsb3ltZW50SWRgIHdoZW4gaXQgc2V0c1xuICAgKiBvbmUuIFRoZSBidWlsZCBJRCBhbG9uZSBpcyBub3QgdW5pcXVlIHBlciBkZXBsb3ltZW50OiBzZXR0aW5nXG4gICAqIGBkZXBsb3ltZW50SWRgIChvciBidWlsZGluZyB3aXRoIGBORVhUX0RFUExPWU1FTlRfSURgKSB0dXJucyBvbiBza2V3XG4gICAqIHByb3RlY3Rpb24sIGFuZCBuZXh0LmpzIHRoZW4gKnBpbnMqIHRoZSBidWlsZCBJRCB0byB0aGUgY29uc3RhbnRcbiAgICogYGJ1aWxkLVRmY3RzV1hwZmYyZktTYCDigJQgc2VlIGBnZXRCdWlsZElkYCBpbiBgbmV4dC9kaXN0L2J1aWxkL2luZGV4LmpzYCxcbiAgICogd2hpY2ggZG9lcyB0aGF0IGRlbGliZXJhdGVseSBzbyB0aGF0IHRvb2xpbmcgZG9pbmdcbiAgICogYC5yZXBsYWNlKGVzY2FwZWRCdWlsZElkLCDigKYpYCBzdGlsbCBoYXMgc29tZXRoaW5nIHRvIHJlcGxhY2UuIFR3b1xuICAgKiBzdWNjZXNzaXZlIGRlcGxveW1lbnRzIG9mIHN1Y2ggYW4gYXBwIHdvdWxkIHNoYXJlIG9uZSBjYWNoZSBwcmVmaXggYW5kIG9uZVxuICAgKiByZXZhbGlkYXRpb24tdGFibGUgcGFydGl0aW9uLCBhbmQgdGhlIG5ldyBvbmUgd291bGQgcmVhZCB0aGUgcHJldmlvdXNcbiAgICogb25lJ3MgcHJlcmVuZGVycy4gQXBwZW5kaW5nIHRoZSBkZXBsb3ltZW50IElEIHJlc3RvcmVzIHRoZSBcIm9uZVxuICAgKiBkZXBsb3ltZW50LCBvbmUgcGFydGl0aW9uXCIgaW52YXJpYW50IHRoYXQgSUQgZXhpc3RzIHRvIGNhcnJ5LlxuICAgKlxuICAgKiBOb3RoaW5nIHJvdXRlcyBvbiB0aGlzIHZhbHVlIOKAlCB0aGUgYC9fbmV4dC9kYXRhLzxidWlsZElkPi/igKZgIFVSTCBzcGFjZSBpc1xuICAgKiByb3V0ZWQgb24gTmV4dC5qcydzIG93biBidWlsZCBJRCwgd2hpY2ggaXMgd2hhdCB0aGUgYXBwJ3MgY2xpZW50IGJ1bmRsZXNcbiAgICogY2Fycnkg4oCUIHNvIGl0IGlzIGZyZWUgdG8gYmUgbG9uZ2VyIHRoYW4gbmV4dC5qcydzIG93bi5cbiAgICovXG4gIGJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGluaXQgY2FjaGUgZGlyZWN0b3J5XG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvLm5leHQvY2RrLW5leHRqcy1pbml0LWNhY2hlXCJcbiAgICovXG4gIGluaXRDYWNoZURpcjogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBwdWJsaWMuIFVzZSBieSBDbG91ZEZyb250L0FMQiB0byBjcmVhdGUgYmVoYXZpb3JzL3J1bGVzXG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvcHVibGljXCJcbiAgICovXG4gIHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgSmF2YVNjcmlwdCBmaWxlIE5vZGUuanMgcnVucyB0byBzZXJ2ZSByZXF1ZXN0cywgcmVsYXRpdmUgdG8gdGhlXG4gICAqIGRlcGxveW1lbnQgcm9vdC4gY2RrLW5leHRqcydzIG93biBjb250YWluZXIgc2hlbGwsIG5vdCBgbmV4dCBidWlsZGAgb3V0cHV0LFxuICAgKiBzbyBpdCBpcyB0aGUgc2FtZSBwYXRoIGZvciBldmVyeSBhcHAuXG4gICAqIEBleGFtcGxlIFwiY2RrLW5leHRqcy1ydW50aW1lL3NlcnZlci5tanNcIlxuICAgKi9cbiAgcmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSAubmV4dCBkaXJlY3RvcnkgY29udGFpbmluZyBOZXh0LmpzIGJ1aWxkIGFydGlmYWN0c1xuICAgKi9cbiAgZG90TmV4dFBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOZXh0LmpzIGFwcCdzIG93biBgYmFzZVBhdGhgIOKAlCB0aGUgVVJMIHByZWZpeCBpdCBnZW5lcmF0ZXMgaXRzIGxpbmtzIGFuZFxuICAgKiBhc3NldCBocmVmcyB1bmRlciDigJQgYXMgdGhlIGFkYXB0ZXIgbWFuaWZlc3QgcmVjb3JkZWQgaXQuIE5vcm1hbGl6ZWQgdG8gYSBiYXJlIHBhdGggc2VnbWVudCwgZW1wdHkgd2hlbiB0aGUgYXBwIHNldHMgbm9uZS4gRXhwb3NlZCBzb1xuICAgKiByb290IGNvbnN0cnVjdHMgY2FuIHJlY29uY2lsZSBpdCB3aXRoIHRoZSBDREsgYGJhc2VQYXRoYCBwcm9wLCB3aGljaCBpcyBhXG4gICAqIGRpc3RpbmN0IHRoaW5nOyBzZWUgYHJlc29sdmVCYXNlUGF0aGAuXG4gICAqL1xuICBuZXh0Q29uZmlnQmFzZVBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOZXh0LmpzIGFwcCdzIG93biBgYXNzZXRQcmVmaXhgLCBhcyBhIHBhdGggd2l0aCBhIGxlYWRpbmcgc2xhc2ggYW5kIG5vXG4gICAqIHRyYWlsaW5nIG9uZSwgZW1wdHkgd2hlbiB0aGUgYXBwIHNldHMgbm9uZSBvciBzZXRzIGFuIGFic29sdXRlIFVSTCAod2hpY2hcbiAgICogbmFtZXMgYW4gb3JpZ2luIGNkay1uZXh0anMgZG9lcyBub3Qgc2VydmUpLlxuICAgKlxuICAgKiBFeHBvc2VkIGJlY2F1c2UgaXQgaXMgdGhlIHNoYXBlIG9mIGBhc3NldFByZWZpeGAgdGhlIHJlZ2lvbmFsXG4gICAqIGBOZXh0anNUeXBlYHMgY2Fubm90IHNlcnZlIOKAlCBzZWUgYHdhcm5VbnNlcnZlZEFzc2V0UHJlZml4YC4gV2hhdCB0aGVcbiAgICogZGlzdHJpYnV0aW9uIGhhcyB0byBhbnN3ZXIgb24gaXMge0BsaW5rIG5leHRDb25maWdBc3NldFByZWZpeFBhdGh9LCB3aGljaFxuICAgKiBhbHNvIGNvdmVycyB0aGUgcGF0aCBhbiBhYnNvbHV0ZSBwcmVmaXggY2Fycmllcy5cbiAgICovXG4gIG5leHRDb25maWdBc3NldFByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgYXBwJ3MgYGFzc2V0UHJlZml4YCwgd2hpY2hldmVyIGZvcm0gaXQgdGFrZXM6IFwiL2NkblwiXG4gICAqIGZvciBib3RoIGBhc3NldFByZWZpeDogXCIvY2RuXCJgIGFuZCBgYXNzZXRQcmVmaXg6XG4gICAqIFwiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vY2RuXCJgLCBlbXB0eSB3aGVuIHRoZXJlIGlzIG5vIHBhdGggdG8gYW5zd2VyIG9uLlxuICAgKlxuICAgKiBFeHBvc2VkIGJlY2F1c2UgaXQgaXMgYSBVUkwgcHJlZml4IHRoZSBkaXN0cmlidXRpb24gaGFzIHRvIGFuc3dlciBvbjogTmV4dC5qc1xuICAgKiBlbWl0cyBgPGFzc2V0UHJlZml4Pi9fbmV4dC9zdGF0aWMvLi4uYCBmb3IgZXZlcnkgYnVuZGxlIGFuZCBjb21waWxlcyBhIHJld3JpdGVcbiAgICogdGhhdCBzZXJ2ZXMgdGhvc2UgVVJMcycgcGF0aHMgaXRzZWxmLCB3aGlsZSB0aGUgb2JqZWN0cyBsaXZlIGluIFMzIHVuZGVyXG4gICAqIGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gLlxuICAgKi9cbiAgbmV4dENvbmZpZ0Fzc2V0UHJlZml4UGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogRXZlcnkgc3RhZ2VkIGRlcGxveW1lbnQgcm9vdCwgb25lIHBlciBmdW5jdGlvbiBncm91cCwgYGRlZmF1bHRgIGZpcnN0OiB0aGVcbiAgICogc3RhZ2VkIHVuaW9uIG9mIGVhY2ggZ3JvdXAncyBzaGlwcGVkIG91dHB1dHMgYW5kIHRoZWlyIHRyYWNlZCBhc3NldHMsXG4gICAqIHdyaXR0ZW4gYnkgdGhlIGFkYXB0ZXIncyBgb25CdWlsZENvbXBsZXRlYC4gRXhhY3RseSBvbmUgZW50cnkgKG5hbWVkXG4gICAqIGBkZWZhdWx0YCwgYXQgYC5uZXh0L2Nkay1uZXh0anMtYWRhcHRlci9hcHBgKSB1bmxlc3MgYGZ1bmN0aW9uR3JvdXBzYFxuICAgKiBzcGxpdHMgdGhlIGFwcC4gVGhlIExhbWJkYSB6aXAgYXNzZXRzOyBDb250YWluZXJzIGBDT1BZYCB0aGUgYGRlZmF1bHRgIG9uZS5cbiAgICovXG4gIGRlcGxveW1lbnRSb290czogTmV4dGpzRGVwbG95bWVudFJvb3RbXTtcbiAgLyoqXG4gICAqIFdoYXQgcm91dGVzIGVhY2ggbm9uLWRlZmF1bHQgZnVuY3Rpb24gZ3JvdXAncyBVUkxzIHRvIGl0LCBtb3N0IHNwZWNpZmljXG4gICAqIGZpcnN0IOKAlCB0aGUgb3JkZXIgQ2xvdWRGcm9udCBoYXMgdG8gc2VlIHRoZW0gaW4sIHNpbmNlIGl0IHN0b3BzIGF0IHRoZVxuICAgKiBmaXJzdCBtYXRjaC4gRW1wdHkgdW5sZXNzIGBmdW5jdGlvbkdyb3Vwc2Agc3BsaXRzIHRoZSBhcHAuXG4gICAqL1xuICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzOiBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3JbXTtcbiAgLyoqXG4gICAqIEZyb20gdGhlIGRlcGxveW1lbnQgcm9vdCB0byB0aGUgTmV4dC5qcyBwcm9qZWN0IGRpciwgUE9TSVgsIGBcIlwiYCB3aGVuXG4gICAqIHRoZSBhcHAgaXMgYXQgdGhlIHJlcG8gcm9vdC4gVGhlIHJ1bnRpbWUgYGNoZGlyYHMgaGVyZTsgQ29udGFpbmVycyBwYXNzIGl0IHRvXG4gICAqIHRoZWlyIERvY2tlcmZpbGUgc28gYC5uZXh0L3N0YXRpY2AgYW5kIGBwdWJsaWNgIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuXG4gICAqIEBzZWUgQWRhcHRlck1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpclxuICAgKi9cbiAgcmVsYXRpdmVQcm9qZWN0RGlyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJjaGl0ZWN0dXJlIGV2ZXJ5IGRlcGxveW1lbnQgcm9vdCdzIG5hdGl2ZSBkZXBlbmRlbmNpZXMgKGBzaGFycGApXG4gICAqIHdlcmUgc3RhZ2VkIGZvci4gVGhlIExhbWJkYXMgZGVwbG95aW5nIHRoZW0gbXVzdCB1c2UgdGhlIHNhbWUgb25lLlxuICAgKi9cbiAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQnVpbGRQcm9wcztcbiAgcHJpdmF0ZSBidWlsZENvbW1hbmQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzQnVpbGRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZG90TmV4dFBhdGggPSBqb2luKHByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIpO1xuXG4gICAgdGhpcy5idWlsZENvbW1hbmQgPSBwcm9wcy5idWlsZENvbW1hbmQgfHwgXCJucG0gcnVuIGJ1aWxkXCI7XG5cbiAgICAvLyBTZXQgaW5pdCBjYWNoZSBkaXJlY3RvcnkgcGF0aFxuICAgIHRoaXMuaW5pdENhY2hlRGlyID0gam9pbihcbiAgICAgIHByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgXCIubmV4dFwiLFxuICAgICAgXCJjZGstbmV4dGpzLWluaXQtY2FjaGVcIixcbiAgICApO1xuXG4gICAgLy8gQmVmb3JlIHRoZSBidWlsZCwgbm90IGFmdGVyIGl0OiB0aGUgYnVpbGQgaXMgbWludXRlcyBsb25nLCBhbmQgdGhlIGVudiB2YXJcbiAgICAvLyBpdCBwYXNzZXMgZ3JvdXBzIHRocm91Z2ggaXMgb25seSBzZXQgZm9yIGEgbm9uLWVtcHR5IGFycmF5IOKAlCBzbyBhbiBpbnZhbGlkXG4gICAgLy8gYGZ1bmN0aW9uR3JvdXBzYCAoYW4gZW1wdHkgYXJyYXksIGEgcmVzZXJ2ZWQgbmFtZSwgYSBncm91cCBvd25pbmcgbm9cbiAgICAvLyByb3V0ZXMpIHdvdWxkIG90aGVyd2lzZSBiZSByZXBvcnRlZCBhcyBcInRoZSBidWlsZCBzdGFnZWQgdGhlIHdyb25nXG4gICAgLy8gZ3JvdXBzXCIsIGFmdGVyIHBheWluZyBmb3IgdGhlIGJ1aWxkLCBpbnN0ZWFkIG9mIGFzIHRoZSBwcm9wIGVycm9yIGl0IGlzLlxuICAgIGlmIChwcm9wcy5mdW5jdGlvbkdyb3Vwcykge1xuICAgICAgdmFsaWRhdGVGdW5jdGlvbkdyb3Vwcyhwcm9wcy5mdW5jdGlvbkdyb3VwcyBhcyBGdW5jdGlvbkdyb3VwU3BlY1tdKTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIGxvY2FsIGJ1aWxkIHByb2Nlc3NcbiAgICBpZiAocHJvcHMuc2tpcEJ1aWxkICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLnJ1bk5leHRCdWlsZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBTa2lwcGluZzogJHt0aGlzLmJ1aWxkQ29tbWFuZH1gKTtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCwgYmVmb3JlIGFueXRoaW5nIGVsc2UgcmVhZHMgYC5uZXh0YDogYSBtaXNzaW5nIG1hbmlmZXN0IGlzIHRoZSBvbmVcbiAgICAvLyBlcnJvciB0aGF0IG5hbWVzIHRoZSBjYXVzZSAobm8gYnVpbGQsIG9yIG9uZSB3aXRob3V0IHRoZSBhZGFwdGVyKSwgd2hlcmVcbiAgICAvLyBldmVyeSBsYXRlciByZWFkIGZhaWxzIHdpdGggYSBiYXJlIEVOT0VOVC5cbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVhZEFkYXB0ZXJNYW5pZmVzdCgpO1xuXG4gICAgLy8gRGVsaWJlcmF0ZWx5IG91dHNpZGUgdGhlIGBza2lwQnVpbGRgIGdhdGUuIFRoZSBwYXRjaCBpcyBhIHByb3BlcnR5IG9mXG4gICAgLy8gKnNlcnZpbmcqIHRocm91Z2ggQ2xvdWRGcm9udCwgbm90IG9mIHdobyByYW4gYG5leHQgYnVpbGRgOiB3aXRob3V0IGl0XG4gICAgLy8gZXZlcnkgUE9TVCB3aXRoIGEgYm9keSBpcyByZWplY3RlZCBieSB0aGUgTGFtYmRhIEZ1bmN0aW9uIFVSTCBiZWZvcmUgaXRcbiAgICAvLyByZWFjaGVzIHRoZSBhcHAgKHNlZSBgcGF0Y2hGZXRjaEluQ2xpZW50SnNgKS4gUnVubmluZyBpdCBvbmx5IGluc2lkZVxuICAgIC8vIGBydW5OZXh0QnVpbGRgIG1lYW50IGBza2lwQnVpbGQ6IHRydWVgIHNpbGVudGx5IHNoaXBwZWQgYW4gYXBwIHdob3NlXG4gICAgLy8gc2VydmVyIGFjdGlvbnMgYW5kIFBPU1Qgcm91dGUgaGFuZGxlcnMgYWxsIHJldHVybmVkIDQwMy5cbiAgICBpZiAocHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TKSB7XG4gICAgICB0aGlzLnBhdGNoRmV0Y2hJbkNsaWVudEpzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZElkID0gZGVwbG95bWVudEJ1aWxkSWQobWFuaWZlc3QpO1xuICAgIHRoaXMucHVibGljRGlyRW50cmllcyA9IHRoaXMuZ2V0TG9jYWxQdWJsaWNEaXJFbnRyaWVzKCk7XG4gICAgLy8gTmV4dC5qcydzIHJlc29sdmVkIGNvbmZpZywgdGhlIHNhbWUgb25lIGl0IHdyaXRlcyBpbnRvXG4gICAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYC5cbiAgICB0aGlzLm5leHRDb25maWdCYXNlUGF0aCA9IG5vcm1hbGl6ZUJhc2VQYXRoKG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCk7XG4gICAgdGhpcy5uZXh0Q29uZmlnQXNzZXRQcmVmaXggPSByZWxhdGl2ZUFzc2V0UHJlZml4KFxuICAgICAgbWFuaWZlc3QuY29uZmlnLmFzc2V0UHJlZml4LFxuICAgICk7XG4gICAgdGhpcy5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoID0gYXNzZXRQcmVmaXhQYXRoKFxuICAgICAgbWFuaWZlc3QuY29uZmlnLmFzc2V0UHJlZml4LFxuICAgICk7XG5cbiAgICBjb25zdCBpc0Z1bmN0aW9ucyA9XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgfHxcbiAgICAgIHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TO1xuXG4gICAgdGhpcy5yZWxhdGl2ZVByb2plY3REaXIgPSBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXI7XG4gICAgdGhpcy5yZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQgPSBqb2luUG9zaXgoUlVOVElNRV9ESVJfTkFNRSwgXCJzZXJ2ZXIubWpzXCIpO1xuICAgIHRoaXMuYXJjaGl0ZWN0dXJlID0gZGVwbG95bWVudEFyY2hpdGVjdHVyZShwcm9wcyk7XG4gICAgdGhpcy5kZXBsb3ltZW50Um9vdHMgPSB0aGlzLnJlc29sdmVEZXBsb3ltZW50Um9vdHMobWFuaWZlc3QpO1xuICAgIHRoaXMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyA9IG1hbmlmZXN0LmJlaGF2aW9ycyA/PyBbXTtcblxuICAgIC8vIE9ubHkgdGhlIFJlZ2lvbmFsQ29udGFpbmVycyBpbWFnZSBjYXJyaWVzIGBwdWJsaWMvYDogbm90aGluZyBpcyBpbiBmcm9udFxuICAgIC8vIG9mIGl0IHRvIGFuc3dlciB0aG9zZSBwYXRocyBmcm9tIFMzLiBFdmVyeSBvdGhlciB0eXBlIGxpc3RzIGl0IGhlcmUgYW5kXG4gICAgLy8gcmVhZHMgYSBmaWxlIHRoZSBlZGdlIGRpZG4ndCByb3V0ZSB0byBTMyAoYSByZXdyaXRlIG9udG8gaXQpIGZyb20gdGhlcmUuXG4gICAgY29uc3QgcHVibGljT25EaXNrID0gcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgIGlmIChwdWJsaWNPbkRpc2spIHtcbiAgICAgIC8vIEl0cyBnZW5lcmF0ZWQgRG9ja2VyZmlsZSBgQ09QWWBzIGBwdWJsaWNgLCB3aGljaCBmYWlscyB0aGUgaW1hZ2UgYnVpbGRcbiAgICAgIC8vIHdoZW4gdGhlIGFwcCBoYXMgbm9uZS4gQW4gZW1wdHkgZGlyZWN0b3J5IGlzIHdoYXQgYG5leHQgc3RhcnRgIHNlZXNcbiAgICAgIC8vIGZvciBhbiBhcHAgd2l0aG91dCBvbmUgYW55d2F5LCBhbmQgZ2l0IGRvZXNuJ3QgdHJhY2sgaXQuXG4gICAgICBta2RpclN5bmMoam9pbihwcm9wcy5idWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmRlcGxveW1lbnRSb290cykge1xuICAgICAgdGhpcy5zdGFnZVJ1bnRpbWUocm9vdC5wYXRoLCBpc0Z1bmN0aW9ucywgcHVibGljT25EaXNrKTtcbiAgICAgIC8vIEZ1bmN0aW9ucyBydW4gb24gdGhlIExhbWJkYSBtYW5hZ2VkIHJ1bnRpbWUgKEFtYXpvbiBMaW51eCAyMDIzLCBnbGliYyksXG4gICAgICAvLyBmb3IgdGhlIGFyY2hpdGVjdHVyZSB0aGVpciBMYW1iZGEgZGVwbG95cywgd2hhdGV2ZXIgdGhpcyBtYWNoaW5lIGlzO1xuICAgICAgLy8gQ29udGFpbmVycyBydW4gb24gbm9kZToyNC1hbHBpbmUgKG11c2wpLlxuICAgICAgdGhpcy5zdGFnZVNoYXJwRm9yVGFyZ2V0KFxuICAgICAgICByb290LFxuICAgICAgICBqb2luKHJvb3QucGF0aCwgdGhpcy5yZWxhdGl2ZVByb2plY3REaXIpLFxuICAgICAgICBgJHtpc0Z1bmN0aW9ucyA/IFwibGludXhcIiA6IFwibGludXhtdXNsXCJ9LSR7dG9Ob2RlQXJjaGl0ZWN0dXJlKHRoaXMuYXJjaGl0ZWN0dXJlKX1gLFxuICAgICAgKTtcbiAgICAgIHRoaXMud2Fybk9uRm9yZWlnbk5hdGl2ZUJpbmFyaWVzKFxuICAgICAgICByb290LFxuICAgICAgICBgbGludXgtJHt0b05vZGVBcmNoaXRlY3R1cmUodGhpcy5hcmNoaXRlY3R1cmUpfWAsXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbnMpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRVbmRlckxhbWJkYUxpbWl0KHJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5lIHVwIHRoZSBncm91cHMgdGhlIHByb3BzIGFza2VkIGZvciB3aXRoIHRoZSByb290cyB0aGUgYnVpbGQgYWN0dWFsbHlcbiAgICogc3RhZ2VkLCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGV5IGRpc2FncmVlLlxuICAgKlxuICAgKiBUaGV5IGNhbiBkaXNhZ3JlZSBpbiBib3RoIGRpcmVjdGlvbnMsIGFuZCBib3RoIG1lYW4gdGhlIHNhbWUgdGhpbmcg4oCUIHRoZVxuICAgKiBgLm5leHRgIG9uIGRpc2sgY2FtZSBmcm9tIGEgYnVpbGQgdGhhdCBkaWQgbm90IHNlZSB0aGlzIGBmdW5jdGlvbkdyb3Vwc2Ag4oCUXG4gICAqIGJ1dCB0aGUgY2F1c2VzIGRpZmZlcjogYHNraXBCdWlsZDogdHJ1ZWAgd2l0aCBhIGJ1aWxkIHJ1biBieSBoYW5kLCBvciBhXG4gICAqIHN0YWxlIGAubmV4dGAgZnJvbSBiZWZvcmUgdGhlIHByb3AgY2hhbmdlZC4gRWl0aGVyIHdheSBldmVyeSBsYXRlciBzeW1wdG9tXG4gICAqIChhIExhbWJkYSBtaXNzaW5nIGFuIGVudHJ5cG9pbnQsIGEgQ2xvdWRGcm9udCBiZWhhdmlvciBwb2ludGluZyBhdCBhXG4gICAqIGZ1bmN0aW9uIHRoYXQgY2Fubm90IHNlcnZlIGl0KSBpcyB0aGlzLCBzZXZlcmFsIHN0ZXBzIGRvd25zdHJlYW0uXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZXBsb3ltZW50Um9vdHMoXG4gICAgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCxcbiAgKTogTmV4dGpzRGVwbG95bWVudFJvb3RbXSB7XG4gICAgY29uc3Qgc3RhZ2VkID0gbWFuaWZlc3QuZ3JvdXBzO1xuXG4gICAgLy8gTmFtZXMgKmFuZCogcm91dGVzOiBtb3ZpbmcgYC9yZXBvcnRzLyoqYCBpbnRvIGFuIGV4aXN0aW5nIGdyb3VwIGtlZXBzIHRoZVxuICAgIC8vIG5hbWVzIGFuZCBzdGlsbCBsZWF2ZXMgdGhhdCBncm91cCdzIHppcCB3aXRob3V0IHRoZSByZXBvcnRzIGVudHJ5cG9pbnRzLlxuICAgIC8vIE9yZGVyIGlzIG5vdDogYXNzaWdubWVudCBhbmQgQ2xvdWRGcm9udCBiZWhhdmlvcnMgYm90aCBnbyBtb3N0IHNwZWNpZmljXG4gICAgLy8gZmlyc3QsIGFuZCBubyB0d28gZGlzdGluY3QgcGF0dGVybnMgdGllIG9uIGEgVVJMIChgZnVuY3Rpb24tZ3JvdXBzLnRzYCksXG4gICAgLy8gc28gcmVvcmRlcmluZyBncm91cHMgb3Igcm91dGVzIGlzIHRoZSBzYW1lIHNwbGl0LlxuICAgIC8vIEFscmVhZHkgdmFsaWRhdGVkIGluIHRoZSBjb25zdHJ1Y3Rvciwgc28gdGhpcyBpcyBhYnNlbnQgb3Igbm9uLWVtcHR5LlxuICAgIGNvbnN0IHdhbnRlZCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aFxuICAgICAgPyB0b0Z1bmN0aW9uR3JvdXBTcGVjcyh0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ290ID0gbWFuaWZlc3QuZnVuY3Rpb25Hcm91cHM7XG5cbiAgICBpZiAoXG4gICAgICBKU09OLnN0cmluZ2lmeShzb3J0ZWRHcm91cFNwZWNzKHdhbnRlZCkpICE9PVxuICAgICAgSlNPTi5zdHJpbmdpZnkoc29ydGVkR3JvdXBTcGVjcyhnb3QpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBhc2tzIGZvciBgICtcbiAgICAgICAgICBgJHt3YW50ZWQgPyBKU09OLnN0cmluZ2lmeSh3YW50ZWQpIDogXCJubyBzcGxpdHRpbmdcIn0gYnV0IHRoZSBidWlsZCBgICtcbiAgICAgICAgICBgaW4gJHt0aGlzLmRvdE5leHRQYXRofSB3YXMgc3BsaXQgaW50byBgICtcbiAgICAgICAgICBgJHtnb3QgPyBKU09OLnN0cmluZ2lmeShnb3QpIDogXCJhIHNpbmdsZSBkZXBsb3ltZW50IHJvb3RcIn0uIGAgK1xuICAgICAgICAgIGBHcm91cHMgYXJlIHJlc29sdmVkIGR1cmluZyBcXGBuZXh0IGJ1aWxkXFxgIChjZGstbmV4dGpzIHBhc3NlcyB0aGVtIGluIGAgK1xuICAgICAgICAgIGB2aWEgJHtGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUn0pLCBzbyB0aGlzIG1lYW5zIHRoZSBidWlsZCBvdXRwdXQgaXMgYCArXG4gICAgICAgICAgYHN0YWxlLCBvciBcXGBza2lwQnVpbGQ6IHRydWVcXGAgYW5kIHRoZSBidWlsZCB3YXMgcnVuIHdpdGhvdXQgdGhhdCBgICtcbiAgICAgICAgICBgdmFyaWFibGUgc2V0LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzID0gc3RhZ2VkID8gT2JqZWN0LmtleXMoc3RhZ2VkKSA6IFtERUZBVUxUX0ZVTkNUSU9OX0dST1VQXTtcbiAgICBjb25zdCByb290cyA9IG5hbWVzLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXRoOiBqb2luKFxuICAgICAgICB0aGlzLmRvdE5leHRQYXRoLFxuICAgICAgICBBREFQVEVSX0RJUl9OQU1FLFxuICAgICAgICAuLi5ncm91cFN0YWdpbmdEaXJOYW1lKHN0YWdlZCA/IG5hbWUgOiB1bmRlZmluZWQpLnNwbGl0KFwiL1wiKSxcbiAgICAgICksXG4gICAgICByb3V0ZXM6IHN0YWdlZD8uW25hbWVdID8/IFtdLFxuICAgIH0pKTtcblxuICAgIC8vIGBkZWZhdWx0YCBmaXJzdCwgc28gYW55IFwidGhlIHJvb3RcIiBjYWxsZXIgZ2V0cyB0aGUgZ3JvdXAgdGhhdCBvd25zXG4gICAgLy8gZXZlcnl0aGluZyB1bmFzc2lnbmVkLlxuICAgIHJvb3RzLnNvcnQoKGEsIGIpID0+XG4gICAgICBhLm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVBcbiAgICAgICAgPyAtMVxuICAgICAgICA6IGIubmFtZSA9PT0gREVGQVVMVF9GVU5DVElPTl9HUk9VUFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCByb290IG9mIHJvb3RzKSB7XG4gICAgICBpZiAoIWV4aXN0c1N5bmMocm9vdC5wYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gVGhlIGRlcGxveW1lbnQgcm9vdCBmb3IgZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke3Jvb3QubmFtZX1cIiBpcyBtaXNzaW5nIGZyb20gJHtyb290LnBhdGh9LCB0aG91Z2ggdGhlIGFkYXB0ZXIgYCArXG4gICAgICAgICAgICBgbWFuaWZlc3QgbGlzdHMgaXQuIFRoZSBcXGAubmV4dFxcYCBkaXJlY3RvcnkgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgYCArXG4gICAgICAgICAgICBgXFxgbmV4dCBidWlsZFxcYCByYW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZXh0IGJ1aWxkYCB0cmFjZXMgbmF0aXZlIGFkZG9ucyBmcm9tIHRoZSBtYWNoaW5lIGl0IHJ1bnMgb24sIGFuZCBvbmx5XG4gICAqIGBzaGFycGAgaXMgc3dhcHBlZCBmb3IgdGhlIHRhcmdldC4gQW55dGhpbmcgZWxzZSBidWlsdCBmb3IgYW5vdGhlciBwbGF0Zm9ybVxuICAgKiBmYWlscyB3aXRoIE1PRFVMRV9OT1RfRk9VTkQgb3IgRVJSX0RMT1BFTl9GQUlMRUQgb24gdGhlIGZpcnN0IHJlcXVlc3QgdGhhdFxuICAgKiBsb2FkcyBpdCwgc28gc2F5IHdoaWNoIHBhY2thZ2UgYXQgc3ludGguIEEgd2FybmluZywgbm90IGFuIGVycm9yOiBzb21lXG4gICAqIGFkZG9ucyBhcmUgb3B0aW9uYWwgKGB3c2AncyBgYnVmZmVydXRpbGAsIGBmc2V2ZW50c2ApIGFuZCBmYWxsIGJhY2sgdG8gSlMuXG4gICAqXG4gICAqIE9ubHkgdGhlIE9TIGFuZCBDUFUgYXJlIGNoZWNrZWQ6IGdsaWJjIGFuZCBtdXNsIGJ1aWxkcyBzaGFyZSBhIGhlYWRlci5cbiAgICovXG4gIHByaXZhdGUgd2Fybk9uRm9yZWlnbk5hdGl2ZUJpbmFyaWVzKFxuICAgIHJvb3Q6IE5leHRqc0RlcGxveW1lbnRSb290LFxuICAgIHRhcmdldDogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBmb3JlaWduID0gZmluZEZvcmVpZ25OYXRpdmVQYWNrYWdlcyhyb290LnBhdGgsIHRhcmdldCk7XG4gICAgaWYgKCFmb3JlaWduLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICBcImNkay1uZXh0anM6Zm9yZWlnbk5hdGl2ZUJpbmFyaWVzXCIsXG4gICAgICBgJHtMT0dfUFJFRklYfSBEZXBsb3ltZW50IHJvb3QgXCIke3Jvb3QubmFtZX1cIiBoYXMgbmF0aXZlIGJpbmFyaWVzIGAgK1xuICAgICAgICBgYnVpbHQgZm9yIGEgcGxhdGZvcm0gb3RoZXIgdGhhbiAke3RhcmdldH0sIHdoaWNoIGl0IHJ1bnMgb246IGAgK1xuICAgICAgICBgJHtmb3JlaWduLmpvaW4oXCIsIFwiKX0uIFxcYG5leHQgYnVpbGRcXGAgdHJhY2VkIHRoZW0gZnJvbSB0aGlzIG1hY2hpbmUsIGAgK1xuICAgICAgICBgc28gdGhleSBmYWlsIG9uIHRoZSBmaXJzdCByZXF1ZXN0IHRoYXQgbG9hZHMgdGhlbSB1bmxlc3MgdGhlIHBhY2thZ2UgYCArXG4gICAgICAgIGBmYWxscyBiYWNrIHdpdGhvdXQgdGhlbS4gQnVpbGQgb24gJHt0YXJnZXR9LCBvciByZXBsYWNlIGVhY2ggd2l0aCBgICtcbiAgICAgICAgYHRoZSAke3RhcmdldH0gdmFyaWFudCBhZnRlciBcXGBuZXh0IGJ1aWxkXFxgIChlLmcuIFxcYG5wbSBwYWNrXFxgIGl0IGluIGAgK1xuICAgICAgICBgeW91ciBcXGBidWlsZENvbW1hbmRcXGApLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nka2xhYnMvY2RrLW5leHRqcy9gICtcbiAgICAgICAgYGJsb2IvbWFpbi9kb2NzL25hdGl2ZS1kZXBlbmRlbmNpZXMtZ3VpZGUubWRgLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTGFtYmRhIGVuZm9yY2VzIDI1MCBNQiB1bnppcHBlZCBhdCBDbG91ZEZvcm1hdGlvbiB0aW1lLCB3aGljaCBpcyBtaW51dGVzXG4gICAqIGludG8gYSBkZXBsb3kgYW5kIHJlcG9ydHMgb25seSBhIHNpemUuIFNwbGl0dGluZyBleGlzdHMgdG8gc3RheSB1bmRlciB0aGF0XG4gICAqIGNhcCwgc28gdGhlIGVycm9yIHRoYXQgdGVsbHMgeW91IHRvIHNwbGl0IGZ1cnRoZXIgaGFzIHRvIG5hbWUgdGhlIGdyb3VwLCBpdHNcbiAgICogc2l6ZSwgYW5kIHdoYXQgdG8gZG8g4oCUIGFuZCBhcnJpdmUgYXQgc3ludGguXG4gICAqL1xuICBwcml2YXRlIGFzc2VydFVuZGVyTGFtYmRhTGltaXQocm9vdDogTmV4dGpzRGVwbG95bWVudFJvb3QpOiB2b2lkIHtcbiAgICBjb25zdCBieXRlcyA9IHN0b3JlZFNpemUocm9vdC5wYXRoKTtcbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IERlcGxveW1lbnQgcm9vdCBcIiR7cm9vdC5uYW1lfVwiIGlzICR7KGJ5dGVzIC8gMWU2KS50b0ZpeGVkKDEpfSBNQiB1bnppcHBlZGAsXG4gICAgKTtcbiAgICBpZiAoYnl0ZXMgPD0gTEFNQkRBX1VOWklQUEVEX0xJTUlUX0JZVEVTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1iID0gKHZhbHVlOiBudW1iZXIpID0+IGAkeyh2YWx1ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDApfSBNQmA7XG4gICAgY29uc3QgaXNTcGxpdCA9IHRoaXMuZGVwbG95bWVudFJvb3RzLmxlbmd0aCA+IDE7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gRnVuY3Rpb24gZ3JvdXAgXCIke3Jvb3QubmFtZX1cIiBpcyAke21iKGJ5dGVzKX0gdW56aXBwZWQsIGAgK1xuICAgICAgICBgb3ZlciBMYW1iZGEncyAke21iKExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUyl9IGxpbWl0LiBgICtcbiAgICAgICAgKGlzU3BsaXRcbiAgICAgICAgICA/IGBTcGxpdCBpdHMgcm91dGVzIGZ1cnRoZXIsIG9yIG1vdmUgc29tZSBvZiB0aGVtIGludG8gYW5vdGhlciBncm91cDogYCArXG4gICAgICAgICAgICBgdGhlIGNhcCBpcyBwZXIgZnVuY3Rpb24sIHNvIHRoZSBzaGFyZWQgXFxgbmV4dFxcYCBjbG9zdXJlIGV2ZXJ5IGdyb3VwIGAgK1xuICAgICAgICAgICAgYGR1cGxpY2F0ZXMgY29zdHMgbm90aGluZyBhZ2FpbnN0IGFueSBzaW5nbGUgYnVkZ2V0LmBcbiAgICAgICAgICA6IGBVc2UgdGhlIFxcYGZ1bmN0aW9uR3JvdXBzXFxgIHByb3AgdG8gcGFja2FnZSByb3V0ZXMgaW50byBzZXBhcmF0ZSBgICtcbiAgICAgICAgICAgIGBmdW5jdGlvbnMuIE5vdGUgdGhhdCBzcGxpdHRpbmcgb25seSByZW1vdmVzIHJvdXRlLWxvY2FsIGNvZGUg4oCUIGAgK1xuICAgICAgICAgICAgYGFueXRoaW5nIHJlYWNoYWJsZSBmcm9tIGEgc2hhcmVkIGxheW91dCBvciB0aGUgXFxgbmV4dFxcYCBydW50aW1lIGlzIGAgK1xuICAgICAgICAgICAgYGluIGV2ZXJ5IGdyb3VwLmApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgbWFuaWZlc3QgdGhlIGFkYXB0ZXIncyBgb25CdWlsZENvbXBsZXRlYCB3cm90ZS5cbiAgICpcbiAgICogSXRzIGFic2VuY2UgbWVhbnMgYG5leHQgYnVpbGRgIHJhbiB3aXRob3V0IGNkay1uZXh0anMncyBhZGFwdGVyIHJlZ2lzdGVyZWRcbiAgICogKG9yIHdpdGggYSBzdGFsZSBgbmV4dC5jb25maWdgKSwgd2hpY2ggaXMgd29ydGggc2F5aW5nIHBsYWlubHkgaGVyZTogZXZlcnlcbiAgICogbGF0ZXIgZmFpbHVyZSDigJQgYSBMYW1iZGEgdGhhdCBjYW5ub3QgZmluZCBgbWFuaWZlc3QuanNvbmAsIGFuIGVtcHR5IGFzc2V0IOKAlFxuICAgKiBpcyB0aGUgc2FtZSBjYXVzZSBzZXZlcmFsIHN0ZXBzIGRvd25zdHJlYW0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRBZGFwdGVyTWFuaWZlc3QoKTogQWRhcHRlck1hbmlmZXN0IHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKFxuICAgICAgdGhpcy5kb3ROZXh0UGF0aCxcbiAgICAgIEFEQVBURVJfRElSX05BTUUsXG4gICAgICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gICAgKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IG5vdCBmb3VuZCBhdCAke21hbmlmZXN0UGF0aH0uIGAgK1xuICAgICAgICAgIGBcIiR7dGhpcy5idWlsZENvbW1hbmR9XCIgbXVzdCBydW4gYSBOZXh0LmpzIGJ1aWxkIHdpdGggY2RrLW5leHRqcydzIGAgK1xuICAgICAgICAgIGBhZGFwdGVyIHJlZ2lzdGVyZWQuIGNkay1uZXh0anMgc2V0cyBcXGBORVhUX0FEQVBURVJfUEFUSFxcYCBvbiB0aGUgYCArXG4gICAgICAgICAgYGJ1aWxkIGl0IHJ1bnMgaXRzZWxmLCBzbyB0aGlzIHVzdWFsbHkgbWVhbnMgZWl0aGVyIHRoZSBidWlsZCBjb21tYW5kIGAgK1xuICAgICAgICAgIGBkb2VzIG5vdCByZWFjaCBcXGBuZXh0IGJ1aWxkXFxgIChhIHdyYXBwZXIgdGhhdCBkcm9wcyB0aGUgZW52aXJvbm1lbnQsIGAgK1xuICAgICAgICAgIGBvciBhIGNhY2hlZCBidWlsZCB0aGF0IGRpZCBub3QgcmUtcnVuKSwgb3IgXFxgc2tpcEJ1aWxkOiB0cnVlXFxgIGFuZCBgICtcbiAgICAgICAgICBgdGhlIGJ1aWxkIGhhcHBlbmVkIG91dHNpZGUgQ0RLLiBGb3IgdGhlIGxhdHRlciwgc2V0IGAgK1xuICAgICAgICAgIGBcXGBhZGFwdGVyUGF0aDogcmVxdWlyZS5yZXNvbHZlKFwiY2RrLW5leHRqcy9hZGFwdGVyXCIpXFxgIGluIGAgK1xuICAgICAgICAgIGBuZXh0LmNvbmZpZy4gQSBjdXN0b20gXFxgZGlzdERpclxcYCBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlcjogYCArXG4gICAgICAgICAgYGNkay1uZXh0anMgcmVhZHMgdGhlIGJ1aWxkIGZyb20gXFxgLm5leHRcXGAuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgcmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGYtOFwiKSxcbiAgICApO1xuICAgIGlmIChtYW5pZmVzdC52ZXJzaW9uICE9PSBBREFQVEVSX01BTklGRVNUX1ZFUlNJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBjZGstbmV4dGpzIGFkYXB0ZXIgbWFuaWZlc3QgYXQgJHttYW5pZmVzdFBhdGh9IGlzIHZlcnNpb24gYCArXG4gICAgICAgICAgYCR7bWFuaWZlc3QudmVyc2lvbn0sIGJ1dCB0aGlzIHZlcnNpb24gb2YgY2RrLW5leHRqcyByZWFkcyB2ZXJzaW9uIGAgK1xuICAgICAgICAgIGAke0FEQVBURVJfTUFOSUZFU1RfVkVSU0lPTn0uIFRoZSBhZGFwdGVyIHRoYXQgd3JvdGUgaXQgYW5kIHRoZSBgICtcbiAgICAgICAgICBgY29uc3RydWN0cyByZWFkaW5nIGl0IGNvbWUgZnJvbSB0aGUgc2FtZSBwYWNrYWdlLCBzbyB0aGlzIG1lYW5zIHR3byBgICtcbiAgICAgICAgICBgY2RrLW5leHRqcyB2ZXJzaW9ucyBhcmUgaW5zdGFsbGVkLCBvciB0aGUgYnVpbGQgb3V0cHV0IGlzIHN0YWxlLmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBjZGstbmV4dGpzJ3Mgb3duIGJ1bmRsZWQgcmVxdWVzdC1oYW5kbGluZyBzaGVsbCBhbmQgdGhlIG1hbmlmZXN0IGludG9cbiAgICogYDxkZXBsb3ltZW50Um9vdD4vY2RrLW5leHRqcy1ydW50aW1lL2AsIHdoaWNoIGlzIHdoZXJlXG4gICAqIGBkZXBsb3ltZW50Um9vdE9mYC9gZGVwbG95ZWRNYW5pZmVzdFBhdGhgIGV4cGVjdCB0byBmaW5kIHRoZW0uXG4gICAqXG4gICAqIE9ubHkgdGhlIHNoZWxsIHRoZSBkZXBsb3ltZW50IHR5cGUgYWN0dWFsbHkgcnVucyBpcyBjb3BpZWQg4oCUIHRoZSBMYW1iZGFcbiAgICogaGFuZGxlciBmb3IgRnVuY3Rpb25zLCB0aGUgYG5vZGU6aHR0cGAgc2VydmVyIGZvciBDb250YWluZXJzIOKAlCBzbyBub3RoaW5nXG4gICAqIHNoaXBzIH4xLjUgTUIgb2YgZGVhZCBjb2RlIGFuZCB0aGUgdHJlZSBzYXlzIHdoaWNoIHR5cGUgcHJvZHVjZWQgaXQuIEJvdGhcbiAgICogYXJlIGNvcGllZCBmcm9tIHRoaXMgcGFja2FnZSdzIGBsaWIvYCwgbmV4dCB0byB0aGUgY29tcGlsZWQgY29uc3RydWN0LlxuICAgKlxuICAgKiBFdmVyeSBncm91cCBnZXRzIHRoZSBzYW1lIHNoZWxsICphbmQgdGhlIHNhbWUgbWFuaWZlc3QqOiBhIGZ1bmN0aW9uIG9ubHlcbiAgICoga25vd3Mgd2hpY2ggcm91dGVzIGl0IG93bnMgc28gaXQgY2FuIHNheSBzbyB3aGVuIG1pc3JvdXRlZCwgYW5kIHRoYXQgY29tZXNcbiAgICogZnJvbSB7QGxpbmsgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUn0sIG5vdCBmcm9tIGEgcGVyLWdyb3VwIG1hbmlmZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVJ1bnRpbWUoXG4gICAgZGVwbG95bWVudFJvb3Q6IHN0cmluZyxcbiAgICBpc0Z1bmN0aW9uczogYm9vbGVhbixcbiAgICBwdWJsaWNPbkRpc2s6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHNoZWxsID0gaXNGdW5jdGlvbnMgPyBcImxhbWJkYS5tanNcIiA6IFwic2VydmVyLm1qc1wiO1xuICAgIGNvbnN0IHNvdXJjZSA9IGpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwicnVudGltZVwiLCBzaGVsbCk7XG5cbiAgICBjb25zdCBydW50aW1lRGlyID0gam9pbihkZXBsb3ltZW50Um9vdCwgUlVOVElNRV9ESVJfTkFNRSk7XG4gICAgLy8gUmVtb3ZlZCByYXRoZXIgdGhhbiBtZXJnZWQ6IGEgc3RhbGUgc2hlbGwgZnJvbSB0aGUgb3RoZXIgZGVwbG95bWVudCB0eXBlXG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIHNpdCBpbiB0aGUgYXNzZXQgYW5kIGNoYW5nZSBpdHMgaGFzaCBmb3Igbm8gcmVhc29uLlxuICAgIHJtU3luYyhydW50aW1lRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKHJ1bnRpbWVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNwU3luYyhzb3VyY2UsIGpvaW4ocnVudGltZURpciwgc2hlbGwpKTtcbiAgICBjcFN5bmMoXG4gICAgICBqb2luKHRoaXMuZG90TmV4dFBhdGgsIEFEQVBURVJfRElSX05BTUUsIE1BTklGRVNUX0ZJTEVfTkFNRSksXG4gICAgICBqb2luKHJ1bnRpbWVEaXIsIE1BTklGRVNUX0ZJTEVfTkFNRSksXG4gICAgKTtcbiAgICBpZiAoIXB1YmxpY09uRGlzaykge1xuICAgICAgLy8gVGhlIExhbWJkYSB6aXBzIGFuZCB0aGUgR2xvYmFsQ29udGFpbmVycyBpbWFnZSBkb24ndCBjYXJyeSBgcHVibGljL2BcbiAgICAgIC8vIChpdHMgYnl0ZXMgYXJlIGluIFMzKSwgc28gdGhlIHJ1bnRpbWUgY2FuJ3QgbGlzdCBpdCBhdCBzdGFydCB0aGUgd2F5XG4gICAgICAvLyB0aGUgUmVnaW9uYWxDb250YWluZXJzIGltYWdlIGRvZXMuXG4gICAgICAvLyBMaXN0ZWQgaGVyZSwgYWZ0ZXIgdGhlIGJ1aWxkIGNvbW1hbmQsIHNvIGBwb3N0YnVpbGRgIG91dHB1dCBpcyBpbiBpdDpcbiAgICAgIC8vIGEgcmV3cml0ZSBvbnRvIGEgbGlzdGVkIGZpbGUgaXMgdGhlbiBzZXJ2ZWQgZnJvbSBTMyByYXRoZXIgdGhhbiA0MDRpbmcuXG4gICAgICB3cml0ZVB1YmxpY0ZpbGVMaXN0KFxuICAgICAgICBydW50aW1lRGlyLFxuICAgICAgICBqb2luKHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBTdGFnZWQgJHtzaGVsbH0gYW5kICR7TUFOSUZFU1RfRklMRV9OQU1FfSBpbiAke3J1bnRpbWVEaXJ9YCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGBORVhUX0FEQVBURVJfUEFUSGAgZm9yIHRoZSBidWlsZCwgc28gYGFkYXB0ZXJQYXRoYCBpbiBgbmV4dC5jb25maWdgIGlzXG4gICAqIG9wdGlvbmFsLlxuICAgKlxuICAgKiBOZXh0LmpzIHJlYWRzIHRoZSB2YXJpYWJsZSBhcyB0aGUgKmRlZmF1bHQqIHZhbHVlIG9mIGBhZGFwdGVyUGF0aGBcbiAgICogKGBuZXh0L2Rpc3Qvc2VydmVyL2NvbmZpZy1zaGFyZWQuanNgLCBgZGVmYXVsdENvbmZpZ2ApLCBzbyBhbiBhcHAgdGhhdCBkb2VzXG4gICAqIHNldCBgYWRhcHRlclBhdGhgIHN0aWxsIHdpbnMgYW5kIG5vdGhpbmcgZXhpc3RpbmcgY2hhbmdlcy5cbiAgICpcbiAgICogUmVzb2x2ZWQgZnJvbSB0aGUgTmV4dC5qcyBhcHAsIG5vdCBmcm9tIGNkay1uZXh0anMncyBvd24gYF9fZGlybmFtZWAgYW5kIG5vdFxuICAgKiBsZWZ0IGFzIGEgYmFyZSBzcGVjaWZpZXIuIEJvdGggYWx0ZXJuYXRpdmVzIHdlcmUgdHJpZWQgYW5kIGJvdGggYXJlIHdyb25nOlxuICAgKlxuICAgKiAtIGNkay1uZXh0anMncyBvd24gbG9jYXRpb24gbG9zZXMgYmVjYXVzZSB0aGUgYWRhcHRlciByZXNvbHZlcyBpdHMgc2libGluZ1xuICAgKiAgIGNhY2hlIGhhbmRsZXIgcmVsYXRpdmUgdG8gd2hlcmV2ZXIgKml0KiB3YXMgbG9hZGVkIGZyb20uIEFuIGFkYXB0ZXIgbG9hZGVkXG4gICAqICAgZnJvbSBvdXRzaWRlIHRoZSBhcHAncyB0cmVlIGhhbmRzIE5leHQuanMgYSBgY2FjaGVIYW5kbGVyYCBvdXRzaWRlXG4gICAqICAgYHR1cmJvcGFjay5yb290YCwgd2hpY2ggVHVyYm9wYWNrIHJlamVjdHMgb3V0cmlnaHQgKFwibGVhdmVzIHRoZSBmaWxlc3lzdGVtXG4gICAqICAgcm9vdFwiKS5cbiAgICogLSBBIGJhcmUgc3BlY2lmaWVyIGxvc2VzIGJlY2F1c2UgTmV4dC5qcyByZXNvbHZlcyBgYWRhcHRlclBhdGhgIGZyb20gaW5zaWRlXG4gICAqICAgaXRzIG93biBjb25maWcgbG9hZGVyLCBpLmUuIGZyb20gYG5leHRgJ3MgcmVhbHBhdGguIFVuZGVyIHBucG0gdGhhdCBpcyB0aGVcbiAgICogICB2aXJ0dWFsIHN0b3JlIChgbm9kZV9tb2R1bGVzLy5wbnBtL25leHRA4oCmL25vZGVfbW9kdWxlcy9uZXh0L2ApLCBhbmQgdGhlXG4gICAqICAgd2FsayB1cCBmcm9tIHRoZXJlIG5ldmVyIHJlYWNoZXMgdGhlIGFwcCdzIG93biBgbm9kZV9tb2R1bGVzYC5cbiAgICpcbiAgICogVW5zZXQgd2hlbiBgY2RrLW5leHRqc2AgaXMgbm90IHJlc29sdmFibGUgZnJvbSB0aGUgYXBwLCB3aGljaCBpcyBsZWdpdGltYXRlOlxuICAgKiB0aGUgTmV4dC5qcyBhcHAgYW5kIHRoZSBDREsgYXBwIGNhbiBiZSBzZXBhcmF0ZSBwYWNrYWdlcywgYW5kIG9ubHkgdGhlIENESyBvbmVcbiAgICogbmVjZXNzYXJpbHkgZGVwZW5kcyBvbiBjZGstbmV4dGpzLiB7QGxpbmsgcmVhZEFkYXB0ZXJNYW5pZmVzdH0gcmVwb3J0cyB0aGVcbiAgICogcmVzdWx0aW5nIGZhaWx1cmUgYW5kIG5hbWVzIHRoaXMgY2FzZS5cbiAgICpcbiAgICogT25lIHNldHVwIHRoaXMgY2Fubm90IHNlcnZlLCBhbmQgdGhlIHJlYXNvbiB0aGlzIHJlcG8ncyBvd24gZXhhbXBsZXMgc3RpbGwgc2V0XG4gICAqIGBhZGFwdGVyUGF0aGA6IGEgYGxpbms6YC9gZmlsZTpgIGRlcGVuZGVuY3kgb24gYSBjZGstbmV4dGpzIGNoZWNrb3V0ICpvdXRzaWRlKlxuICAgKiB0aGUgYXBwJ3MgcHJvamVjdCByb290LiBUaGUgc3ltbGluayByZXNvbHZlcyBvdXQgb2YgdGhlIHByb2plY3QsIHNvIHRoZVxuICAgKiBgY2FjaGVIYW5kbGVyYCBlc2NhcGUgYWJvdmUgYXBwbGllcy4gU2V0IGBhZGFwdGVyUGF0aGAgaW4gYG5leHQuY29uZmlnYCB0aGVyZVxuICAgKiDigJQgaXQgaXMgcmVzb2x2ZWQgYnkgdGhlIGJ1aWxkLCBhZnRlciB3aGF0ZXZlciBwdXQgdGhlIGFkYXB0ZXIgaW4gcGxhY2UuXG4gICAqL1xuICBwcml2YXRlIGFkYXB0ZXJQYXRoRW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBORVhUX0FEQVBURVJfUEFUSDogcmVxdWlyZS5yZXNvbHZlKFwiY2RrLW5leHRqcy9hZGFwdGVyXCIsIHtcbiAgICAgICAgICBwYXRoczogW3RoaXMucHJvcHMuYnVpbGREaXJlY3RvcnldLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gQ291bGQgbm90IHJlc29sdmUgXCJjZGstbmV4dGpzL2FkYXB0ZXJcIiBmcm9tIGAgK1xuICAgICAgICAgIGAke3RoaXMucHJvcHMuYnVpbGREaXJlY3Rvcnl9OyBsZWF2aW5nIE5FWFRfQURBUFRFUl9QQVRIIHVuc2V0LCBzbyBgICtcbiAgICAgICAgICBgbmV4dC5jb25maWcgbXVzdCBzZXQgXFxgYWRhcHRlclBhdGhcXGAuYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgbG9jYWwgYnVpbGQgY29tbWFuZCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBydW5OZXh0QnVpbGQoKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtMT0dfUFJFRklYfSBSdW5uaW5nOiBcIiR7dGhpcy5idWlsZENvbW1hbmR9XCIgaW4gZGlyZWN0b3J5OiAke3RoaXMucHJvcHMuYnVpbGREaXJlY3Rvcnl9YCxcbiAgICApO1xuXG4gICAgLy8gQ2xlYW4gZXhpc3RpbmcgY2FjaGUgZGlyZWN0b3J5IHRvIGF2b2lkIHN0YWxlIGRhdGEgZnJvbSBwcmV2aW91cyBidWlsZHNcbiAgICBpZiAoZXhpc3RzU3luYyh0aGlzLmluaXRDYWNoZURpcikpIHtcbiAgICAgIHJtU3luYyh0aGlzLmluaXRDYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgZGVidWcoYENsZWFuZWQgZXhpc3RpbmcgY2FjaGUgZGlyZWN0b3J5OiAke3RoaXMuaW5pdENhY2hlRGlyfWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyh0aGlzLmJ1aWxkQ29tbWFuZCwge1xuICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICAgIGN3ZDogdGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgQ0RLX05FWFRKU19JTklUX0NBQ0hFX0RJUjogdGhpcy5pbml0Q2FjaGVEaXIsXG4gICAgICAgICAgLi4udGhpcy5hZGFwdGVyUGF0aEVudigpLFxuICAgICAgICAgIC8vIGBvbkJ1aWxkQ29tcGxldGVgIHJ1bnMgaW5zaWRlIHRoaXMgcHJvY2VzcyBhbmQgY2Fubm90IHJlYWQgQ0RLXG4gICAgICAgICAgLy8gcHJvcHMsIHNvIHRoZSByZXNvbHZlZCBncm91cHMgdHJhdmVsIGFzIEpTT04uIEFic2VudCB3aGVuIG5vdFxuICAgICAgICAgIC8vIHNwbGl0dGluZywgd2hpY2ggdGhlIGFkYXB0ZXIgcmVhZHMgYXMgXCJvbmUgZGVwbG95bWVudCByb290XCIuXG4gICAgICAgICAgLi4uKHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgW0ZVTkNUSU9OX0dST1VQU19FTlZfVkFSXTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICB0b0Z1bmN0aW9uR3JvdXBTcGVjcyh0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvY2FsIGJ1aWxkIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZCBgcGF0Y2gtZmV0Y2guanNgIHRvIHRoZSBjbGllbnQgZW50cnlwb2ludCBjaHVua3MsIGZvclxuICAgKiBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zYCBvbmx5LlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgUE9TVCB3b3JrIGF0IGFsbCBvbiB0aGF0IHR5cGUuIENsb3VkRnJvbnQgcmVhY2hlcyB0aGVcbiAgICogc2VydmVyIHRocm91Z2ggYSBMYW1iZGEgRnVuY3Rpb24gVVJMIHdpdGggYEF1dGhUeXBlOiBBV1NfSUFNYCwgc2lnbmVkIGJ5IGFuXG4gICAqIG9yaWdpbiBhY2Nlc3MgY29udHJvbCwgYW5kIEFXUyBkb2N1bWVudHMgdGhlIGNvbnNlcXVlbmNlOiBcIklmIHlvdSB1c2UgUFVUIG9yXG4gICAqIFBPU1QgbWV0aG9kcyB3aXRoIHlvdXIgTGFtYmRhIGZ1bmN0aW9uIFVSTCwgeW91ciB1c2VycyBtdXN0IGNvbXB1dGUgdGhlXG4gICAqIFNIQTI1NiBvZiB0aGUgYm9keSBhbmQgaW5jbHVkZSB0aGUgcGF5bG9hZCBoYXNoIHZhbHVlIG9mIHRoZSByZXF1ZXN0IGJvZHkgaW5cbiAgICogdGhlIGB4LWFtei1jb250ZW50LXNoYTI1NmAgaGVhZGVyIHdoZW4gc2VuZGluZyB0aGUgcmVxdWVzdCB0byBDbG91ZEZyb250LlxuICAgKiBMYW1iZGEgZG9lc24ndCBzdXBwb3J0IHVuc2lnbmVkIHBheWxvYWRzLlwiXG4gICAqXG4gICAqIENsb3VkRnJvbnQgc2lnbnMgR0VUcyBpdHNlbGYgKGVtcHR5LWJvZHkgaGFzaCkgYnV0IHdpbGwgbm90IGhhc2ggYSBib2R5LCBhbmRcbiAgICogYSBicm93c2VyIGhhcyBubyB3YXkgdG8gYWRkIHRoYXQgaGVhZGVyIG9uIGl0cyBvd24sIHNvIGFuIHVucGF0Y2hlZCBhcHBcbiAgICogYW5zd2VycyBldmVyeSBzZXJ2ZXIgYWN0aW9uLCBmb3JtIHN1Ym1pc3Npb24gYW5kIFBPU1Qgcm91dGUgaGFuZGxlciB3aXRoXG4gICAqIGA0MDMgSW52YWxpZFNpZ25hdHVyZUV4Y2VwdGlvbmAgYmVmb3JlIHRoZSByZXF1ZXN0IHJlYWNoZXMgTmV4dC5qcy4gVGhlXG4gICAqIHBhdGNoIGluc3RhbGxzIGBmZXRjaGAvYFhNTEh0dHBSZXF1ZXN0YCB3cmFwcGVycyB0aGF0IGNvbXB1dGUgdGhlIGhhc2guXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3ByaXZhdGUtY29udGVudC1yZXN0cmljdGluZy1hY2Nlc3MtdG8tbGFtYmRhLmh0bWxcbiAgICovXG4gIHByaXZhdGUgcGF0Y2hGZXRjaEluQ2xpZW50SnMoKSB7XG4gICAgY29uc3Qgc3RhdGljQ2h1bmtzUGF0aCA9IGpvaW4odGhpcy5kb3ROZXh0UGF0aCwgXCJzdGF0aWNcIiwgXCJjaHVua3NcIik7XG4gICAgY29uc3QgY2h1bmtGaWxlcyA9IHJlYWRkaXJTeW5jKHN0YXRpY0NodW5rc1BhdGgpLmZpbHRlcihcbiAgICAgIChmaWxlOiBzdHJpbmcpID0+XG4gICAgICAgIC8vIG1haW4tYXBwLSBmb3Igd2VicGFjaywgdHVyYm9wYWNrLSBmb3IgdHVyYm9cbiAgICAgICAgZmlsZS5zdGFydHNXaXRoKFwibWFpbi1hcHAtXCIpIHx8XG4gICAgICAgIChmaWxlLnN0YXJ0c1dpdGgoXCJ0dXJib3BhY2stXCIpICYmIGZpbGUuZW5kc1dpdGgoXCIuanNcIikpLFxuICAgICk7XG5cbiAgICBpZiAoY2h1bmtGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNsaWVudCBzaWRlIGpzIGVudHJ5cG9pbnQgZmlsZXMgZm91bmRcIik7XG4gICAgfVxuXG4gICAgLy8gUmVhZCB0aGUgcGF0Y2gtZmV0Y2guanMgY29udGVudFxuICAgIGNvbnN0IHBhdGNoRmV0Y2hQYXRoID0gam9pbihfX2Rpcm5hbWUsIFwicGF0Y2gtZmV0Y2guanNcIik7XG4gICAgY29uc3QgcGF0Y2hGZXRjaENvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0Y2hGZXRjaFBhdGgsIFwidXRmLThcIik7XG5cbiAgICAvLyBQcmVwZW5kIHBhdGNoLWZldGNoIGxvZ2ljIHRvIGVhY2ggZW50cnlwb2ludCwgb25jZS4gTm93IHRoYXQgdGhpcyBydW5zXG4gICAgLy8gb3V0c2lkZSBgcnVuTmV4dEJ1aWxkYCwgdGhlIHNhbWUgYC5uZXh0YCBjYW4gYmUgc3ludGhlc2l6ZWQgbW9yZSB0aGFuXG4gICAgLy8gb25jZSAoYHNraXBCdWlsZDogdHJ1ZWAsIGBjZGsgc3ludGhgIHRoZW4gYGNkayBkZXBsb3lgLCBhIHJldHJpZWRcbiAgICAvLyBkZXBsb3kpLCBhbmQgcHJlcGVuZGluZyB0d2ljZSB3b3VsZCByZS13cmFwIHRoZSB3cmFwcGVycy5cbiAgICBmb3IgKGNvbnN0IGNodW5rRmlsZSBvZiBjaHVua0ZpbGVzKSB7XG4gICAgICBjb25zdCBjaHVua0ZpbGVQYXRoID0gam9pbihzdGF0aWNDaHVua3NQYXRoLCBjaHVua0ZpbGUpO1xuICAgICAgY29uc3QgcGF0Y2hlZENvbnRlbnQgPSBwYXRjaENsaWVudENodW5rKFxuICAgICAgICByZWFkRmlsZVN5bmMoY2h1bmtGaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICAgcGF0Y2hGZXRjaENvbnRlbnQsXG4gICAgICAgIGNodW5rRmlsZVBhdGgsXG4gICAgICApO1xuICAgICAgaWYgKHBhdGNoZWRDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gQWxyZWFkeSBwYXRjaGVkLCBza2lwcGluZzogJHtjaHVua0ZpbGVQYXRofWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHdyaXRlRmlsZVN5bmMoY2h1bmtGaWxlUGF0aCwgcGF0Y2hlZENvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcHVibGljIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gbG9jYWwgZmlsZXN5c3RlbVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb2NhbFB1YmxpY0RpckVudHJpZXMoKTogUHVibGljRGlyRW50cnlbXSB7XG4gICAgY29uc3QgcHVibGljRGlyUGF0aCA9IGpvaW4odGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIik7XG4gICAgaWYgKCFleGlzdHNTeW5jKHB1YmxpY0RpclBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlYWRkaXJTeW5jKHB1YmxpY0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIGlzRGlyZWN0b3J5OiBlbnRyeS5pc0RpcmVjdG9yeSgpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcCB3aGF0ZXZlciBwbGF0Zm9ybS1zcGVjaWZpYyBTaGFycCBiaW5hcmllcyBgbmV4dCBidWlsZGAncyBvdXRwdXQgZmlsZVxuICAgKiB0cmFjaW5nIHN0YWdlZCwgc2luY2UgdGhleSdyZSB0aGUgaG9zdCdzIChlLmcuIG1hY09TL2dsaWJjKSByYXRoZXIgdGhhbiB0aGVcbiAgICogZGVwbG95bWVudCB0YXJnZXQncywgdGhlbiBpbnN0YWxsIHRoZSB0YXJnZXQncy4gU2tpcHBpbmcgdGhpcyBpcyBzaWxlbnQ6XG4gICAqIGBpbWFnZU9wdGltaXplcmAgY2F0Y2hlcyB0aGUgbG9hZCBmYWlsdXJlIGludGVybmFsbHkgYW5kIHJldHVybnMgdGhlXG4gICAqIHVub3B0aW1pemVkIG9yaWdpbmFsIHdpdGggYW4gSFRUUCAyMDAuXG4gICAqXG4gICAqIE9ubHkgYSByb290IHdpdGggYHNoYXJwYCBzdGFnZWQgZ2V0cyB0aGUgYmluYXJpZXM6IHRoZSBpbWFnZSBvcHRpbWl6ZXJcbiAgICogYnJpbmdzIGl0IGludG8gYGRlZmF1bHRgLCB3aGljaCBzZXJ2ZXMgZXZlcnkgYC9fbmV4dC9pbWFnZWAsIGFuZCBhbm90aGVyXG4gICAqIGdyb3VwIGhhcyBpdCBvbmx5IGlmIGl0cyBvd24gcm91dGVzIHVzZSBpdC4gU28gb25seSBgZGVmYXVsdGAgd2FybnMgd2hlblxuICAgKiBpdCdzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlU2hhcnBGb3JUYXJnZXQoXG4gICAgcm9vdDogTmV4dGpzRGVwbG95bWVudFJvb3QsXG4gICAgcHJvamVjdERpcjogc3RyaW5nLFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHNoYXJwU291cmNlID0gdGhpcy5yZW1vdmVFeGlzdGluZ1NoYXJwQmluYXJpZXMocm9vdC5wYXRoLCBwcm9qZWN0RGlyKTtcbiAgICBpZiAoIXNoYXJwU291cmNlKSB7XG4gICAgICBpZiAocm9vdC5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBcInNoYXJwXCIgbm90IGZvdW5kIGluIHRoZSBzdGFnZWQgYnVpbGQgb3V0cHV0LiBBZGQgXCJzaGFycFwiIGFzIGEgZGVwZW5kZW5jeSBvZiB5b3VyIE5leHQuanMgYXBwIHRvIGVuYWJsZSBpbWFnZSBvcHRpbWl6YXRpb24uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnN0YWxsU2hhcnBQYWNrYWdlcyhcbiAgICAgIHNoYXJwQmluYXJ5RGlyKHJvb3QucGF0aCksXG4gICAgICB0aGlzLmdldFNoYXJwQmluYXJ5UGFja2FnZXMoc2hhcnBTb3VyY2UsIHBsYXRmb3JtKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IGZpbmQgYW5kIHJlbW92ZSBleGlzdGluZyBTaGFycCBwbGF0Zm9ybSBiaW5hcmllcy5cbiAgICpcbiAgICogYHJvb3RgIGlzIHdhbGtlZCB3aG9sZSByYXRoZXIgdGhhbiBqdXN0IGl0cyBgbm9kZV9tb2R1bGVzYDogdGhlIHN0YWdlZCB0cmVlXG4gICAqIGlzIGtleWVkIGJ5IHJlcG8tcm9vdC1yZWxhdGl2ZSBwYXRoLCBzbyBpbiBhIG1vbm9yZXBvIHRoZSBgbm9kZV9tb2R1bGVzYFxuICAgKiBob2xkaW5nIGBzaGFycGAgaXMgc2V2ZXJhbCBkaXJlY3RvcmllcyBkb3duLiB7QGxpbmsgaXNTaGFycEJpbmFyeVBhY2thZ2V9IGlzXG4gICAqIHdoYXQga2VlcHMgdGhhdCBmcm9tIHJlYWNoaW5nIHRoZSBhcHAncyBvd24gb3V0cHV0IOKAlCB0aGUgc3RhZ2VkIHJvb3QgaG9sZHNcbiAgICogdGhlIGNvbXBpbGVkIGAubmV4dGAgYXMgd2VsbCBhcyB0aGUgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvamVjdERpciB0aGUgYXBwJ3MgZGlyZWN0b3J5IGluc2lkZSBgcm9vdGAsIHdoaWNoIGBuZXh0YCBpc1xuICAgKiByZXNvbHZlZCBmcm9tLlxuICAgKiBAcmV0dXJucyB0aGUgc3RhZ2VkIGBzaGFycGAgSlMgd3JhcHBlciB0byBpbnN0YWxsIG5leHQgdG8sIGZvdW5kIGluIHRoZSBzYW1lXG4gICAqIHdhbGs6IGEgcm9vdCBjYW4gYmUgaHVuZHJlZHMgb2YgbWVnYWJ5dGVzLCBhbmQgZWFjaCBncm91cCBoYXMgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFeGlzdGluZ1NoYXJwQmluYXJpZXMoXG4gICAgcm9vdDogc3RyaW5nLFxuICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzaGFycENhbmRpZGF0ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBMaW5rcyBhcmUgbGlzdGVkLCBub3QgZm9sbG93ZWQ6IGV2ZXJ5IGxpbmsgaW4gYSBzdGFnZWQgcm9vdCBwb2ludHNcbiAgICAvLyBpbnNpZGUgaXQgKGBzdGFnZUZpbGVzYCBjb3BpZXMgdGhlIG9uZXMgdGhhdCBkb24ndCksIHNvIGl0cyB0YXJnZXQgaXNcbiAgICAvLyB3YWxrZWQgYXQgaXRzIG93biBwYXRoIGFueXdheSwgYW5kIGZvbGxvd2luZyB0aGVtIGlzIHdoYXQgbGV0IGFcbiAgICAvLyB3b3Jrc3BhY2UgY3ljbGUgaGFuZyB0aGUgc3ludGguXG4gICAgY29uc3QgYWxsRW50cmllcyA9IGxpc3RUcmVlKHJvb3QpO1xuXG4gICAgLy8gU3ltbGlua3MgYXJlIHVubGlua2VkLCBub3QgYHJtU3luY2BlZCwgYW5kIHRoZXkgZ28gZmlyc3QuIHBucG0gcG9pbnRzXG4gICAgLy8gc2V2ZXJhbCBsaW5rcyBhdCBvbmUgc3RvcmUgZGlyZWN0b3J5LCBhbmQgYHJtU3luYyjigKYsIHsgcmVjdXJzaXZlOiB0cnVlLFxuICAgIC8vIGZvcmNlOiB0cnVlIH0pYCAqc2lsZW50bHkgbm8tb3BzKiBvbiBhIHN5bWxpbmsgd2hvc2UgdGFyZ2V0IGlzIGFscmVhZHlcbiAgICAvLyBnb25lIOKAlCBgZm9yY2VgIHN3YWxsb3dzIHRoZSBFTk9FTlQgaXRzIGBybWRpcmAgZ2V0cy4gUmVtb3ZpbmcgYSBzdG9yZVxuICAgIC8vIGRpcmVjdG9yeSBiZWZvcmUgaXRzIGxpbmtzIHRoZXJlZm9yZSBsZWZ0IGRhbmdsaW5nXG4gICAgLy8gYEBpbWcvc2hhcnAtZGFyd2luLWFybTY0YCBlbnRyaWVzIGluIHRoZSBhc3NldCwgd2hpY2ggaXMgYSBsYXRlbnQgRU5PRU5UXG4gICAgLy8gaW4gd2hhdGV2ZXIgbmV4dCBmb2xsb3dzIHRoZW0gKGBzaGFycGAgZG9lcywgd2hlbiBpdCBsb29rcyBmb3IgYmluYXJpZXMpLlxuICAgIGNvbnN0IHN5bWxpbmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBhbGxFbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lID09PSBcInNoYXJwXCIpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSk7XG4gICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4ocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICAgICAgc2hhcnBDYW5kaWRhdGVzLnB1c2gocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2hhcnBCaW5hcnlQYWNrYWdlKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgIHN5bWxpbmtzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGRpcmVjdG9yaWVzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gUmVtb3ZpbmcgJHtzeW1saW5rcy5sZW5ndGh9IFNoYXJwIGJpbmFyeSBzeW1saW5rcyBhbmQgJHtkaXJlY3Rvcmllcy5sZW5ndGh9IGRpcmVjdG9yaWVzYCxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHN5bWxpbmtzKSB7XG4gICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gVW5saW5rZWQ6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICBybVN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gUmVtb3ZlZDogJHtwYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gcGlja1N0YWdlZFNoYXJwUGFja2FnZShcbiAgICAgIHNoYXJwQ2FuZGlkYXRlcyxcbiAgICAgIHJlc29sdmVOZXh0U2hhcnAocHJvamVjdERpciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBgQGltZy9zaGFycC08cGxhdGZvcm0+YCBhbmQgYEBpbWcvc2hhcnAtbGlidmlwcy08cGxhdGZvcm0+YFxuICAgKiB2ZXJzaW9ucyB0byBpbnN0YWxsIGZvciBhIGdpdmVuIHBsYXRmb3JtLlxuICAgKlxuICAgKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBgc2hhcnBgIEpTIHdyYXBwZXIgdGhhdCBvdXRwdXQgZmlsZSB0cmFjaW5nIHN0YWdlZDpcbiAgICogYHNoYXJwYCdzIGBsaWIvbGlidmlwcy5qc2AgY29tcGFyZXMgdGhlIGJpbmFyeSdzXG4gICAqIHJlcG9ydGVkIGxpYnZpcHMgdmVyc2lvbiBhZ2FpbnN0IGl0cyBvd24gYG1pbmltdW1MaWJ2aXBzVmVyc2lvbmAgYW5kXG4gICAqIHRocm93cyBhdCBsb2FkIHdoZW4gdGhleSBkaXNhZ3JlZS4gYHNoYXJwYCBwaW5zIGJvdGggaW4gaXRzXG4gICAqIGBvcHRpb25hbERlcGVuZGVuY2llc2AsIHNvIHRoYXQgbWFuaWZlc3QgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTaGFycEJpbmFyeVBhY2thZ2VzKFxuICAgIHNoYXJwU291cmNlOiBzdHJpbmcsXG4gICAgcGxhdGZvcm06IHN0cmluZyxcbiAgKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W10ge1xuICAgIC8vIE9ubHkgZm9yIGEgYmluYXJ5IHRoZSBzdGFnZWQgYHNoYXJwYCBkb2VzIG5vdCBwaW4uXG4gICAgY29uc3QgZmFsbGJhY2sgPSBbXG4gICAgICB7IG5hbWU6IGBzaGFycC1saWJ2aXBzLSR7cGxhdGZvcm19YCwgdmVyc2lvbjogXCIxLjIuNFwiIH0sXG4gICAgICB7IG5hbWU6IGBzaGFycC0ke3BsYXRmb3JtfWAsIHZlcnNpb246IFwiMC4zNC41XCIgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgcmVhZEZpbGVTeW5jKGpvaW4oc2hhcnBTb3VyY2UsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpLFxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPVxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge307XG5cbiAgICByZXR1cm4gZmFsbGJhY2subWFwKChwa2cpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBvcHRpb25hbERlcGVuZGVuY2llc1tgQGltZy8ke3BrZy5uYW1lfWBdO1xuICAgICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBzaGFycEAke21hbmlmZXN0LnZlcnNpb259IGRvZXMgbm90IHBpbiBcIkBpbWcvJHtwa2cubmFtZX1cIjsgZmFsbGluZyBiYWNrIHRvICR7cGtnLnZlcnNpb259LmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBwa2c7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBuYW1lOiBwa2cubmFtZSwgdmVyc2lvbiB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkICh3aXRoIGNhY2hpbmcpIGFuZCBleHRyYWN0IFNoYXJwJ3MgcGxhdGZvcm0tc3BlY2lmaWMgYmluYXJ5XG4gICAqIHBhY2thZ2VzIGludG8gYGltZ1BhdGhgLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2hhcnBQYWNrYWdlcyhcbiAgICBpbWdQYXRoOiBzdHJpbmcsXG4gICAgcGFja2FnZXM6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYWNoZURpciA9IGpvaW4odG1wZGlyKCksIFwiY2RrLW5leHRqcy1zaGFycC1jYWNoZVwiKTtcbiAgICBta2RpclN5bmMoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBwa2cgb2YgcGFja2FnZXMpIHtcbiAgICAgIGNvbnN0IHRhcmdldERpciA9IGpvaW4oaW1nUGF0aCwgcGtnLm5hbWUpO1xuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BpbWcvJHtwa2cubmFtZX0vLS8ke3BrZy5uYW1lfS0ke3BrZy52ZXJzaW9ufS50Z3pgO1xuXG4gICAgICAvLyBDcmVhdGUgYSBjb25zaXN0ZW50IGZpbGVuYW1lIGJhc2VkIG9uIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvblxuICAgICAgY29uc3QgY2FjaGVGaWxlTmFtZSA9IGAke3BrZy5uYW1lfS0ke3BrZy52ZXJzaW9ufS50Z3pgO1xuICAgICAgY29uc3QgY2FjaGVkRmlsZSA9IGpvaW4oY2FjaGVEaXIsIGNhY2hlRmlsZU5hbWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSB2YWxpZCBwYWNrYWdlIGNhY2hlZDsgcmUtZG93bmxvYWQgaWZcbiAgICAgIC8vIGEgcHJldmlvdXMgcnVuIGxlZnQgYmVoaW5kIGEgdHJ1bmNhdGVkL2NvcnJ1cHQgZG93bmxvYWRcbiAgICAgIGlmIChleGlzdHNTeW5jKGNhY2hlZEZpbGUpICYmIHRoaXMuaXNDYWNoZWRGaWxlVmFsaWQoY2FjaGVkRmlsZSkpIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gVXNpbmcgY2FjaGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IGZyb20gJHtjYWNoZWRGaWxlfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBEb3dubG9hZGluZyAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufS4uLmApO1xuXG4gICAgICAgIC8vIERvd25sb2FkIHRvIGEgcHJvY2Vzcy11bmlxdWUgdGVtcCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSxcbiAgICAgICAgLy8gdGhlbiBhdG9taWNhbGx5IHJlbmFtZSBpdCBvbnRvIHRoZSBzaGFyZWQgY2FjaGUgcGF0aC4gQ29uY3VycmVudFxuICAgICAgICAvLyBzeW50aCBwcm9jZXNzZXMgKGUuZy4gVHVyYm9yZXBvIHJ1bm5pbmcgbXVsdGlwbGUgYGNka2AgY29tbWFuZHMpXG4gICAgICAgIC8vIHNoYXJlIHRoaXMgY2FjaGUgZGlyLCBzbyB3cml0aW5nIGRpcmVjdGx5IHRvIGBjYWNoZWRGaWxlYCByaXNrc1xuICAgICAgICAvLyBhbm90aGVyIHByb2Nlc3MgZXh0cmFjdGluZyBhIGhhbGYtd3JpdHRlbiBmaWxlLiBSZW5hbWluZyB3aXRoaW5cbiAgICAgICAgLy8gdGhlIHNhbWUgZmlsZXN5c3RlbSBpcyBhdG9taWMsIHNvIHJlYWRlcnMgb25seSBldmVyIHNlZSBhXG4gICAgICAgIC8vIGNvbXBsZXRlIGZpbGUsIHdoaWNoZXZlciBwcm9jZXNzIHdpbnMgdGhlIHJhY2UuXG4gICAgICAgIGNvbnN0IHRlbXBGaWxlID0gam9pbihcbiAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgICBgJHtjYWNoZUZpbGVOYW1lfS4ke3Byb2Nlc3MucGlkfS0ke3JhbmRvbUJ5dGVzKDYpLnRvU3RyaW5nKFwiaGV4XCIpfS50bXBgLFxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIC0tZmFpbCBtYWtlcyBjdXJsIGV4aXQgbm9uLXplcm8gb24gSFRUUCBlcnJvcnMgYW5kIC0tcmV0cnlcbiAgICAgICAgICAvLyBoYW5kbGVzIHRyYW5zaWVudCBjb25uZWN0aW9uIGRyb3BzIHNvIGEgcGFydGlhbCB0cmFuc2ZlclxuICAgICAgICAgIC8vIGlzbid0IGNhY2hlZCBhcyB2YWxpZC5cbiAgICAgICAgICBleGVjRmlsZVN5bmMoXG4gICAgICAgICAgICBcImN1cmxcIixcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCItTFwiLFxuICAgICAgICAgICAgICBcIi0tZmFpbFwiLFxuICAgICAgICAgICAgICBcIi0tcmV0cnlcIixcbiAgICAgICAgICAgICAgXCIzXCIsXG4gICAgICAgICAgICAgIFwiLS1yZXRyeS1kZWxheVwiLFxuICAgICAgICAgICAgICBcIjFcIixcbiAgICAgICAgICAgICAgXCItb1wiLFxuICAgICAgICAgICAgICB0ZW1wRmlsZSxcbiAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgc3RkaW86IFwicGlwZVwiIH0sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghdGhpcy5pc0NhY2hlZEZpbGVWYWxpZCh0ZW1wRmlsZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYERvd25sb2FkZWQgZmlsZSBmb3IgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gaXMgZW1wdHkgb3IgbWlzc2luZzogJHt0ZW1wRmlsZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW5hbWVTeW5jKHRlbXBGaWxlLCBjYWNoZWRGaWxlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBybVN5bmModGVtcEZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBDYWNoZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gdG8gJHtjYWNoZWRGaWxlfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG1rZGlyU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZXhlY0ZpbGVTeW5jKFxuICAgICAgICBcInRhclwiLFxuICAgICAgICBbXCIteHpmXCIsIGNhY2hlZEZpbGUsIFwiLUNcIiwgdGFyZ2V0RGlyLCBcIi0tc3RyaXAtY29tcG9uZW50cz0xXCJdLFxuICAgICAgICB7IHN0ZGlvOiBcInBpcGVcIiB9LFxuICAgICAgKTtcblxuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gSW5zdGFsbGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGF0IGEgY2FjaGVkIFNoYXJwIGJpbmFyeSBhcmNoaXZlIGlzIG5vbi1lbXB0eS4gR3VhcmRzIGFnYWluc3RcbiAgICogYSB0cnVuY2F0ZWQvY29ycnVwdCBkb3dubG9hZCAoZS5nLiBmcm9tIGEgZHJvcHBlZCBjb25uZWN0aW9uKSBiZWluZ1xuICAgKiByZXVzZWQgYWNyb3NzIHN5bnRoIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGlzQ2FjaGVkRmlsZVZhbGlkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGVQYXRoKS5zaXplID4gMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IHRyYXZlbHMgdG8gdGhlIGFkYXB0ZXIgaW4ge0BsaW5rIEZVTkNUSU9OX0dST1VQU19FTlZfVkFSfSwgYW5kIHdoYXQgaXRcbiAqIHJlY29yZHMgYmFjayBhcyBgQWRhcHRlck1hbmlmZXN0LmZ1bmN0aW9uR3JvdXBzYC5cbiAqL1xuZnVuY3Rpb24gdG9GdW5jdGlvbkdyb3VwU3BlY3MoXG4gIGdyb3VwczogTmV4dGpzRnVuY3Rpb25Hcm91cFJvdXRlc1tdLFxuKTogRnVuY3Rpb25Hcm91cFNwZWNbXSB7XG4gIHJldHVybiBncm91cHMubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoeyBuYW1lLCByb3V0ZXMgfSkpO1xufVxuXG4vKiogYGdyb3Vwc2AgaW4gYSBjYW5vbmljYWwgb3JkZXIsIGZvciBjb21wYXJpbmcgdHdvIG9mIHRoZW0uICovXG5mdW5jdGlvbiBzb3J0ZWRHcm91cFNwZWNzKFxuICBncm91cHM6IHJlYWRvbmx5IEZ1bmN0aW9uR3JvdXBTcGVjW10gfCB1bmRlZmluZWQsXG4pOiBGdW5jdGlvbkdyb3VwU3BlY1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdyb3Vwc1xuICAgID8ubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoeyBuYW1lLCByb3V0ZXM6IFsuLi5yb3V0ZXNdLnNvcnQoKSB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gKGEubmFtZSA8IGIubmFtZSA/IC0xIDogMSkpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHN0YWdlZCBgc2hhcnBgIEpTIHdyYXBwZXIgb3V0IG9mIGV2ZXJ5IGNvcHkgZm91bmQgaW4gdGhlIHRyZWUuXG4gKlxuICogVW5saWtlIGEgc3RhbmRhbG9uZSBidWlsZCB0aGVyZSBpcyBubyBzaW5nbGUgYG5vZGVfbW9kdWxlc2AgdG8gbG9vayBpbjogdGhlXG4gKiB0cmVlIG1pcnJvcnMgcmVwby1yb290LXJlbGF0aXZlIHBhdGhzLCBzbyB0aGUgc2VhcmNoIGlzIGJ5IGRpcmVjdG9yeSBuYW1lLlxuICpcbiAqIEFuIGFwcCBjYW4gaGF2ZSB0d28gYHNoYXJwYCBjb3BpZXMgYXQgZGlmZmVyZW50IHZlcnNpb25zIChpdHMgb3duLCBob2lzdGVkLFxuICogYW5kIG5leHQncywgbmVzdGVkIHVuZGVyIGBuZXh0L25vZGVfbW9kdWxlc2ApLCBhbmQgZXZlcnkgYmluYXJ5IGdvZXMgaW50byB0aGVcbiAqIG9uZSByb290IGBAaW1nYCwgc28gdGhlIGNvcHkgcGlubmluZyB0aGVtIGhhcyB0byBiZSB0aGUgb25lIGBuZXh0YCdzIGltYWdlXG4gKiBvcHRpbWl6ZXIgbG9hZHM6IGBuZXh0U2hhcnBgLCB3aGVuIHtAbGluayByZXNvbHZlTmV4dFNoYXJwfSBmb3VuZCBpdC4gT3RoZXJ3aXNlXG4gKiBzaG9ydGVzdCBwYXRoIHdpbnMgYXMgdGhlIGNsb3Nlc3QgdG8gYSBob2lzdGVkIGluc3RhbGwsIHNvcnRlZCBmb3JcbiAqIGRldGVybWluaXNtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGlja1N0YWdlZFNoYXJwUGFja2FnZShcbiAgY2FuZGlkYXRlczogc3RyaW5nW10sXG4gIG5leHRTaGFycD86IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZWQgPVxuICAgIG5leHRTaGFycCAmJlxuICAgIGNhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PlxuICAgICAgbmV4dFNoYXJwLnN0YXJ0c1dpdGgocmVhbHBhdGhTeW5jKGNhbmRpZGF0ZSkgKyBzZXApLFxuICAgICk7XG4gIGlmICh1c2VkKSB7XG4gICAgcmV0dXJuIHVzZWQ7XG4gIH1cbiAgY2FuZGlkYXRlcy5zb3J0KChhLCBiKSA9PiBhLmxlbmd0aCAtIGIubGVuZ3RoIHx8IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA+IDEpIHtcbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IE11bHRpcGxlIHN0YWdlZCBcInNoYXJwXCIgY29waWVzOyB1c2luZyAke2NhbmRpZGF0ZXNbMF19YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzWzBdO1xufVxuXG4vKipcbiAqIFRoZSByZWFsIHBhdGggb2YgdGhlIGBzaGFycGAgZW50cnkgcG9pbnQgdGhlIHN0YWdlZCBgbmV4dGAgcmVzb2x2ZXMgZnJvbVxuICogYHByb2plY3REaXJgLCBgdW5kZWZpbmVkYCB3aGVuIGVpdGhlciBkb2VzIG5vdCByZXNvbHZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5leHRTaGFycChwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIC8vIFRoZSBhbmNob3IgZmlsZSBuZWVkbid0IGV4aXN0OyBgY3JlYXRlUmVxdWlyZWAgb25seSByZWFkcyBpdHMgZGlyZWN0b3J5LlxuICAgIGNvbnN0IG5leHRQYWNrYWdlID0gY3JlYXRlUmVxdWlyZShcbiAgICAgIGpvaW4ocHJvamVjdERpciwgXCJjZGstbmV4dGpzLW5leHQtcmVzb2x2ZXIuY2pzXCIpLFxuICAgICkucmVzb2x2ZShcIm5leHQvcGFja2FnZS5qc29uXCIpO1xuICAgIHJldHVybiBjcmVhdGVSZXF1aXJlKG5leHRQYWNrYWdlKS5yZXNvbHZlKFwic2hhcnBcIik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBlbnRyeSBgbmFtZWAgaW4gYHBhcmVudFBhdGhgIGlzIGFuIGBAaW1nL3NoYXJwLSpgIHBsYXRmb3JtIGJpbmFyeVxuICogcGFja2FnZSwgb3IgcG5wbSdzIHN0b3JlIGVudHJ5IGZvciBvbmUuXG4gKlxuICogVGhlIG5hbWUgYWxvbmUgaXMgbm90IGVub3VnaCB0byBkZWxldGUgYSBkaXJlY3RvcnkgYnkuIEEgcm91dGUgc2VnbWVudCBjYWxsZWRcbiAqIGBzaGFycC1lZGdlc2Agc3RhZ2VzIGAubmV4dC9zZXJ2ZXIvYXBwL3NoYXJwLWVkZ2VzL2AsIGFuZCByZW1vdmluZyBpdCBsZWZ0IHRoZVxuICogbWFuaWZlc3QgbGlzdGluZyBhbiBlbnRyeXBvaW50IHRoYXQgaXMgbm8gbG9uZ2VyIG9uIGRpc2sg4oCUIGV2ZXJ5IHJlcXVlc3QgdG9cbiAqIHRoYXQgcm91dGUgNTAwaW5nIHdpdGggXCJDb3VsZCBub3QgbG9hZCB0aGUgZW50cnlwb2ludFwiLiBOb3IgaXMgXCJhIGBzaGFycC1gXG4gKiBwYWNrYWdlXCI6IGBzaGFycC1pY29gIGFuZCBgc2hhcnAtcGhhc2hgIGFyZSB1bnJlbGF0ZWQgZGVwZW5kZW5jaWVzLCBhbmRcbiAqIHJlbW92aW5nIHRoZW0gZmFpbGVkIHRoZSBhcHAgYXQgcnVudGltZSB3aXRoIE1PRFVMRV9OT1RfRk9VTkQuIFNvIGJvdGggdGhlXG4gKiBzY29wZSBhbmQgdGhlIHBsYWNlIGhhdmUgdG8gbWF0Y2g6XG4gKlxuICogLSBgbm9kZV9tb2R1bGVzL0BpbWcvc2hhcnAt4oCmYCwgd2hlcmUgZXZlcnkgcGxhdGZvcm0gYmluYXJ5IGFjdHVhbGx5IGxpdmVzXG4gKiAtIGBub2RlX21vZHVsZXMvLnBucG0vQGltZytzaGFycC3igKZAMC4zNS40YCwgcG5wbSdzIHN0b3JlLCB3aG9zZSBlbnRyaWVzIGFyZVxuICogICBhbHNvIHdoYXQgdGhlIGBAaW1nYCBsaW5rcyBwb2ludCBhdCAoYHNoYXJwLWxpYnZpcHMt4oCmYCBtYXRjaGVzIHRoZSBzYW1lIHdheSlcbiAqXG4gKiBUaGUgYG5vZGVfbW9kdWxlc2Agc2VnbWVudCBpcyByZXF1aXJlZCBhcyB3ZWxsLCBzbyBhbiBhcHAgZGlyZWN0b3J5IHRoYXRcbiAqIGhhcHBlbnMgdG8gYmUgY2FsbGVkIGBAaW1nYCBvciBgLnBucG1gIGlzIHN0aWxsIGxlZnQgYWxvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NoYXJwQmluYXJ5UGFja2FnZShcbiAgcGFyZW50UGF0aDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXJlbnRQYXRoLnNwbGl0KHNlcCk7XG4gIGNvbnN0IHBhcmVudCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICBjb25zdCBzY29wZWQgPVxuICAgIChwYXJlbnQgPT09IFwiQGltZ1wiICYmIG5hbWUuc3RhcnRzV2l0aChcInNoYXJwLVwiKSkgfHxcbiAgICAocGFyZW50ID09PSBcIi5wbnBtXCIgJiYgbmFtZS5zdGFydHNXaXRoKFwiQGltZytzaGFycC1cIikpO1xuICByZXR1cm4gc2NvcGVkICYmIHNlZ21lbnRzLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpO1xufVxuXG4vKipcbiAqIFdoZXJlIHRoZSB0YXJnZXQncyBgQGltZy9zaGFycC0qYCBiaW5hcmllcyBnbzogYDxyb290Pi9ub2RlX21vZHVsZXMvQGltZ2AuXG4gKlxuICogTm90IG5leHQgdG8gdGhlIHN0YWdlZCBgc2hhcnBgIHBhY2thZ2UuIFVuZGVyIHBucG0gdGhhdCBpc1xuICogYG5vZGVfbW9kdWxlcy8ucG5wbS9zaGFycEB4L25vZGVfbW9kdWxlcy9AaW1nYCwgd2hpY2ggb25seSB0aGUgc3RvcmUgY29weSBvZlxuICogYHNoYXJwYCByZXNvbHZlcyBmcm9tOiBhIGRlcmVmZXJlbmNlZCBsaW5rIHRvIGBzaGFycGAgKGEgY29weSBhdFxuICogYGFwcC9ub2RlX21vZHVsZXMvc2hhcnBgLCBzYXkpIGxvb2tzIGZvciBgQGltZ2AgZnJvbSBpdHMgb3duIHBhdGggYW5kIHdhbGtzXG4gKiB1cCwgbmV2ZXIgaW50byB0aGUgc3RvcmUuIEJvdGggdGhlIEZ1bmN0aW9ucyB6aXAgKGB6aXBEaXJlY3RvcnlgKSBhbmQgdGhlXG4gKiBDb250YWluZXJzIGBDT1BZYCBrZWVwIHRoZSBsaW5rcywgc28gaXQgaXMgdGhlIHN0b3JlIGNvcHkgdGhhdCBsb2FkcywgYW5kIGl0c1xuICogd2FsayB1cCByZWFjaGVzIHRoZSByb290IGBub2RlX21vZHVsZXNgIHRvbywgc28gaXQgc2VydmVzIGVpdGhlciBsYXlvdXQuIEl0XG4gKiBpcyBhbHNvIHdoZXJlIG1haW4gaW5zdGFsbGVkIHRoZW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFycEJpbmFyeURpcihyb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihyb290LCBcIm5vZGVfbW9kdWxlc1wiLCBcIkBpbWdcIik7XG59XG5cbi8qKlxuICogRXZlcnkgZW50cnkgdW5kZXIgYHJvb3RgLCBsaW5rcyBsaXN0ZWQgYnV0IG5vdCBmb2xsb3dlZC5cbiAqXG4gKiBBbiBleHBsaWNpdCB3YWxrIHJhdGhlciB0aGFuIGByZWFkZGlyU3luYyh7IHJlY3Vyc2l2ZTogdHJ1ZSB9KWAsIHdoaWNoIG9uXG4gKiBOb2RlIDI0IGRlc2NlbmRzIGludG8gc3ltbGlua2VkIGRpcmVjdG9yaWVzIGl0c2VsZiBhbmQgc28gbmV2ZXIgcmV0dXJucyBvbiBhXG4gKiBjeWNsZSDigJQgdHdvIHdvcmtzcGFjZSBwYWNrYWdlcyB0aGF0IGxpbmsgZWFjaCBvdGhlciwgd2hpY2ggaXMgaG93IHBucG0gd2lyZXMgYVxuICogbW9ub3JlcG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0VHJlZShyb290OiBzdHJpbmcpOiBEaXJlbnRbXSB7XG4gIGNvbnN0IGVudHJpZXM6IERpcmVudFtdID0gW107XG4gIGNvbnN0IHBlbmRpbmcgPSBbcm9vdF07XG4gIGZvciAobGV0IGRpciA9IHBlbmRpbmcucG9wKCk7IGRpciAhPT0gdW5kZWZpbmVkOyBkaXIgPSBwZW5kaW5nLnBvcCgpKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHBlbmRpbmcucHVzaChqb2luKGRpciwgZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZW50cmllcztcbn1cblxuY29uc3QgRUxGX01BQ0hJTkVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0geyA2MjogXCJ4NjRcIiwgMTgzOiBcImFybTY0XCIgfTtcbmNvbnN0IE1BQ0hfT19NQUdJQ1MgPSBbXG4gIDB4ZmVlZGZhY2UsIDB4ZmVlZGZhY2YsIDB4Y2VmYWVkZmUsIDB4Y2ZmYWVkZmUsIDB4Y2FmZWJhYmUsXG5dO1xuXG4vKipcbiAqIFRoZSBwbGF0Zm9ybSBhIG5hdGl2ZSBhZGRvbiB3YXMgY29tcGlsZWQgZm9yLCByZWFkIGZyb20gaXRzIGhlYWRlcjpcbiAqIGBsaW51eC08YXJjaD5gLCBgZGFyd2luYCBvciBgd2luMzJgLCBvciBgdW5kZWZpbmVkYCBmb3IgYSBmaWxlIHRoYXQgaXMgbm9uZVxuICogb2YgdGhvc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVCaW5hcnlQbGF0Zm9ybShmaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMjApO1xuICBjb25zdCBmZCA9IG9wZW5TeW5jKGZpbGUsIFwiclwiKTtcbiAgdHJ5IHtcbiAgICByZWFkU3luYyhmZCwgaGVhZGVyLCAwLCBoZWFkZXIubGVuZ3RoLCAwKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbG9zZVN5bmMoZmQpO1xuICB9XG4gIGNvbnN0IG1hZ2ljID0gaGVhZGVyLnJlYWRVSW50MzJCRSgwKTtcbiAgaWYgKG1hZ2ljID09PSAweDdmNDU0YzQ2KSB7XG4gICAgLy8gZV9tYWNoaW5lLCBpbiB0aGUgYnl0ZSBvcmRlciBFSV9EQVRBIG5hbWVzICgyIGlzIGJpZy1lbmRpYW4pLlxuICAgIGNvbnN0IG1hY2hpbmUgPVxuICAgICAgaGVhZGVyWzVdID09PSAyID8gaGVhZGVyLnJlYWRVSW50MTZCRSgxOCkgOiBoZWFkZXIucmVhZFVJbnQxNkxFKDE4KTtcbiAgICByZXR1cm4gYGxpbnV4LSR7RUxGX01BQ0hJTkVTW21hY2hpbmVdID8/IGBtYWNoaW5lLSR7bWFjaGluZX1gfWA7XG4gIH1cbiAgaWYgKE1BQ0hfT19NQUdJQ1MuaW5jbHVkZXMobWFnaWMpKSB7XG4gICAgcmV0dXJuIFwiZGFyd2luXCI7XG4gIH1cbiAgaWYgKGhlYWRlci50b1N0cmluZyhcImxhdGluMVwiLCAwLCAyKSA9PT0gXCJNWlwiKSB7XG4gICAgcmV0dXJuIFwid2luMzJcIjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBwYWNrYWdlcyB1bmRlciBgcm9vdGAgdGhhdCBoYXZlIGAubm9kZWAgYWRkb25zIGJ1dCBub25lIGJ1aWx0IGZvclxuICogYHRhcmdldGAsIHNvIHRoZXknZCBmYWlsIHRvIGxvYWQgdGhlcmUuIFJldHVybmVkIGFzIGByb290YC1yZWxhdGl2ZSBwYXRocy5cbiAqXG4gKiBBIHBhY2thZ2Ugd2l0aCBhZGRvbnMgZm9yIHNldmVyYWwgcGxhdGZvcm1zIGlzIGZpbmUgYXMgbG9uZyBhcyBvbmUgb2YgdGhlbVxuICogaXMgYHRhcmdldGA6IHBhY2thZ2VzIGxpa2UgYGJ1ZmZlcnV0aWxgIGJ1bmRsZSBhIGBkYXJ3aW5gIGFuZCBhXG4gKiBgbGludXgteDY0YCBhZGRvbiBhbmQgbG9hZCB3aGljaGV2ZXIgbWF0Y2hlcyB0aGUgbWFjaGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRGb3JlaWduTmF0aXZlUGFja2FnZXMoXG4gIHJvb3Q6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIHsgbWF0Y2hlczogYm9vbGVhbjsgZm9yZWlnbjogYm9vbGVhbiB9PigpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RUcmVlKHJvb3QpKSB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aChcIi5ub2RlXCIpKSBjb250aW51ZTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG5hdGl2ZUJpbmFyeVBsYXRmb3JtKGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpO1xuICAgIGlmICghcGxhdGZvcm0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBrZyA9IHBhY2thZ2VEaXJPZihyb290LCBlbnRyeS5wYXJlbnRQYXRoKTtcbiAgICBjb25zdCBzZWVuID0gcGFja2FnZXMuZ2V0KHBrZykgPz8geyBtYXRjaGVzOiBmYWxzZSwgZm9yZWlnbjogZmFsc2UgfTtcbiAgICBpZiAocGxhdGZvcm0gPT09IHRhcmdldCkge1xuICAgICAgc2Vlbi5tYXRjaGVzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Vlbi5mb3JlaWduID0gdHJ1ZTtcbiAgICB9XG4gICAgcGFja2FnZXMuc2V0KHBrZywgc2Vlbik7XG4gIH1cbiAgcmV0dXJuIFsuLi5wYWNrYWdlc11cbiAgICAuZmlsdGVyKChbLCBzZWVuXSkgPT4gc2Vlbi5mb3JlaWduICYmICFzZWVuLm1hdGNoZXMpXG4gICAgLm1hcCgoW3BrZ10pID0+IHJlbGF0aXZlKHJvb3QsIHBrZykpXG4gICAgLnNvcnQoKTtcbn1cblxuLyoqIFRoZSBuZWFyZXN0IGRpcmVjdG9yeSBmcm9tIGBkaXJgIHVwIHRvIGByb290YCB3aXRoIGEgYHBhY2thZ2UuanNvbmAuICovXG5mdW5jdGlvbiBwYWNrYWdlRGlyT2Yocm9vdDogc3RyaW5nLCBkaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGZvciAoXG4gICAgbGV0IGN1cnJlbnQgPSBkaXI7XG4gICAgY3VycmVudC5zdGFydHNXaXRoKHJvb3QpO1xuICAgIGN1cnJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpXG4gICkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oY3VycmVudCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQgPT09IHJvb3QpIGJyZWFrO1xuICB9XG4gIHJldHVybiBkaXI7XG59XG5cbi8qKlxuICogV3JpdGUge0BsaW5rIFBVQkxJQ19GSUxFU19GSUxFX05BTUV9IGludG8gYSBkZXBsb3ltZW50IHJvb3QncyBydW50aW1lXG4gKiBkaXJlY3Rvcnk6IGV2ZXJ5IGZpbGUgdW5kZXIgYHB1YmxpY0RpcmAsIGxpc3RlZCB0aGUgd2F5IHRoZSBydW50aW1lIHdvdWxkXG4gKiBsaXN0IGl0IG9mZiBkaXNrIChgcmVhZFB1YmxpY0ZpbGVzYDogc3ltbGlua3MgZm9sbG93ZWQsIGAvYC1zZXBhcmF0ZWQsXG4gKiBzb3J0ZWQpLiBBbiBhcHAgd2l0aG91dCBgcHVibGljL2AgZ2V0cyBgW11gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQdWJsaWNGaWxlTGlzdChydW50aW1lRGlyOiBzdHJpbmcsIHB1YmxpY0Rpcjogc3RyaW5nKSB7XG4gIHdyaXRlRmlsZVN5bmMoXG4gICAgam9pbihydW50aW1lRGlyLCBQVUJMSUNfRklMRVNfRklMRV9OQU1FKSxcbiAgICBKU09OLnN0cmluZ2lmeShyZWFkUHVibGljRmlsZXMocHVibGljRGlyKSksXG4gICk7XG59XG5cbi8qKlxuICogVG90YWwgYnl0ZXMgb2YgYSB0cmVlIGFzIGl0cyBkZXBsb3ltZW50IHppcCBzdG9yZXMgaXQuIGB6aXBEaXJlY3RvcnlgIGtlZXBzXG4gKiBsaW5rcyBhcyBsaW5rcywgc28gZWFjaCBjb3VudHMgYXMgaXRzIHRhcmdldCBwYXRoLCBub3QgYXMgdGhlIHRhcmdldCwgd2hpY2hcbiAqIGlzIHdhbGtlZCBhdCBpdHMgb3duIHBhdGggYW55d2F5IChldmVyeSBsaW5rIGluIGEgc3RhZ2VkIHJvb3QgcG9pbnRzIGluc2lkZVxuICogaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkU2l6ZShyb290OiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgYnl0ZXMgPSAwO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RUcmVlKHJvb3QpKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBieXRlcyArPSBsc3RhdFN5bmMoam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSkuc2l6ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIGBjaHVua2Agd2l0aCBgcGF0Y2hgIHByZXBlbmRlZCBiZXR3ZWVuIGBQQVRDSF9GRVRDSF9NQVJLRVJgIGFuZFxuICogYFBBVENIX0ZFVENIX0VORF9NQVJLRVJgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGFscmVhZHkgY2FycmllcyB0aGlzIGV4YWN0XG4gKiBwYXRjaC5cbiAqXG4gKiBUaGUgb3BlbmluZyBtYXJrZXIgY2FycmllcyBhIGhhc2ggb2YgdGhlIHBhdGNoLCBzbyBhIGNodW5rIHBhdGNoZWQgYnkgYVxuICogY2RrLW5leHRqcyB3aG9zZSBgcGF0Y2gtZmV0Y2guanNgIGRpZmZlcnMgKGFuIHVwZ3JhZGUsIG92ZXIgYSBgLm5leHRgIHJldXNlZFxuICogd2l0aCBgc2tpcEJ1aWxkOiB0cnVlYCkgaXMgbm90IG1pc3Rha2VuIGZvciBjdXJyZW50OiB0aGUgb2xkIHBhdGNoIGlzIGN1dCBvZmZcbiAqIGF0IGl0cyBlbmQgbWFya2VyIGFuZCB0aGlzIG9uZSBwdXQgaW4gaXRzIHBsYWNlLCByYXRoZXIgdGhhbiB0aGUgb2xkIG9uZVxuICogc2hpcHBpbmcgb3IgYm90aCBzdGFja2luZyB1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoQ2xpZW50Q2h1bmsoXG4gIGNodW5rOiBzdHJpbmcsXG4gIHBhdGNoOiBzdHJpbmcsXG4gIGNodW5rUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGNoKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTYpO1xuICBjb25zdCBvcGVuID0gYCR7UEFUQ0hfRkVUQ0hfTUFSS0VSfSAke2hhc2h9ICovYDtcbiAgaWYgKGNodW5rLnN0YXJ0c1dpdGgoYCR7b3Blbn1cXG5gKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IG9yaWdpbmFsID0gY2h1bms7XG4gIGlmIChjaHVuay5zdGFydHNXaXRoKFBBVENIX0ZFVENIX01BUktFUikpIHtcbiAgICBjb25zdCBlbmQgPSBjaHVuay5pbmRleE9mKGBcXG4ke1BBVENIX0ZFVENIX0VORF9NQVJLRVJ9XFxuYCk7XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIE9ubHkgYSBwcmUtcmVsZWFzZSBjZGstbmV4dGpzIHdyb3RlIHRoZSBtYXJrZXIgd2l0aG91dCBhbiBlbmQsIGFuZFxuICAgICAgLy8gd2hlcmUgaXRzIHBhdGNoIHN0b3BzIGNhbm5vdCBiZSB0b2xkIGZyb20gdGhlIGNodW5rJ3Mgb3duIGNvZGUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9ICR7Y2h1bmtQYXRofSBjYXJyaWVzIGEgY2RrLW5leHRqcyBmZXRjaCBwYXRjaCB0aGlzIGAgK1xuICAgICAgICAgIGB2ZXJzaW9uIGNhbm5vdCByZXBsYWNlLiBSZS1ydW4gXFxgbmV4dCBidWlsZFxcYCB0byByZWdlbmVyYXRlIGl0LmAsXG4gICAgICApO1xuICAgIH1cbiAgICBvcmlnaW5hbCA9IGNodW5rLnNsaWNlKGVuZCArIFBBVENIX0ZFVENIX0VORF9NQVJLRVIubGVuZ3RoICsgMik7XG4gIH1cbiAgcmV0dXJuIGAke29wZW59XFxuJHtwYXRjaH1cXG4ke1BBVENIX0ZFVENIX0VORF9NQVJLRVJ9XFxuJHtvcmlnaW5hbH1gO1xufVxuIl19