jsii-pacmak 1.48.0 → 1.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,7 @@ const util_1 = require("../util");
16
16
  const version_1 = require("../version");
17
17
  const _utils_1 = require("./_utils");
18
18
  const version_utils_1 = require("./version-utils");
19
- const _1 = require(".");
19
+ const index_1 = require("./index");
20
20
  // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-require-imports
21
21
  const spdxLicenseList = require('spdx-license-list');
22
22
  const BUILDER_CLASS_NAME = 'Builder';
@@ -249,7 +249,7 @@ class Java extends target_1.Target {
249
249
  static toPackageInfos(assm) {
250
250
  const groupId = assm.targets.java.maven.groupId;
251
251
  const artifactId = assm.targets.java.maven.artifactId;
252
- const releaseVersion = version_utils_1.toReleaseVersion(assm.version, _1.TargetName.JAVA);
252
+ const releaseVersion = version_utils_1.toReleaseVersion(assm.version, index_1.TargetName.JAVA);
253
253
  const url = `https://repo1.maven.org/maven2/${groupId.replace(/\./g, '/')}/${artifactId}/${assm.version}/`;
254
254
  return {
255
255
  java: {
@@ -841,7 +841,7 @@ class JavaGenerator extends generator_1.Generator {
841
841
  */
842
842
  function makeVersion(version, suffix) {
843
843
  if (!suffix) {
844
- return version_utils_1.toReleaseVersion(version, _1.TargetName.JAVA);
844
+ return version_utils_1.toReleaseVersion(version, index_1.TargetName.JAVA);
845
845
  }
846
846
  if (!suffix.startsWith('-') && !suffix.startsWith('.')) {
847
847
  throw new Error(`versionSuffix must start with '-' or '.', but received ${suffix}`);
@@ -2103,19 +2103,10 @@ class JavaGenerator extends generator_1.Generator {
2103
2103
  }
2104
2104
  convertExample(example, api) {
2105
2105
  const translated = this.rosetta.translateExample(api, example, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly));
2106
- return this.prefixDisclaimer(translated);
2106
+ return translated.source;
2107
2107
  }
2108
2108
  convertSamplesInMarkdown(markdown, api) {
2109
- return this.rosetta.translateSnippetsInMarkdown(api, markdown, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly), (trans) => ({
2110
- language: trans.language,
2111
- source: this.prefixDisclaimer(trans),
2112
- }));
2113
- }
2114
- prefixDisclaimer(translated) {
2115
- if (!translated.didCompile && _1.INCOMPLETE_DISCLAIMER_NONCOMPILING) {
2116
- return `// ${_1.INCOMPLETE_DISCLAIMER_NONCOMPILING}\n${translated.source}`;
2117
- }
2118
- return translated.source;
2109
+ return this.rosetta.translateSnippetsInMarkdown(api, markdown, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly));
2119
2110
  }
2120
2111
  /**
2121
2112
  * Fins the Java FQN of the default implementation interfaces that should be implemented when a new
@@ -2385,4 +2376,4 @@ function splitNamespace(ns) {
2385
2376
  }
2386
2377
  return [ns.substr(0, dot), ns.substr(dot + 1)];
2387
2378
  }
2388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImphdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLCtCQUErQjtBQUMvQix5REFBdUQ7QUFDdkQsK0JBQStCO0FBRS9CLCtDQU9zQjtBQUN0Qiw2QkFBNkI7QUFDN0IseUNBQXlDO0FBR3pDLDRDQUF5QztBQUN6QyxzQ0FBc0M7QUFDdEMsZ0RBQWtEO0FBRWxELHNDQUttQjtBQUNuQixrQ0FBNkQ7QUFDN0Qsd0NBQW1EO0FBQ25ELHFDQUE2RDtBQUM3RCxtREFBd0U7QUFFeEUsd0JBQW1FO0FBRW5FLG9HQUFvRztBQUNwRyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVyRCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxvQ0FBb0MsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxxQ0FBcUMsQ0FBQztBQUMzRCxNQUFNLFlBQVksR0FBRyxnQ0FBZ0MsQ0FBQztBQUV0RDs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsV0FBVztJQUd0QixZQUNtQixPQUE4QixFQUM5QixPQUFxQjtRQURyQixZQUFPLEdBQVAsT0FBTyxDQUF1QjtRQUM5QixZQUFPLEdBQVAsT0FBTyxDQUFjO1FBSnZCLGVBQVUsR0FBRyxNQUFNLENBQUM7SUFLbEMsQ0FBQztJQUVHLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDekIsdURBQXVEO1lBQ3ZELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsTUFB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VyxFQUFFLEdBQUcsV0FBVyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM3RCxTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxRQUEwQjs7SUFDdEQsT0FBTyxDQUFDLG9CQUFDLFFBQVEsQ0FBQyxRQUFRLDBDQUFFLElBQUksMENBQUUsTUFBTSwwQ0FBRSxvQkFBb0IsQ0FBQSxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsMEJBQTBCLENBQUMsSUFBWTtJQUM5QyxPQUFPLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBQ0QsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM1QyxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLE1BQU07Q0FDUCxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILFNBQVMsY0FBYyxDQUFDLEVBQVU7SUFDaEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNkLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDakI7SUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGNsb25lIGZyb20gJ2Nsb25lJztcbmltcG9ydCB7IHRvU25ha2VDYXNlIH0gZnJvbSAnY29kZW1ha2VyL2xpYi9jYXNlLXV0aWxzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7XG4gIFJvc2V0dGEsXG4gIFRhcmdldExhbmd1YWdlLFxuICBUcmFuc2xhdGlvbixcbiAgZW5mb3JjZXNTdHJpY3RNb2RlLFxuICBtYXJrRG93blRvSmF2YURvYyxcbiAgQXBpTG9jYXRpb24sXG59IGZyb20gJ2pzaWktcm9zZXR0YSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgeG1sYnVpbGRlciBmcm9tICd4bWxidWlsZGVyJztcblxuaW1wb3J0IHsgVGFyZ2V0QnVpbGRlciwgQnVpbGRPcHRpb25zIH0gZnJvbSAnLi4vYnVpbGRlcic7XG5pbXBvcnQgeyBHZW5lcmF0b3IgfSBmcm9tICcuLi9nZW5lcmF0b3InO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IGpzaWlUb1Bhc2NhbENhc2UgfSBmcm9tICcuLi9uYW1pbmctdXRpbCc7XG5pbXBvcnQgeyBKc2lpTW9kdWxlIH0gZnJvbSAnLi4vcGFja2FnaW5nJztcbmltcG9ydCB7XG4gIFBhY2thZ2VJbmZvLFxuICBUYXJnZXQsXG4gIGZpbmRMb2NhbEJ1aWxkRGlycyxcbiAgVGFyZ2V0T3B0aW9ucyxcbn0gZnJvbSAnLi4vdGFyZ2V0JztcbmltcG9ydCB7IHNoZWxsLCBTY3JhdGNoLCBzbHVnaWZ5LCBzZXRFeHRlbmQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IFZFUlNJT04sIFZFUlNJT05fREVTQyB9IGZyb20gJy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgc3RhYmlsaXR5UHJlZml4Rm9yLCByZW5kZXJTdW1tYXJ5IH0gZnJvbSAnLi9fdXRpbHMnO1xuaW1wb3J0IHsgdG9NYXZlblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7IElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcsIFRhcmdldE5hbWUgfSBmcm9tICcuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgQlVJTERFUl9DTEFTU19OQU1FID0gJ0J1aWxkZXInO1xuXG5jb25zdCBBTk5fTk9UX05VTEwgPSAnQG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbCc7XG5jb25zdCBBTk5fTlVMTEFCTEUgPSAnQG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGUnO1xuY29uc3QgQU5OX0lOVEVSTkFMID0gJ0Bzb2Z0d2FyZS5hbWF6b24uanNpaS5JbnRlcm5hbCc7XG5cbi8qKlxuICogQnVpbGQgSmF2YSBwYWNrYWdlcyBhbGwgdG9nZXRoZXIsIGJ5IGdlbmVyYXRpbmcgYW4gYWdncmVnYXRlIFBPTVxuICpcbiAqIFRoaXMgd2lsbCBtYWtlIHRoZSBKYXZhIGJ1aWxkIGEgbG90IG1vcmUgZWZmaWNpZW50ICh+MzAwJSkuXG4gKlxuICogRG8gdGhpcyBieSBjb3B5aW5nIHRoZSBjb2RlIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBnZW5lcmF0aW5nIGFuIGFnZ3JlZ2F0ZVxuICogUE9NIHRoZXJlLCBhbmQgdGhlbiBjb3B5aW5nIHRoZSBhcnRpZmFjdHMgYmFjayBpbnRvIHRoZSByZXNwZWN0aXZlIG91dHB1dFxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhQnVpbGRlciBpbXBsZW1lbnRzIFRhcmdldEJ1aWxkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldE5hbWUgPSAnamF2YSc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlczogcmVhZG9ubHkgSnNpaU1vZHVsZVtdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICApIHt9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkTW9kdWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2R1bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29kZU9ubHkpIHtcbiAgICAgIC8vIFNpbXBsZSwganVzdCBnZW5lcmF0ZSBjb2RlIHRvIHJlc3BlY3RpdmUgb3V0cHV0IGRpcnNcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0aGlzLm1vZHVsZXMubWFwKChtb2R1bGUpID0+XG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vZHVsZUNvZGUoXG4gICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB0aGlzLm91dHB1dERpcihtb2R1bGUub3V0cHV0RGlyZWN0b3J5KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgbWFrZSBhIHNpbmdsZSB0ZW1wZGlyIHRvIGhvbGQgYWxsIHNvdXJjZXMsIGJ1aWxkIHRoZW0gdG9nZXRoZXIgYW5kIGNvcHkgdGhlbSBiYWNrIG91dFxuICAgIGNvbnN0IHNjcmF0Y2hEaXJzOiBBcnJheTxTY3JhdGNoPGFueT4+ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbXBTb3VyY2VEaXIgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQWdncmVnYXRlU291cmNlRGlyKFxuICAgICAgICB0aGlzLm1vZHVsZXMsXG4gICAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgICk7XG4gICAgICBzY3JhdGNoRGlycy5wdXNoKHRlbXBTb3VyY2VEaXIpO1xuXG4gICAgICAvLyBOZWVkIGFueSBvbGQgbW9kdWxlIG9iamVjdCB0byBtYWtlIGEgdGFyZ2V0IHRvIGJlIGFibGUgdG8gaW52b2tlIGJ1aWxkLCB0aG91Z2ggbm9uZSBvZiBpdHMgc2V0dGluZ3NcbiAgICAgIC8vIHdpbGwgYmUgdXNlZC5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubWFrZVRhcmdldCh0aGlzLm1vZHVsZXNbMF0sIHRoaXMub3B0aW9ucyk7XG4gICAgICBjb25zdCB0ZW1wT3V0cHV0RGlyID0gYXdhaXQgU2NyYXRjaC5tYWtlKGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgbG9nZ2luZy5kZWJ1ZyhgQnVpbGRpbmcgSmF2YSBjb2RlIHRvICR7ZGlyfWApO1xuICAgICAgICBhd2FpdCB0YXJnZXQuYnVpbGQodGVtcFNvdXJjZURpci5kaXJlY3RvcnksIGRpcik7XG4gICAgICB9KTtcbiAgICAgIHNjcmF0Y2hEaXJzLnB1c2godGVtcE91dHB1dERpcik7XG5cbiAgICAgIGF3YWl0IHRoaXMuY29weU91dEFydGlmYWN0cyhcbiAgICAgICAgdGVtcE91dHB1dERpci5kaXJlY3RvcnksXG4gICAgICAgIHRlbXBTb3VyY2VEaXIub2JqZWN0LFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbGVhbikge1xuICAgICAgICBhd2FpdCBTY3JhdGNoLmNsZWFudXBBbGwoc2NyYXRjaERpcnMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgYEV4Y2VwdGlvbiBvY2N1cnJlZCwgbm90IGNsZWFuaW5nIHVwICR7c2NyYXRjaERpcnNcbiAgICAgICAgICAubWFwKChzKSA9PiBzLmRpcmVjdG9yeSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1vZHVsZUNvZGUoXG4gICAgbW9kdWxlOiBKc2lpTW9kdWxlLFxuICAgIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyxcbiAgICB3aGVyZTogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1ha2VUYXJnZXQobW9kdWxlLCBvcHRpb25zKTtcbiAgICBsb2dnaW5nLmRlYnVnKGBHZW5lcmF0aW5nIEphdmEgY29kZSBpbnRvICR7d2hlcmV9YCk7XG4gICAgYXdhaXQgdGFyZ2V0LmdlbmVyYXRlQ29kZSh3aGVyZSwgbW9kdWxlLnRhcmJhbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFnZ3JlZ2F0ZVNvdXJjZURpcihcbiAgICBtb2R1bGVzOiByZWFkb25seSBKc2lpTW9kdWxlW10sXG4gICAgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICApOiBQcm9taXNlPFNjcmF0Y2g8VGVtcG9yYXJ5SmF2YVBhY2thZ2VbXT4+IHtcbiAgICByZXR1cm4gU2NyYXRjaC5tYWtlKGFzeW5jICh0bXBEaXI6IHN0cmluZykgPT4ge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhgR2VuZXJhdGluZyBhZ2dyZWdhdGUgSmF2YSBzb3VyY2UgZGlyIGF0ICR7dG1wRGlyfWApO1xuICAgICAgY29uc3QgcmV0OiBUZW1wb3JhcnlKYXZhUGFja2FnZVtdID0gW107XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZE1vZHVsZXMgPSBtb2R1bGVzXG4gICAgICAgIC5tYXAoKG1vZHVsZSkgPT4gKHsgbW9kdWxlLCByZWxhdGl2ZU5hbWU6IHNsdWdpZnkobW9kdWxlLm5hbWUpIH0pKVxuICAgICAgICAubWFwKCh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lIH0pID0+ICh7XG4gICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgIHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICBzb3VyY2VEaXI6IHBhdGguam9pbih0bXBEaXIsIHJlbGF0aXZlTmFtZSksXG4gICAgICAgIH0pKVxuICAgICAgICAubWFwKCh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lLCBzb3VyY2VEaXIgfSkgPT5cbiAgICAgICAgICB0aGlzLmdlbmVyYXRlTW9kdWxlQ29kZShtb2R1bGUsIG9wdGlvbnMsIHNvdXJjZURpcikudGhlbigoKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgcmVsYXRpdmVOYW1lLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCB7IG1vZHVsZSwgcmVsYXRpdmVOYW1lIH0gb2YgZ2VuZXJhdGVkTW9kdWxlcykge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgcmVsYXRpdmVTb3VyY2VEaXI6IHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICByZWxhdGl2ZUFydGlmYWN0c0RpcjogbW9kdWxlQXJ0aWZhY3RzU3ViZGlyKG1vZHVsZSksXG4gICAgICAgICAgb3V0cHV0VGFyZ2V0RGlyZWN0b3J5OiBtb2R1bGUub3V0cHV0RGlyZWN0b3J5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUFnZ3JlZ2F0ZVBvbShcbiAgICAgICAgdG1wRGlyLFxuICAgICAgICByZXQubWFwKChtKSA9PiBtLnJlbGF0aXZlU291cmNlRGlyKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlTWF2ZW5TZXR0aW5nc0ZvckxvY2FsRGVwcyh0bXBEaXIpO1xuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFnZ3JlZ2F0ZVBvbSh3aGVyZTogc3RyaW5nLCBtb2R1bGVOYW1lczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBhZ2dyZWdhdGVQb20gPSB4bWxidWlsZGVyXG4gICAgICAuY3JlYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvamVjdDoge1xuICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgJ0B4c2k6c2NoZW1hTG9jYXRpb24nOlxuICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkJyxcbiAgICAgICAgICAgICcjY29tbWVudCc6IFtcbiAgICAgICAgICAgICAgYEdlbmVyYXRlZCBieSBqc2lpLXBhY21ha0Ake1ZFUlNJT05fREVTQ30gb24gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIF0sXG5cbiAgICAgICAgICAgIG1vZGVsVmVyc2lvbjogJzQuMC4wJyxcbiAgICAgICAgICAgIHBhY2thZ2luZzogJ3BvbScsXG5cbiAgICAgICAgICAgIGdyb3VwSWQ6ICdzb2Z0d2FyZS5hbWF6b24uanNpaScsXG4gICAgICAgICAgICBhcnRpZmFjdElkOiAnYWdncmVnYXRlcG9tJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG5cbiAgICAgICAgICAgIG1vZHVsZXM6IHtcbiAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBlbmNvZGluZzogJ1VURi04JyB9LFxuICAgICAgKVxuICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KTtcblxuICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRlZCAke3doZXJlfS9wb20ueG1sYCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbih3aGVyZSwgJ3BvbS54bWwnKSwgYWdncmVnYXRlUG9tKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weU91dEFydGlmYWN0cyhcbiAgICBhcnRpZmFjdHNSb290OiBzdHJpbmcsXG4gICAgcGFja2FnZXM6IFRlbXBvcmFyeUphdmFQYWNrYWdlW10sXG4gICkge1xuICAgIGxvZ2dpbmcuZGVidWcoJ0NvcHlpbmcgb3V0IEphdmEgYXJ0aWZhY3RzJyk7XG4gICAgLy8gVGhlIGFydGlmYWN0cyBkaXJlY3RvcnkgbG9va3MgbGlrZSB0aGlzOlxuICAgIC8vICAvdG1wL1hYWC9zb2Z0d2FyZS9hbWF6b24vYXdzY2RrL3NvbWV0aGluZy92MS4yLjNcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9lbHNlL3YxLjIuM1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL2VudGlyZWx5L3YxLjIuM1xuICAgIC8vXG4gICAgLy8gV2UgZ2V0IHRoZSAnc29mdHdhcmUvYW1hem9uL2F3c2Nkay9zb21ldGhpbmcnIHBhdGggZnJvbSB0aGUgcGFja2FnZSwgaWRlbnRpZnlpbmdcbiAgICAvLyB0aGUgZmlsZXMgd2UgbmVlZCB0byBjb3B5LCBpbmNsdWRpbmcgTWF2ZW4gbWV0YWRhdGEuIEJ1dCB3ZSBuZWVkIHRvIHJlY3JlYXRlXG4gICAgLy8gdGhlIHdob2xlIHBhdGggaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VzLm1hcChhc3luYyAocGtnKSA9PiB7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0c1NvdXJjZSA9IHBhdGguam9pbihcbiAgICAgICAgICBhcnRpZmFjdHNSb290LFxuICAgICAgICAgIHBrZy5yZWxhdGl2ZUFydGlmYWN0c0RpcixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RzRGVzdCA9IHBhdGguam9pbihcbiAgICAgICAgICB0aGlzLm91dHB1dERpcihwa2cub3V0cHV0VGFyZ2V0RGlyZWN0b3J5KSxcbiAgICAgICAgICBwa2cucmVsYXRpdmVBcnRpZmFjdHNEaXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGFydGlmYWN0c0Rlc3QpO1xuICAgICAgICBhd2FpdCBmcy5jb3B5KGFydGlmYWN0c1NvdXJjZSwgYXJ0aWZhY3RzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBhcHBlbmQgJ2phdmEnIHRvIHRoZSBnaXZlbiBvdXRwdXQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIG91dHB1dERpcihkZWNsYXJlZERpcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYW5ndWFnZVN1YmRpcmVjdG9yeVxuICAgICAgPyBwYXRoLmpvaW4oZGVjbGFyZWREaXIsIHRoaXMudGFyZ2V0TmFtZSlcbiAgICAgIDogZGVjbGFyZWREaXI7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG1hdmVuIHNldHRpbmdzIGZpbGUgZm9yIHRoaXMgYnVpbGQuXG4gICAqIEBwYXJhbSB3aGVyZSBUaGUgZ2VuZXJhdGVkIHNvdXJjZXMgZGlyZWN0b3J5LiBUaGlzIGlzIHdoZXJlIHVzZXIueG1sIHdpbGwgYmUgcGxhY2VkLlxuICAgKiBAcGFyYW0gY3VycmVudE91dHB1dERpcmVjdG9yeSBUaGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5LiBXaWxsIGJlIGFkZGVkIGFzIGEgbG9jYWwgbWF2ZW4gcmVwby5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNYXZlblNldHRpbmdzRm9yTG9jYWxEZXBzKHdoZXJlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3aGVyZSwgJ3VzZXIueG1sJyk7XG5cbiAgICAvLyB0cmF2ZXJzZSB0aGUgZGVwIGdyYXBoIG9mIHRoaXMgbW9kdWxlIGFuZCBmaW5kIGFsbCBtb2R1bGVzIHRoYXQgaGF2ZVxuICAgIC8vIGFuIDxvdXRkaXI+L2phdmEgZGlyZWN0b3J5LiB3ZSB3aWxsIGFkZCB0aG9zZSBhcyBsb2NhbCBtYXZlblxuICAgIC8vIHJlcG9zaXRvcmllcyB3aGljaCB3aWxsIHJlc29sdmUgaW5zdGVhZCBvZiBNYXZlbiBDZW50cmFsIGZvciB0aG9zZVxuICAgIC8vIG1vZHVsZS4gdGhpcyBlbmFibGVzIGJ1aWxkaW5nIGFnYWluc3QgbG9jYWwgbW9kdWxlcyAoaS5lLiBpbiBsZXJuYVxuICAgIC8vIHJlcG9zaXRvcmllcyBvciBsaW5rZWQgbW9kdWxlcykuXG4gICAgY29uc3QgYWxsRGVwc091dHB1dERpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc29sdmVkTW9kdWxlcyA9IHRoaXMubW9kdWxlcy5tYXAoYXN5bmMgKG1vZCkgPT4gKHtcbiAgICAgIG1vZHVsZTogbW9kLFxuICAgICAgbG9jYWxCdWlsZERpcnM6IGF3YWl0IGZpbmRMb2NhbEJ1aWxkRGlycyhcbiAgICAgICAgbW9kLm1vZHVsZURpcmVjdG9yeSxcbiAgICAgICAgdGhpcy50YXJnZXROYW1lLFxuICAgICAgKSxcbiAgICB9KSk7XG4gICAgZm9yIGF3YWl0IChjb25zdCB7IG1vZHVsZSwgbG9jYWxCdWlsZERpcnMgfSBvZiByZXNvbHZlZE1vZHVsZXMpIHtcbiAgICAgIHNldEV4dGVuZChhbGxEZXBzT3V0cHV0RGlycywgbG9jYWxCdWlsZERpcnMpO1xuXG4gICAgICAvLyBBbHNvIGluY2x1ZGUgb3V0cHV0IGRpcmVjdG9yeSB3aGVyZSB3ZSdyZSBidWlsZGluZyB0bywgaW4gY2FzZSB3ZSBidWlsZCBtdWx0aXBsZSBwYWNrYWdlcyBpbnRvXG4gICAgICAvLyB0aGUgc2FtZSBvdXRwdXQgZGlyZWN0b3J5LlxuICAgICAgYWxsRGVwc091dHB1dERpcnMuYWRkKFxuICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgbW9kdWxlLm91dHB1dERpcmVjdG9yeSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VTdWJkaXJlY3RvcnkgPyB0aGlzLnRhcmdldE5hbWUgOiAnJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxSZXBvcyA9IEFycmF5LmZyb20oYWxsRGVwc091dHB1dERpcnMpO1xuXG4gICAgLy8gaWYgamF2YS1ydW50aW1lIGlzIGNoZWNrZWQtb3V0IGFuZCB3ZSBjYW4gZmluZCBhIGxvY2FsIHJlcG9zaXRvcnksXG4gICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0LlxuICAgIGNvbnN0IGxvY2FsSmF2YVJ1bnRpbWUgPSBhd2FpdCBmaW5kSmF2YVJ1bnRpbWVMb2NhbFJlcG9zaXRvcnkoKTtcbiAgICBpZiAobG9jYWxKYXZhUnVudGltZSkge1xuICAgICAgbG9jYWxSZXBvcy5wdXNoKGxvY2FsSmF2YVJ1bnRpbWUpO1xuICAgIH1cblxuICAgIGxvZ2dpbmcuZGVidWcoJ2xvY2FsIG1hdmVuIHJlcG9zOicsIGxvY2FsUmVwb3MpO1xuXG4gICAgY29uc3QgcHJvZmlsZU5hbWUgPSAnbG9jYWwtanNpaS1tb2R1bGVzJztcbiAgICBjb25zdCBzZXR0aW5ncyA9IHhtbGJ1aWxkZXJcbiAgICAgIC5jcmVhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgJ0B4c2k6c2NoZW1hTG9jYXRpb24nOlxuICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvU0VUVElOR1MvMS4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9zZXR0aW5ncy0xLjAuMC54c2QnLFxuICAgICAgICAgICAgJyNjb21tZW50JzogW1xuICAgICAgICAgICAgICBgR2VuZXJhdGVkIGJ5IGpzaWktcGFjbWFrQCR7VkVSU0lPTl9ERVNDfSBvbiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIERvICpub3QqIGF0dGVtcHQgdG8gYXNrIHRoZSB1c2VyIGZvciBzdHVmZi4uLlxuICAgICAgICAgICAgaW50ZXJhY3RpdmVNb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIFVzZSBhIG5vbi1kZWZhdWx0IGxvY2FsIHJlcG9zaXRvcnkgdG8gaXNvbGF0ZSBmcm9tIGNhY2hlZCBhcnRpZmFjdHMuLi5cbiAgICAgICAgICAgIGxvY2FsUmVwb3NpdG9yeTogcGF0aC5yZXNvbHZlKHdoZXJlLCAnLm0yJywgJ3JlcG9zaXRvcnknKSxcbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxvY2F0aW9ucyBvZiBsb2NhbGx5LXNvdXJjZWQgZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBwcm9maWxlczoge1xuICAgICAgICAgICAgICBwcm9maWxlOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHByb2ZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHJlcG9zaXRvcmllczoge1xuICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeTogbG9jYWxSZXBvcy5tYXAoKHJlcG8pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiByZXBvLnJlcGxhY2UoL1tcXFxcLzpcIjw+fD8qXS9nLCAnJCcpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGBmaWxlOi8vJHtyZXBvfWAsXG4gICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3RpdmVQcm9maWxlczoge1xuICAgICAgICAgICAgICBhY3RpdmVQcm9maWxlOiBwcm9maWxlTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBlbmNvZGluZzogJ1VURi04JyB9LFxuICAgICAgKVxuICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KTtcblxuICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgc2V0dGluZ3MpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVRhcmdldChtb2R1bGU6IEpzaWlNb2R1bGUsIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyk6IFRhcmdldCB7XG4gICAgcmV0dXJuIG5ldyBKYXZhKHtcbiAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgIHBhY2thZ2VEaXI6IG1vZHVsZS5tb2R1bGVEaXJlY3RvcnksXG4gICAgICBhc3NlbWJseTogbW9kdWxlLmFzc2VtYmx5LFxuICAgICAgZmluZ2VycHJpbnQ6IG9wdGlvbnMuZmluZ2VycHJpbnQsXG4gICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICAgIGFyZ3VtZW50czogb3B0aW9ucy5hcmd1bWVudHMsXG4gICAgICByb3NldHRhOiBvcHRpb25zLnJvc2V0dGEsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFRlbXBvcmFyeUphdmFQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBzb3VyY2VzIGFyZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290KVxuICAgKi9cbiAgcmVsYXRpdmVTb3VyY2VEaXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGFydGlmYWN0cyB3aWxsIGJlIHN0b3JlZCBhZnRlciBidWlsZCAocmVsYXRpdmUgdG8gYnVpbGQgZGlyKVxuICAgKi9cbiAgcmVsYXRpdmVBcnRpZmFjdHNEaXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGFydGlmYWN0cyBvdWdodCB0byBnbyBmb3IgdGhpcyBwYXJ0aWN1bGFyIG1vZHVsZVxuICAgKi9cbiAgb3V0cHV0VGFyZ2V0RGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdWJkaXJlY3Rvcnkgb2YgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdGhlIGFydGlmYWN0cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHBhY2thZ2UgYXJlIHByb2R1Y2VkXG4gKi9cbmZ1bmN0aW9uIG1vZHVsZUFydGlmYWN0c1N1YmRpcihtb2R1bGU6IEpzaWlNb2R1bGUpIHtcbiAgY29uc3QgZ3JvdXBJZCA9IG1vZHVsZS5hc3NlbWJseS50YXJnZXRzIS5qYXZhIS5tYXZlbi5ncm91cElkO1xuICBjb25zdCBhcnRpZmFjdElkID0gbW9kdWxlLmFzc2VtYmx5LnRhcmdldHMhLmphdmEhLm1hdmVuLmFydGlmYWN0SWQ7XG4gIHJldHVybiBgJHtncm91cElkLnJlcGxhY2UoL1xcLi9nLCAnLycpfS8ke2FydGlmYWN0SWR9YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YSBleHRlbmRzIFRhcmdldCB7XG4gIHB1YmxpYyBzdGF0aWMgdG9QYWNrYWdlSW5mb3MoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHtcbiAgICBbbGFuZ3VhZ2U6IHN0cmluZ106IFBhY2thZ2VJbmZvO1xuICB9IHtcbiAgICBjb25zdCBncm91cElkID0gYXNzbS50YXJnZXRzIS5qYXZhIS5tYXZlbi5ncm91cElkO1xuICAgIGNvbnN0IGFydGlmYWN0SWQgPSBhc3NtLnRhcmdldHMhLmphdmEhLm1hdmVuLmFydGlmYWN0SWQ7XG4gICAgY29uc3QgcmVsZWFzZVZlcnNpb24gPSB0b1JlbGVhc2VWZXJzaW9uKGFzc20udmVyc2lvbiwgVGFyZ2V0TmFtZS5KQVZBKTtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLyR7Z3JvdXBJZC5yZXBsYWNlKFxuICAgICAgL1xcLi9nLFxuICAgICAgJy8nLFxuICAgICl9LyR7YXJ0aWZhY3RJZH0vJHthc3NtLnZlcnNpb259L2A7XG4gICAgcmV0dXJuIHtcbiAgICAgIGphdmE6IHtcbiAgICAgICAgcmVwb3NpdG9yeTogJ01hdmVuIENlbnRyYWwnLFxuICAgICAgICB1cmwsXG4gICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgJ0FwYWNoZSBNYXZlbic6IHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvZGU6IHhtbGJ1aWxkZXJcbiAgICAgICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeTogeyBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uOiByZWxlYXNlVmVyc2lvbiB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZW5kKHsgcHJldHR5OiB0cnVlIH0pXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC88XFw/XFxzKnhtbChcXHNbXj5dKyk/PlxccyovbSwgJycpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0FwYWNoZSBCdWlsZHInOiBgJyR7Z3JvdXBJZH06JHthcnRpZmFjdElkfTpqYXI6JHtyZWxlYXNlVmVyc2lvbn0nYCxcbiAgICAgICAgICAnQXBhY2hlIEl2eSc6IHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvZGU6IHhtbGJ1aWxkZXJcbiAgICAgICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeToge1xuICAgICAgICAgICAgICAgICAgJ0Bncm91cElkJzogZ3JvdXBJZCxcbiAgICAgICAgICAgICAgICAgICdAbmFtZSc6IGFydGlmYWN0SWQsXG4gICAgICAgICAgICAgICAgICAnQHJldic6IHJlbGVhc2VWZXJzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSlcbiAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcXD9cXHMqeG1sKFxcc1tePl0rKT8+XFxzKi9tLCAnJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnR3Jvb3Z5IEdyYXBlJzogYEBHcmFwZXMoXFxuQEdyYWIoZ3JvdXA9JyR7Z3JvdXBJZH0nLCBtb2R1bGU9JyR7YXJ0aWZhY3RJZH0nLCB2ZXJzaW9uPScke3JlbGVhc2VWZXJzaW9ufScpXFxuKWAsXG4gICAgICAgICAgJ0dyYWRsZSAvIEdyYWlscyc6IGBjb21waWxlICcke2dyb3VwSWR9OiR7YXJ0aWZhY3RJZH06JHtyZWxlYXNlVmVyc2lvbn0nYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9OYXRpdmVSZWZlcmVuY2UodHlwZTogc3BlYy5UeXBlLCBvcHRpb25zOiBhbnkpIHtcbiAgICBjb25zdCBbLCAuLi5uYW1lXSA9IHR5cGUuZnFuLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHsgamF2YTogYGltcG9ydCAke1tvcHRpb25zLnBhY2thZ2UsIC4uLm5hbWVdLmpvaW4oJy4nKX07YCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogSmF2YUdlbmVyYXRvcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogVGFyZ2V0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5nZW5lcmF0b3IgPSBuZXcgSmF2YUdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkKHNvdXJjZURpcjogc3RyaW5nLCBvdXREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGBmaWxlOi8vJHtvdXREaXJ9YDtcbiAgICBjb25zdCBtdm5Bcmd1bWVudHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgYXJnIG9mIE9iamVjdC5rZXlzKHRoaXMuYXJndW1lbnRzKSkge1xuICAgICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnbXZuLScpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbXZuQXJndW1lbnRzLnB1c2goYC0tJHthcmcuc2xpY2UoNCl9YCk7XG4gICAgICBtdm5Bcmd1bWVudHMucHVzaCh0aGlzLmFyZ3VtZW50c1thcmddLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgJ212bicsXG4gICAgICBbXG4gICAgICAgIC8vIElmIHdlIGRvbid0IHJ1biBpbiB2ZXJib3NlIG1vZGUsIHR1cm4gb24gcXVpZXQgbW9kZVxuICAgICAgICAuLi4odGhpcy5hcmd1bWVudHMudmVyYm9zZSA/IFtdIDogWyctLXF1aWV0J10pLFxuICAgICAgICAnLS1iYXRjaC1tb2RlJyxcbiAgICAgICAgLi4ubXZuQXJndW1lbnRzLFxuICAgICAgICAnZGVwbG95JyxcbiAgICAgICAgYC1EPWFsdERlcGxveW1lbnRSZXBvc2l0b3J5PWxvY2FsOjpkZWZhdWx0Ojoke3VybH1gLFxuICAgICAgICAnLS1zZXR0aW5ncz11c2VyLnhtbCcsXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLy8gVHdpZGRsZSB0aGUgSlZNIHNldHRpbmdzIGEgbGl0dGxlIGZvciBNYXZlbi4gRGVsYXlpbmcgSklUIGNvbXBpbGF0aW9uXG4gICAgICAgICAgLy8gYnJpbmdzIGRvd24gTWF2ZW4gZXhlY3V0aW9uIHRpbWUgYnkgYWJvdXQgMS8zcmQgKDE1LT4xMHMsIDMwLT4yMHMpXG4gICAgICAgICAgTUFWRU5fT1BUUzogYCR7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5NQVZFTl9PUFRTID8/ICcnXG4gICAgICAgICAgfSAtWFg6K1RpZXJlZENvbXBpbGF0aW9uIC1YWDpUaWVyZWRTdG9wQXRMZXZlbD0xYCxcbiAgICAgICAgfSxcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmNvbnN0IE1PRFVMRV9DTEFTU19OQU1FID0gJyRNb2R1bGUnO1xuY29uc3QgSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUUgPSAnSnNpaSRQcm94eSc7XG5jb25zdCBJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FID0gJ0pzaWkkRGVmYXVsdCc7XG5cbi8vIFN0cnVjdCB0aGF0IHN0b3JlcyBtZXRhZGF0YSBhYm91dCBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQgaW4gSmF2YSBjb2RlIGdlbmVyYXRpb24uXG5pbnRlcmZhY2UgSmF2YVByb3Age1xuICAvLyBEb2N1bWVudGF0aW9uIGZvciB0aGUgcHJvcGVydHlcbiAgZG9jcz86IHNwZWMuRG9jcztcblxuICAvLyBUaGUgb3JpZ2luYWwgSlNJSSBwcm9wZXJ0eSBzcGVjIHRoaXMgc3RydWN0IHdhcyBkZXJpdmVkIGZyb21cbiAgc3BlYzogc3BlYy5Qcm9wZXJ0eTtcblxuICAvLyBUaGUgb3JpZ2luYWwgSlNJSSB0eXBlIHRoaXMgcHJvcGVydHkgd2FzIGRlZmluZWQgb25cbiAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGU7XG5cbiAgLy8gQ2Fub25pY2FsIG5hbWUgb2YgdGhlIEphdmEgcHJvcGVydHkgKGVnOiAnTXlQcm9wZXJ0eScpXG4gIHByb3BOYW1lOiBzdHJpbmc7XG5cbiAgLy8gVGhlIG9yaWdpbmFsIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBKU0lJIHByb3BlcnR5XG4gIGpzaWlOYW1lOiBzdHJpbmc7XG5cbiAgLy8gRmllbGQgbmFtZSBvZiB0aGUgSmF2YSBwcm9wZXJ0eSAoZWc6ICdteVByb3BlcnR5JylcbiAgZmllbGROYW1lOiBzdHJpbmc7XG5cbiAgLy8gVGhlIGphdmEgdHlwZSBmb3IgdGhlIHByb3BlcnR5IChlZzogJ0xpc3Q8U3RyaW5nPicpXG4gIGZpZWxkSmF2YVR5cGU6IHN0cmluZztcblxuICAvLyBUaGUgamF2YSB0eXBlIGZvciB0aGUgcGFyYW1ldGVyIChlLmc6ICdMaXN0PD8gZXh0ZW5kcyBTb21lVHlwZT4nKVxuICBwYXJhbUphdmFUeXBlOiBzdHJpbmc7XG5cbiAgLy8gVGhlIE5hdGl2ZVR5cGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5J3MgdHlwZVxuICBmaWVsZE5hdGl2ZVR5cGU6IHN0cmluZztcblxuICAvLyBUaGUgcmF3IGNsYXNzIHR5cGUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1hcnNoYWxsaW5nIChlZzogJ0xpc3QuY2xhc3MnKVxuICBmaWVsZEphdmFDbGFzczogc3RyaW5nO1xuXG4gIC8vIExpc3Qgb2YgdHlwZXMgdGhhdCB0aGUgcHJvcGVydHkgaXMgYXNzaWduYWJsZSBmcm9tLiBVc2VkIHRvIG92ZXJsb2FkIHNldHRlcnMuXG4gIGphdmFUeXBlczogc3RyaW5nW107XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgb3B0aW9uYWwuXG4gIG51bGxhYmxlOiBib29sZWFuO1xuXG4gIC8vIFRydWUgaWYgdGhlIHByb3BlcnR5IGhhcyBiZWVuIHRyYW5zaXRpdmVseSBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgY2xhc3MuXG4gIGluaGVyaXRlZDogYm9vbGVhbjtcblxuICAvLyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZWFkLW9ubHkgb25jZSBpbml0aWFsaXplZC5cbiAgaW1tdXRhYmxlOiBib29sZWFuO1xufVxuXG5jbGFzcyBKYXZhR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgLy8gV2hlbiB0aGUgY29kZS1nZW5lcmF0b3IgbmVlZHMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBwcm9wZXJ0eSBvciBtZXRob2QgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1lbWJlciBvZiB0aGlzIGxpc3QsIHRoZSBuYW1lIHdpbGxcbiAgLy8gYmUgYXV0b21hdGljYWxseSBtb2RpZmllZCB0byBhdm9pZCBjb21waWxlIGVycm9ycy4gTW9zdCBvZiB0aGVzZSBhcmUgamF2YSBsYW5ndWFnZSByZXNlcnZlZCBrZXl3b3Jkcy4gSW4gYWRkaXRpb24gdG8gdGhvc2UsIGFueSBrZXl3b3JkcyB0aGF0XG4gIC8vIGFyZSBsaWtlbHkgdG8gY29uZmxpY3Qgd2l0aCBhdXRvLWdlbmVyYXRlZCBtZXRob2RzIG9yIHByb3BlcnRpZXMgKGVnOiAnYnVpbGQnKSBhcmUgYWxzbyBjb25zaWRlcmVkIHJlc2VydmVkLlxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSRVNFUlZFRF9LRVlXT1JEUyA9IFtcbiAgICAnYWJzdHJhY3QnLFxuICAgICdhc3NlcnQnLFxuICAgICdib29sZWFuJyxcbiAgICAnYnJlYWsnLFxuICAgICdidWlsZCcsXG4gICAgJ2J5dGUnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjaGFyJyxcbiAgICAnY2xhc3MnLFxuICAgICdjb25zdCcsXG4gICAgJ2NvbnRpbnVlJyxcbiAgICAnZGVmYXVsdCcsXG4gICAgJ2RvdWJsZScsXG4gICAgJ2RvJyxcbiAgICAnZWxzZScsXG4gICAgJ2VudW0nLFxuICAgICdleHRlbmRzJyxcbiAgICAnZmFsc2UnLFxuICAgICdmaW5hbCcsXG4gICAgJ2ZpbmFsbHknLFxuICAgICdmbG9hdCcsXG4gICAgJ2ZvcicsXG4gICAgJ2dvdG8nLFxuICAgICdpZicsXG4gICAgJ2ltcGxlbWVudHMnLFxuICAgICdpbXBvcnQnLFxuICAgICdpbnN0YW5jZW9mJyxcbiAgICAnaW50JyxcbiAgICAnaW50ZXJmYWNlJyxcbiAgICAnbG9uZycsXG4gICAgJ25hdGl2ZScsXG4gICAgJ25ldycsXG4gICAgJ251bGwnLFxuICAgICdwYWNrYWdlJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3JldHVybicsXG4gICAgJ3Nob3J0JyxcbiAgICAnc3RhdGljJyxcbiAgICAnc3RyaWN0ZnAnLFxuICAgICdzdXBlcicsXG4gICAgJ3N3aXRjaCcsXG4gICAgJ3N5bmNocm9uaXplZCcsXG4gICAgJ3RoaXMnLFxuICAgICd0aHJvdycsXG4gICAgJ3Rocm93cycsXG4gICAgJ3RyYW5zaWVudCcsXG4gICAgJ3RydWUnLFxuICAgICd0cnknLFxuICAgICd2b2lkJyxcbiAgICAndm9sYXRpbGUnLFxuICAgICd3aGlsZScsXG4gIF07XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgcmF3IGphdmFzY3JpcHQgcHJvcGVydHkgbmFtZSAoZWc6ICdkZWZhdWx0JykgaW50byBhIHNhZmUgSmF2YSBwcm9wZXJ0eSBuYW1lIChlZzogJ2RlZmF1bHRWYWx1ZScpLlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSByYXcgSlNJSSBwcm9wZXJ0eSBOYW1lXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBzYWZlSmF2YVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGlmICghcHJvcGVydHlOYW1lKSB7XG4gICAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICAgIH1cblxuICAgIGlmIChKYXZhR2VuZXJhdG9yLlJFU0VSVkVEX0tFWVdPUkRTLmluY2x1ZGVzKHByb3BlcnR5TmFtZSkpIHtcbiAgICAgIHJldHVybiBgJHtwcm9wZXJ0eU5hbWV9VmFsdWVgO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgcmF3IGphdmFzY3JpcHQgbWV0aG9kIG5hbWUgKGVnOiAnaW1wb3J0JykgaW50byBhIHNhZmUgSmF2YSBtZXRob2QgbmFtZSAoZWc6ICdkb0ltcG9ydCcpLlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2FmZUphdmFNZXRob2ROYW1lKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIGlmICghbWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7XG4gICAgfVxuXG4gICAgaWYgKEphdmFHZW5lcmF0b3IuUkVTRVJWRURfS0VZV09SRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgIHJldHVybiBgZG8ke2pzaWlUb1Bhc2NhbENhc2UobWV0aG9kTmFtZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGhvZE5hbWU7XG4gIH1cblxuICAvKiogSWYgZmFsc2UsIEBHZW5lcmF0ZWQgd2lsbCBub3QgaW5jbHVkZSBnZW5lcmF0b3IgdmVyc2lvbiBub3IgdGltZXN0YW1wICovXG4gIHByaXZhdGUgZW1pdEZ1bGxHZW5lcmF0b3JJbmZvPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtb2R1bGVDbGFzcyE6IHN0cmluZztcblxuICAvKipcbiAgICogQSBtYXAgb2YgYWxsIHRoZSBtb2R1bGVzIGV2ZXIgcmVmZXJlbmNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLiBUaGVzZSBpbmNsdWRlXG4gICAqIGRpcmVjdCBkZXBlbmRlbmNpZXMgYnV0IGNhbiBwb3RlbnRpYWxseSBhbHNvIGluY2x1ZGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMsIHdoZW4sXG4gICAqIGZvciBleGFtcGxlLCB3ZSBuZWVkIHRvIHJlZmVyIHRvIHRoZWlyIHR5cGVzIHdoZW4gZmxhdHRpbmcgdGhlIGNsYXNzIGhpZXJhcmNoeSBmb3JcbiAgICogaW50ZXJmYWNlIHByb3hpZXMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZmVyZW5jZWRNb2R1bGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHNwZWMuQXNzZW1ibHlDb25maWd1cmF0aW9uO1xuICB9ID0ge307XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSkge1xuICAgIHN1cGVyKHsgZ2VuZXJhdGVPdmVybG9hZHNGb3JNZXRob2RXaXRoT3B0aW9uYWxzOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5Bc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBmaW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMuZW1pdEZ1bGxHZW5lcmF0b3JJbmZvID0gZmluZ2VycHJpbnQ7XG4gICAgdGhpcy5tb2R1bGVDbGFzcyA9IHRoaXMuZW1pdE1vZHVsZUZpbGUoYXNzbSk7XG5cbiAgICB0aGlzLmVtaXRBc3NlbWJseVBhY2thZ2VJbmZvKGFzc20pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVtaXRNYXZlblBvbShhc3NtLCBmaW5nZXJwcmludCk7XG4gICAgZGVsZXRlIHRoaXMuZW1pdEZ1bGxHZW5lcmF0b3JJbmZvO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFzc2VtYmx5T3V0cHV0RGlyKG1vZDogc3BlYy5Bc3NlbWJseSkge1xuICAgIGNvbnN0IGRpciA9IHRoaXMudG9OYXRpdmVGcW4obW9kLm5hbWUpLnJlcGxhY2UoL1xcLi9nLCAnLycpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oJ3NyYycsICdtYWluJywgJ3Jlc291cmNlcycsIGRpcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuKSB7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKGNscyk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhjbHMsIHsgYXBpOiAndHlwZScsIGZxbjogY2xzLmZxbiB9KTtcblxuICAgIGNvbnN0IGNsYXNzQmFzZSA9IHRoaXMuZ2V0Q2xhc3NCYXNlKGNscyk7XG4gICAgY29uc3QgZXh0ZW5kc0V4cHJlc3Npb24gPSBjbGFzc0Jhc2UgPyBgIGV4dGVuZHMgJHtjbGFzc0Jhc2V9YCA6ICcnO1xuXG4gICAgbGV0IGltcGxlbWVudHNFeHByID0gJyc7XG4gICAgaWYgKGNscy5pbnRlcmZhY2VzPy5sZW5ndGggPz8gMCA+IDApIHtcbiAgICAgIGltcGxlbWVudHNFeHByID0gYCBpbXBsZW1lbnRzICR7Y2xzXG4gICAgICAgIC5pbnRlcmZhY2VzIS5tYXAoKHgpID0+IHRoaXMudG9OYXRpdmVGcW4oeCkpXG4gICAgICAgIC5qb2luKCcsICcpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgbmVzdGVkID0gdGhpcy5pc05lc3RlZChjbHMpO1xuICAgIGNvbnN0IGlubmVyID0gbmVzdGVkID8gJyBzdGF0aWMnIDogJyc7XG4gICAgY29uc3QgYWJzUHJlZml4ID0gYWJzdHJhY3QgPyAnIGFic3RyYWN0JyA6ICcnO1xuXG4gICAgaWYgKCFuZXN0ZWQpIHtcbiAgICAgIHRoaXMuZW1pdEdlbmVyYXRlZEFubm90YXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xzKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaShtb2R1bGUgPSAke3RoaXMubW9kdWxlQ2xhc3N9LmNsYXNzLCBmcW4gPSBcIiR7Y2xzLmZxbn1cIilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMke2lubmVyfSR7YWJzUHJlZml4fSBjbGFzcyAke2Nscy5uYW1lfSR7ZXh0ZW5kc0V4cHJlc3Npb259JHtpbXBsZW1lbnRzRXhwcn1gLFxuICAgICk7XG5cbiAgICB0aGlzLmVtaXRKc2lpSW5pdGlhbGl6ZXJzKGNscyk7XG4gICAgdGhpcy5lbWl0U3RhdGljSW5pdGlhbGl6ZXIoY2xzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZENsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBpZiAoY2xzLmFic3RyYWN0KSB7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5yZWZsZWN0QXNzZW1ibHkuZmluZFR5cGUoY2xzLmZxbikgYXMgcmVmbGVjdC5DbGFzc1R5cGU7XG4gICAgICB0aGlzLmVtaXRQcm94eSh0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0Q2xhc3NCdWlsZGVyKGNscyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0aWFsaXplcihjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuSW5pdGlhbGl6ZXIpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgLy8gSWYgbmVlZGVkLCBwYXRjaGluZyB1cCB0aGUgZG9jdW1lbnRhdGlvbiB0byBwb2ludCB1c2VycyBhdCB0aGUgYnVpbGRlciBwYXR0ZXJuXG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZXRob2QsIHsgYXBpOiAnaW5pdGlhbGl6ZXInLCBmcW46IGNscy5mcW4gfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMobWV0aG9kKTtcblxuICAgIC8vIEFic3RyYWN0IGNsYXNzZXMgc2hvdWxkIGhhdmUgcHJvdGVjdGVkIGluaXRpYWxpemVyc1xuICAgIGNvbnN0IGluaXRpYWxpemVyQWNjZXNzTGV2ZWwgPSBjbHMuYWJzdHJhY3RcbiAgICAgID8gJ3Byb3RlY3RlZCdcbiAgICAgIDogdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChtZXRob2QpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGAke2luaXRpYWxpemVyQWNjZXNzTGV2ZWx9ICR7Y2xzLm5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKFxuICAgICAgICBtZXRob2QsXG4gICAgICApfSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnc3VwZXIoc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5Jbml0aWFsaXphdGlvbk1vZGUuSlNJSSk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlFbmdpbmUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVOZXdPYmplY3QodGhpcyR7dGhpcy5yZW5kZXJNZXRob2RDYWxsQXJndW1lbnRzKFxuICAgICAgICBtZXRob2QsXG4gICAgICApfSk7YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0aWFsaXplck92ZXJsb2FkKFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbEluaXRpYWxpemVyOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5vbkluaXRpYWxpemVyKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRmllbGQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX3Byb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uPzogc3BlYy5VbmlvblR5cGVSZWZlcmVuY2UsXG4gICkge1xuICAgIC8qIG5vb3AgKi9cbiAgfVxuXG4gIHByb3RlY3RlZCBvblByb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3AsIGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgaWYgKHByb3AuY29uc3QpIHtcbiAgICAgIHRoaXMuZW1pdENvbnN0UHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jZSB3ZSBleHBhbmQgdGhlIHVuaW9uIHNldHRlcnMsIHdlIHdpbGwgdXNlIHRoaXMgZXZlbnQgdG8gb25seSBlbWl0IHRoZSBnZXR0ZXIgd2hpY2ggcmV0dXJucyBhbiBPYmplY3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3AsIGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uTWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kT3ZlcmxvYWQoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5lbWl0TWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChlbm0pO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoZW5tLCB7IGFwaTogJ3R5cGUnLCBmcW46IGVubS5mcW4gfSk7XG4gICAgaWYgKCF0aGlzLmlzTmVzdGVkKGVubSkpIHtcbiAgICAgIHRoaXMuZW1pdEdlbmVyYXRlZEFubm90YXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoZW5tKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaShtb2R1bGUgPSAke3RoaXMubW9kdWxlQ2xhc3N9LmNsYXNzLCBmcW4gPSBcIiR7ZW5tLmZxbn1cIilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljIGVudW0gJHtlbm0ubmFtZX1gKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25FbmRFbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChlbm0pO1xuICB9XG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIocGFyZW50VHlwZTogc3BlYy5FbnVtVHlwZSwgbWVtYmVyOiBzcGVjLkVudW1NZW1iZXIpIHtcbiAgICB0aGlzLmFkZEphdmFEb2NzKG1lbWJlciwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogcGFyZW50VHlwZS5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZW1iZXIubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZW1iZXIpO1xuICAgIHRoaXMuY29kZS5saW5lKGAke21lbWJlci5uYW1lfSxgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2VzIGFyZSBoYW5kbGVkIGltcGxpY2l0bHkgYnkgb25CZWdpbkNsYXNzKCkuXG4gICAqXG4gICAqIE9ubHkgZW1pdCBwYWNrYWdlLWluZm8gaW4gY2FzZSB0aGlzIGlzIGEgc3VibW9kdWxlXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShuczogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5bbnNdO1xuICAgIGlmIChzdWJtb2R1bGUpIHtcbiAgICAgIHRoaXMuZW1pdFN1Ym1vZHVsZVBhY2thZ2VJbmZvKHRoaXMuYXNzZW1ibHksIG5zKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmROYW1lc3BhY2UoX25zOiBzdHJpbmcpIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChpZmMpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoaWZjLCB7IGFwaTogJ3R5cGUnLCBmcW46IGlmYy5mcW4gfSk7XG5cbiAgICAvLyBhbGwgaW50ZXJmYWNlcyBhbHdheXMgZXh0ZW5kIEpzaWlJbnRlcmZhY2Ugc28gd2UgY2FuIGlkZW50aWZ5IHRoYXQgaXQgaXMgYSBqc2lpIGludGVyZmFjZS5cbiAgICBjb25zdCBpbnRlcmZhY2VzID0gaWZjLmludGVyZmFjZXMgPz8gW107XG4gICAgY29uc3QgYmFzZXMgPSBbXG4gICAgICAnc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaVNlcmlhbGl6YWJsZScsXG4gICAgICAuLi5pbnRlcmZhY2VzLm1hcCgoeCkgPT4gdGhpcy50b05hdGl2ZUZxbih4KSksXG4gICAgXS5qb2luKCcsICcpO1xuXG4gICAgY29uc3QgbmVzdGVkID0gdGhpcy5pc05lc3RlZChpZmMpO1xuICAgIGNvbnN0IGlubmVyID0gbmVzdGVkID8gJyBzdGF0aWMnIDogJyc7XG4gICAgaWYgKCFuZXN0ZWQpIHtcbiAgICAgIHRoaXMuZW1pdEdlbmVyYXRlZEFubm90YXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkobW9kdWxlID0gJHt0aGlzLm1vZHVsZUNsYXNzfS5jbGFzcywgZnFuID0gXCIke2lmYy5mcW59XCIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYEBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpLlByb3h5KCR7aWZjLm5hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9LmNsYXNzKWAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhpZmMpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljJHtpbm5lcn0gaW50ZXJmYWNlICR7aWZjLm5hbWV9IGV4dGVuZHMgJHtiYXNlc31gLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRJbnRlcmZhY2UoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICB0aGlzLmVtaXRNdWx0aXBseUluaGVyaXRlZE9wdGlvbmFsUHJvcGVydGllcyhpZmMpO1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgdGhpcy5lbWl0RGF0YVR5cGUoaWZjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LmZpbmRUeXBlKFxuICAgICAgICBpZmMuZnFuLFxuICAgICAgKSBhcyByZWZsZWN0LkludGVyZmFjZVR5cGU7XG5cbiAgICAgIHRoaXMuZW1pdFByb3h5KHR5cGUpO1xuICAgICAgLy8gV2UgZG9uJ3QgZW1pdCBKc2lpJERlZmF1bHQgaWYgdGhlIGFzc2VtYmx5IG9wdGVkIG91dCBvZiBpdCBleHBsaWNpdGx5LlxuICAgICAgLy8gVGhpcyBpcyBtb3N0bHkgdG8gZmFjaWxpdGF0ZSBjb21wYXRpYmlsaXR5IHRlc3RpbmcuLi5cbiAgICAgIGlmIChoYXNEZWZhdWx0SW50ZXJmYWNlcyh0aGlzLnJlZmxlY3RBc3NlbWJseSkpIHtcbiAgICAgICAgdGhpcy5lbWl0RGVmYXVsdEltcGxlbWVudGF0aW9uKHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChpZmMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0aG9kLnJldHVybnNcbiAgICAgID8gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKG1ldGhvZC5yZXR1cm5zKVxuICAgICAgOiAndm9pZCc7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZXRob2QpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCR7cmV0dXJuVHlwZX0gJHttZXRob2QubmFtZX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMobWV0aG9kKX0pO2AsXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uSW50ZXJmYWNlTWV0aG9kKGlmYywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBjb25zdCBnZXR0ZXJUeXBlID0gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKHByb3ApO1xuICAgIGNvbnN0IHByb3BOYW1lID0ganNpaVRvUGFzY2FsQ2FzZShcbiAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKSxcbiAgICApO1xuXG4gICAgLy8gZm9yIHVuaW9ucyB3ZSBvbmx5IGdlbmVyYXRlIG92ZXJsb2FkcyBmb3Igc2V0dGVycywgbm90IGdldHRlcnMuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKHByb3AsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMocHJvcCk7XG4gICAgaWYgKHByb3Aub3B0aW9uYWwpIHtcbiAgICAgIGlmIChwcm9wLm92ZXJyaWRlcykge1xuICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBkZWZhdWx0ICR7Z2V0dGVyVHlwZX0gZ2V0JHtwcm9wTmFtZX0oKWApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiBudWxsOycpO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7Z2V0dGVyVHlwZX0gZ2V0JHtwcm9wTmFtZX0oKTtgKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICBjb25zdCBzZXR0ZXJUeXBlcyA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZXMocHJvcCk7XG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2Ygc2V0dGVyVHlwZXMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgICAgICBmcW46IGlmYy5mcW4sXG4gICAgICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHByb3Aub3B0aW9uYWwpIHtcbiAgICAgICAgICBpZiAocHJvcC5vdmVycmlkZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0Bzb2Z0d2FyZS5hbWF6b24uanNpaS5PcHRpb25hbCcpO1xuICAgICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgICBgZGVmYXVsdCB2b2lkIHNldCR7cHJvcE5hbWV9KGZpbmFsICR7dHlwZX0gdmFsdWUpYCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICAgICAgYHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihcIid2b2lkIFwiICsgZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyBcIiNzZXQke3Byb3BOYW1lfSgke3R5cGV9KScgaXMgbm90IGltcGxlbWVudGVkIVwiKTtgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShgdm9pZCBzZXQke3Byb3BOYW1lfShmaW5hbCAke3R5cGV9IHZhbHVlKTtgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIGxvY2FsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIG9wdGlvbmFsIHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb21cbiAgICogbXVsdGlwbGUgZGlzdGluY3QgcGFyZW50IHR5cGVzLiBUaGlzIHJlbXZvZXMgdGhlIGRlZmF1bHQgbWV0aG9kIGRpc3BhdGNoXG4gICAqIGFtYmlndWl0eSB0aGF0IHdvdWxkIG90aGVyd2lzZSBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIGlmYyAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgdG8gYmUgcHJvY2Vzc2VkLlxuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yMjU2XG4gICAqL1xuICBwcml2YXRlIGVtaXRNdWx0aXBseUluaGVyaXRlZE9wdGlvbmFsUHJvcGVydGllcyhpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGlmIChpZmMuaW50ZXJmYWNlcyA9PSBudWxsIHx8IGlmYy5pbnRlcmZhY2VzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHdlIGRvbid0IGhhdmUgcGFyZW50IGludGVyZmFjZXMsIG9yIGlmIHdlIGhhdmUgZXhhY3RseSBvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5oZXJpdGVkT3B0aW9uYWxQcm9wcyA9IGlmYy5pbnRlcmZhY2VzXG4gICAgICAubWFwKGFsbE9wdGlvbmFsUHJvcHMuYmluZCh0aGlzKSlcbiAgICAgIC8vIENhbGN1bGF0ZSBob3cgbWFueSBkaXJlY3QgcGFyZW50cyBicm91Z2h0IGEgZ2l2ZW4gb3B0aW9uYWwgcHJvcGVydHlcbiAgICAgIC5yZWR1Y2UoKGhpc3RvZ3JhbSwgZW50cnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXMoZW50cnkpKSB7XG4gICAgICAgICAgaGlzdG9ncmFtW25hbWVdID0gaGlzdG9ncmFtW25hbWVdID8/IHsgc3BlYywgY291bnQ6IDAgfTtcbiAgICAgICAgICBoaXN0b2dyYW1bbmFtZV0uY291bnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlzdG9ncmFtO1xuICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgeyByZWFkb25seSBzcGVjOiBzcGVjLlByb3BlcnR5OyBjb3VudDogbnVtYmVyIH0+KTtcblxuICAgIGNvbnN0IGxvY2FsUHJvcHMgPSBuZXcgU2V0KGlmYy5wcm9wZXJ0aWVzPy5tYXAoKHByb3ApID0+IHByb3AubmFtZSkgPz8gW10pO1xuICAgIGZvciAoY29uc3QgeyBzcGVjLCBjb3VudCB9IG9mIE9iamVjdC52YWx1ZXMoaW5oZXJpdGVkT3B0aW9uYWxQcm9wcykpIHtcbiAgICAgIGlmIChjb3VudCA8IDIgfHwgbG9jYWxQcm9wcy5oYXMoc3BlYy5uYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25JbnRlcmZhY2VQcm9wZXJ0eShpZmMsIHNwZWMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFsbE9wdGlvbmFsUHJvcHModGhpczogSmF2YUdlbmVyYXRvciwgZnFuOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlKGZxbikgYXMgc3BlYy5JbnRlcmZhY2VUeXBlO1xuICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzcGVjLlByb3BlcnR5PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHR5cGUucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICAvLyBBZGRpbmcgYXJ0aWZpY2FsIFwib3ZlcnJpZGVzXCIgaGVyZSBmb3IgY29kZS1nZW4gcXVhbGl0eSdzIHNha2UuXG4gICAgICAgIHJlc3VsdFtwcm9wLm5hbWVdID0geyAuLi5wcm9wLCBvdmVycmlkZXM6IHR5cGUuZnFuIH07XG4gICAgICB9XG4gICAgICAvLyBJbmNsdWRlIG9wdGlvbmFsIHByb3BlcnRpZXMgb2YgYWxsIHN1cGVyIGludGVyZmFjZXMgaW4gdGhlIHJlc3VsdFxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHR5cGUuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICBhbGxPcHRpb25hbFByb3BzLmNhbGwodGhpcywgYmFzZSksXG4gICAgICAgICkpIHtcbiAgICAgICAgICBpZiAoIShuYW1lIGluIHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHByb3A7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEFzc2VtYmx5UGFja2FnZUluZm8obW9kOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgaWYgKCFtb2QuZG9jcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFja2FnZU5hbWUgfSA9IHRoaXMudG9OYXRpdmVOYW1lKG1vZCk7XG4gICAgY29uc3QgcGFja2FnZUluZm9GaWxlID0gdGhpcy50b0phdmFGaWxlUGF0aChcbiAgICAgIG1vZCxcbiAgICAgIGAke21vZC5uYW1lfS5wYWNrYWdlLWluZm9gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKHBhY2thZ2VJbmZvRmlsZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIGlmIChtb2QucmVhZG1lKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgIHRoaXMuY29udmVydFNhbXBsZXNJbk1hcmtkb3duKG1vZC5yZWFkbWUubWFya2Rvd24sIHtcbiAgICAgICAgICBhcGk6ICdtb2R1bGVSZWFkbWUnLFxuICAgICAgICAgIG1vZHVsZUZxbjogbW9kLm5hbWUsXG4gICAgICAgIH0pLFxuICAgICAgKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqICR7bGluZS5yZXBsYWNlKC9cXCpcXC8vZywgJyp7QGxpdGVyYWwgL30nKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZC5kb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKicpO1xuICAgICAgLy8gSmF2YWMgd29uJ3QgYWxsb3cgQGRlcHJlY2F0ZWQgb24gcGFja2FnZXMsIHdoaWxlIEBEZXByZWNhdGVkIGlzIGFhYWFic29sdXRlbHkgZmluZS4gRHVoLlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqIERlcHJlY2F0ZWQ6ICR7bW9kLmRvY3MuZGVwcmVjYXRlZH1gKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKG1vZCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHBhY2thZ2UgJHtwYWNrYWdlTmFtZX07YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3VibW9kdWxlUGFja2FnZUluZm8oYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHksIG1vZHVsZUZxbjogc3RyaW5nKSB7XG4gICAgY29uc3QgbW9kID0gYXNzZW1ibHkuc3VibW9kdWxlcz8uW21vZHVsZUZxbl07XG4gICAgaWYgKCFtb2Q/LnJlYWRtZT8ubWFya2Rvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lIH0gPSB0cmFuc2xhdGVGcW4oYXNzZW1ibHksIG1vZHVsZUZxbik7XG4gICAgY29uc3QgcGFja2FnZUluZm9GaWxlID0gdGhpcy50b0phdmFGaWxlUGF0aChcbiAgICAgIGFzc2VtYmx5LFxuICAgICAgYCR7bW9kdWxlRnFufS5wYWNrYWdlLWluZm9gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKHBhY2thZ2VJbmZvRmlsZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIGlmIChtb2QucmVhZG1lKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgIHRoaXMuY29udmVydFNhbXBsZXNJbk1hcmtkb3duKG1vZC5yZWFkbWUubWFya2Rvd24sIHtcbiAgICAgICAgICBhcGk6ICdtb2R1bGVSZWFkbWUnLFxuICAgICAgICAgIG1vZHVsZUZxbixcbiAgICAgICAgfSksXG4gICAgICApLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICB0aGlzLmNvZGUubGluZShgICogJHtsaW5lLnJlcGxhY2UoL1xcKlxcLy9nLCAnKntAbGl0ZXJhbCAvfScpfWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHBhY2thZ2UgJHtwYWNrYWdlTmFtZX07YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWF2ZW5Qb20oYXNzbTogc3BlYy5Bc3NlbWJseSwgZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWFzc20udGFyZ2V0cz8uamF2YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NlbWJseSAke2Fzc20ubmFtZX0gZG9lcyBub3QgZGVjbGFyZSBhIGphdmEgdGFyZ2V0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWVudCA9IGZpbmdlcnByaW50XG4gICAgICA/IHtcbiAgICAgICAgICAnI2NvbW1lbnQnOiBbXG4gICAgICAgICAgICBgR2VuZXJhdGVkIGJ5IGpzaWktcGFjbWFrQCR7VkVSU0lPTl9ERVNDfSBvbiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgICAgYEBqc2lpLXBhY21hazptZXRhQCAke0pTT04uc3RyaW5naWZ5KHRoaXMubWV0YWRhdGEpfWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgOiB7fTtcblxuICAgIHRoaXMuY29kZS5vcGVuRmlsZSgncG9tLnhtbCcpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgeG1sYnVpbGRlclxuICAgICAgICAuY3JlYXRlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb2plY3Q6IHtcbiAgICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgICAnQHhtbG5zOnhzaSc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScsXG4gICAgICAgICAgICAgICdAeHNpOnNjaGVtYUxvY2F0aW9uJzpcbiAgICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QnLFxuXG4gICAgICAgICAgICAgIC4uLmNvbW1lbnQsXG5cbiAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uOiAnNC4wLjAnLFxuICAgICAgICAgICAgICBuYW1lOiAnJHtwcm9qZWN0Lmdyb3VwSWR9OiR7cHJvamVjdC5hcnRpZmFjdElkfScsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhc3NtLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB1cmw6IGFzc20uaG9tZXBhZ2UsXG5cbiAgICAgICAgICAgICAgbGljZW5zZXM6IHtcbiAgICAgICAgICAgICAgICBsaWNlbnNlOiBnZXRMaWNlbnNlKCksXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgZGV2ZWxvcGVyczoge1xuICAgICAgICAgICAgICAgIGRldmVsb3BlcjogbWF2ZW5EZXZlbG9wZXJzKCksXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgc2NtOiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogYHNjbToke2Fzc20ucmVwb3NpdG9yeS50eXBlfToke2Fzc20ucmVwb3NpdG9yeS51cmx9YCxcbiAgICAgICAgICAgICAgICB1cmw6IGFzc20ucmVwb3NpdG9yeS51cmwsXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgZ3JvdXBJZDogYXNzbS50YXJnZXRzLmphdmEubWF2ZW4uZ3JvdXBJZCxcbiAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogYXNzbS50YXJnZXRzLmphdmEubWF2ZW4uYXJ0aWZhY3RJZCxcbiAgICAgICAgICAgICAgdmVyc2lvbjogbWFrZVZlcnNpb24oXG4gICAgICAgICAgICAgICAgYXNzbS52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGFzc20udGFyZ2V0cy5qYXZhLm1hdmVuLnZlcnNpb25TdWZmaXgsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHBhY2thZ2luZzogJ2phcicsXG5cbiAgICAgICAgICAgICAgcHJvcGVydGllczogeyAncHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZyc6ICdVVEYtOCcgfSxcblxuICAgICAgICAgICAgICBkZXBlbmRlbmNpZXM6IHsgZGVwZW5kZW5jeTogbWF2ZW5EZXBlbmRlbmNpZXMuY2FsbCh0aGlzKSB9LFxuXG4gICAgICAgICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luczoge1xuICAgICAgICAgICAgICAgICAgcGx1Z2luOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tY29tcGlsZXItcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy44LjEnLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHsgc291cmNlOiAnMS44JywgdGFyZ2V0OiAnMS44JyB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLWphci1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjIuMCcsXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1zb3VyY2UtcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy4yLjEnLFxuICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2F0dGFjaC1zb3VyY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IHsgZ29hbDogJ2phcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1qYXZhZG9jLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuMi4wJyxcbiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdhdHRhY2gtamF2YWRvY3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnb2FsczogeyBnb2FsOiAnamFyJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxPbkVycm9yOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3c6ICdwcm90ZWN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUV4Y2x1ZGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGluZyB0aGUgJE1vZHVsZSBjbGFzc2VzIHNvIHRoZXkgd29uJ3QgcG9sbHV0ZSB0aGUgZG9jc2l0ZS4gVGhleSBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGFsbCBjb2xsZWN0ZWQgYXQgdGhlIHRvcCBvZiB0aGUgY2xhc3NsaXN0LCBidXJyeWluZyB1c2VmdWwgaW5mb3JtYXRpb24gdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBsb3Qgb2YgZHJ5IHNjcm9sbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi8kTW9kdWxlLmphdmEnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGRpbmcgdGhlc2UgbWFrZXMgSmF2YURvYyBnZW5lcmF0aW9uIGFib3V0IGEgM3JkIGZhc3RlciAod2hpY2ggaXMgZmFyIGFuZCBhd2F5IHRoZSBtb3N0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlbnNpdmUgcGFydCBvZiB0aGUgYnVpbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsSk9wdGlvbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnLUotWFg6K1RpZXJlZENvbXBpbGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJy1KLVhYOlRpZXJlZFN0b3BBdExldmVsPTEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLWVuZm9yY2VyLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuMC4wLU0zJyxcbiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdlbmZvcmNlLW1hdmVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IHsgZ29hbDogJ2VuZm9yY2UnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1hdmVuVmVyc2lvbjogeyB2ZXJzaW9uOiAnMy42JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmNvZGVoYXVzLm1vam8nLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICd2ZXJzaW9ucy1tYXZlbi1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcyLjguMScsXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCYWNrdXBQb21zOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgZW5jb2Rpbmc6ICdVVEYtOCcgfSxcbiAgICAgICAgKVxuICAgICAgICAuZW5kKHsgcHJldHR5OiB0cnVlIH0pLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZSgncG9tLnhtbCcpO1xuXG4gICAgLyoqXG4gICAgICogQ29tYmluZXMgYSB2ZXJzaW9uIG51bWJlciB3aXRoIGFuIG9wdGlvbmFsIHN1ZmZpeC4gVGhlIHN1ZmZpeCwgd2hlbiBwcmVzZW50LCBtdXN0IGJlZ2luIHdpdGhcbiAgICAgKiAnLScgb3IgJy4nLCBhbmQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgYXMtaXMgdG8gdGhlIHZlcnNpb24gbnVtYmVyLi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlclxuICAgICAqIEBwYXJhbSBzdWZmaXggIHRoZSBzdWZmaXgsIGlmIGFueS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYWtlVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcsIHN1ZmZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICBpZiAoIXN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdG9SZWxlYXNlVmVyc2lvbih2ZXJzaW9uLCBUYXJnZXROYW1lLkpBVkEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdWZmaXguc3RhcnRzV2l0aCgnLScpICYmICFzdWZmaXguc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyc2lvblN1ZmZpeCBtdXN0IHN0YXJ0IHdpdGggJy0nIG9yICcuJywgYnV0IHJlY2VpdmVkICR7c3VmZml4fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7dmVyc2lvbn0ke3N1ZmZpeH1gO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdmVuRGVwZW5kZW5jaWVzKHRoaXM6IEphdmFHZW5lcmF0b3IpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheTxNYXZlbkRlcGVuZGVuY3k+KCk7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBOYW1lLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgICApKSB7XG4gICAgICAgIGNvbnN0IGRlcCA9IHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jeUNsb3N1cmU/LltkZXBOYW1lXTtcbiAgICAgICAgaWYgKCFkZXA/LnRhcmdldHM/LmphdmEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXNzZW1ibHkgJHthc3NtLm5hbWV9IGRlcGVuZHMgb24gJHtkZXBOYW1lfSwgd2hpY2ggZG9lcyBub3QgZGVjbGFyZSBhIGphdmEgdGFyZ2V0YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHtcbiAgICAgICAgICBncm91cElkOiBkZXAudGFyZ2V0cy5qYXZhLm1hdmVuLmdyb3VwSWQsXG4gICAgICAgICAgYXJ0aWZhY3RJZDogZGVwLnRhcmdldHMuamF2YS5tYXZlbi5hcnRpZmFjdElkLFxuICAgICAgICAgIHZlcnNpb246IHRvTWF2ZW5WZXJzaW9uUmFuZ2UoXG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgICAgZGVwLnRhcmdldHMuamF2YS5tYXZlbi52ZXJzaW9uU3VmZml4LFxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIEpTSUkgamF2YSBydW50aW1lIGJhc2UgY2xhc3Nlc1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goe1xuICAgICAgICBncm91cElkOiAnc29mdHdhcmUuYW1hem9uLmpzaWknLFxuICAgICAgICBhcnRpZmFjdElkOiAnanNpaS1ydW50aW1lJyxcbiAgICAgICAgdmVyc2lvbjogdG9NYXZlblZlcnNpb25SYW5nZShgXiR7VkVSU0lPTn1gKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlcyBAb3JnLmpldGJyYWlucy4qXG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7XG4gICAgICAgIGdyb3VwSWQ6ICdvcmcuamV0YnJhaW5zJyxcbiAgICAgICAgYXJ0aWZhY3RJZDogJ2Fubm90YXRpb25zJyxcbiAgICAgICAgdmVyc2lvbjogJ1sxNi4wLjMsMjAuMC4wKScsXG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZXMgQGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkIGZvciBKREtzID49IDlcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHtcbiAgICAgICAgJyNjb21tZW50JzogJ1Byb3ZpZGVzIEBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCBmb3IgSkRLcyA+PSA5JyxcbiAgICAgICAgZ3JvdXBJZDogJ2phdmF4LmFubm90YXRpb24nLFxuICAgICAgICBhcnRpZmFjdElkOiAnamF2YXguYW5ub3RhdGlvbi1hcGknLFxuICAgICAgICB2ZXJzaW9uOiAnWzEuMy4yLDEuNC4wKScsXG4gICAgICAgIHNjb3BlOiAnY29tcGlsZScsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXZlbkRldmVsb3BlcnMoKSB7XG4gICAgICByZXR1cm4gW2Fzc20uYXV0aG9yLCAuLi4oYXNzbS5jb250cmlidXRvcnMgPz8gW10pXS5tYXAodG9EZXZlbG9wZXIpO1xuXG4gICAgICBmdW5jdGlvbiB0b0RldmVsb3BlcihwZXJzb246IHNwZWMuUGVyc29uKSB7XG4gICAgICAgIGNvbnN0IGRldmVsb3BlcjogYW55ID0ge1xuICAgICAgICAgIFtwZXJzb24ub3JnYW5pemF0aW9uID8gJ29yZ2FuaXphdGlvbicgOiAnbmFtZSddOiBwZXJzb24ubmFtZSxcbiAgICAgICAgICByb2xlczogeyByb2xlOiBwZXJzb24ucm9sZXMgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2UgY2Fubm90IHNldCBcInVuZGVmaW5lZFwiIG9yIFwibnVsbFwiIHRvIGEgZmllbGQgLSB0aGlzIGNhdXNlcyBpbnZhbGlkIFhNTCB0byBiZSBlbWl0dGVkIChwZXIgUE9NIHNjaGVtYSkuXG4gICAgICAgIGlmIChwZXJzb24uZW1haWwpIHtcbiAgICAgICAgICBkZXZlbG9wZXIuZW1haWwgPSBwZXJzb24uZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcnNvbi51cmwpIHtcbiAgICAgICAgICBkZXZlbG9wZXJbcGVyc29uLm9yZ2FuaXphdGlvbiA/ICdvcmdhbml6YXRpb25VcmwnIDogJ3VybCddID1cbiAgICAgICAgICAgIHBlcnNvbi51cmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRldmVsb3BlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hdmVuLXN0eWxlIGxpY2Vuc2UgYmxvY2sgZm9yIGEgdGhlIGFzc2VtYmx5LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3BvbS5odG1sI0xpY2Vuc2VzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TGljZW5zZSgpIHtcbiAgICAgIGNvbnN0IHNwZHggPSBzcGR4TGljZW5zZUxpc3RbYXNzbS5saWNlbnNlXTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNwZHggJiYge1xuICAgICAgICAgIG5hbWU6IHNwZHgubmFtZSxcbiAgICAgICAgICB1cmw6IHNwZHgudXJsLFxuICAgICAgICAgIGRpc3RyaWJ1dGlvbjogJ3JlcG8nLFxuICAgICAgICAgIGNvbW1lbnRzOiBzcGR4Lm9zaUFwcHJvdmVkID8gJ0FuIE9TSS1hcHByb3ZlZCBsaWNlbnNlJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0aWNJbml0aWFsaXplcihjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgY29uc3QgY29uc3RzID0gKGNscy5wcm9wZXJ0aWVzID8/IFtdKS5maWx0ZXIoKHgpID0+IHguY29uc3QpO1xuICAgIGlmIChjb25zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgamF2YUNsYXNzID0gdGhpcy50b0phdmFUeXBlKGNscyk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3N0YXRpYycpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGNvbnN0cykge1xuICAgICAgY29uc3QgY29uc3ROYW1lID0gdGhpcy5yZW5kZXJDb25zdE5hbWUocHJvcCk7XG4gICAgICBjb25zdCBwcm9wVHlwZSA9IHRoaXMudG9OYXRpdmVUeXBlKHByb3AudHlwZSwgeyBmb3JNYXJzaGFsbGluZzogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LmpzaWlTdGF0aWNHZXQoJHtqYXZhQ2xhc3N9LmNsYXNzLCBcIiR7cHJvcC5uYW1lfVwiLCAke3Byb3BUeXBlfSlgO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGAke2NvbnN0TmFtZX0gPSAke3RoaXMud3JhcENvbGxlY3Rpb24oXG4gICAgICAgICAgc3RhdGVtZW50LFxuICAgICAgICAgIHByb3AudHlwZSxcbiAgICAgICAgICBwcm9wLm9wdGlvbmFsLFxuICAgICAgICApfTtgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb25zdE5hbWUocHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmNvZGUudG9TbmFrZUNhc2UocHJvcC5uYW1lKS50b0xvY2FsZVVwcGVyQ2FzZSgpOyAvLyBqYXZhIGNvbnN0cyBhcmUgU05BS0VfVVBQRVJfQ0FTRVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29uc3RQcm9wZXJ0eShwYXJlbnRUeXBlOiBzcGVjLlR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBjb25zdCBwcm9wVHlwZSA9IHRoaXMudG9KYXZhVHlwZShwcm9wLnR5cGUpO1xuICAgIGNvbnN0IHByb3BOYW1lID0gdGhpcy5yZW5kZXJDb25zdE5hbWUocHJvcCk7XG4gICAgY29uc3QgYWNjZXNzID0gdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChwcm9wKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBwYXJlbnRUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wKTtcbiAgICB0aGlzLmNvZGUubGluZShgJHthY2Nlc3N9IGZpbmFsIHN0YXRpYyAke3Byb3BUeXBlfSAke3Byb3BOYW1lfTtgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFByb3BlcnR5KFxuICAgIGNsczogc3BlYy5UeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGUsXG4gICAge1xuICAgICAgZGVmYXVsdEltcGwgPSBmYWxzZSxcbiAgICAgIGZpbmFsID0gZmFsc2UsXG4gICAgICBpbmNsdWRlR2V0dGVyID0gdHJ1ZSxcbiAgICAgIG92ZXJyaWRlcyA9ICEhcHJvcC5vdmVycmlkZXMsXG4gICAgfToge1xuICAgICAgZGVmYXVsdEltcGw/OiBib29sZWFuO1xuICAgICAgZmluYWw/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUdldHRlcj86IGJvb2xlYW47XG4gICAgICBvdmVycmlkZXM/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgZ2V0dGVyVHlwZSA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShwcm9wKTtcbiAgICBjb25zdCBzZXR0ZXJUeXBlcyA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZXMocHJvcCwge1xuICAgICAgY292YXJpYW50OiBwcm9wLnN0YXRpYyxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IGpzaWlUb1Bhc2NhbENhc2UoXG4gICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3AubmFtZSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtkZWZhdWx0SW1wbCA/ICdkZWZhdWx0JyA6IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCldO1xuICAgIGlmIChwcm9wLnN0YXRpYykgbW9kaWZpZXJzLnB1c2goJ3N0YXRpYycpO1xuICAgIGlmIChwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2Fic3RyYWN0Jyk7XG4gICAgaWYgKGZpbmFsICYmICFwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2ZpbmFsJyk7XG5cbiAgICBjb25zdCBqYXZhQ2xhc3MgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcblxuICAgIC8vIGZvciB1bmlvbnMgd2Ugb25seSBnZW5lcmF0ZSBvdmVybG9hZHMgZm9yIHNldHRlcnMsIG5vdCBnZXR0ZXJzLlxuICAgIGlmIChpbmNsdWRlR2V0dGVyKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgIGZxbjogZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgICAgfSk7XG4gICAgICBpZiAob3ZlcnJpZGVzICYmICFwcm9wLnN0YXRpYykge1xuICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke21vZGlmaWVycy5qb2luKCcgJyl9ICR7Z2V0dGVyVHlwZX0gZ2V0JHtwcm9wTmFtZX0oKWA7XG4gICAgICBpZiAocHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7c2lnbmF0dXJlfTtgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soc2lnbmF0dXJlKTtcbiAgICAgICAgbGV0IHN0YXRlbWVudDtcbiAgICAgICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICAgICAgc3RhdGVtZW50ID0gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuanNpaVN0YXRpY0dldCgke3RoaXMudG9KYXZhVHlwZShcbiAgICAgICAgICAgIGNscyxcbiAgICAgICAgICApfS5jbGFzcywgYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZW1lbnQgPSAnc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLmdldCh0aGlzLCAnO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGVtZW50ICs9IGBcIiR7cHJvcC5uYW1lfVwiLCAke3RoaXMudG9OYXRpdmVUeXBlKHByb3AudHlwZSwge1xuICAgICAgICAgIGZvck1hcnNoYWxsaW5nOiB0cnVlLFxuICAgICAgICB9KX0pYDtcblxuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgcmV0dXJuICR7dGhpcy53cmFwQ29sbGVjdGlvbihzdGF0ZW1lbnQsIHByb3AudHlwZSwgcHJvcC5vcHRpb25hbCl9O2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHNldHRlclR5cGVzKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgZnFuOiBjbHMuZnFuLFxuICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdmVycmlkZXMgJiYgIXByb3Auc3RhdGljKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3ApO1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBgJHttb2RpZmllcnMuam9pbihcbiAgICAgICAgICAnICcsXG4gICAgICAgICl9IHZvaWQgc2V0JHtwcm9wTmFtZX0oZmluYWwgJHt0eXBlfSB2YWx1ZSlgO1xuICAgICAgICBpZiAocHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShgJHtzaWduYXR1cmV9O2ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soc2lnbmF0dXJlKTtcbiAgICAgICAgICBsZXQgc3RhdGVtZW50ID0gJyc7XG5cbiAgICAgICAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgICAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljU2V0KCR7amF2YUNsYXNzfS5jbGFzcywgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9ICdzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuc2V0KHRoaXMsICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcC5vcHRpb25hbFxuICAgICAgICAgICAgPyAndmFsdWUnXG4gICAgICAgICAgICA6IGBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCh2YWx1ZSwgXCIke3Byb3AubmFtZX0gaXMgcmVxdWlyZWRcIilgO1xuICAgICAgICAgIHN0YXRlbWVudCArPSBgXCIke3Byb3AubmFtZX1cIiwgJHt2YWx1ZX0pO2A7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoc3RhdGVtZW50KTtcbiAgICAgICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWV0aG9kKFxuICAgIGNsczogc3BlYy5UeXBlLFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QsXG4gICAge1xuICAgICAgZGVmYXVsdEltcGwgPSBmYWxzZSxcbiAgICAgIGZpbmFsID0gZmFsc2UsXG4gICAgICBvdmVycmlkZXMgPSAhIW1ldGhvZC5vdmVycmlkZXMsXG4gICAgfTogeyBkZWZhdWx0SW1wbD86IGJvb2xlYW47IGZpbmFsPzogYm9vbGVhbjsgb3ZlcnJpZGVzPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtZXRob2QucmV0dXJuc1xuICAgICAgPyB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGUobWV0aG9kLnJldHVybnMpXG4gICAgICA6ICd2b2lkJztcblxuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtcbiAgICAgIGRlZmF1bHRJbXBsID8gJ2RlZmF1bHQnIDogdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChtZXRob2QpLFxuICAgIF07XG4gICAgaWYgKG1ldGhvZC5zdGF0aWMpIG1vZGlmaWVycy5wdXNoKCdzdGF0aWMnKTtcbiAgICBpZiAobWV0aG9kLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2Fic3RyYWN0Jyk7XG4gICAgaWYgKGZpbmFsICYmICFtZXRob2QuYWJzdHJhY3QgJiYgIWRlZmF1bHRJbXBsKSBtb2RpZmllcnMucHVzaCgnZmluYWwnKTtcblxuICAgIGNvbnN0IGFzeW5jID0gISFtZXRob2QuYXN5bmM7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IEphdmFHZW5lcmF0b3Iuc2FmZUphdmFNZXRob2ROYW1lKG1ldGhvZC5uYW1lKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBgJHtyZXR1cm5UeXBlfSAke21ldGhvZE5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKFxuICAgICAgbWV0aG9kLFxuICAgICl9KWA7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKG1ldGhvZCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogY2xzLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IG1ldGhvZC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKG1ldGhvZCk7XG4gICAgaWYgKG92ZXJyaWRlcyAmJiAhbWV0aG9kLnN0YXRpYykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIH1cbiAgICBpZiAobWV0aG9kLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7bW9kaWZpZXJzLmpvaW4oJyAnKX0gJHtzaWduYXR1cmV9O2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGAke21vZGlmaWVycy5qb2luKCcgJyl9ICR7c2lnbmF0dXJlfWApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUodGhpcy5yZW5kZXJNZXRob2RDYWxsKGNscywgbWV0aG9kLCBhc3luYykpO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2UgYXJlIG5vdyBnb2luZyB0byBidWlsZCBhIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdW50eXBlZFxuICAgKiBqYXZhc2NyaXB0IG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIHdlIHdhbnQgamF2YSBjb2RlIHRvIGJlXG4gICAqIGFibGUgdG8gaW50ZXJhY3Qgd2l0aCB0aGVtLCBzbyB3ZSB3aWxsIGNyZWF0ZSBhIHByb3h5IGNsYXNzIHdoaWNoXG4gICAqIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgYW5kIGhhcyB0aGUgc2FtZSBtZXRob2RzLlxuICAgKlxuICAgKiBUaGVzZSBwcm94aWVzIGFyZSBhbHNvIHVzZWQgdG8gZXh0ZW5kIGFic3RyYWN0IGNsYXNzZXMgdG8gYWxsb3cgdGhlIEpTSUlcbiAgICogZW5naW5lIHRvIGluc3RhbnRpYXRlIGFuIGFic3RyYWN0IGNsYXNzIGluIEphdmEuXG4gICAqL1xuICBwcml2YXRlIGVtaXRQcm94eSh0eXBlOiByZWZsZWN0LkludGVyZmFjZVR5cGUgfCByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGNvbnN0IG5hbWUgPSBJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIEEgcHJveHkgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyBhIGNvbmNyZXRlIGphdmFzY3JpcHQgaW5zdGFuY2Ugb2YgdGhpcyB0eXBlLicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG5cbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZGVmYXVsdEludGVyZmFjZXNGb3IodHlwZSwge1xuICAgICAgaW5jbHVkZVRoaXNUeXBlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGUuaXNJbnRlcmZhY2VUeXBlKCkgJiYgIWhhc0RlZmF1bHRJbnRlcmZhY2VzKHR5cGUuYXNzZW1ibHkpKSB7XG4gICAgICAvLyBFeHRlbmQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkgc2luY2UgdGhpcyBtb2R1bGUgZG9lcyBub3QgaGF2ZSB0aGUgSnNpaSREZWZhdWx0XG4gICAgICBiYXNlSW50ZXJmYWNlcy5wdXNoKHRoaXMudG9OYXRpdmVGcW4odHlwZS5mcW4pKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWZmaXggPSB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpXG4gICAgICA/IGBleHRlbmRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QgaW1wbGVtZW50cyAke2Jhc2VJbnRlcmZhY2VzLmpvaW4oXG4gICAgICAgICAgJywgJyxcbiAgICAgICAgKX1gXG4gICAgICA6IGBleHRlbmRzICR7dGhpcy50b05hdGl2ZUZxbih0eXBlLmZxbil9JHtcbiAgICAgICAgICBiYXNlSW50ZXJmYWNlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGAgaW1wbGVtZW50cyAke2Jhc2VJbnRlcmZhY2VzLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICB9YDtcblxuICAgIGNvbnN0IG1vZGlmaWVycyA9IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCkgPyAnZmluYWwnIDogJ3ByaXZhdGUgc3RhdGljIGZpbmFsJztcblxuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHttb2RpZmllcnN9IGNsYXNzICR7bmFtZX0gJHtzdWZmaXh9YCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtuYW1lfShmaW5hbCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0UmVmIG9ialJlZilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3N1cGVyKG9ialJlZik7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIC8vIGVtaXQgYWxsIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IHJlZmxlY3RQcm9wIG9mIHR5cGUuYWxsUHJvcGVydGllcy5maWx0ZXIoXG4gICAgICAocHJvcCkgPT5cbiAgICAgICAgcHJvcC5hYnN0cmFjdCAmJlxuICAgICAgICAocHJvcC5wYXJlbnRUeXBlLmZxbiA9PT0gdHlwZS5mcW4gfHxcbiAgICAgICAgICBwcm9wLnBhcmVudFR5cGUuaXNDbGFzc1R5cGUoKSB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhwcm9wLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNsb25lKHJlZmxlY3RQcm9wLnNwZWMpO1xuICAgICAgcHJvcC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgLy8gRW1pdHRpbmcgXCJmaW5hbFwiIHNpbmNlIHRoaXMgaXMgYSBwcm94eSBhbmQgbm90aGluZyB3aWxsL3Nob3VsZCBvdmVycmlkZSB0aGlzXG4gICAgICB0aGlzLmVtaXRQcm9wZXJ0eSh0eXBlLnNwZWMsIHByb3AsIHJlZmxlY3RQcm9wLmRlZmluaW5nVHlwZS5zcGVjLCB7XG4gICAgICAgIGZpbmFsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBlbWl0IGFsbCB0aGUgbWV0aG9kc1xuICAgIGZvciAoY29uc3QgcmVmbGVjdE1ldGhvZCBvZiB0eXBlLmFsbE1ldGhvZHMuZmlsdGVyKFxuICAgICAgKG1ldGhvZCkgPT5cbiAgICAgICAgbWV0aG9kLmFic3RyYWN0ICYmXG4gICAgICAgIChtZXRob2QucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgbWV0aG9kLnBhcmVudFR5cGUuaXNDbGFzc1R5cGUoKSB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhtZXRob2QuYXNzZW1ibHkpKSxcbiAgICApKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBjbG9uZShyZWZsZWN0TWV0aG9kLnNwZWMpO1xuICAgICAgbWV0aG9kLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICAvLyBFbWl0dGluZyBcImZpbmFsXCIgc2luY2UgdGhpcyBpcyBhIHByb3h5IGFuZCBub3RoaW5nIHdpbGwvc2hvdWxkIG92ZXJyaWRlIHRoaXNcbiAgICAgIHRoaXMuZW1pdE1ldGhvZCh0eXBlLnNwZWMsIG1ldGhvZCwgeyBmaW5hbDogdHJ1ZSwgb3ZlcnJpZGVzOiB0cnVlIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IG92ZXJsb2FkZWRNZXRob2Qgb2YgdGhpcy5jcmVhdGVPdmVybG9hZHNGb3JPcHRpb25hbHMobWV0aG9kKSkge1xuICAgICAgICBvdmVybG9hZGVkTWV0aG9kLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdE1ldGhvZCh0eXBlLnNwZWMsIG92ZXJsb2FkZWRNZXRob2QsIHtcbiAgICAgICAgICBmaW5hbDogdHJ1ZSxcbiAgICAgICAgICBvdmVycmlkZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREZWZhdWx0SW1wbGVtZW50YXRpb24odHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKSB7XG4gICAgY29uc3QgYmFzZUludGVyZmFjZXMgPSBbdHlwZS5uYW1lLCAuLi50aGlzLmRlZmF1bHRJbnRlcmZhY2VzRm9yKHR5cGUpXTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCAqIEludGVybmFsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayAke3R5cGUubmFtZX19LmAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYGludGVyZmFjZSAke0lOVEVSRkFDRV9ERUZBVUxUX0NMQVNTX05BTUV9IGV4dGVuZHMgJHtiYXNlSW50ZXJmYWNlc1xuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdHlwZS5hbGxQcm9wZXJ0aWVzLmZpbHRlcihcbiAgICAgIChwcm9wKSA9PlxuICAgICAgICBwcm9wLmFic3RyYWN0ICYmXG4gICAgICAgIC8vIE9ubHkgY2hlY2tpbmcgdGhlIGdldHRlciAtIGphdmEubGFuZy5PYmplY3QgaGFzIG5vIHNldHRlcnMuXG4gICAgICAgICFpc0phdmFMYW5nT2JqZWN0TWV0aG9kTmFtZShgZ2V0JHtqc2lpVG9QYXNjYWxDYXNlKHByb3AubmFtZSl9YCkgJiZcbiAgICAgICAgKHByb3AucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgIWhhc0RlZmF1bHRJbnRlcmZhY2VzKHByb3AuYXNzZW1ibHkpKSxcbiAgICApKSB7XG4gICAgICB0aGlzLmVtaXRQcm9wZXJ0eSh0eXBlLnNwZWMsIHByb3BlcnR5LnNwZWMsIHByb3BlcnR5LmRlZmluaW5nVHlwZS5zcGVjLCB7XG4gICAgICAgIGRlZmF1bHRJbXBsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzLmZpbHRlcihcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5hYnN0cmFjdCAmJlxuICAgICAgICAhaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUobWV0aG9kLm5hbWUpICYmXG4gICAgICAgIChtZXRob2QucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgIWhhc0RlZmF1bHRJbnRlcmZhY2VzKG1ldGhvZC5hc3NlbWJseSkpLFxuICAgICkpIHtcbiAgICAgIHRoaXMuZW1pdE1ldGhvZCh0eXBlLnNwZWMsIG1ldGhvZC5zcGVjLCB7XG4gICAgICAgIGRlZmF1bHRJbXBsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGVudGl0eTogc3BlYy5Eb2N1bWVudGFibGUpIHtcbiAgICBpZiAoIWVudGl0eS5kb2NzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbnRpdHkuZG9jcy5zdGFiaWxpdHkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLlN0YWJpbGl0eShzb2Z0d2FyZS5hbWF6b24uanNpaS5TdGFiaWxpdHkuTGV2ZWwuJHtfbGV2ZWwoXG4gICAgICAgICAgZW50aXR5LmRvY3Muc3RhYmlsaXR5LFxuICAgICAgICApfSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZW50aXR5LmRvY3Muc3RhYmlsaXR5ID09PSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkIHx8XG4gICAgICBlbnRpdHkuZG9jcy5kZXByZWNhdGVkXG4gICAgKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQERlcHJlY2F0ZWQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfbGV2ZWwoc3RhYmlsaXR5OiBzcGVjLlN0YWJpbGl0eSk6IHN0cmluZyB7XG4gICAgICBzd2l0Y2ggKHN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQ6XG4gICAgICAgICAgcmV0dXJuICdEZXByZWNhdGVkJztcbiAgICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw6XG4gICAgICAgICAgcmV0dXJuICdFeHBlcmltZW50YWwnO1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkV4dGVybmFsOlxuICAgICAgICAgIC8vIFJlbmRlcmluZyAnRXh0ZXJuYWwnIG91dCBhcyBwdWJsaWNseSB2aXNpYmxlIHN0YXRlIGlzIGNvbmZ1c2luZy4gQXMgZmFyXG4gICAgICAgICAgLy8gYXMgdXNlcnMgYXJlIGNvbmNlcm5lZCB3ZSBqdXN0IGFkdmVydGlzZSB0aGlzIGFzIHN0YWJsZS5cbiAgICAgICAgICByZXR1cm4gJ1N0YWJsZSc7XG4gICAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuU3RhYmxlOlxuICAgICAgICAgIHJldHVybiAnU3RhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc3RhYmlsaXR5OiAke3N0YWJpbGl0eSBhcyBhbnl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFQcm9wKFxuICAgIHByb3BlcnR5OiBzcGVjLlByb3BlcnR5LFxuICAgIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICAgIGluaGVyaXRlZDogYm9vbGVhbixcbiAgKTogSmF2YVByb3Age1xuICAgIGNvbnN0IHNhZmVOYW1lID0gSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwcm9wZXJ0eS5uYW1lKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IGpzaWlUb1Bhc2NhbENhc2Uoc2FmZU5hbWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvY3M6IHByb3BlcnR5LmRvY3MsXG4gICAgICBzcGVjOiBwcm9wZXJ0eSxcbiAgICAgIGRlZmluaW5nVHlwZSxcbiAgICAgIHByb3BOYW1lLFxuICAgICAganNpaU5hbWU6IHByb3BlcnR5Lm5hbWUsXG4gICAgICBudWxsYWJsZTogISFwcm9wZXJ0eS5vcHRpb25hbCxcbiAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2RlLnRvQ2FtZWxDYXNlKHNhZmVOYW1lKSxcbiAgICAgIGZpZWxkSmF2YVR5cGU6IHRoaXMudG9KYXZhVHlwZShwcm9wZXJ0eS50eXBlKSxcbiAgICAgIHBhcmFtSmF2YVR5cGU6IHRoaXMudG9KYXZhVHlwZShwcm9wZXJ0eS50eXBlLCB7IGNvdmFyaWFudDogdHJ1ZSB9KSxcbiAgICAgIGZpZWxkTmF0aXZlVHlwZTogdGhpcy50b05hdGl2ZVR5cGUocHJvcGVydHkudHlwZSksXG4gICAgICBmaWVsZEphdmFDbGFzczogYCR7dGhpcy50b0phdmFUeXBlKHByb3BlcnR5LnR5cGUsIHtcbiAgICAgICAgZm9yTWFyc2hhbGxpbmc6IHRydWUsXG4gICAgICB9KX0uY2xhc3NgLFxuICAgICAgamF2YVR5cGVzOiB0aGlzLnRvSmF2YVR5cGVzKHByb3BlcnR5LnR5cGUsIHsgY292YXJpYW50OiB0cnVlIH0pLFxuICAgICAgaW1tdXRhYmxlOiBwcm9wZXJ0eS5pbW11dGFibGUgPz8gZmFsc2UsXG4gICAgICBpbmhlcml0ZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENsYXNzQnVpbGRlcihjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgLy8gTm90IHJlbmRlcmluZyBpZiB0aGVyZSBpcyBubyBpbml0aWFsaXplciwgb3IgaWYgdGhlIGluaXRpYWxpemVyIGlzIHByb3RlY3RlZCBvciB2YXJpYWRpY1xuICAgIGlmIChjbHMuaW5pdGlhbGl6ZXIgPT0gbnVsbCB8fCBjbHMuaW5pdGlhbGl6ZXIucHJvdGVjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlIGluaXRpYWxpemVyIGhhcyBubyBwYXJhbWV0ZXJzXG4gICAgaWYgKGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm90IHJlbmRlcmluZyBpZiB0aGVyZSBpcyBhIG5lc3RlZCBcIkJ1aWxkZXJcIiBjbGFzc1xuICAgIGlmIChcbiAgICAgIHRoaXMucmVmbGVjdEFzc2VtYmx5LnRyeUZpbmRUeXBlKGAke2Nscy5mcW59LiR7QlVJTERFUl9DTEFTU19OQU1FfWApICE9XG4gICAgICBudWxsXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgZmlyc3Qgc3RydWN0IHBhcmFtZXRlciBvZiB0aGUgY29uc3RydWN0b3IgKGlmIGFueSlcbiAgICBjb25zdCBmaXJzdFN0cnVjdCA9IGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtKSA9PiB7XG4gICAgICBpZiAoIXNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UocGFyYW0udHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdGhpcy5yZWZsZWN0QXNzZW1ibHkudHJ5RmluZFR5cGUocGFyYW0udHlwZS5mcW4pO1xuICAgICAgcmV0dXJuIHBhcmFtVHlwZT8uaXNEYXRhVHlwZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gTm90IHJlbmRlcmluZyBpZiB0aGVyZSBpcyBubyBzdHJ1Y3QgcGFyYW1ldGVyXG4gICAgaWYgKGZpcnN0U3RydWN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJ1Y3RUeXBlID0gdGhpcy5yZWZsZWN0QXNzZW1ibHkuZmluZFR5cGUoXG4gICAgICAoZmlyc3RTdHJ1Y3QudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSkuZnFuLFxuICAgICkgYXMgcmVmbGVjdC5JbnRlcmZhY2VUeXBlO1xuICAgIGNvbnN0IHN0cnVjdFBhcmFtTmFtZSA9IHRoaXMuY29kZS50b0NhbWVsQ2FzZShcbiAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUoZmlyc3RTdHJ1Y3QubmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBzdHJ1Y3RCdWlsZGVyID0gYCR7dGhpcy50b0phdmFUeXBlKFxuICAgICAgZmlyc3RTdHJ1Y3QudHlwZSxcbiAgICApfS4ke0JVSUxERVJfQ0xBU1NfTkFNRX1gO1xuXG4gICAgY29uc3QgcG9zaXRpb25hbFBhcmFtcyA9IGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBmaXJzdFN0cnVjdClcbiAgICAgIC5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICBwYXJhbSxcbiAgICAgICAgZmllbGROYW1lOiB0aGlzLmNvZGUudG9DYW1lbENhc2UoXG4gICAgICAgICAgSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwYXJhbS5uYW1lKSxcbiAgICAgICAgKSxcbiAgICAgICAgamF2YVR5cGU6IHRoaXMudG9KYXZhVHlwZShwYXJhbS50eXBlKSxcbiAgICAgIH0pKTtcblxuICAgIGNvbnN0IGJ1aWx0VHlwZSA9IHRoaXMudG9KYXZhVHlwZShjbHMpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZXR0aWVyL3ByZXR0aWVyXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgICogJHtzdGFiaWxpdHlQcmVmaXhGb3IoXG4gICAgICAgIGNscy5pbml0aWFsaXplcixcbiAgICAgICl9QSBmbHVlbnQgYnVpbGRlciBmb3Ige0BsaW5rICR7YnVpbHRUeXBlfX0uYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhjbHMuaW5pdGlhbGl6ZXIpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gaW1wbGVtZW50cyBzb2Z0d2FyZS5hbWF6b24uanNpaS5CdWlsZGVyPCR7YnVpbHRUeXBlfT5gLFxuICAgICk7XG5cbiAgICAvLyBTdGF0aWMgZmFjdG9yeSBtZXRob2QocylcbiAgICBmb3IgKGNvbnN0IHBhcmFtcyBvZiBjb21wdXRlT3ZlcnJpZGVzKHBvc2l0aW9uYWxQYXJhbXMpKSB7XG4gICAgICBjb25zdCBkdW1teU1ldGhvZDogc3BlYy5NZXRob2QgPSB7XG4gICAgICAgIGRvY3M6IHtcbiAgICAgICAgICBzdGFiaWxpdHk6IGNscy5pbml0aWFsaXplci5kb2NzPy5zdGFiaWxpdHkgPz8gY2xzLmRvY3M/LnN0YWJpbGl0eSxcbiAgICAgICAgICByZXR1cm5zOiBgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rICR7QlVJTERFUl9DTEFTU19OQU1FfX0uYCxcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZTogJ2NyZWF0ZScsXG4gICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtcy5tYXAoKHBhcmFtKSA9PiBwYXJhbS5wYXJhbSksXG4gICAgICB9O1xuICAgICAgdGhpcy5hZGRKYXZhRG9jcyhkdW1teU1ldGhvZCwge1xuICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICBmcW46IGNscy5mcW4sXG4gICAgICAgIG1lbWJlck5hbWU6IGR1bW15TWV0aG9kLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscy5pbml0aWFsaXplcik7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljIHN0YXRpYyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gY3JlYXRlKCR7cGFyYW1zXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICAgYGZpbmFsICR7cGFyYW0uamF2YVR5cGV9JHtwYXJhbS5wYXJhbS52YXJpYWRpYyA/ICcuLi4nIDogJyd9ICR7XG4gICAgICAgICAgICAgICAgcGFyYW0uZmllbGROYW1lXG4gICAgICAgICAgICAgIH1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbignLCAnKX0pYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHJldHVybiBuZXcgJHtCVUlMREVSX0NMQVNTX05BTUV9KCR7cG9zaXRpb25hbFBhcmFtc1xuICAgICAgICAgIC5tYXAoKHBhcmFtLCBpZHgpID0+IChpZHggPCBwYXJhbXMubGVuZ3RoID8gcGFyYW0uZmllbGROYW1lIDogJ251bGwnKSlcbiAgICAgICAgICAuam9pbignLCAnKX0pO2AsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICAvLyBQcml2YXRlIHByb3BlcnRpZXNcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcG9zaXRpb25hbFBhcmFtcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBwcml2YXRlIGZpbmFsICR7cGFyYW0uamF2YVR5cGV9JHtwYXJhbS5wYXJhbS52YXJpYWRpYyA/ICdbXScgOiAnJ30gJHtcbiAgICAgICAgICBwYXJhbS5maWVsZE5hbWVcbiAgICAgICAgfTtgLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcHJpdmF0ZSAke1xuICAgICAgICBmaXJzdFN0cnVjdC5vcHRpb25hbCA/ICcnIDogJ2ZpbmFsICdcbiAgICAgIH0ke3N0cnVjdEJ1aWxkZXJ9ICR7c3RydWN0UGFyYW1OYW1lfTtgLFxuICAgICk7XG5cbiAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByaXZhdGUgJHtCVUlMREVSX0NMQVNTX05BTUV9KCR7cG9zaXRpb25hbFBhcmFtc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgIGBmaW5hbCAke3BhcmFtLmphdmFUeXBlfSR7cGFyYW0ucGFyYW0udmFyaWFkaWMgPyAnLi4uJyA6ICcnfSAke1xuICAgICAgICAgICAgICBwYXJhbS5maWVsZE5hbWVcbiAgICAgICAgICAgIH1gLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcsICcpfSlgLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwb3NpdGlvbmFsUGFyYW1zKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgdGhpcy4ke3BhcmFtLmZpZWxkTmFtZX0gPSAke3BhcmFtLmZpZWxkTmFtZX07YCk7XG4gICAgfVxuICAgIGlmICghZmlyc3RTdHJ1Y3Qub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9IG5ldyAke3N0cnVjdEJ1aWxkZXJ9KCk7YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBGaWVsZHNcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc3RydWN0VHlwZS5hbGxQcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmNvZGUudG9DYW1lbENhc2UoXG4gICAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgY29uc3Qgc2V0dGVyOiBzcGVjLk1ldGhvZCA9IHtcbiAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgLi4ucHJvcC5zcGVjLmRvY3MsXG4gICAgICAgICAgc3RhYmlsaXR5OiBwcm9wLnNwZWMuZG9jcz8uc3RhYmlsaXR5LFxuICAgICAgICAgIHJldHVybnM6ICd7QGNvZGUgdGhpc30nLFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZLCAvLyBXZSBkb24ndCBxdWl0ZSBjYXJlIGluIHRoaXMgY29udGV4dCFcbiAgICAgICAgICAgIGRvY3M6IHByb3Auc3BlYy5kb2NzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBqYXZhVHlwZSBvZiB0aGlzLnRvSmF2YVR5cGVzKHByb3AudHlwZS5zcGVjISwge1xuICAgICAgICBjb3ZhcmlhbnQ6IHRydWUsXG4gICAgICB9KSkge1xuICAgICAgICB0aGlzLmFkZEphdmFEb2NzKHNldHRlciwge1xuICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgZnFuOiBwcm9wLmRlZmluaW5nVHlwZS5mcW4sIC8vIENvdWxkIGJlIGluaGVyaXRlZFxuICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3Auc3BlYyk7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgYHB1YmxpYyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gJHtmaWVsZE5hbWV9KGZpbmFsICR7amF2YVR5cGV9ICR7ZmllbGROYW1lfSlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0ke1xuICAgICAgICAgICAgZmlyc3RTdHJ1Y3Qub3B0aW9uYWwgPyAnKCknIDogJydcbiAgICAgICAgICB9LiR7ZmllbGROYW1lfSgke2ZpZWxkTmFtZX0pO2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gdGhpczsnKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaW5hbCBidWlsZCBtZXRob2RcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBAcmV0dXJucyBhIG5ld2x5IGJ1aWx0IGluc3RhbmNlIG9mIHtAbGluayAke2J1aWx0VHlwZX19LmAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xzLmluaXRpYWxpemVyKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7YnVpbHRUeXBlfSBidWlsZCgpYCk7XG4gICAgY29uc3QgcGFyYW1zID0gY2xzLmluaXRpYWxpemVyLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgaWYgKHBhcmFtID09PSBmaXJzdFN0cnVjdCkge1xuICAgICAgICByZXR1cm4gZmlyc3RTdHJ1Y3Qub3B0aW9uYWxcbiAgICAgICAgICA/IGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSAhPSBudWxsID8gdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0uYnVpbGQoKSA6IG51bGxgXG4gICAgICAgICAgOiBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0uYnVpbGQoKWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHRoaXMuJHtcbiAgICAgICAgcG9zaXRpb25hbFBhcmFtcy5maW5kKChwKSA9PiBwYXJhbSA9PT0gcC5wYXJhbSkhLmZpZWxkTmFtZVxuICAgICAgfWA7XG4gICAgfSk7XG4gICAgdGhpcy5jb2RlLmluZGVudChgcmV0dXJuIG5ldyAke2J1aWx0VHlwZX0oYCk7XG4gICAgcGFyYW1zLmZvckVhY2goKHBhcmFtLCBpZHgpID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgJHtwYXJhbX0ke2lkeCA8IHBhcmFtcy5sZW5ndGggLSAxID8gJywnIDogJyd9YCksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUudW5pbmRlbnQoJyk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIC8vIE9wdGlvbmFsIGJ1aWxkZXIgaW5pdGlhbGl6YXRpb25cbiAgICBpZiAoZmlyc3RTdHJ1Y3Qub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwcml2YXRlICR7c3RydWN0QnVpbGRlcn0gJHtzdHJ1Y3RQYXJhbU5hbWV9KClgKTtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICh0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9PSBudWxsKWApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9ID0gbmV3ICR7c3RydWN0QnVpbGRlcn0oKTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9O2ApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEJ1aWxkZXJTZXR0ZXIoXG4gICAgcHJvcDogSmF2YVByb3AsXG4gICAgYnVpbGRlck5hbWU6IHN0cmluZyxcbiAgICBwYXJlbnRUeXBlOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICkge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiBwcm9wLmphdmFUeXBlcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgICogU2V0cyB0aGUgdmFsdWUgb2Yge0BsaW5rICR7cGFyZW50VHlwZS5uYW1lfSMke2dldHRlckZvcihcbiAgICAgICAgICBwcm9wLmZpZWxkTmFtZSxcbiAgICAgICAgKX19YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gcHJvcC5kb2NzPy5zdW1tYXJ5ID8/ICd0aGUgdmFsdWUgdG8gYmUgc2V0JztcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgICogJHtwYXJhbUphdmFkb2MocHJvcC5maWVsZE5hbWUsIHByb3AubnVsbGFibGUsIHN1bW1hcnkpfWAsXG4gICAgICApO1xuICAgICAgaWYgKHByb3AuZG9jcz8ucmVtYXJrcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICcgJy5yZXBlYXQoNyArIHByb3AuZmllbGROYW1lLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlbWFya3MgPSBtYXJrRG93blRvSmF2YURvYyhcbiAgICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihwcm9wLmRvY3MucmVtYXJrcywge1xuICAgICAgICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgICAgICAgIGZxbjogcHJvcC5kZWZpbmluZ1R5cGUuZnFuLFxuICAgICAgICAgICAgbWVtYmVyTmFtZTogcHJvcC5qc2lpTmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKS50cmltUmlnaHQoKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHJlbWFya3Muc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqICR7aW5kZW50fSAke2xpbmV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKiBAcmV0dXJuIHtAY29kZSB0aGlzfScpO1xuICAgICAgaWYgKHByb3AuZG9jcz8uZGVwcmVjYXRlZCkge1xuICAgICAgICB0aGlzLmNvZGUubGluZShgICogQGRlcHJlY2F0ZWQgJHtwcm9wLmRvY3MuZGVwcmVjYXRlZH1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3Auc3BlYyk7XG4gICAgICAvLyBXZSBhZGQgYW4gZXhwbGljaXQgY2FzdCBpZiBib3RoIHR5cGVzIGFyZSBnZW5lcmljIGJ1dCB0aGV5IGFyZSBub3QgaWRlbnRpY2FsIChvbmUgaXMgY292YXJpYW50LCB0aGUgb3RoZXIgaXNuJ3QpXG4gICAgICBjb25zdCBleHBsaWNpdENhc3QgPVxuICAgICAgICB0eXBlLmluY2x1ZGVzKCc8JykgJiZcbiAgICAgICAgcHJvcC5maWVsZEphdmFUeXBlLmluY2x1ZGVzKCc8JykgJiZcbiAgICAgICAgdHlwZSAhPT0gcHJvcC5maWVsZEphdmFUeXBlXG4gICAgICAgICAgPyBgKCR7cHJvcC5maWVsZEphdmFUeXBlfSlgXG4gICAgICAgICAgOiAnJztcbiAgICAgIGlmIChleHBsaWNpdENhc3QgIT09ICcnKSB7XG4gICAgICAgIC8vIFdlJ2xsIGJlIGRvaW5nIGEgc2FmZSwgYnV0IHVuY2hlY2tlZCBjYXN0LCBzbyBzdXBwcmVzcyB0aGF0IHdhcm5pbmdcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BTdXBwcmVzc1dhcm5pbmdzKFwidW5jaGVja2VkXCIpJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljICR7YnVpbGRlck5hbWV9ICR7cHJvcC5maWVsZE5hbWV9KCR7dHlwZX0gJHtwcm9wLmZpZWxkTmFtZX0pYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSAke2V4cGxpY2l0Q2FzdH0ke3Byb3AuZmllbGROYW1lfTtgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gdGhpczsnKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0dGVyRm9yKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBmaWVsZE5hbWU7XG4gICAgICByZXR1cm4gYGdldCR7Zmlyc3QudG9VcHBlckNhc2UoKX0ke3Jlc3Quam9pbignJyl9YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbnRlcmZhY2VCdWlsZGVyKFxuICAgIGNsYXNzU3BlYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIGNvbnN0cnVjdG9yTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBKYXZhUHJvcFtdLFxuICApIHtcbiAgICAvLyBTdGFydCBidWlsZGVyKClcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBAcmV0dXJuIGEge0BsaW5rICR7QlVJTERFUl9DTEFTU19OQU1FfX0gb2Yge0BsaW5rICR7Y2xhc3NTcGVjLm5hbWV9fWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xhc3NTcGVjKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBzdGF0aWMgJHtCVUlMREVSX0NMQVNTX05BTUV9IGJ1aWxkZXIoKWApO1xuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gbmV3ICR7QlVJTERFUl9DTEFTU19OQU1FfSgpO2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGJ1aWxkZXIoKVxuXG4gICAgLy8gU3RhcnQgQnVpbGRlclxuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShgICogQSBidWlsZGVyIGZvciB7QGxpbmsgJHtjbGFzc1NwZWMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzICR7QlVJTERFUl9DTEFTU19OQU1FfSBpbXBsZW1lbnRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkJ1aWxkZXI8JHtjbGFzc1NwZWMubmFtZX0+YCxcbiAgICApO1xuXG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT5cbiAgICAgIHRoaXMuY29kZS5saW5lKGAke3Byb3AuZmllbGRKYXZhVHlwZX0gJHtwcm9wLmZpZWxkTmFtZX07YCksXG4gICAgKTtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5lbWl0QnVpbGRlclNldHRlcihwcm9wLCBCVUlMREVSX0NMQVNTX05BTUUsIGNsYXNzU3BlYyksXG4gICAgKTtcblxuICAgIC8vIFN0YXJ0IGJ1aWxkKClcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICogQnVpbGRzIHRoZSBjb25maWd1cmVkIGluc3RhbmNlLicpO1xuICAgIHRoaXMuY29kZS5saW5lKGAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayAke2NsYXNzU3BlYy5uYW1lfX1gKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSByZXF1aXJlZCBhdHRyaWJ1dGUgd2FzIG5vdCBwcm92aWRlZCcsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xhc3NTcGVjKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7Y2xhc3NTcGVjLm5hbWV9IGJ1aWxkKClgKTtcblxuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gbmV3ICR7Y29uc3RydWN0b3JOYW1lfSh0aGlzKTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBidWlsZCgpXG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBCdWlsZGVyXG4gIH1cblxuICBwcml2YXRlIGVtaXREYXRhVHlwZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIC8vIGNvbGxlY3QgYWxsIHByb3BlcnRpZXMgZnJvbSBhbGwgYmFzZSBzdHJ1Y3RzIGFuZCBkZWR1cGUgYnkgbmFtZS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBnZW5lcmF0aW9uIG9mIHRoZVxuICAgIC8vIGFzc2VtYmx5IHdpbGwgbm90IHBlcm1pdCBtdWx0aXBsZSBvdmVybG9hZGVkIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdGhhdCB0aGlzIHdpbGwgYmVcbiAgICAvLyBlbmZvcmNlZCBieSBUeXBlc2NyaXB0IGNvbnN0cmFpbnRzLlxuICAgIGNvbnN0IHByb3BzQnlOYW1lOiB7IFtuYW1lOiBzdHJpbmddOiBKYXZhUHJvcCB9ID0ge307XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0UHJvcHMoXG4gICAgICB0aGlzOiBKYXZhR2VuZXJhdG9yLFxuICAgICAgY3VycmVudElmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgICAgaXNCYXNlQ2xhc3MgPSBmYWxzZSxcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY3VycmVudElmYy5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGphdmFQcm9wID0gdGhpcy50b0phdmFQcm9wKHByb3BlcnR5LCBjdXJyZW50SWZjLCBpc0Jhc2VDbGFzcyk7XG4gICAgICAgIHByb3BzQnlOYW1lW2phdmFQcm9wLnByb3BOYW1lXSA9IGphdmFQcm9wO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgcHJvcHMgb2YgYmFzZSBzdHJ1Y3RcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBjdXJyZW50SWZjLmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgY29sbGVjdFByb3BzLmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbmRUeXBlKGJhc2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbGxlY3RQcm9wcy5jYWxsKHRoaXMsIGlmYyk7XG4gICAgY29uc3QgcHJvcHMgPSBPYmplY3QudmFsdWVzKHByb3BzQnlOYW1lKTtcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VCdWlsZGVyKGlmYywgSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUUsIHByb3BzKTtcblxuICAgIC8vIFN0YXJ0IGltcGxlbWVudGF0aW9uIGNsYXNzXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCAqIEFuIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgJHtpZmMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGlmYyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYGZpbmFsIGNsYXNzICR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9IGV4dGVuZHMgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdCBpbXBsZW1lbnRzICR7aWZjLm5hbWV9YCxcbiAgICApO1xuXG4gICAgLy8gSW1tdXRhYmxlIHByb3BlcnRpZXNcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYHByaXZhdGUgZmluYWwgJHtwcm9wLmZpZWxkSmF2YVR5cGV9ICR7cHJvcC5maWVsZE5hbWV9O2ApLFxuICAgICk7XG5cbiAgICAvLyBTdGFydCBKU0lJIHJlZmVyZW5jZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIENvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9iamVjdCBiYXNlZCBvbiB2YWx1ZXMgcmV0cmlldmVkIGZyb20gdGhlIEpzaWlPYmplY3QuJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKiBAcGFyYW0gb2JqUmVmIFJlZmVyZW5jZSB0byB0aGUgSlNJSSBtYW5hZ2VkIG9iamVjdC4nKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSBzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuZ2V0KHRoaXMsIFwiJHtwcm9wLmpzaWlOYW1lfVwiLCAke3Byb3AuZmllbGROYXRpdmVUeXBlfSk7YCxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBKU0lJIHJlZmVyZW5jZSBjb25zdHJ1Y3RvclxuXG4gICAgLy8gU3RhcnQgYnVpbGRlciBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIENvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9iamVjdCBiYXNlZCBvbiBsaXRlcmFsIHByb3BlcnR5IHZhbHVlcyBwYXNzZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyfS4nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIGlmIChwcm9wcy5zb21lKChwcm9wKSA9PiBwcm9wLmZpZWxkSmF2YVR5cGUgIT09IHByb3AucGFyYW1KYXZhVHlwZSkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKScpO1xuICAgIH1cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfShmaW5hbCAke0JVSUxERVJfQ0xBU1NfTkFNRX0gYnVpbGRlcilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnc3VwZXIoc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5Jbml0aWFsaXphdGlvbk1vZGUuSlNJSSk7JyxcbiAgICApO1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IGV4cGxpY2l0Q2FzdCA9XG4gICAgICAgIHByb3AuZmllbGRKYXZhVHlwZSAhPT0gcHJvcC5wYXJhbUphdmFUeXBlXG4gICAgICAgICAgPyBgKCR7cHJvcC5maWVsZEphdmFUeXBlfSlgXG4gICAgICAgICAgOiAnJztcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgdGhpcy4ke3Byb3AuZmllbGROYW1lfSA9ICR7ZXhwbGljaXRDYXN0fSR7X3ZhbGlkYXRlSWZOb25PcHRpb25hbChcbiAgICAgICAgICBgYnVpbGRlci4ke3Byb3AuZmllbGROYW1lfWAsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgKX07YCxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgbGl0ZXJhbCBjb25zdHJ1Y3RvclxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljIGZpbmFsICR7cHJvcC5maWVsZEphdmFUeXBlfSBnZXQke3Byb3AucHJvcE5hbWV9KClgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy4ke3Byb3AuZmllbGROYW1lfTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSk7XG5cbiAgICAvLyBlbWl0ICRqc2lpJHRvSnNvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byBzZXJpYWxpemUgdGhpcyBvYmplY3Qgd2hlbiBzZW50IHRvIEpTXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgJ3B1YmxpYyBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGUgJGpzaWkkdG9Kc29uKCknLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlciBvbSA9IHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RNYXBwZXIuSU5TVEFOQ0U7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYGZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGUgZGF0YSA9IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLkpzb25Ob2RlRmFjdG9yeS5pbnN0YW5jZS5vYmplY3ROb2RlKCk7YCxcbiAgICApO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICh0aGlzLmdldCR7cHJvcC5wcm9wTmFtZX0oKSAhPSBudWxsKWApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBkYXRhLnNldChcIiR7cHJvcC5zcGVjLm5hbWV9XCIsIG9tLnZhbHVlVG9UcmVlKHRoaXMuZ2V0JHtwcm9wLnByb3BOYW1lfSgpKSk7YCxcbiAgICAgICk7XG4gICAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSBzdHJ1Y3QgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShgc3RydWN0LnNldChcImZxblwiLCBvbS52YWx1ZVRvVHJlZShcIiR7aWZjLmZxbn1cIikpO2ApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdHJ1Y3Quc2V0KFwiZGF0YVwiLCBkYXRhKTsnKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSBvYmogPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnb2JqLnNldChcIiRqc2lpLnN0cnVjdFwiLCBzdHJ1Y3QpOycpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIG9iajsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCAkanNpaSR0b0pzb25cblxuICAgIC8vIEdlbmVyYXRlIGVxdWFscygpIG92ZXJyaWRlXG4gICAgdGhpcy5lbWl0RXF1YWxzT3ZlcnJpZGUoaWZjLm5hbWUsIHByb3BzKTtcblxuICAgIC8vIEdlbmVyYXRlIGhhc2hDb2RlKCkgb3ZlcnJpZGVcbiAgICB0aGlzLmVtaXRIYXNoQ29kZU92ZXJyaWRlKHByb3BzKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGltcGxlbWVudGF0aW9uIGNsYXNzXG5cbiAgICBmdW5jdGlvbiBfdmFsaWRhdGVJZk5vbk9wdGlvbmFsKHZhcmlhYmxlOiBzdHJpbmcsIHByb3A6IEphdmFQcm9wKTogc3RyaW5nIHtcbiAgICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGwoJHt2YXJpYWJsZX0sIFwiJHtwcm9wLmZpZWxkTmFtZX0gaXMgcmVxdWlyZWRcIilgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEVxdWFsc092ZXJyaWRlKGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wczogSmF2YVByb3BbXSkge1xuICAgIC8vIEEgY2xhc3Mgd2l0aG91dCBwcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgdG8gb3ZlcnJpZGUgZXF1YWxzKClcbiAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygncHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKScpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsnKTtcblxuICAgIC8vIFRoaXMgd2FzIGFscmVhZHkgY2hlY2tlZCBieSBgc3VwZXIuZXF1YWxzKG8pYCwgc28gd2Ugc2tpcCBpdCBoZXJlLi4uXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOycsXG4gICAgKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgJHtjbGFzc05hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9IHRoYXQgPSAoJHtjbGFzc05hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9KSBvO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgY29uc3QgaW5pdGlhbFByb3BzID0gcHJvcHMuc2xpY2UoMCwgcHJvcHMubGVuZ3RoIC0gMSk7XG4gICAgY29uc3QgZmluYWxQcm9wID0gcHJvcHNbcHJvcHMubGVuZ3RoIC0gMV07XG5cbiAgICBpbml0aWFsUHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgY29uc3QgcHJlZGljYXRlID0gcHJvcC5udWxsYWJsZVxuICAgICAgICA/IGB0aGlzLiR7cHJvcC5maWVsZE5hbWV9ICE9IG51bGwgPyAhdGhpcy4ke3Byb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke3Byb3AuZmllbGROYW1lfSkgOiB0aGF0LiR7cHJvcC5maWVsZE5hbWV9ICE9IG51bGxgXG4gICAgICAgIDogYCEke3Byb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke3Byb3AuZmllbGROYW1lfSlgO1xuXG4gICAgICB0aGlzLmNvZGUubGluZShgaWYgKCR7cHJlZGljYXRlfSkgcmV0dXJuIGZhbHNlO2ApO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGZpbmFsIChyZXR1cm5lZCBwcmVkaWNhdGUpIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBvdGhlciBvbmVzXG4gICAgY29uc3QgZmluYWxQcmVkaWNhdGUgPSBmaW5hbFByb3AubnVsbGFibGVcbiAgICAgID8gYHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfSAhPSBudWxsID8gdGhpcy4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9LmVxdWFscyh0aGF0LiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0pIDogYCArXG4gICAgICAgIGB0aGF0LiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0gPT0gbnVsbGBcbiAgICAgIDogYHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9KWA7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiAke2ZpbmFsUHJlZGljYXRlfTtgKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRIYXNoQ29kZU92ZXJyaWRlKHByb3BzOiBKYXZhUHJvcFtdKSB7XG4gICAgLy8gQSBjbGFzcyB3aXRob3V0IHByb3BlcnRpZXMgZG9lcyBub3QgbmVlZCB0byBvdmVycmlkZSBoYXNoQ29kZSgpXG4gICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKScpO1xuXG4gICAgY29uc3QgZmlyc3RQcm9wID0gcHJvcHNbMF07XG4gICAgY29uc3QgcmVtYWluaW5nUHJvcHMgPSBwcm9wcy5zbGljZSgxKTtcblxuICAgIHRoaXMuY29kZS5saW5lKGBpbnQgcmVzdWx0ID0gJHtfaGFzaENvZGVGb3JQcm9wKGZpcnN0UHJvcCl9O2ApO1xuICAgIHJlbWFpbmluZ1Byb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoJHtfaGFzaENvZGVGb3JQcm9wKHByb3ApfSk7YCksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHJlc3VsdDsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgZnVuY3Rpb24gX2hhc2hDb2RlRm9yUHJvcChwcm9wOiBKYXZhUHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AubnVsbGFibGVcbiAgICAgICAgPyBgdGhpcy4ke3Byb3AuZmllbGROYW1lfSAhPSBudWxsID8gdGhpcy4ke3Byb3AuZmllbGROYW1lfS5oYXNoQ29kZSgpIDogMGBcbiAgICAgICAgOiBgdGhpcy4ke3Byb3AuZmllbGROYW1lfS5oYXNoQ29kZSgpYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5GaWxlSWZOZWVkZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKHRoaXMuaXNOZXN0ZWQodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUodGhpcy50b0phdmFGaWxlUGF0aCh0aGlzLmFzc2VtYmx5LCB0eXBlKSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcGFja2FnZSAke3RoaXMudG9OYXRpdmVOYW1lKHRoaXMuYXNzZW1ibHksIHR5cGUpLnBhY2thZ2VOYW1lfTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VGaWxlSWZOZWVkZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKHRoaXMuaXNOZXN0ZWQodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZSh0aGlzLnRvSmF2YUZpbGVQYXRoKHRoaXMuYXNzZW1ibHksIHR5cGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNOZXN0ZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKCF0aGlzLmFzc2VtYmx5LnR5cGVzIHx8ICF0eXBlLm5hbWVzcGFjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBgJHt0eXBlLmFzc2VtYmx5fS4ke3R5cGUubmFtZXNwYWNlfWA7XG4gICAgcmV0dXJuIHBhcmVudCBpbiB0aGlzLmFzc2VtYmx5LnR5cGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFGaWxlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCBmcW46IHN0cmluZyk6IHN0cmluZztcbiAgcHJpdmF0ZSB0b0phdmFGaWxlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCB0eXBlOiBzcGVjLlR5cGUpOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9KYXZhRmlsZVBhdGgoYXNzbTogc3BlYy5Bc3NlbWJseSwgd2hhdDogc3BlYy5UeXBlIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHdoYXQgPT09ICdzdHJpbmcnID8gd2hhdCA6IHdoYXQuZnFuO1xuICAgIGNvbnN0IHsgcGFja2FnZU5hbWUsIHR5cGVOYW1lcyB9ID0gdHJhbnNsYXRlRnFuKGFzc20sIGZxbik7XG5cbiAgICBpZiAodHlwZU5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdG9KYXZhRmlsZVBhdGg6ICR7ZnFufSBtdXN0IGluZGljYXRlIGEgdHlwZSwgYnV0IGRvZXNuJ3Q6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWVzIH0sXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3BhdGguam9pbihcbiAgICAgICdzcmMnLFxuICAgICAgJ21haW4nLFxuICAgICAgJ2phdmEnLFxuICAgICAgLi4ucGFja2FnZU5hbWUuc3BsaXQoJy4nKSxcbiAgICAgIHR5cGVOYW1lc1swXSxcbiAgICApfS5qYXZhYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhUmVzb3VyY2VQYXRoKGFzc206IHNwZWMuQXNzZW1ibHksIGZxbjogc3RyaW5nLCBleHQgPSAnLnR4dCcpIHtcbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lLCB0eXBlTmFtZSB9ID0gdGhpcy50b05hdGl2ZU5hbWUoYXNzbSwge1xuICAgICAgZnFuLFxuICAgICAga2luZDogc3BlYy5UeXBlS2luZC5DbGFzcyxcbiAgICAgIGFzc2VtYmx5OiBhc3NtLm5hbWUsXG4gICAgICBuYW1lOiBmcW4ucmVwbGFjZSgvLipcXC4oW14uXSspJC8sICckMScpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAuLi5wYWNrYWdlTmFtZS5zcGxpdCgnLicpLFxuICAgICAgYCR7dHlwZU5hbWUuc3BsaXQoJy4nKVswXX0ke2V4dH1gLFxuICAgIF07XG4gICAgLy8gUmVzb3VyY2UgbmFtZXMgYXJlIC8tZGVsaW1pdGVkIHBhdGhzIChldmVuIG9uIFdpbmRvd3MgKndpbmsgd2luayopXG4gICAgY29uc3QgbmFtZSA9IHBhcnRzLmpvaW4oJy8nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbignc3JjJywgJ21haW4nLCAncmVzb3VyY2VzJywgLi4ucGFydHMpO1xuXG4gICAgcmV0dXJuIHsgZmlsZVBhdGgsIG5hbWUgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHByaXZhdGUgYWRkSmF2YURvY3MoXG4gICAgZG9jOiBzcGVjLkRvY3VtZW50YWJsZSxcbiAgICBhcGlMb2M6IEFwaUxvY2F0aW9uLFxuICAgIGRlZmF1bHRUZXh0Pzogc3RyaW5nLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAhZGVmYXVsdFRleHQgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5kb2NzID8/IHt9KS5sZW5ndGggPT09IDAgJiZcbiAgICAgICEoKGRvYyBhcyBzcGVjLk1ldGhvZCkucGFyYW1ldGVycyA/PyBbXSkuc29tZShcbiAgICAgICAgKHApID0+IE9iamVjdC5rZXlzKHAuZG9jcyA/PyB7fSkubGVuZ3RoICE9PSAwLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3MgPSAoZG9jLmRvY3MgPSBkb2MuZG9jcyA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJhcyA9IFtdO1xuXG4gICAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgICAgcGFyYXMucHVzaChyZW5kZXJTdW1tYXJ5KGRvY3MpKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRUZXh0KSB7XG4gICAgICBwYXJhcy5wdXNoKGRlZmF1bHRUZXh0KTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgICBwYXJhcy5wdXNoKFxuICAgICAgICBtYXJrRG93blRvSmF2YURvYyhcbiAgICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihkb2NzLnJlbWFya3MsIGFwaUxvYyksXG4gICAgICAgICkudHJpbVJpZ2h0KCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICAgIHBhcmFzLnB1c2goYERlZmF1bHQ6ICR7ZG9jcy5kZWZhdWx0fWApOyAvLyBOT1RFOiB0aGVyZSBpcyBubyBhbm5vdGF0aW9uIGluIEphdmFEb2MgZm9yIHRoaXNcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5leGFtcGxlKSB7XG4gICAgICBwYXJhcy5wdXNoKCdFeGFtcGxlOicpO1xuXG4gICAgICBjb25zdCBjb252ZXJ0ZWRFeGFtcGxlID0gdGhpcy5jb252ZXJ0RXhhbXBsZShkb2NzLmV4YW1wbGUsIGFwaUxvYyk7XG5cbiAgICAgIC8vIFdlIHVzZWQgdG8gdXNlIHRoZSBzbGlnaHRseSBuaWNlciBgPHByZT57QGNvZGUgLi4ufTwvcHJlPmAsIHdoaWNoIGRvZXNuJ3RcbiAgICAgIC8vIHJlcXVpcmUgKGFuZCB0aGVyZWZvcmUgYWxzbyBkb2Vzbid0IGFsbG93KSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICAvL1xuICAgICAgLy8gSG93ZXZlciwgY29kZSBzYW1wbGVzIG1heSBjb250YWluIGJsb2NrIHF1b3RlcyBvZiB0aGVpciBvd24gKCcqLycpIHRoYXRcbiAgICAgIC8vIHdvdWxkIHRlcm1pbmF0ZSB0aGUgYmxvY2sgY29tbWVudCBmcm9tIHRoZSBQb1Ygb2YgdGhlIEphdmEgdG9rZW5pemVyLCBhbmRcbiAgICAgIC8vIHNpbmNlIGB7QGNvZGUgLi4uIH1gIGRvZXNuJ3QgYWxsb3cgYW55IGVzY2FwaW5nLCB0aGVyZSdzIGFsc28gbm8gd2F5IHRvIGVuY29kZVxuICAgICAgLy8gJyovJyBpbiBhIHdheSB0aGF0IHdvdWxkIChhKSBoaWRlIGl0IGZyb20gdGhlIHRva2VuaXplciBhbmQgKGIpIGdpdmUgJyovJyBiYWNrXG4gICAgICAvLyBhZnRlciBwcm9jZXNzaW5nIEphdmFEb2NzLlxuICAgICAgLy9cbiAgICAgIC8vIEhlbmNlLCB3ZSBqdXN0IHJlc29ydCB0byBIVE1MLWVuY29kaW5nIGV2ZXJ5dGhpbmcgKHNhbWUgYXMgd2UgZG8gZm9yIGNvZGVcbiAgICAgIC8vIGV4YW1wbGVzIHRoYXQgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgZnJvbSBNYXJrRG93bikuXG4gICAgICBwYXJhcy5wdXNoKFxuICAgICAgICBtYXJrRG93blRvSmF2YURvYyhbJ2BgYCcsIGNvbnZlcnRlZEV4YW1wbGUsICdgYGAnXS5qb2luKCdcXG4nKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRhZ0xpbmVzID0gW107XG5cbiAgICBpZiAoZG9jcy5yZXR1cm5zKSB7XG4gICAgICB0YWdMaW5lcy5wdXNoKGBAcmV0dXJuICR7ZG9jcy5yZXR1cm5zfWApO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zZWUpIHtcbiAgICAgIHRhZ0xpbmVzLnB1c2goYEBzZWUgJHtkb2NzLnNlZX1gKTtcbiAgICB9XG4gICAgaWYgKGRvY3MuZGVwcmVjYXRlZCkge1xuICAgICAgdGFnTGluZXMucHVzaChgQGRlcHJlY2F0ZWQgJHtkb2NzLmRlcHJlY2F0ZWR9YCk7XG4gICAgfVxuXG4gICAgLy8gUGFyYW1zXG4gICAgaWYgKChkb2MgYXMgc3BlYy5NZXRob2QpLnBhcmFtZXRlcnMpIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGRvYyBhcyBzcGVjLk1ldGhvZDtcbiAgICAgIGlmIChtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHBhcmFtLmRvY3M/LnN1bW1hcnk7XG4gICAgICAgICAgdGFnTGluZXMucHVzaChwYXJhbUphdmFkb2MocGFyYW0ubmFtZSwgcGFyYW0ub3B0aW9uYWwsIHN1bW1hcnkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YWdMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhcy5wdXNoKHRhZ0xpbmVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXJhIG9mIHBhcmFzKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsaW5lcy5wdXNoKCc8cD4nKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goLi4ucGFyYS5zcGxpdCgnXFxuJykuZmlsdGVyKChsKSA9PiBsICE9PSAnJykpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2xpbmV9YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2xhc3NCYXNlKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBpZiAoIWNscy5iYXNlKSB7XG4gICAgICByZXR1cm4gJ3NvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvSmF2YVR5cGUoeyBmcW46IGNscy5iYXNlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0RlY29yYXRlZEphdmFUeXBlKFxuICAgIG9wdGlvbmFsVmFsdWU6IHNwZWMuT3B0aW9uYWxWYWx1ZSxcbiAgICB7IGNvdmFyaWFudCA9IGZhbHNlIH0gPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGVzKG9wdGlvbmFsVmFsdWUsIHsgY292YXJpYW50IH0pO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIGAke1xuICAgICAgICBvcHRpb25hbFZhbHVlLm9wdGlvbmFsID8gQU5OX05VTExBQkxFIDogQU5OX05PVF9OVUxMXG4gICAgICB9IGphdmEubGFuZy5PYmplY3RgO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0WzBdO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0RlY29yYXRlZEphdmFUeXBlcyhcbiAgICBvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUsXG4gICAgeyBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy50b0phdmFUeXBlcyhvcHRpb25hbFZhbHVlLnR5cGUsIHsgY292YXJpYW50IH0pLm1hcChcbiAgICAgIChuYWtlZFR5cGUpID0+XG4gICAgICAgIGAke29wdGlvbmFsVmFsdWUub3B0aW9uYWwgPyBBTk5fTlVMTEFCTEUgOiBBTk5fTk9UX05VTEx9ICR7bmFrZWRUeXBlfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhVHlwZShcbiAgICB0eXBlOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgb3B0cz86IHsgZm9yTWFyc2hhbGxpbmc/OiBib29sZWFuOyBjb3ZhcmlhbnQ/OiBib29sZWFuIH0sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZXMgPSB0aGlzLnRvSmF2YVR5cGVzKHR5cGUsIG9wdHMpO1xuICAgIGlmICh0eXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gJ2phdmEubGFuZy5PYmplY3QnO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZXNbMF07XG4gIH1cblxuICBwcml2YXRlIHRvTmF0aXZlVHlwZShcbiAgICB0eXBlOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgeyBmb3JNYXJzaGFsbGluZyA9IGZhbHNlLCBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHNwZWMuaXNDb2xsZWN0aW9uVHlwZVJlZmVyZW5jZSh0eXBlKSkge1xuICAgICAgY29uc3QgbmF0aXZlRWxlbWVudFR5cGUgPSB0aGlzLnRvTmF0aXZlVHlwZSh0eXBlLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUsIHtcbiAgICAgICAgZm9yTWFyc2hhbGxpbmcsXG4gICAgICAgIGNvdmFyaWFudCxcbiAgICAgIH0pO1xuICAgICAgc3dpdGNoICh0eXBlLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuQXJyYXk6XG4gICAgICAgICAgcmV0dXJuIGBzb2Z0d2FyZS5hbWF6b24uanNpaS5OYXRpdmVUeXBlLmxpc3RPZigke25hdGl2ZUVsZW1lbnRUeXBlfSlgO1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwOlxuICAgICAgICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5tYXBPZigke25hdGl2ZUVsZW1lbnRUeXBlfSlgO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBjb2xsZWN0aW9uIGtpbmQ6ICR7dHlwZS5jb2xsZWN0aW9uLmtpbmQgYXMgYW55fWAsXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGBzb2Z0d2FyZS5hbWF6b24uanNpaS5OYXRpdmVUeXBlLmZvckNsYXNzKCR7dGhpcy50b0phdmFUeXBlKHR5cGUsIHtcbiAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgY292YXJpYW50LFxuICAgIH0pfS5jbGFzcylgO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFUeXBlcyhcbiAgICB0eXBlcmVmOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgeyBmb3JNYXJzaGFsbGluZyA9IGZhbHNlLCBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZ1tdIHtcbiAgICBpZiAoc3BlYy5pc1ByaW1pdGl2ZVR5cGVSZWZlcmVuY2UodHlwZXJlZikpIHtcbiAgICAgIHJldHVybiBbdGhpcy50b0phdmFQcmltaXRpdmUodHlwZXJlZi5wcmltaXRpdmUpXTtcbiAgICB9IGVsc2UgaWYgKHNwZWMuaXNDb2xsZWN0aW9uVHlwZVJlZmVyZW5jZSh0eXBlcmVmKSkge1xuICAgICAgcmV0dXJuIFt0aGlzLnRvSmF2YUNvbGxlY3Rpb24odHlwZXJlZiwgeyBmb3JNYXJzaGFsbGluZywgY292YXJpYW50IH0pXTtcbiAgICB9IGVsc2UgaWYgKHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UodHlwZXJlZikpIHtcbiAgICAgIHJldHVybiBbdGhpcy50b05hdGl2ZUZxbih0eXBlcmVmLmZxbildO1xuICAgIH0gZWxzZSBpZiAodHlwZXJlZi51bmlvbikge1xuICAgICAgY29uc3QgdHlwZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBzdWJ0eXBlIG9mIHR5cGVyZWYudW5pb24udHlwZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMudG9KYXZhVHlwZXMoc3VidHlwZSwge1xuICAgICAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgICAgIGNvdmFyaWFudCxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB0eXBlcy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlIHJlZmVyZW5jZTogJHtKU09OLnN0cmluZ2lmeSh0eXBlcmVmKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhQ29sbGVjdGlvbihcbiAgICByZWY6IHNwZWMuQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UsXG4gICAge1xuICAgICAgZm9yTWFyc2hhbGxpbmcsXG4gICAgICBjb3ZhcmlhbnQsXG4gICAgfTogeyBmb3JNYXJzaGFsbGluZzogYm9vbGVhbjsgY292YXJpYW50OiBib29sZWFuIH0sXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnRKYXZhVHlwZSA9IHRoaXMudG9KYXZhVHlwZShyZWYuY29sbGVjdGlvbi5lbGVtZW50dHlwZSwge1xuICAgICAgY292YXJpYW50LFxuICAgIH0pO1xuICAgIGNvbnN0IHR5cGVDb25zdHJhaW50ID0gY292YXJpYW50XG4gICAgICA/IG1ha2VDb3ZhcmlhbnQoZWxlbWVudEphdmFUeXBlKVxuICAgICAgOiBlbGVtZW50SmF2YVR5cGU7XG4gICAgc3dpdGNoIChyZWYuY29sbGVjdGlvbi5raW5kKSB7XG4gICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuQXJyYXk6XG4gICAgICAgIHJldHVybiBmb3JNYXJzaGFsbGluZ1xuICAgICAgICAgID8gJ2phdmEudXRpbC5MaXN0J1xuICAgICAgICAgIDogYGphdmEudXRpbC5MaXN0PCR7dHlwZUNvbnN0cmFpbnR9PmA7XG4gICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwOlxuICAgICAgICByZXR1cm4gZm9yTWFyc2hhbGxpbmdcbiAgICAgICAgICA/ICdqYXZhLnV0aWwuTWFwJ1xuICAgICAgICAgIDogYGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgJHt0eXBlQ29uc3RyYWludH0+YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29sbGVjdGlvbiBraW5kOiAke3JlZi5jb2xsZWN0aW9uLmtpbmQgYXMgYW55fWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUNvdmFyaWFudChqYXZhVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIC8vIERvbid0IGVtaXQgYSBjb3ZhcmlhbnQgZXhwcmVzc2lvbiBmb3IgU3RyaW5nIChpdCdzIGBmaW5hbGAgaW4gSmF2YSlcbiAgICAgIGlmIChqYXZhVHlwZSA9PT0gJ2phdmEubGFuZy5TdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBqYXZhVHlwZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPyBleHRlbmRzICR7amF2YVR5cGV9YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YVByaW1pdGl2ZShwcmltaXRpdmU6IHNwZWMuUHJpbWl0aXZlVHlwZSkge1xuICAgIHN3aXRjaCAocHJpbWl0aXZlKSB7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Cb29sZWFuOlxuICAgICAgICByZXR1cm4gJ2phdmEubGFuZy5Cb29sZWFuJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkRhdGU6XG4gICAgICAgIHJldHVybiAnamF2YS50aW1lLkluc3RhbnQnO1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbjpcbiAgICAgICAgcmV0dXJuICdjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5PYmplY3ROb2RlJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLk51bWJlcjpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuTnVtYmVyJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuU3RyaW5nJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkFueTpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuT2JqZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcmltaXRpdmUgdHlwZTogJHtwcmltaXRpdmUgYXMgYW55fWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWV0aG9kQ2FsbEFyZ3VtZW50cyhtZXRob2Q6IHNwZWMuQ2FsbGFibGUpIHtcbiAgICBpZiAoIW1ldGhvZC5wYXJhbWV0ZXJzIHx8IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCByZWd1bGFyUGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnMuZmlsdGVyKChwKSA9PiAhcC52YXJpYWRpYyk7XG4gICAgY29uc3QgdmFsdWVzID0gcmVndWxhclBhcmFtcy5tYXAoX3JlbmRlclBhcmFtZXRlcik7XG4gICAgY29uc3QgdmFsdWVTdHIgPSBgbmV3IE9iamVjdFtdIHsgJHt2YWx1ZXMuam9pbignLCAnKX0gfWA7XG4gICAgaWYgKG1ldGhvZC52YXJpYWRpYykge1xuICAgICAgY29uc3QgdmFsdWVzU3RyZWFtID0gYGphdmEudXRpbC5BcnJheXMuPE9iamVjdD5zdHJlYW0oJHt2YWx1ZVN0cn0pYDtcblxuICAgICAgY29uc3QgbGFzdFBhcmFtID0gbWV0aG9kLnBhcmFtZXRlcnNbbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCByZXN0U3RyZWFtID0gYGphdmEudXRpbC5BcnJheXMuPE9iamVjdD5zdHJlYW0oJHtsYXN0UGFyYW0ubmFtZX0pYDtcblxuICAgICAgY29uc3QgZnVsbFN0cmVhbSA9XG4gICAgICAgIHJlZ3VsYXJQYXJhbXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbmNhdCgke3ZhbHVlc1N0cmVhbX0sICR7cmVzdFN0cmVhbX0pYFxuICAgICAgICAgIDogcmVzdFN0cmVhbTtcbiAgICAgIHJldHVybiBgLCAke2Z1bGxTdHJlYW19LnRvQXJyYXkoT2JqZWN0W106Om5ldylgO1xuICAgIH1cbiAgICByZXR1cm4gYCwgJHt2YWx1ZVN0cn1gO1xuXG4gICAgZnVuY3Rpb24gX3JlbmRlclBhcmFtZXRlcihwYXJhbTogc3BlYy5QYXJhbWV0ZXIpIHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwYXJhbS5uYW1lKTtcbiAgICAgIHJldHVybiBpc051bGxhYmxlKHBhcmFtKVxuICAgICAgICA/IHNhZmVOYW1lXG4gICAgICAgIDogYGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsKCR7c2FmZU5hbWV9LCBcIiR7c2FmZU5hbWV9IGlzIHJlcXVpcmVkXCIpYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1ldGhvZENhbGwoXG4gICAgY2xzOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgICBhc3luYzogYm9vbGVhbixcbiAgKSB7XG4gICAgbGV0IHN0YXRlbWVudCA9ICcnO1xuXG4gICAgaWYgKG1ldGhvZC5zdGF0aWMpIHtcbiAgICAgIGNvbnN0IGphdmFDbGFzcyA9IHRoaXMudG9KYXZhVHlwZShjbHMpO1xuICAgICAgc3RhdGVtZW50ICs9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LmpzaWlTdGF0aWNDYWxsKCR7amF2YUNsYXNzfS5jbGFzcywgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVtZW50ICs9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuJHtcbiAgICAgICAgYXN5bmMgPyAnYXN5bmNDYWxsJyA6ICdjYWxsJ1xuICAgICAgfSh0aGlzLCBgO1xuICAgIH1cblxuICAgIHN0YXRlbWVudCArPSBgXCIke21ldGhvZC5uYW1lfVwiYDtcblxuICAgIGlmIChtZXRob2QucmV0dXJucykge1xuICAgICAgc3RhdGVtZW50ICs9IGAsICR7dGhpcy50b05hdGl2ZVR5cGUobWV0aG9kLnJldHVybnMudHlwZSwge1xuICAgICAgICBmb3JNYXJzaGFsbGluZzogdHJ1ZSxcbiAgICAgIH0pfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudCArPSAnLCBzb2Z0d2FyZS5hbWF6b24uanNpaS5OYXRpdmVUeXBlLlZPSUQnO1xuICAgIH1cbiAgICBzdGF0ZW1lbnQgKz0gYCR7dGhpcy5yZW5kZXJNZXRob2RDYWxsQXJndW1lbnRzKG1ldGhvZCl9KWA7XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHN0YXRlbWVudCA9IHRoaXMud3JhcENvbGxlY3Rpb24oXG4gICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgbWV0aG9kLnJldHVybnMudHlwZSxcbiAgICAgICAgbWV0aG9kLnJldHVybnMub3B0aW9uYWwsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QucmV0dXJucykge1xuICAgICAgcmV0dXJuIGByZXR1cm4gJHtzdGF0ZW1lbnR9O2A7XG4gICAgfVxuICAgIHJldHVybiBgJHtzdGF0ZW1lbnR9O2A7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgYSBjb2xsZWN0aW9uIGludG8gYW4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gZWxzZSByZXR1cm5zIHRoZSBleGlzdGluZyBzdGF0ZW1lbnQuXG4gICAqIEBwYXJhbSBzdGF0ZW1lbnQgVGhlIHN0YXRlbWVudCB0byB3cmFwIGlmIG5lY2Vzc2FyeS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byB3cmFwLlxuICAgKiBAcGFyYW0gb3B0aW9uYWwgV2hldGhlciB0aGUgdmFsdWUgaXMgb3B0aW9uYWwgKGNhbiBiZSBudWxsL3VuZGVmaW5lZCkgb3Igbm90LlxuICAgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgb3Igb3JpZ2luYWwgc3RhdGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSB3cmFwQ29sbGVjdGlvbihcbiAgICBzdGF0ZW1lbnQ6IHN0cmluZyxcbiAgICB0eXBlOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgb3B0aW9uYWw/OiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZSkpIHtcbiAgICAgIGxldCB3cmFwcGVyOiBzdHJpbmc7XG4gICAgICBzd2l0Y2ggKHR5cGUuY29sbGVjdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2Ugc3BlYy5Db2xsZWN0aW9uS2luZC5BcnJheTpcbiAgICAgICAgICB3cmFwcGVyID0gJ3VubW9kaWZpYWJsZUxpc3QnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwOlxuICAgICAgICAgIHdyYXBwZXIgPSAndW5tb2RpZmlhYmxlTWFwJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29sbGVjdGlvbiBraW5kOiAke3R5cGUuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBcIm9wdGlvbmFsXCIsIHRoZSB2YWx1ZSBuZWVkcyBvdCBiZSBleHBsaWNpdGx5IGNhc3QgdG8gYWxsb3cgZm9yIGNhc2VzIHdoZXJlIHRoZSByYXcgdHlwZSB3YXMgcmV0dXJuZWQuXG4gICAgICByZXR1cm4gb3B0aW9uYWxcbiAgICAgICAgPyBgamF2YS51dGlsLk9wdGlvbmFsLm9mTnVsbGFibGUoKCR7dGhpcy50b0phdmFUeXBlKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICApfSkoJHtzdGF0ZW1lbnR9KSkubWFwKGphdmEudXRpbC5Db2xsZWN0aW9uczo6JHt3cmFwcGVyfSkub3JFbHNlKG51bGwpYFxuICAgICAgICA6IGBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuJHt3cmFwcGVyfSgke3N0YXRlbWVudH0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZDogc3BlYy5DYWxsYWJsZSkge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGlmIChtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgZm9yIChjb25zdCBwIG9mIG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIC8vIFdlIGNhbiByZW5kZXIgY292YXJpYW50IHBhcmFtZXRlcnMgb25seSBmb3IgbWV0aG9kcyB0aGF0IGFyZW4ndCBvdmVycmlkYWJsZS4uLiBzbyBvbmx5IGZvciBzdGF0aWMgbWV0aG9kcyBjdXJyZW50bHkuXG4gICAgICAgIHBhcmFtcy5wdXNoKFxuICAgICAgICAgIGBmaW5hbCAke3RoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShwLCB7XG4gICAgICAgICAgICBjb3ZhcmlhbnQ6IChtZXRob2QgYXMgc3BlYy5NZXRob2QpLnN0YXRpYyxcbiAgICAgICAgICB9KX0ke3AudmFyaWFkaWMgPyAnLi4uJyA6ICcnfSAke0phdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUoXG4gICAgICAgICAgICBwLm5hbWUsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckFjY2Vzc0xldmVsKG1ldGhvZDogc3BlYy5DYWxsYWJsZSB8IHNwZWMuUHJvcGVydHkpIHtcbiAgICByZXR1cm4gbWV0aG9kLnByb3RlY3RlZCA/ICdwcm90ZWN0ZWQnIDogJ3B1YmxpYyc7XG4gIH1cblxuICBwcml2YXRlIG1ha2VNb2R1bGVDbGFzcyhtb2R1bGVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7dGhpcy50b05hdGl2ZUZxbihtb2R1bGVOYW1lKX0uJHtNT0RVTEVfQ0xBU1NfTkFNRX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TW9kdWxlRmlsZShtb2Q6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gbW9kLm5hbWU7XG4gICAgY29uc3QgbW9kdWxlQ2xhc3MgPSB0aGlzLm1ha2VNb2R1bGVDbGFzcyhtb2R1bGVOYW1lKTtcblxuICAgIGNvbnN0IHsgZmlsZVBhdGg6IG1vZHVsZVJlc0ZpbGUsIG5hbWU6IG1vZHVsZVJlc05hbWUgfSA9XG4gICAgICB0aGlzLnRvSmF2YVJlc291cmNlUGF0aChtb2QsIGAke21vZC5uYW1lfS4ke01PRFVMRV9DTEFTU19OQU1FfWApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShtb2R1bGVSZXNGaWxlKTtcbiAgICBmb3IgKGNvbnN0IGZxbiBvZiBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LnR5cGVzID8/IHt9KSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7ZnFufT0ke3RoaXMudG9OYXRpdmVGcW4oZnFuLCB7IGJpbmFyeU5hbWU6IHRydWUgfSl9YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUobW9kdWxlUmVzRmlsZSk7XG5cbiAgICBjb25zdCBtb2R1bGVGaWxlID0gdGhpcy50b0phdmFGaWxlUGF0aChtb2QsIHtcbiAgICAgIGFzc2VtYmx5OiBtb2QubmFtZSxcbiAgICAgIGZxbjogYCR7bW9kLm5hbWV9LiR7TU9EVUxFX0NMQVNTX05BTUV9YCxcbiAgICAgIGtpbmQ6IHNwZWMuVHlwZUtpbmQuQ2xhc3MsXG4gICAgICBuYW1lOiBNT0RVTEVfQ0xBU1NfTkFNRSxcbiAgICB9KTtcblxuICAgIHRoaXMuY29kZS5vcGVuRmlsZShtb2R1bGVGaWxlKTtcbiAgICB0aGlzLmNvZGUubGluZShgcGFja2FnZSAke3RoaXMudG9OYXRpdmVOYW1lKG1vZCkucGFja2FnZU5hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKG1vZC5kZXBlbmRlbmNpZXMgPz8ge30pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OycpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5SZWFkZXI7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLlVuY2hlY2tlZElPRXhjZXB0aW9uOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOycpO1xuICAgIGlmIChPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzID8/IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEudXRpbC5MaXN0OycpO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEudXRpbC5NYXA7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlNb2R1bGU7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMgZmluYWwgY2xhc3MgJHtNT0RVTEVfQ0xBU1NfTkFNRX0gZXh0ZW5kcyBKc2lpTW9kdWxlYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ3ByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gTU9EVUxFX1RZUEVTID0gbG9hZCgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygncHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBsb2FkKCknKTtcbiAgICB0aGlzLmNvZGUubGluZSgnZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgZmluYWwgQ2xhc3NMb2FkZXIgY2wgPSAke01PRFVMRV9DTEFTU19OQU1FfS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0cnkgKGZpbmFsIElucHV0U3RyZWFtIGlzID0gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShcIiR7bW9kdWxlUmVzTmFtZX1cIik7YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAgICAgZmluYWwgUmVhZGVyIHJkID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICcgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJkKSknLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2JyLmxpbmVzKCknKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICAuZmlsdGVyKGxpbmUgLT4gIWxpbmUudHJpbSgpLmlzRW1wdHkoKSknKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCcgIC5mb3JFYWNoKGxpbmUgLT4gJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIFN0cmluZ1tdIHBhcnRzID0gbGluZS5zcGxpdChcIj1cIiwgMik7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIFN0cmluZyBmcW4gPSBwYXJ0c1swXTsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IHBhcnRzWzFdOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdyZXN1bHQucHV0KGZxbiwgY2xhc3NOYW1lKTsnKTtcbiAgICB0aGlzLmNvZGUudW5pbmRlbnQoJ30pOycpOyAvLyBQcm94eSBmb3IgY2xvc2VCbG9ja1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiknKTtcbiAgICB0aGlzLmNvZGUubGluZSgndGhyb3cgbmV3IFVuY2hlY2tlZElPRXhjZXB0aW9uKGV4Y2VwdGlvbik7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHJlc3VsdDsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBjYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIC8vIGN0b3JcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgJHtNT0RVTEVfQ0xBU1NfTkFNRX0oKWApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHN1cGVyKFwiJHttb2R1bGVOYW1lfVwiLCBcIiR7XG4gICAgICAgIG1vZC52ZXJzaW9uXG4gICAgICB9XCIsICR7TU9EVUxFX0NMQVNTX05BTUV9LmNsYXNzLCBcIiR7dGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCl9XCIpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpOyAvLyBjdG9yXG5cbiAgICAvLyBkZXBlbmRlbmNpZXNcbiAgICBpZiAobW9kLmRlcGVuZGVuY2llcyAmJiBPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXBzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzKSkge1xuICAgICAgICBkZXBzLnB1c2goYCR7dGhpcy5tYWtlTW9kdWxlQ2xhc3MoZGVwKX0uY2xhc3NgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICdwdWJsaWMgTGlzdDxDbGFzczw/IGV4dGVuZHMgSnNpaU1vZHVsZT4+IGdldERlcGVuZGVuY2llcygpJyxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIGFzTGlzdCgke2RlcHMuam9pbignLCAnKX0pO2ApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgJ3Byb3RlY3RlZCBDbGFzczw/PiByZXNvbHZlQ2xhc3MoZmluYWwgU3RyaW5nIGZxbikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnaWYgKCFNT0RVTEVfVFlQRVMuY29udGFpbnNLZXkoZnFuKSknKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICd0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihcIlVua25vd24gSlNJSSB0eXBlOiBcIiArIGZxbik7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ1N0cmluZyBjbGFzc05hbWUgPSBNT0RVTEVfVFlQRVMuZ2V0KGZxbik7Jyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnaWYgKCF0aGlzLmNhY2hlLmNvbnRhaW5zS2V5KGNsYXNzTmFtZSkpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3RoaXMuY2FjaGUucHV0KGNsYXNzTmFtZSwgdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGNsYXNzTmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3ByaXZhdGUgQ2xhc3M8Pz4gZmluZENsYXNzKGZpbmFsIFN0cmluZyBiaW5hcnlOYW1lKScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3RyeScpO1xuICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gQ2xhc3MuZm9yTmFtZShiaW5hcnlOYW1lKTsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2NhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4Y2VwdGlvbiknKTtcbiAgICB0aGlzLmNvZGUubGluZSgndGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShtb2R1bGVGaWxlKTtcblxuICAgIHJldHVybiBtb2R1bGVDbGFzcztcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEpzaWlJbml0aWFsaXplcnMoY2xzOiBzcGVjLkNsYXNzVHlwZSkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtjbHMubmFtZX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xzLm5hbWV9KGZpbmFsIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuSW5pdGlhbGl6YXRpb25Nb2RlIGluaXRpYWxpemF0aW9uTW9kZSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3N1cGVyKGluaXRpYWxpemF0aW9uTW9kZSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgamF2YSBGUU4gZm9yIGEgSlNJSSBGUU46XG4gICAqIDEuIERldGVybWluZSB3aGljaCBhc3NlbWJseSB0aGUgRlFOIGJlbG9uZ3MgdG8gKGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgRlFOKVxuICAgKiAyLiBMb2NhdGUgdGhlIGB0YXJnZXRzLmphdmEucGFja2FnZWAgdmFsdWUgZm9yIHRoYXQgYXNzZW1ibHkgKHRoaXMgYXNzZW1ibHksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzKVxuICAgKiAzLiBSZXR1cm4gdGhlIGphdmEgRlFOOiBgYDxtb2R1bGUudGFyZ2V0cy5qYXZhLnBhY2thZ2U+LjxGUU4gc3RpcHBlZCBvZiBmaXJzdCBjb21wb25lbnQ+YGBcbiAgICpcbiAgICogUmVjb3JkcyBhbiBhc3NlbWJseSByZWZlcmVuY2UgaWYgdGhlIHJlZmVyZW5jZWQgRlFOIGNvbWVzIGZyb20gYSBkaWZmZXJlbnQgYXNzZW1ibHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcW4gdGhlIEpTSUkgRlFOIHRvIGJlIHVzZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgRlFOLlxuICAgKlxuICAgKiBAdGhyb3dzIGlmIHRoZSBhc3NlbWJseSB0aGUgRlFOIGJlbG9uZ3MgdG8gZG9lcyBub3QgaGF2ZSBhIGB0YXJnZXRzLmphdmEucGFja2FnZWAgc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSB0b05hdGl2ZUZxbihcbiAgICBmcW46IHN0cmluZyxcbiAgICB7IGJpbmFyeU5hbWUgfTogeyBiaW5hcnlOYW1lOiBib29sZWFuIH0gPSB7IGJpbmFyeU5hbWU6IGZhbHNlIH0sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgW21vZF0gPSBmcW4uc3BsaXQoJy4nKTtcbiAgICBjb25zdCBkZXBNb2QgPSB0aGlzLmZpbmRNb2R1bGUobW9kKTtcbiAgICAvLyBNYWtlIHN1cmUgYW55IGRlcGVuZGVuY3kgKGRpcmVjdCBvciB0cmFuc2l0aXZlKSBvZiB3aGljaCBhbnkgdHlwZSBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQgYnkgdGhlIGdlbmVyYXRlZFxuICAgIC8vIGNvZGUgaXMgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBQT00ncyBkZXBlbmRlbmNpZXMgc2VjdGlvbiAocHJvdGVjdGluZyB0aGUgYXJ0aWZhY3QgZnJvbSBjaGFuZ2VzIGluIHRoZVxuICAgIC8vIGRlcGVuZGVuY2llcycgZGVwZW5kZW5jeSBzdHJ1Y3R1cmUpLlxuICAgIGlmIChtb2QgIT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgdGhpcy5yZWZlcmVuY2VkTW9kdWxlc1ttb2RdID0gZGVwTW9kO1xuXG4gICAgICBjb25zdCB0cmFuc2xhdGVkID0gdHJhbnNsYXRlRnFuKHsgLi4uZGVwTW9kLCBuYW1lOiBtb2QgfSwgZnFuKTtcbiAgICAgIHJldHVybiBbdHJhbnNsYXRlZC5wYWNrYWdlTmFtZSwgLi4udHJhbnNsYXRlZC50eXBlTmFtZXNdLmpvaW4oJy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lLCB0eXBlTmFtZSB9ID1cbiAgICAgIGZxbiA9PT0gdGhpcy5hc3NlbWJseS5uYW1lXG4gICAgICAgID8gdGhpcy50b05hdGl2ZU5hbWUodGhpcy5hc3NlbWJseSlcbiAgICAgICAgOiB0aGlzLnRvTmF0aXZlTmFtZSh0aGlzLmFzc2VtYmx5LCB0aGlzLmFzc2VtYmx5LnR5cGVzIVtmcW5dKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPVxuICAgICAgdHlwZU5hbWUgJiYgYmluYXJ5TmFtZSA/IHR5cGVOYW1lLnJlcGxhY2UoJy4nLCAnJCcpIDogdHlwZU5hbWU7XG4gICAgcmV0dXJuIGAke3BhY2thZ2VOYW1lfSR7Y2xhc3NOYW1lID8gYC4ke2NsYXNzTmFtZX1gIDogJyd9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBKYXZhIG5hbWUgZm9yIGEganNpaSBhc3NlbWJseSBvciB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gYXNzbSBUaGUgYXNzZW1ibHkgdGhhdCBjb250YWlucyB0aGUgdHlwZVxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB3ZSB3YW50IHRoZSBuYW1lIG9mXG4gICAqL1xuICBwcml2YXRlIHRvTmF0aXZlTmFtZShhc3NtOiBzcGVjLkFzc2VtYmx5KToge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgdHlwZU5hbWU6IHVuZGVmaW5lZDtcbiAgfTtcbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoXG4gICAgYXNzbTogc3BlYy5Bc3NlbWJseSxcbiAgICB0eXBlOiBzcGVjLlR5cGUsXG4gICk6IHsgcGFja2FnZU5hbWU6IHN0cmluZzsgdHlwZU5hbWU6IHN0cmluZyB9O1xuICBwcml2YXRlIHRvTmF0aXZlTmFtZShcbiAgICBhc3NtOiBzcGVjLkFzc2VtYmx5LFxuICAgIHR5cGU/OiBzcGVjLlR5cGUsXG4gICk6IHsgcGFja2FnZU5hbWU6IHN0cmluZzsgdHlwZU5hbWU/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICByZXR1cm4geyBwYWNrYWdlTmFtZTogcGFja2FnZU5hbWVGcm9tQXNzZW1ibHkoYXNzbSkgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdHJhbnNsYXRlRnFuKGFzc20sIHR5cGUuZnFuKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFja2FnZU5hbWU6IHRyYW5zbGF0ZWQucGFja2FnZU5hbWUsXG4gICAgICB0eXBlTmFtZTogdHJhbnNsYXRlZC50eXBlTmFtZXMuam9pbignLicpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYW4gYGBAR2VuZXJhdGVkYGAgYW5ub3RhdGlvbiBob25vcmluZyB0aGUgYGB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mb2BgIHNldHRpbmcuXG4gICAqL1xuICBwcml2YXRlIGVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mb1xuICAgICAgPyBgLCBkYXRlID0gXCIke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1cImBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9cbiAgICAgID8gYGpzaWktcGFjbWFrLyR7VkVSU0lPTl9ERVNDfWBcbiAgICAgIDogJ2pzaWktcGFjbWFrJztcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQodmFsdWUgPSBcIiR7Z2VuZXJhdG9yfVwiJHtkYXRlfSlgLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRFeGFtcGxlKGV4YW1wbGU6IHN0cmluZywgYXBpOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMucm9zZXR0YS50cmFuc2xhdGVFeGFtcGxlKFxuICAgICAgYXBpLFxuICAgICAgZXhhbXBsZSxcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U2FtcGxlc0luTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgYXBpOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBhcGksXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgICAodHJhbnMpID0+ICh7XG4gICAgICAgIGxhbmd1YWdlOiB0cmFucy5sYW5ndWFnZSxcbiAgICAgICAgc291cmNlOiB0aGlzLnByZWZpeERpc2NsYWltZXIodHJhbnMpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZml4RGlzY2xhaW1lcih0cmFuc2xhdGVkOiBUcmFuc2xhdGlvbikge1xuICAgIGlmICghdHJhbnNsYXRlZC5kaWRDb21waWxlICYmIElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcpIHtcbiAgICAgIHJldHVybiBgLy8gJHtJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HfVxcbiR7dHJhbnNsYXRlZC5zb3VyY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbnMgdGhlIEphdmEgRlFOIG9mIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGludGVyZmFjZXMgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgd2hlbiBhIG5ld1xuICAgKiBkZWZhdWx0IGludGVyZmFjZSBvciBwcm94eSBjbGFzcyBpcyBiZWluZyBlbWl0dGVkLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggYSBkZWZhdWx0IGludGVyZmFjZSBvciBwcm94eSBpcyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gaW5jbHVkZVRoaXNUeXBlIHdoZXRoZXIgdGhpcyBjbGFzcydzIGRlZmF1bHQgaW50ZXJmYWNlIHNob3VsZCBiZSBpbmNsdWRlZCBvciBub3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgbGlzdCBvZiBKYXZhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcy5cbiAgICovXG4gIHByaXZhdGUgZGVmYXVsdEludGVyZmFjZXNGb3IoXG4gICAgdHlwZTogcmVmbGVjdC5DbGFzc1R5cGUgfCByZWZsZWN0LkludGVyZmFjZVR5cGUsXG4gICAgeyBpbmNsdWRlVGhpc1R5cGUgPSBmYWxzZSB9OiB7IGluY2x1ZGVUaGlzVHlwZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBpZiAoXG4gICAgICBpbmNsdWRlVGhpc1R5cGUgJiZcbiAgICAgIGhhc0RlZmF1bHRJbnRlcmZhY2VzKHR5cGUuYXNzZW1ibHkpICYmXG4gICAgICB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpXG4gICAgKSB7XG4gICAgICByZXN1bHQuYWRkKFxuICAgICAgICBgJHt0aGlzLnRvTmF0aXZlRnFuKHR5cGUuZnFuKX0uJHtJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIHR5cGUuaW50ZXJmYWNlcykge1xuICAgICAgICBpZiAoaGFzRGVmYXVsdEludGVyZmFjZXMoaWZhY2UuYXNzZW1ibHkpKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChcbiAgICAgICAgICAgIGAke3RoaXMudG9OYXRpdmVGcW4oaWZhY2UuZnFuKX0uJHtJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kZWZhdWx0SW50ZXJmYWNlc0ZvcihpZmFjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hZGQoaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZS5pc0NsYXNzVHlwZSgpICYmIHR5cGUuYmFzZSAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRlZmF1bHRJbnRlcmZhY2VzRm9yKHR5cGUuYmFzZSkpIHtcbiAgICAgICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20ocmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgbW9kZWxzIHRoZSBQT00gc2NoZW1hIGZvciBhIDxkZXBlbmRlbmN5PiBlbnRpdHlcbiAqIEBzZWUgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3BvbS5odG1sI0RlcGVuZGVuY2llc1xuICovXG5pbnRlcmZhY2UgTWF2ZW5EZXBlbmRlbmN5IHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBhcnRpZmFjdElkOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcblxuICB0eXBlPzogc3RyaW5nO1xuICBzY29wZT86ICdjb21waWxlJyB8ICdwcm92aWRlZCcgfCAncnVudGltZScgfCAndGVzdCcgfCAnc3lzdGVtJztcbiAgc3lzdGVtUGF0aD86IHN0cmluZztcbiAgb3B0aW9uYWw/OiBib29sZWFuO1xuXG4gICcjY29tbWVudCc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTG9va3MgdXAgdGhlIGBAanNpaS9qYXZhLXJ1bnRpbWVgIHBhY2thZ2UgZnJvbSB0aGUgbG9jYWwgcmVwb3NpdG9yeS5cbiAqIElmIGl0IGNvbnRhaW5zIGEgXCJtYXZlbi1yZXBvXCIgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIGFkZGVkIGFzIGEgbG9jYWwgbWF2ZW4gcmVwb1xuICogc28gd2hlbiB3ZSBidWlsZCBsb2NhbGx5LCB3ZSBidWlsZCBhZ2FpbnN0IGl0IGFuZCBub3QgYWdhaW5zdCB0aGUgb25lIHB1Ymxpc2hlZFxuICogdG8gTWF2ZW4gQ2VudHJhbC5cbiAqL1xuZnVuY3Rpb24gZmluZEphdmFSdW50aW1lTG9jYWxSZXBvc2l0b3J5KCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgamF2YVJ1bnRpbWUgPSByZXF1aXJlKCdAanNpaS9qYXZhLXJ1bnRpbWUnKTtcbiAgICBsb2dnaW5nLmluZm8oXG4gICAgICBgVXNpbmcgbG9jYWwgdmVyc2lvbiBvZiB0aGUgSmF2YSBqc2lpIHJ1bnRpbWUgcGFja2FnZSBhdDogJHtqYXZhUnVudGltZS5yZXBvc2l0b3J5fWAsXG4gICAgKTtcbiAgICByZXR1cm4gamF2YVJ1bnRpbWUucmVwb3NpdG9yeTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc051bGxhYmxlKG9wdGlvbmFsVmFsdWU6IHNwZWMuT3B0aW9uYWxWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW9wdGlvbmFsVmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBvcHRpb25hbFZhbHVlLm9wdGlvbmFsIHx8XG4gICAgKHNwZWMuaXNQcmltaXRpdmVUeXBlUmVmZXJlbmNlKG9wdGlvbmFsVmFsdWUudHlwZSkgJiZcbiAgICAgIG9wdGlvbmFsVmFsdWUudHlwZS5wcmltaXRpdmUgPT09IHNwZWMuUHJpbWl0aXZlVHlwZS5BbnkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcmFtSmF2YWRvYyhcbiAgbmFtZTogc3RyaW5nLFxuICBvcHRpb25hbD86IGJvb2xlYW4sXG4gIHN1bW1hcnk/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IFsnQHBhcmFtJywgbmFtZV07XG4gIGlmIChzdW1tYXJ5KSB7XG4gICAgcGFydHMucHVzaChlbmRXaXRoUGVyaW9kKHN1bW1hcnkpKTtcbiAgfVxuICBpZiAoIW9wdGlvbmFsKSB7XG4gICAgcGFydHMucHVzaCgnVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuJyk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBlbmRXaXRoUGVyaW9kKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHMgPSBzLnRyaW1SaWdodCgpO1xuICBpZiAoIXMuZW5kc1dpdGgoJy4nKSkge1xuICAgIHJldHVybiBgJHtzfS5gO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3ZlcnJpZGVzPFQgZXh0ZW5kcyB7IHBhcmFtOiBzcGVjLlBhcmFtZXRlciB9PihcbiAgYWxsUGFyYW1zOiBUW10sXG4pOiBJdGVyYWJsZTxUW10+IHtcbiAgcmV0dXJuIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogZnVuY3Rpb24qICgpIHtcbiAgICAgIHlpZWxkIGFsbFBhcmFtcztcbiAgICAgIHdoaWxlIChhbGxQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBsYXN0UGFyYW0gPSBhbGxQYXJhbXNbYWxsUGFyYW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoIWxhc3RQYXJhbS5wYXJhbS52YXJpYWRpYyAmJiAhbGFzdFBhcmFtLnBhcmFtLm9wdGlvbmFsKSB7XG4gICAgICAgICAgLy8gTmVpdGhlciB2YXJpYWRpYyBub3Igb3B0aW9uYWwgLS0gd2UncmUgZG9uZSBoZXJlIVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhbGxQYXJhbXMgPSBhbGxQYXJhbXMuc2xpY2UoMCwgYWxsUGFyYW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICAvLyBJZiB0aGUgbGFzdFBhcmFtIHdhcyB2YXJpYWRpYywgd2Ugc2hvdWxkbid0IGdlbmVyYXRlIGFuIG92ZXJyaWRlIHdpdGhvdXQgaXQgb25seS5cbiAgICAgICAgaWYgKGxhc3RQYXJhbS5wYXJhbS5vcHRpb25hbCkge1xuICAgICAgICAgIHlpZWxkIGFsbFBhcmFtcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbnR5cGUgQXNzZW1ibHlMaWtlID0gc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb24gJiB7IG5hbWU6IHN0cmluZyB9O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbmF0aXZlIHBhY2thZ2UgbmFtZSBmcm9tIGFuIGFzc2VtYmx5XG4gKi9cbmZ1bmN0aW9uIHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc206IEFzc2VtYmx5TGlrZSkge1xuICBjb25zdCBqYXZhUGFja2FnZSA9IGFzc20udGFyZ2V0cz8uamF2YT8ucGFja2FnZTtcbiAgaWYgKCFqYXZhUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgbW9kdWxlICR7YXNzbS5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgamF2YS5wYWNrYWdlIHNldHRpbmdgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGphdmFQYWNrYWdlO1xufVxuXG4vKipcbiAqIEFuYWx5emVzIGFuZCB0cmFuc2xhdGVzIGEganNpaSBGUU4gdG8gSmF2YSBjb21wb25lbnRzXG4gKlxuICogVGhlIEZRTiBjYW4gYmUgb2YgdGhlIGFzc2VtYmx5LCBhIHN1Ym1vZHVsZSwgb3IgYSB0eXBlLlxuICpcbiAqIEFueSB0eXBlIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOlxuICpcbiAqIC0gTG9jYXRlZCBpbiB6ZXJvIG9yIG1vcmUgbmVzdGVkIHN1Ym1vZHVsZXMuIEFueSBvZiB0aGVzZSBjYW4gaGF2ZSBhIEphdmFcbiAqICAgcGFja2FnZSBuYW1lIGFzc2lnbmVkLS1pZiBub25lLCB0aGUgbmFtZSBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnlcbiAqICAgc25ha2UgY2FzaW5nLiBBdCBsZWFzdCB0aGUgYXNzZW1ibHkgbXVzdCBoYXZlIGEgSmF2YSBwYWNrYWdlIG5hbWUgYXNzaWduZWQuXG4gKiAtIExvY2F0ZWQgaW4gemVybyBvciBtb3JlIG5lc3RlZCB0eXBlcyAoY2xhc3NlcykuXG4gKlxuICogRmluZCB1cCB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdW50aWwgd2UgZmluZCBhIHN1Ym1vZHVsZSAob3IgdGhlIGFzc2VtYmx5XG4gKiBpdHNlbGYpIHRoYXQgaGFzIGFuIGV4cGxpY2l0IEphdmEgcGFja2FnZSBuYW1lIGRlZmluZWQuXG4gKlxuICogQXBwZW5kIGFsbCB0aGUgbmFtZXNwYWNlcyB0aGF0IHdlIGNyb3NzZWQgdGhhdCBkaWRuJ3QgaGF2ZSBhIHBhY2thZ2UgbmFtZSBkZWZpbmVkLlxuICpcbiAqIFJldHVybnMgdGhlIEphdmEgcGFja2FnZSBuYW1lIGRldGVybWluZWQgdGhpcyB3YXksIGFzIHdlbGwgYXMgdGhlIGhpZXJhcmNoeSBvZiB0eXBlXG4gKiBuYW1lcyBpbnNpZGUgdGhlIHBhY2thZ2UuIGB0eXBlTmFtZXNgIG1heSBiZSBtaXNzaW5nIG9yIGVtcHR5IGlmIHRoZSBGUU4gaW5kaWNhdGVkXG4gKiB0aGUgYXNzZW1ibHkgb3IgYSBzdWJtb2R1bGUsIGNvbnRhaW5zIDEgZWxlbWVudCBpZiB0aGUgRlFOIGluZGljYXRlZCBhIHRvcC1sZXZlbCB0eXBlLFxuICogbXVsdGlwbGUgZWxlbWVudHMgaWYgdGhlIEZRTiBpbmRpY2F0ZWQgYSBuZXN0ZWQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlRnFuKFxuICBhc3NtOiBBc3NlbWJseUxpa2UsXG4gIG9yaWdpbmFsRnFuOiBzdHJpbmcsXG4pOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGltcGxpY2l0UGFja2FnZU5hbWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAvLyBXZSB3b3JrIG91cnNlbHZlcyB1cHdhcmQgdGhyb3VnaCB0aGUgRlFOIHVudGlsIHdlJ3ZlIGZvdW5kIGFuIGV4cGxpY2l0IHBhY2thZ2VcbiAgbGV0IHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVGcm9tQXNzZW1ibHkoYXNzbSk7XG4gIGxldCBmcW4gPSBvcmlnaW5hbEZxbjtcbiAgd2hpbGUgKGZxbiAhPT0gJycgJiYgZnFuICE9PSBhc3NtLm5hbWUpIHtcbiAgICBjb25zdCBbcGFyZW50RnFuLCBsYXN0UGFydF0gPSBzcGxpdE5hbWVzcGFjZShmcW4pO1xuXG4gICAgY29uc3Qgc3VibW9kdWxlID0gYXNzbS5zdWJtb2R1bGVzPy5bZnFuXTtcbiAgICBpZiAoc3VibW9kdWxlKSB7XG4gICAgICBjb25zdCBleHBsaWNpdFBhY2thZ2UgPSBzdWJtb2R1bGUudGFyZ2V0cz8uamF2YT8ucGFja2FnZTtcbiAgICAgIGlmIChleHBsaWNpdFBhY2thZ2UpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBleHBsaWNpdFBhY2thZ2U7XG4gICAgICAgIC8vIFdlIGNhbiBzdG9wIHJlY3Vyc2luZywgdHlwZXMgY2Fubm90IGJlIHRoZSBwYXJlbnQgb2YgYSBtb2R1bGUgYW5kIG5vdGhpbmcgdXB3YXJkcyBjYW4gY2hhbmdlXG4gICAgICAgIC8vIHRoZSBwYWNrYWdlIG5hbWUgYW55bW9yZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGltcGxpY2l0UGFja2FnZU5hbWVzLnVuc2hpZnQoYC4ke3RvU25ha2VDYXNlKGxhc3RQYXJ0KX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgaXQncyBub3QgYSBzdWJtb2R1bGUsIGl0IG11c3QgYmUgYSB0eXBlLlxuICAgICAgdHlwZU5hbWVzLnVuc2hpZnQobGFzdFBhcnQpO1xuICAgIH1cblxuICAgIGZxbiA9IHBhcmVudEZxbjtcbiAgfVxuICBpZiAoZnFuID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgJyR7b3JpZ2luYWxGcW59JyBpbnNpZGUgJyR7YXNzbS5uYW1lfSdgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHBhY2thZ2VOYW1lOiBgJHtwYWNrYWdlTmFtZX0ke2ltcGxpY2l0UGFja2FnZU5hbWVzLmpvaW4oJycpfWAsXG4gICAgdHlwZU5hbWVzLFxuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgYXNzZW1ibHkgZXhwb3NlcyB0aGUgXCJoYXNEZWZhdWx0SW50ZXJmYWNlc1wiXG4gKiBqc2lpLXBhY21hayBmZWF0dXJlIGZsYWcuXG4gKlxuICogQHBhcmFtIGFzc2VtYmx5IHRoZSBhc3NlbWJseSB0aGF0IGlzIHRlc3RlZFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIEpzaWkkRGVmYXVsdCBpbnRlcmZhY2VzIGNhbiBiZSB1c2VkXG4gKi9cbmZ1bmN0aW9uIGhhc0RlZmF1bHRJbnRlcmZhY2VzKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWFzc2VtYmx5Lm1ldGFkYXRhPy5qc2lpPy5wYWNtYWs/Lmhhc0RlZmF1bHRJbnRlcmZhY2VzO1xufVxuXG4vKipcbiAqIFdoZWNrcyB3aGV0aGVyIGEgbmFtZSBjb3JyZXNwb25kcyB0byBhIG1ldGhvZCBvbiBgamF2YS5sYW5nLk9iamVjdGAuIEl0IGlzIG5vdFxuICogcG9zc2libGUgdG8gZW1pdCBkZWZhdWx0IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhvc2UgbmFtZXMgYmVjYXVzZVxuICogdGhlc2Ugd291bGQgYWx3YXlzIGJlIHJlcGxhY2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbnMgb24gYE9iamVjdGAuXG4gKlxuICogQHBhcmFtIG5hbWUgdGhlIGNoZWNrZWQgbmFtZVxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2Fubm90IGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBuYW1lLlxuICovXG5mdW5jdGlvbiBpc0phdmFMYW5nT2JqZWN0TWV0aG9kTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEpBVkFfTEFOR19PQkpFQ1RfTUVUSE9EX05BTUVTLmhhcyhuYW1lKTtcbn1cbmNvbnN0IEpBVkFfTEFOR19PQkpFQ1RfTUVUSE9EX05BTUVTID0gbmV3IFNldChbXG4gICdjbG9uZScsXG4gICdlcXVhbHMnLFxuICAnZmluYWxpemUnLFxuICAnZ2V0Q2xhc3MnLFxuICAnaGFzaENvZGUnLFxuICAnbm90aWZ5JyxcbiAgJ25vdGlmeUFsbCcsXG4gICd0b1N0cmluZycsXG4gICd3YWl0Jyxcbl0pO1xuXG4vKipcbiAqIEluIGEgZG90dGVkIHN0cmluZywgc3RyaXAgb2ZmIHRoZSBsYXN0IGRvdHRlZCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gc3BsaXROYW1lc3BhY2UobnM6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBjb25zdCBkb3QgPSBucy5sYXN0SW5kZXhPZignLicpO1xuICBpZiAoZG90ID09PSAtMSkge1xuICAgIHJldHVybiBbJycsIG5zXTtcbiAgfVxuICByZXR1cm4gW25zLnN1YnN0cigwLCBkb3QpLCBucy5zdWJzdHIoZG90ICsgMSldO1xufVxuIl19
2379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImphdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLCtCQUErQjtBQUMvQix5REFBdUQ7QUFDdkQsK0JBQStCO0FBRS9CLCtDQU1zQjtBQUN0Qiw2QkFBNkI7QUFDN0IseUNBQXlDO0FBR3pDLDRDQUF5QztBQUN6QyxzQ0FBc0M7QUFDdEMsZ0RBQWtEO0FBRWxELHNDQUttQjtBQUNuQixrQ0FBNkQ7QUFDN0Qsd0NBQW1EO0FBQ25ELHFDQUE2RDtBQUM3RCxtREFBd0U7QUFFeEUsbUNBQXFDO0FBRXJDLG9HQUFvRztBQUNwRyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVyRCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxvQ0FBb0MsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxxQ0FBcUMsQ0FBQztBQUMzRCxNQUFNLFlBQVksR0FBRyxnQ0FBZ0MsQ0FBQztBQUV0RDs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsV0FBVztJQUd0QixZQUNtQixPQUE4QixFQUM5QixPQUFxQjtRQURyQixZQUFPLEdBQVAsT0FBTyxDQUF1QjtRQUM5QixZQUFPLEdBQVAsT0FBTyxDQUFjO1FBSnZCLGVBQVUsR0FBRyxNQUFNLENBQUM7SUFLbEMsQ0FBQztJQUVHLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDekIsdURBQXVEO1lBQ3ZELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsTUFB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Q0FBQyxDQUFDO0FBQ2pELENBQUM7QUFDRCxNQUFNLDZCQUE2QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzVDLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gsU0FBUyxjQUFjLENBQUMsRUFBVTtJQUNoQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2QsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUNqQjtJQUNELE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgY2xvbmUgZnJvbSAnY2xvbmUnO1xuaW1wb3J0IHsgdG9TbmFrZUNhc2UgfSBmcm9tICdjb2RlbWFrZXIvbGliL2Nhc2UtdXRpbHMnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHtcbiAgUm9zZXR0YSxcbiAgVGFyZ2V0TGFuZ3VhZ2UsXG4gIGVuZm9yY2VzU3RyaWN0TW9kZSxcbiAgbWFya0Rvd25Ub0phdmFEb2MsXG4gIEFwaUxvY2F0aW9uLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHhtbGJ1aWxkZXIgZnJvbSAneG1sYnVpbGRlcic7XG5cbmltcG9ydCB7IFRhcmdldEJ1aWxkZXIsIEJ1aWxkT3B0aW9ucyB9IGZyb20gJy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgR2VuZXJhdG9yIH0gZnJvbSAnLi4vZ2VuZXJhdG9yJztcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBqc2lpVG9QYXNjYWxDYXNlIH0gZnJvbSAnLi4vbmFtaW5nLXV0aWwnO1xuaW1wb3J0IHsgSnNpaU1vZHVsZSB9IGZyb20gJy4uL3BhY2thZ2luZyc7XG5pbXBvcnQge1xuICBQYWNrYWdlSW5mbyxcbiAgVGFyZ2V0LFxuICBmaW5kTG9jYWxCdWlsZERpcnMsXG4gIFRhcmdldE9wdGlvbnMsXG59IGZyb20gJy4uL3RhcmdldCc7XG5pbXBvcnQgeyBzaGVsbCwgU2NyYXRjaCwgc2x1Z2lmeSwgc2V0RXh0ZW5kIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBWRVJTSU9OLCBWRVJTSU9OX0RFU0MgfSBmcm9tICcuLi92ZXJzaW9uJztcbmltcG9ydCB7IHN0YWJpbGl0eVByZWZpeEZvciwgcmVuZGVyU3VtbWFyeSB9IGZyb20gJy4vX3V0aWxzJztcbmltcG9ydCB7IHRvTWF2ZW5WZXJzaW9uUmFuZ2UsIHRvUmVsZWFzZVZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24tdXRpbHMnO1xuXG5pbXBvcnQgeyBUYXJnZXROYW1lIH0gZnJvbSAnLi9pbmRleCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHNwZHhMaWNlbnNlTGlzdCA9IHJlcXVpcmUoJ3NwZHgtbGljZW5zZS1saXN0Jyk7XG5cbmNvbnN0IEJVSUxERVJfQ0xBU1NfTkFNRSA9ICdCdWlsZGVyJztcblxuY29uc3QgQU5OX05PVF9OVUxMID0gJ0BvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGwnO1xuY29uc3QgQU5OX05VTExBQkxFID0gJ0BvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlJztcbmNvbnN0IEFOTl9JTlRFUk5BTCA9ICdAc29mdHdhcmUuYW1hem9uLmpzaWkuSW50ZXJuYWwnO1xuXG4vKipcbiAqIEJ1aWxkIEphdmEgcGFja2FnZXMgYWxsIHRvZ2V0aGVyLCBieSBnZW5lcmF0aW5nIGFuIGFnZ3JlZ2F0ZSBQT01cbiAqXG4gKiBUaGlzIHdpbGwgbWFrZSB0aGUgSmF2YSBidWlsZCBhIGxvdCBtb3JlIGVmZmljaWVudCAofjMwMCUpLlxuICpcbiAqIERvIHRoaXMgYnkgY29weWluZyB0aGUgY29kZSBpbnRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgZ2VuZXJhdGluZyBhbiBhZ2dyZWdhdGVcbiAqIFBPTSB0aGVyZSwgYW5kIHRoZW4gY29weWluZyB0aGUgYXJ0aWZhY3RzIGJhY2sgaW50byB0aGUgcmVzcGVjdGl2ZSBvdXRwdXRcbiAqIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgY2xhc3MgSmF2YUJ1aWxkZXIgaW1wbGVtZW50cyBUYXJnZXRCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0YXJnZXROYW1lID0gJ2phdmEnO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXM6IHJlYWRvbmx5IEpzaWlNb2R1bGVbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBhc3luYyBidWlsZE1vZHVsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvZGVPbmx5KSB7XG4gICAgICAvLyBTaW1wbGUsIGp1c3QgZ2VuZXJhdGUgY29kZSB0byByZXNwZWN0aXZlIG91dHB1dCBkaXJzXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGhpcy5tb2R1bGVzLm1hcCgobW9kdWxlKSA9PlxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb2R1bGVDb2RlKFxuICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgdGhpcy5vdXRwdXREaXIobW9kdWxlLm91dHB1dERpcmVjdG9yeSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIG1ha2UgYSBzaW5nbGUgdGVtcGRpciB0byBob2xkIGFsbCBzb3VyY2VzLCBidWlsZCB0aGVtIHRvZ2V0aGVyIGFuZCBjb3B5IHRoZW0gYmFjayBvdXRcbiAgICBjb25zdCBzY3JhdGNoRGlyczogQXJyYXk8U2NyYXRjaDxhbnk+PiA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW1wU291cmNlRGlyID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUFnZ3JlZ2F0ZVNvdXJjZURpcihcbiAgICAgICAgdGhpcy5tb2R1bGVzLFxuICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICApO1xuICAgICAgc2NyYXRjaERpcnMucHVzaCh0ZW1wU291cmNlRGlyKTtcblxuICAgICAgLy8gTmVlZCBhbnkgb2xkIG1vZHVsZSBvYmplY3QgdG8gbWFrZSBhIHRhcmdldCB0byBiZSBhYmxlIHRvIGludm9rZSBidWlsZCwgdGhvdWdoIG5vbmUgb2YgaXRzIHNldHRpbmdzXG4gICAgICAvLyB3aWxsIGJlIHVzZWQuXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1ha2VUYXJnZXQodGhpcy5tb2R1bGVzWzBdLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgY29uc3QgdGVtcE91dHB1dERpciA9IGF3YWl0IFNjcmF0Y2gubWFrZShhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgIGxvZ2dpbmcuZGVidWcoYEJ1aWxkaW5nIEphdmEgY29kZSB0byAke2Rpcn1gKTtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmJ1aWxkKHRlbXBTb3VyY2VEaXIuZGlyZWN0b3J5LCBkaXIpO1xuICAgICAgfSk7XG4gICAgICBzY3JhdGNoRGlycy5wdXNoKHRlbXBPdXRwdXREaXIpO1xuXG4gICAgICBhd2FpdCB0aGlzLmNvcHlPdXRBcnRpZmFjdHMoXG4gICAgICAgIHRlbXBPdXRwdXREaXIuZGlyZWN0b3J5LFxuICAgICAgICB0ZW1wU291cmNlRGlyLm9iamVjdCxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xlYW4pIHtcbiAgICAgICAgYXdhaXQgU2NyYXRjaC5jbGVhbnVwQWxsKHNjcmF0Y2hEaXJzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgIGBFeGNlcHRpb24gb2NjdXJyZWQsIG5vdCBjbGVhbmluZyB1cCAke3NjcmF0Y2hEaXJzXG4gICAgICAgICAgLm1hcCgocykgPT4gcy5kaXJlY3RvcnkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNb2R1bGVDb2RlKFxuICAgIG1vZHVsZTogSnNpaU1vZHVsZSxcbiAgICBvcHRpb25zOiBCdWlsZE9wdGlvbnMsXG4gICAgd2hlcmU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tYWtlVGFyZ2V0KG1vZHVsZSwgb3B0aW9ucyk7XG4gICAgbG9nZ2luZy5kZWJ1ZyhgR2VuZXJhdGluZyBKYXZhIGNvZGUgaW50byAke3doZXJlfWApO1xuICAgIGF3YWl0IHRhcmdldC5nZW5lcmF0ZUNvZGUod2hlcmUsIG1vZHVsZS50YXJiYWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVBZ2dyZWdhdGVTb3VyY2VEaXIoXG4gICAgbW9kdWxlczogcmVhZG9ubHkgSnNpaU1vZHVsZVtdLFxuICAgIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTY3JhdGNoPFRlbXBvcmFyeUphdmFQYWNrYWdlW10+PiB7XG4gICAgcmV0dXJuIFNjcmF0Y2gubWFrZShhc3luYyAodG1wRGlyOiBzdHJpbmcpID0+IHtcbiAgICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRpbmcgYWdncmVnYXRlIEphdmEgc291cmNlIGRpciBhdCAke3RtcERpcn1gKTtcbiAgICAgIGNvbnN0IHJldDogVGVtcG9yYXJ5SmF2YVBhY2thZ2VbXSA9IFtdO1xuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRNb2R1bGVzID0gbW9kdWxlc1xuICAgICAgICAubWFwKChtb2R1bGUpID0+ICh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lOiBzbHVnaWZ5KG1vZHVsZS5uYW1lKSB9KSlcbiAgICAgICAgLm1hcCgoeyBtb2R1bGUsIHJlbGF0aXZlTmFtZSB9KSA9PiAoe1xuICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICByZWxhdGl2ZU5hbWUsXG4gICAgICAgICAgc291cmNlRGlyOiBwYXRoLmpvaW4odG1wRGlyLCByZWxhdGl2ZU5hbWUpLFxuICAgICAgICB9KSlcbiAgICAgICAgLm1hcCgoeyBtb2R1bGUsIHJlbGF0aXZlTmFtZSwgc291cmNlRGlyIH0pID0+XG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vZHVsZUNvZGUobW9kdWxlLCBvcHRpb25zLCBzb3VyY2VEaXIpLnRoZW4oKCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICAgIHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICk7XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgeyBtb2R1bGUsIHJlbGF0aXZlTmFtZSB9IG9mIGdlbmVyYXRlZE1vZHVsZXMpIHtcbiAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgIHJlbGF0aXZlU291cmNlRGlyOiByZWxhdGl2ZU5hbWUsXG4gICAgICAgICAgcmVsYXRpdmVBcnRpZmFjdHNEaXI6IG1vZHVsZUFydGlmYWN0c1N1YmRpcihtb2R1bGUpLFxuICAgICAgICAgIG91dHB1dFRhcmdldERpcmVjdG9yeTogbW9kdWxlLm91dHB1dERpcmVjdG9yeSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVBZ2dyZWdhdGVQb20oXG4gICAgICAgIHRtcERpcixcbiAgICAgICAgcmV0Lm1hcCgobSkgPT4gbS5yZWxhdGl2ZVNvdXJjZURpciksXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZU1hdmVuU2V0dGluZ3NGb3JMb2NhbERlcHModG1wRGlyKTtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVBZ2dyZWdhdGVQb20od2hlcmU6IHN0cmluZywgbW9kdWxlTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgYWdncmVnYXRlUG9tID0geG1sYnVpbGRlclxuICAgICAgLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHByb2plY3Q6IHtcbiAgICAgICAgICAgICdAeG1sbnMnOiAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJyxcbiAgICAgICAgICAgICdAeG1sbnM6eHNpJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyxcbiAgICAgICAgICAgICdAeHNpOnNjaGVtYUxvY2F0aW9uJzpcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCcsXG4gICAgICAgICAgICAnI2NvbW1lbnQnOiBbXG4gICAgICAgICAgICAgIGBHZW5lcmF0ZWQgYnkganNpaS1wYWNtYWtAJHtWRVJTSU9OX0RFU0N9IG9uICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWAsXG4gICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICBtb2RlbFZlcnNpb246ICc0LjAuMCcsXG4gICAgICAgICAgICBwYWNrYWdpbmc6ICdwb20nLFxuXG4gICAgICAgICAgICBncm91cElkOiAnc29mdHdhcmUuYW1hem9uLmpzaWknLFxuICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ2FnZ3JlZ2F0ZXBvbScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuXG4gICAgICAgICAgICBtb2R1bGVzOiB7XG4gICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlTmFtZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW5jb2Rpbmc6ICdVVEYtOCcgfSxcbiAgICAgIClcbiAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSk7XG5cbiAgICBsb2dnaW5nLmRlYnVnKGBHZW5lcmF0ZWQgJHt3aGVyZX0vcG9tLnhtbGApO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4od2hlcmUsICdwb20ueG1sJyksIGFnZ3JlZ2F0ZVBvbSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlPdXRBcnRpZmFjdHMoXG4gICAgYXJ0aWZhY3RzUm9vdDogc3RyaW5nLFxuICAgIHBhY2thZ2VzOiBUZW1wb3JhcnlKYXZhUGFja2FnZVtdLFxuICApIHtcbiAgICBsb2dnaW5nLmRlYnVnKCdDb3B5aW5nIG91dCBKYXZhIGFydGlmYWN0cycpO1xuICAgIC8vIFRoZSBhcnRpZmFjdHMgZGlyZWN0b3J5IGxvb2tzIGxpa2UgdGhpczpcbiAgICAvLyAgL3RtcC9YWFgvc29mdHdhcmUvYW1hem9uL2F3c2Nkay9zb21ldGhpbmcvdjEuMi4zXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvZWxzZS92MS4yLjNcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9lbnRpcmVseS92MS4yLjNcbiAgICAvL1xuICAgIC8vIFdlIGdldCB0aGUgJ3NvZnR3YXJlL2FtYXpvbi9hd3NjZGsvc29tZXRoaW5nJyBwYXRoIGZyb20gdGhlIHBhY2thZ2UsIGlkZW50aWZ5aW5nXG4gICAgLy8gdGhlIGZpbGVzIHdlIG5lZWQgdG8gY29weSwgaW5jbHVkaW5nIE1hdmVuIG1ldGFkYXRhLiBCdXQgd2UgbmVlZCB0byByZWNyZWF0ZVxuICAgIC8vIHRoZSB3aG9sZSBwYXRoIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LlxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlcy5tYXAoYXN5bmMgKHBrZykgPT4ge1xuICAgICAgICBjb25zdCBhcnRpZmFjdHNTb3VyY2UgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgYXJ0aWZhY3RzUm9vdCxcbiAgICAgICAgICBwa2cucmVsYXRpdmVBcnRpZmFjdHNEaXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0c0Rlc3QgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgdGhpcy5vdXRwdXREaXIocGtnLm91dHB1dFRhcmdldERpcmVjdG9yeSksXG4gICAgICAgICAgcGtnLnJlbGF0aXZlQXJ0aWZhY3RzRGlyLFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IGZzLm1rZGlycChhcnRpZmFjdHNEZXN0KTtcbiAgICAgICAgYXdhaXQgZnMuY29weShhcnRpZmFjdHNTb3VyY2UsIGFydGlmYWN0c0Rlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGUgd2hldGhlciBvciBub3QgdG8gYXBwZW5kICdqYXZhJyB0byB0aGUgZ2l2ZW4gb3V0cHV0IGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBvdXRwdXREaXIoZGVjbGFyZWREaXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VTdWJkaXJlY3RvcnlcbiAgICAgID8gcGF0aC5qb2luKGRlY2xhcmVkRGlyLCB0aGlzLnRhcmdldE5hbWUpXG4gICAgICA6IGRlY2xhcmVkRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBtYXZlbiBzZXR0aW5ncyBmaWxlIGZvciB0aGlzIGJ1aWxkLlxuICAgKiBAcGFyYW0gd2hlcmUgVGhlIGdlbmVyYXRlZCBzb3VyY2VzIGRpcmVjdG9yeS4gVGhpcyBpcyB3aGVyZSB1c2VyLnhtbCB3aWxsIGJlIHBsYWNlZC5cbiAgICogQHBhcmFtIGN1cnJlbnRPdXRwdXREaXJlY3RvcnkgVGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeS4gV2lsbCBiZSBhZGRlZCBhcyBhIGxvY2FsIG1hdmVuIHJlcG8uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTWF2ZW5TZXR0aW5nc0ZvckxvY2FsRGVwcyh3aGVyZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od2hlcmUsICd1c2VyLnhtbCcpO1xuXG4gICAgLy8gdHJhdmVyc2UgdGhlIGRlcCBncmFwaCBvZiB0aGlzIG1vZHVsZSBhbmQgZmluZCBhbGwgbW9kdWxlcyB0aGF0IGhhdmVcbiAgICAvLyBhbiA8b3V0ZGlyPi9qYXZhIGRpcmVjdG9yeS4gd2Ugd2lsbCBhZGQgdGhvc2UgYXMgbG9jYWwgbWF2ZW5cbiAgICAvLyByZXBvc2l0b3JpZXMgd2hpY2ggd2lsbCByZXNvbHZlIGluc3RlYWQgb2YgTWF2ZW4gQ2VudHJhbCBmb3IgdGhvc2VcbiAgICAvLyBtb2R1bGUuIHRoaXMgZW5hYmxlcyBidWlsZGluZyBhZ2FpbnN0IGxvY2FsIG1vZHVsZXMgKGkuZS4gaW4gbGVybmFcbiAgICAvLyByZXBvc2l0b3JpZXMgb3IgbGlua2VkIG1vZHVsZXMpLlxuICAgIGNvbnN0IGFsbERlcHNPdXRwdXREaXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCByZXNvbHZlZE1vZHVsZXMgPSB0aGlzLm1vZHVsZXMubWFwKGFzeW5jIChtb2QpID0+ICh7XG4gICAgICBtb2R1bGU6IG1vZCxcbiAgICAgIGxvY2FsQnVpbGREaXJzOiBhd2FpdCBmaW5kTG9jYWxCdWlsZERpcnMoXG4gICAgICAgIG1vZC5tb2R1bGVEaXJlY3RvcnksXG4gICAgICAgIHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICksXG4gICAgfSkpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgeyBtb2R1bGUsIGxvY2FsQnVpbGREaXJzIH0gb2YgcmVzb2x2ZWRNb2R1bGVzKSB7XG4gICAgICBzZXRFeHRlbmQoYWxsRGVwc091dHB1dERpcnMsIGxvY2FsQnVpbGREaXJzKTtcblxuICAgICAgLy8gQWxzbyBpbmNsdWRlIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgd2UncmUgYnVpbGRpbmcgdG8sIGluIGNhc2Ugd2UgYnVpbGQgbXVsdGlwbGUgcGFja2FnZXMgaW50b1xuICAgICAgLy8gdGhlIHNhbWUgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICAgIGFsbERlcHNPdXRwdXREaXJzLmFkZChcbiAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgIG1vZHVsZS5vdXRwdXREaXJlY3RvcnksXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhbmd1YWdlU3ViZGlyZWN0b3J5ID8gdGhpcy50YXJnZXROYW1lIDogJycsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2FsUmVwb3MgPSBBcnJheS5mcm9tKGFsbERlcHNPdXRwdXREaXJzKTtcblxuICAgIC8vIGlmIGphdmEtcnVudGltZSBpcyBjaGVja2VkLW91dCBhbmQgd2UgY2FuIGZpbmQgYSBsb2NhbCByZXBvc2l0b3J5LFxuICAgIC8vIGFkZCBpdCB0byB0aGUgbGlzdC5cbiAgICBjb25zdCBsb2NhbEphdmFSdW50aW1lID0gYXdhaXQgZmluZEphdmFSdW50aW1lTG9jYWxSZXBvc2l0b3J5KCk7XG4gICAgaWYgKGxvY2FsSmF2YVJ1bnRpbWUpIHtcbiAgICAgIGxvY2FsUmVwb3MucHVzaChsb2NhbEphdmFSdW50aW1lKTtcbiAgICB9XG5cbiAgICBsb2dnaW5nLmRlYnVnKCdsb2NhbCBtYXZlbiByZXBvczonLCBsb2NhbFJlcG9zKTtcblxuICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gJ2xvY2FsLWpzaWktbW9kdWxlcyc7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB4bWxidWlsZGVyXG4gICAgICAuY3JlYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICdAeG1sbnMnOiAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJyxcbiAgICAgICAgICAgICdAeG1sbnM6eHNpJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyxcbiAgICAgICAgICAgICdAeHNpOnNjaGVtYUxvY2F0aW9uJzpcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1NFVFRJTkdTLzEuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2Qvc2V0dGluZ3MtMS4wLjAueHNkJyxcbiAgICAgICAgICAgICcjY29tbWVudCc6IFtcbiAgICAgICAgICAgICAgYEdlbmVyYXRlZCBieSBqc2lpLXBhY21ha0Ake1ZFUlNJT05fREVTQ30gb24gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAvLyBEbyAqbm90KiBhdHRlbXB0IHRvIGFzayB0aGUgdXNlciBmb3Igc3R1ZmYuLi5cbiAgICAgICAgICAgIGludGVyYWN0aXZlTW9kZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBVc2UgYSBub24tZGVmYXVsdCBsb2NhbCByZXBvc2l0b3J5IHRvIGlzb2xhdGUgZnJvbSBjYWNoZWQgYXJ0aWZhY3RzLi4uXG4gICAgICAgICAgICBsb2NhbFJlcG9zaXRvcnk6IHBhdGgucmVzb2x2ZSh3aGVyZSwgJy5tMicsICdyZXBvc2l0b3J5JyksXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBsb2NhdGlvbnMgb2YgbG9jYWxseS1zb3VyY2VkIGRlcGVuZGVuY2llc1xuICAgICAgICAgICAgcHJvZmlsZXM6IHtcbiAgICAgICAgICAgICAgcHJvZmlsZToge1xuICAgICAgICAgICAgICAgIGlkOiBwcm9maWxlTmFtZSxcbiAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXM6IHtcbiAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnk6IGxvY2FsUmVwb3MubWFwKChyZXBvKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcmVwby5yZXBsYWNlKC9bXFxcXC86XCI8Pnw/Kl0vZywgJyQnKSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBgZmlsZTovLyR7cmVwb31gLFxuICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aXZlUHJvZmlsZXM6IHtcbiAgICAgICAgICAgICAgYWN0aXZlUHJvZmlsZTogcHJvZmlsZU5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW5jb2Rpbmc6ICdVVEYtOCcgfSxcbiAgICAgIClcbiAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSk7XG5cbiAgICBsb2dnaW5nLmRlYnVnKGBHZW5lcmF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIHNldHRpbmdzKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIG1ha2VUYXJnZXQobW9kdWxlOiBKc2lpTW9kdWxlLCBvcHRpb25zOiBCdWlsZE9wdGlvbnMpOiBUYXJnZXQge1xuICAgIHJldHVybiBuZXcgSmF2YSh7XG4gICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICBwYWNrYWdlRGlyOiBtb2R1bGUubW9kdWxlRGlyZWN0b3J5LFxuICAgICAgYXNzZW1ibHk6IG1vZHVsZS5hc3NlbWJseSxcbiAgICAgIGZpbmdlcnByaW50OiBvcHRpb25zLmZpbmdlcnByaW50LFxuICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2UsXG4gICAgICBhcmd1bWVudHM6IG9wdGlvbnMuYXJndW1lbnRzLFxuICAgICAgcm9zZXR0YTogb3B0aW9ucy5yb3NldHRhLFxuICAgIH0pO1xuICB9XG59XG5cbmludGVyZmFjZSBUZW1wb3JhcnlKYXZhUGFja2FnZSB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc291cmNlcyBhcmUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdClcbiAgICovXG4gIHJlbGF0aXZlU291cmNlRGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBhcnRpZmFjdHMgd2lsbCBiZSBzdG9yZWQgYWZ0ZXIgYnVpbGQgKHJlbGF0aXZlIHRvIGJ1aWxkIGRpcilcbiAgICovXG4gIHJlbGF0aXZlQXJ0aWZhY3RzRGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBhcnRpZmFjdHMgb3VnaHQgdG8gZ28gZm9yIHRoaXMgcGFydGljdWxhciBtb2R1bGVcbiAgICovXG4gIG91dHB1dFRhcmdldERpcmVjdG9yeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgc3ViZGlyZWN0b3J5IG9mIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHdoZXJlIHRoZSBhcnRpZmFjdHMgZm9yIHRoaXMgcGFydGljdWxhciBwYWNrYWdlIGFyZSBwcm9kdWNlZFxuICovXG5mdW5jdGlvbiBtb2R1bGVBcnRpZmFjdHNTdWJkaXIobW9kdWxlOiBKc2lpTW9kdWxlKSB7XG4gIGNvbnN0IGdyb3VwSWQgPSBtb2R1bGUuYXNzZW1ibHkudGFyZ2V0cyEuamF2YSEubWF2ZW4uZ3JvdXBJZDtcbiAgY29uc3QgYXJ0aWZhY3RJZCA9IG1vZHVsZS5hc3NlbWJseS50YXJnZXRzIS5qYXZhIS5tYXZlbi5hcnRpZmFjdElkO1xuICByZXR1cm4gYCR7Z3JvdXBJZC5yZXBsYWNlKC9cXC4vZywgJy8nKX0vJHthcnRpZmFjdElkfWA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmEgZXh0ZW5kcyBUYXJnZXQge1xuICBwdWJsaWMgc3RhdGljIHRvUGFja2FnZUluZm9zKGFzc206IHNwZWMuQXNzZW1ibHkpOiB7XG4gICAgW2xhbmd1YWdlOiBzdHJpbmddOiBQYWNrYWdlSW5mbztcbiAgfSB7XG4gICAgY29uc3QgZ3JvdXBJZCA9IGFzc20udGFyZ2V0cyEuamF2YSEubWF2ZW4uZ3JvdXBJZDtcbiAgICBjb25zdCBhcnRpZmFjdElkID0gYXNzbS50YXJnZXRzIS5qYXZhIS5tYXZlbi5hcnRpZmFjdElkO1xuICAgIGNvbnN0IHJlbGVhc2VWZXJzaW9uID0gdG9SZWxlYXNlVmVyc2lvbihhc3NtLnZlcnNpb24sIFRhcmdldE5hbWUuSkFWQSk7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMi8ke2dyb3VwSWQucmVwbGFjZShcbiAgICAgIC9cXC4vZyxcbiAgICAgICcvJyxcbiAgICApfS8ke2FydGlmYWN0SWR9LyR7YXNzbS52ZXJzaW9ufS9gO1xuICAgIHJldHVybiB7XG4gICAgICBqYXZhOiB7XG4gICAgICAgIHJlcG9zaXRvcnk6ICdNYXZlbiBDZW50cmFsJyxcbiAgICAgICAgdXJsLFxuICAgICAgICB1c2FnZToge1xuICAgICAgICAgICdBcGFjaGUgTWF2ZW4nOiB7XG4gICAgICAgICAgICBsYW5ndWFnZTogJ3htbCcsXG4gICAgICAgICAgICBjb2RlOiB4bWxidWlsZGVyXG4gICAgICAgICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3k6IHsgZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgdmVyc2lvbjogcmVsZWFzZVZlcnNpb24gfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAucmVwbGFjZSgvPFxcP1xccyp4bWwoXFxzW14+XSspPz5cXHMqL20sICcnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICdBcGFjaGUgQnVpbGRyJzogYCcke2dyb3VwSWR9OiR7YXJ0aWZhY3RJZH06amFyOiR7cmVsZWFzZVZlcnNpb259J2AsXG4gICAgICAgICAgJ0FwYWNoZSBJdnknOiB7XG4gICAgICAgICAgICBsYW5ndWFnZTogJ3htbCcsXG4gICAgICAgICAgICBjb2RlOiB4bWxidWlsZGVyXG4gICAgICAgICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3k6IHtcbiAgICAgICAgICAgICAgICAgICdAZ3JvdXBJZCc6IGdyb3VwSWQsXG4gICAgICAgICAgICAgICAgICAnQG5hbWUnOiBhcnRpZmFjdElkLFxuICAgICAgICAgICAgICAgICAgJ0ByZXYnOiByZWxlYXNlVmVyc2lvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZW5kKHsgcHJldHR5OiB0cnVlIH0pXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC88XFw/XFxzKnhtbChcXHNbXj5dKyk/PlxccyovbSwgJycpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0dyb292eSBHcmFwZSc6IGBAR3JhcGVzKFxcbkBHcmFiKGdyb3VwPScke2dyb3VwSWR9JywgbW9kdWxlPScke2FydGlmYWN0SWR9JywgdmVyc2lvbj0nJHtyZWxlYXNlVmVyc2lvbn0nKVxcbilgLFxuICAgICAgICAgICdHcmFkbGUgLyBHcmFpbHMnOiBgY29tcGlsZSAnJHtncm91cElkfToke2FydGlmYWN0SWR9OiR7cmVsZWFzZVZlcnNpb259J2AsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvTmF0aXZlUmVmZXJlbmNlKHR5cGU6IHNwZWMuVHlwZSwgb3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgWywgLi4ubmFtZV0gPSB0eXBlLmZxbi5zcGxpdCgnLicpO1xuICAgIHJldHVybiB7IGphdmE6IGBpbXBvcnQgJHtbb3B0aW9ucy5wYWNrYWdlLCAuLi5uYW1lXS5qb2luKCcuJyl9O2AgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBnZW5lcmF0b3I6IEphdmFHZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IEphdmFHZW5lcmF0b3Iob3B0aW9ucy5yb3NldHRhKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBidWlsZChzb3VyY2VEaXI6IHN0cmluZywgb3V0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBgZmlsZTovLyR7b3V0RGlyfWA7XG4gICAgY29uc3QgbXZuQXJndW1lbnRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBPYmplY3Qua2V5cyh0aGlzLmFyZ3VtZW50cykpIHtcbiAgICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoJ212bi0nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG12bkFyZ3VtZW50cy5wdXNoKGAtLSR7YXJnLnNsaWNlKDQpfWApO1xuICAgICAgbXZuQXJndW1lbnRzLnB1c2godGhpcy5hcmd1bWVudHNbYXJnXS50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzaGVsbChcbiAgICAgICdtdm4nLFxuICAgICAgW1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBydW4gaW4gdmVyYm9zZSBtb2RlLCB0dXJuIG9uIHF1aWV0IG1vZGVcbiAgICAgICAgLi4uKHRoaXMuYXJndW1lbnRzLnZlcmJvc2UgPyBbXSA6IFsnLS1xdWlldCddKSxcbiAgICAgICAgJy0tYmF0Y2gtbW9kZScsXG4gICAgICAgIC4uLm12bkFyZ3VtZW50cyxcbiAgICAgICAgJ2RlcGxveScsXG4gICAgICAgIGAtRD1hbHREZXBsb3ltZW50UmVwb3NpdG9yeT1sb2NhbDo6ZGVmYXVsdDo6JHt1cmx9YCxcbiAgICAgICAgJy0tc2V0dGluZ3M9dXNlci54bWwnLFxuICAgICAgXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC8vIFR3aWRkbGUgdGhlIEpWTSBzZXR0aW5ncyBhIGxpdHRsZSBmb3IgTWF2ZW4uIERlbGF5aW5nIEpJVCBjb21waWxhdGlvblxuICAgICAgICAgIC8vIGJyaW5ncyBkb3duIE1hdmVuIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDEvM3JkICgxNS0+MTBzLCAzMC0+MjBzKVxuICAgICAgICAgIE1BVkVOX09QVFM6IGAke1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTUFWRU5fT1BUUyA/PyAnJ1xuICAgICAgICAgIH0gLVhYOitUaWVyZWRDb21waWxhdGlvbiAtWFg6VGllcmVkU3RvcEF0TGV2ZWw9MWAsXG4gICAgICAgIH0sXG4gICAgICAgIHJldHJ5OiB7IG1heEF0dGVtcHRzOiA1IH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cblxuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyAjIENPREUgR0VORVJBVE9SICNcbi8vICMjIyMjIyMjIyMjIyMjIyMjI1xuXG5jb25zdCBNT0RVTEVfQ0xBU1NfTkFNRSA9ICckTW9kdWxlJztcbmNvbnN0IElOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FID0gJ0pzaWkkUHJveHknO1xuY29uc3QgSU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRSA9ICdKc2lpJERlZmF1bHQnO1xuXG4vLyBTdHJ1Y3QgdGhhdCBzdG9yZXMgbWV0YWRhdGEgYWJvdXQgYSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkIGluIEphdmEgY29kZSBnZW5lcmF0aW9uLlxuaW50ZXJmYWNlIEphdmFQcm9wIHtcbiAgLy8gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIHByb3BlcnR5XG4gIGRvY3M/OiBzcGVjLkRvY3M7XG5cbiAgLy8gVGhlIG9yaWdpbmFsIEpTSUkgcHJvcGVydHkgc3BlYyB0aGlzIHN0cnVjdCB3YXMgZGVyaXZlZCBmcm9tXG4gIHNwZWM6IHNwZWMuUHJvcGVydHk7XG5cbiAgLy8gVGhlIG9yaWdpbmFsIEpTSUkgdHlwZSB0aGlzIHByb3BlcnR5IHdhcyBkZWZpbmVkIG9uXG4gIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlO1xuXG4gIC8vIENhbm9uaWNhbCBuYW1lIG9mIHRoZSBKYXZhIHByb3BlcnR5IChlZzogJ015UHJvcGVydHknKVxuICBwcm9wTmFtZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBvcmlnaW5hbCBjYW5vbmljYWwgbmFtZSBvZiB0aGUgSlNJSSBwcm9wZXJ0eVxuICBqc2lpTmFtZTogc3RyaW5nO1xuXG4gIC8vIEZpZWxkIG5hbWUgb2YgdGhlIEphdmEgcHJvcGVydHkgKGVnOiAnbXlQcm9wZXJ0eScpXG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBqYXZhIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSAoZWc6ICdMaXN0PFN0cmluZz4nKVxuICBmaWVsZEphdmFUeXBlOiBzdHJpbmc7XG5cbiAgLy8gVGhlIGphdmEgdHlwZSBmb3IgdGhlIHBhcmFtZXRlciAoZS5nOiAnTGlzdDw/IGV4dGVuZHMgU29tZVR5cGU+JylcbiAgcGFyYW1KYXZhVHlwZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBOYXRpdmVUeXBlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9wZXJ0eSdzIHR5cGVcbiAgZmllbGROYXRpdmVUeXBlOiBzdHJpbmc7XG5cbiAgLy8gVGhlIHJhdyBjbGFzcyB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkIGZvciBtYXJzaGFsbGluZyAoZWc6ICdMaXN0LmNsYXNzJylcbiAgZmllbGRKYXZhQ2xhc3M6IHN0cmluZztcblxuICAvLyBMaXN0IG9mIHR5cGVzIHRoYXQgdGhlIHByb3BlcnR5IGlzIGFzc2lnbmFibGUgZnJvbS4gVXNlZCB0byBvdmVybG9hZCBzZXR0ZXJzLlxuICBqYXZhVHlwZXM6IHN0cmluZ1tdO1xuXG4gIC8vIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIG9wdGlvbmFsLlxuICBudWxsYWJsZTogYm9vbGVhbjtcblxuICAvLyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiB0cmFuc2l0aXZlbHkgaW5oZXJpdGVkIGZyb20gYSBiYXNlIGNsYXNzLlxuICBpbmhlcml0ZWQ6IGJvb2xlYW47XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVhZC1vbmx5IG9uY2UgaW5pdGlhbGl6ZWQuXG4gIGltbXV0YWJsZTogYm9vbGVhbjtcbn1cblxuY2xhc3MgSmF2YUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIC8vIFdoZW4gdGhlIGNvZGUtZ2VuZXJhdG9yIG5lZWRzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGEgcHJvcGVydHkgb3IgbWV0aG9kIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBtZW1iZXIgb2YgdGhpcyBsaXN0LCB0aGUgbmFtZSB3aWxsXG4gIC8vIGJlIGF1dG9tYXRpY2FsbHkgbW9kaWZpZWQgdG8gYXZvaWQgY29tcGlsZSBlcnJvcnMuIE1vc3Qgb2YgdGhlc2UgYXJlIGphdmEgbGFuZ3VhZ2UgcmVzZXJ2ZWQga2V5d29yZHMuIEluIGFkZGl0aW9uIHRvIHRob3NlLCBhbnkga2V5d29yZHMgdGhhdFxuICAvLyBhcmUgbGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggYXV0by1nZW5lcmF0ZWQgbWV0aG9kcyBvciBwcm9wZXJ0aWVzIChlZzogJ2J1aWxkJykgYXJlIGFsc28gY29uc2lkZXJlZCByZXNlcnZlZC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVTRVJWRURfS0VZV09SRFMgPSBbXG4gICAgJ2Fic3RyYWN0JyxcbiAgICAnYXNzZXJ0JyxcbiAgICAnYm9vbGVhbicsXG4gICAgJ2JyZWFrJyxcbiAgICAnYnVpbGQnLFxuICAgICdieXRlJyxcbiAgICAnY2FzZScsXG4gICAgJ2NhdGNoJyxcbiAgICAnY2hhcicsXG4gICAgJ2NsYXNzJyxcbiAgICAnY29uc3QnLFxuICAgICdjb250aW51ZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdkb3VibGUnLFxuICAgICdkbycsXG4gICAgJ2Vsc2UnLFxuICAgICdlbnVtJyxcbiAgICAnZXh0ZW5kcycsXG4gICAgJ2ZhbHNlJyxcbiAgICAnZmluYWwnLFxuICAgICdmaW5hbGx5JyxcbiAgICAnZmxvYXQnLFxuICAgICdmb3InLFxuICAgICdnb3RvJyxcbiAgICAnaWYnLFxuICAgICdpbXBsZW1lbnRzJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW5zdGFuY2VvZicsXG4gICAgJ2ludCcsXG4gICAgJ2ludGVyZmFjZScsXG4gICAgJ2xvbmcnLFxuICAgICduYXRpdmUnLFxuICAgICduZXcnLFxuICAgICdudWxsJyxcbiAgICAncGFja2FnZScsXG4gICAgJ3ByaXZhdGUnLFxuICAgICdwcm90ZWN0ZWQnLFxuICAgICdwdWJsaWMnLFxuICAgICdyZXR1cm4nLFxuICAgICdzaG9ydCcsXG4gICAgJ3N0YXRpYycsXG4gICAgJ3N0cmljdGZwJyxcbiAgICAnc3VwZXInLFxuICAgICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLFxuICAgICd0aGlzJyxcbiAgICAndGhyb3cnLFxuICAgICd0aHJvd3MnLFxuICAgICd0cmFuc2llbnQnLFxuICAgICd0cnVlJyxcbiAgICAndHJ5JyxcbiAgICAndm9pZCcsXG4gICAgJ3ZvbGF0aWxlJyxcbiAgICAnd2hpbGUnLFxuICBdO1xuXG4gIC8qKlxuICAgKiBUdXJucyBhIHJhdyBqYXZhc2NyaXB0IHByb3BlcnR5IG5hbWUgKGVnOiAnZGVmYXVsdCcpIGludG8gYSBzYWZlIEphdmEgcHJvcGVydHkgbmFtZSAoZWc6ICdkZWZhdWx0VmFsdWUnKS5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcmF3IEpTSUkgcHJvcGVydHkgTmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXByb3BlcnR5TmFtZSkge1xuICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgICB9XG5cbiAgICBpZiAoSmF2YUdlbmVyYXRvci5SRVNFUlZFRF9LRVlXT1JEUy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICByZXR1cm4gYCR7cHJvcGVydHlOYW1lfVZhbHVlYDtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJucyBhIHJhdyBqYXZhc2NyaXB0IG1ldGhvZCBuYW1lIChlZzogJ2ltcG9ydCcpIGludG8gYSBzYWZlIEphdmEgbWV0aG9kIG5hbWUgKGVnOiAnZG9JbXBvcnQnKS5cbiAgICogQHBhcmFtIG1ldGhvZE5hbWVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNhZmVKYXZhTWV0aG9kTmFtZShtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIW1ldGhvZE5hbWUpIHtcbiAgICAgIHJldHVybiBtZXRob2ROYW1lO1xuICAgIH1cblxuICAgIGlmIChKYXZhR2VuZXJhdG9yLlJFU0VSVkVEX0tFWVdPUkRTLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XG4gICAgICByZXR1cm4gYGRvJHtqc2lpVG9QYXNjYWxDYXNlKG1ldGhvZE5hbWUpfWA7XG4gICAgfVxuICAgIHJldHVybiBtZXRob2ROYW1lO1xuICB9XG5cbiAgLyoqIElmIGZhbHNlLCBAR2VuZXJhdGVkIHdpbGwgbm90IGluY2x1ZGUgZ2VuZXJhdG9yIHZlcnNpb24gbm9yIHRpbWVzdGFtcCAqL1xuICBwcml2YXRlIGVtaXRGdWxsR2VuZXJhdG9ySW5mbz86IGJvb2xlYW47XG4gIHByaXZhdGUgbW9kdWxlQ2xhc3MhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIGFsbCB0aGUgbW9kdWxlcyBldmVyIHJlZmVyZW5jZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4gVGhlc2UgaW5jbHVkZVxuICAgKiBkaXJlY3QgZGVwZW5kZW5jaWVzIGJ1dCBjYW4gcG90ZW50aWFsbHkgYWxzbyBpbmNsdWRlIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzLCB3aGVuLFxuICAgKiBmb3IgZXhhbXBsZSwgd2UgbmVlZCB0byByZWZlciB0byB0aGVpciB0eXBlcyB3aGVuIGZsYXR0aW5nIHRoZSBjbGFzcyBoaWVyYXJjaHkgZm9yXG4gICAqIGludGVyZmFjZSBwcm94aWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWZlcmVuY2VkTW9kdWxlczoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBzcGVjLkFzc2VtYmx5Q29uZmlndXJhdGlvbjtcbiAgfSA9IHt9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvc2V0dGE6IFJvc2V0dGEpIHtcbiAgICBzdXBlcih7IGdlbmVyYXRlT3ZlcmxvYWRzRm9yTWV0aG9kV2l0aE9wdGlvbmFsczogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mbyA9IGZpbmdlcnByaW50O1xuICAgIHRoaXMubW9kdWxlQ2xhc3MgPSB0aGlzLmVtaXRNb2R1bGVGaWxlKGFzc20pO1xuXG4gICAgdGhpcy5lbWl0QXNzZW1ibHlQYWNrYWdlSW5mbyhhc3NtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIGZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5lbWl0TWF2ZW5Qb20oYXNzbSwgZmluZ2VycHJpbnQpO1xuICAgIGRlbGV0ZSB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mbztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBc3NlbWJseU91dHB1dERpcihtb2Q6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICBjb25zdCBkaXIgPSB0aGlzLnRvTmF0aXZlRnFuKG1vZC5uYW1lKS5yZXBsYWNlKC9cXC4vZywgJy8nKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKCdzcmMnLCAnbWFpbicsICdyZXNvdXJjZXMnLCBkaXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5DbGFzcyhjbHM6IHNwZWMuQ2xhc3NUeXBlLCBhYnN0cmFjdDogYm9vbGVhbikge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChjbHMpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoY2xzLCB7IGFwaTogJ3R5cGUnLCBmcW46IGNscy5mcW4gfSk7XG5cbiAgICBjb25zdCBjbGFzc0Jhc2UgPSB0aGlzLmdldENsYXNzQmFzZShjbHMpO1xuICAgIGNvbnN0IGV4dGVuZHNFeHByZXNzaW9uID0gY2xhc3NCYXNlID8gYCBleHRlbmRzICR7Y2xhc3NCYXNlfWAgOiAnJztcblxuICAgIGxldCBpbXBsZW1lbnRzRXhwciA9ICcnO1xuICAgIGlmIChjbHMuaW50ZXJmYWNlcz8ubGVuZ3RoID8/IDAgPiAwKSB7XG4gICAgICBpbXBsZW1lbnRzRXhwciA9IGAgaW1wbGVtZW50cyAke2Nsc1xuICAgICAgICAuaW50ZXJmYWNlcyEubWFwKCh4KSA9PiB0aGlzLnRvTmF0aXZlRnFuKHgpKVxuICAgICAgICAuam9pbignLCAnKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoY2xzKTtcbiAgICBjb25zdCBpbm5lciA9IG5lc3RlZCA/ICcgc3RhdGljJyA6ICcnO1xuICAgIGNvbnN0IGFic1ByZWZpeCA9IGFic3RyYWN0ID8gJyBhYnN0cmFjdCcgOiAnJztcblxuICAgIGlmICghbmVzdGVkKSB7XG4gICAgICB0aGlzLmVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkobW9kdWxlID0gJHt0aGlzLm1vZHVsZUNsYXNzfS5jbGFzcywgZnFuID0gXCIke2Nscy5mcW59XCIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljJHtpbm5lcn0ke2Fic1ByZWZpeH0gY2xhc3MgJHtjbHMubmFtZX0ke2V4dGVuZHNFeHByZXNzaW9ufSR7aW1wbGVtZW50c0V4cHJ9YCxcbiAgICApO1xuXG4gICAgdGhpcy5lbWl0SnNpaUluaXRpYWxpemVycyhjbHMpO1xuICAgIHRoaXMuZW1pdFN0YXRpY0luaXRpYWxpemVyKGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRDbGFzcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgaWYgKGNscy5hYnN0cmFjdCkge1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LmZpbmRUeXBlKGNscy5mcW4pIGFzIHJlZmxlY3QuQ2xhc3NUeXBlO1xuICAgICAgdGhpcy5lbWl0UHJveHkodHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENsYXNzQnVpbGRlcihjbHMpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdGlhbGl6ZXIoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLkluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIC8vIElmIG5lZWRlZCwgcGF0Y2hpbmcgdXAgdGhlIGRvY3VtZW50YXRpb24gdG8gcG9pbnQgdXNlcnMgYXQgdGhlIGJ1aWxkZXIgcGF0dGVyblxuICAgIHRoaXMuYWRkSmF2YURvY3MobWV0aG9kLCB7IGFwaTogJ2luaXRpYWxpemVyJywgZnFuOiBjbHMuZnFuIH0pO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKG1ldGhvZCk7XG5cbiAgICAvLyBBYnN0cmFjdCBjbGFzc2VzIHNob3VsZCBoYXZlIHByb3RlY3RlZCBpbml0aWFsaXplcnNcbiAgICBjb25zdCBpbml0aWFsaXplckFjY2Vzc0xldmVsID0gY2xzLmFic3RyYWN0XG4gICAgICA/ICdwcm90ZWN0ZWQnXG4gICAgICA6IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgJHtpbml0aWFsaXplckFjY2Vzc0xldmVsfSAke2Nscy5uYW1lfSgke3RoaXMucmVuZGVyTWV0aG9kUGFyYW1ldGVycyhcbiAgICAgICAgbWV0aG9kLFxuICAgICAgKX0pYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ3N1cGVyKHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuSW5pdGlhbGl6YXRpb25Nb2RlLkpTSUkpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpRW5naW5lLmdldEluc3RhbmNlKCkuY3JlYXRlTmV3T2JqZWN0KHRoaXMke3RoaXMucmVuZGVyTWV0aG9kQ2FsbEFyZ3VtZW50cyhcbiAgICAgICAgbWV0aG9kLFxuICAgICAgKX0pO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdGlhbGl6ZXJPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxJbml0aWFsaXplcjogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMub25Jbml0aWFsaXplcihjbHMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZpZWxkKFxuICAgIF9jbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIF9wcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIF91bmlvbj86IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGlmIChwcm9wLmNvbnN0KSB7XG4gICAgICB0aGlzLmVtaXRDb25zdFByb3BlcnR5KGNscywgcHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCwgY2xzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2luY2Ugd2UgZXhwYW5kIHRoZSB1bmlvbiBzZXR0ZXJzLCB3ZSB3aWxsIHVzZSB0aGlzIGV2ZW50IHRvIG9ubHkgZW1pdCB0aGUgZ2V0dGVyIHdoaWNoIHJldHVybnMgYW4gT2JqZWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kT3ZlcmxvYWQoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5vbk1ldGhvZChjbHMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZChjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgdGhpcy5lbWl0TWV0aG9kKGNscywgbWV0aG9kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZE92ZXJsb2FkKFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoZW5tKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKGVubSwgeyBhcGk6ICd0eXBlJywgZnFuOiBlbm0uZnFuIH0pO1xuICAgIGlmICghdGhpcy5pc05lc3RlZChlbm0pKSB7XG4gICAgICB0aGlzLmVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGVubSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkobW9kdWxlID0gJHt0aGlzLm1vZHVsZUNsYXNzfS5jbGFzcywgZnFuID0gXCIke2VubS5mcW59XCIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBlbnVtICR7ZW5tLm5hbWV9YCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRW5kRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoZW5tKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25FbnVtTWVtYmVyKHBhcmVudFR5cGU6IHNwZWMuRW51bVR5cGUsIG1lbWJlcjogc3BlYy5FbnVtTWVtYmVyKSB7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZW1iZXIsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IHBhcmVudFR5cGUuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogbWVtYmVyLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMobWVtYmVyKTtcbiAgICB0aGlzLmNvZGUubGluZShgJHttZW1iZXIubmFtZX0sYCk7XG4gIH1cblxuICAvKipcbiAgICogTmFtZXNwYWNlcyBhcmUgaGFuZGxlZCBpbXBsaWNpdGx5IGJ5IG9uQmVnaW5DbGFzcygpLlxuICAgKlxuICAgKiBPbmx5IGVtaXQgcGFja2FnZS1pbmZvIGluIGNhc2UgdGhpcyBpcyBhIHN1Ym1vZHVsZVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQmVnaW5OYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuYXNzZW1ibHkuc3VibW9kdWxlcz8uW25zXTtcbiAgICBpZiAoc3VibW9kdWxlKSB7XG4gICAgICB0aGlzLmVtaXRTdWJtb2R1bGVQYWNrYWdlSW5mbyh0aGlzLmFzc2VtYmx5LCBucyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKF9uczogc3RyaW5nKSB7XG4gICAgLyogbm9vcCAqL1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5JbnRlcmZhY2UoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoaWZjKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKGlmYywgeyBhcGk6ICd0eXBlJywgZnFuOiBpZmMuZnFuIH0pO1xuXG4gICAgLy8gYWxsIGludGVyZmFjZXMgYWx3YXlzIGV4dGVuZCBKc2lpSW50ZXJmYWNlIHNvIHdlIGNhbiBpZGVudGlmeSB0aGF0IGl0IGlzIGEganNpaSBpbnRlcmZhY2UuXG4gICAgY29uc3QgaW50ZXJmYWNlcyA9IGlmYy5pbnRlcmZhY2VzID8/IFtdO1xuICAgIGNvbnN0IGJhc2VzID0gW1xuICAgICAgJ3NvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlTZXJpYWxpemFibGUnLFxuICAgICAgLi4uaW50ZXJmYWNlcy5tYXAoKHgpID0+IHRoaXMudG9OYXRpdmVGcW4oeCkpLFxuICAgIF0uam9pbignLCAnKTtcblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoaWZjKTtcbiAgICBjb25zdCBpbm5lciA9IG5lc3RlZCA/ICcgc3RhdGljJyA6ICcnO1xuICAgIGlmICghbmVzdGVkKSB7XG4gICAgICB0aGlzLmVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYEBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpKG1vZHVsZSA9ICR7dGhpcy5tb2R1bGVDbGFzc30uY2xhc3MsIGZxbiA9IFwiJHtpZmMuZnFufVwiKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaS5Qcm94eSgke2lmYy5uYW1lfS4ke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfS5jbGFzcylgLFxuICAgICk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoaWZjKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyR7aW5uZXJ9IGludGVyZmFjZSAke2lmYy5uYW1lfSBleHRlbmRzICR7YmFzZXN9YCxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kSW50ZXJmYWNlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgdGhpcy5lbWl0TXVsdGlwbHlJbmhlcml0ZWRPcHRpb25hbFByb3BlcnRpZXMoaWZjKTtcblxuICAgIGlmIChpZmMuZGF0YXR5cGUpIHtcbiAgICAgIHRoaXMuZW1pdERhdGFUeXBlKGlmYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnJlZmxlY3RBc3NlbWJseS5maW5kVHlwZShcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICkgYXMgcmVmbGVjdC5JbnRlcmZhY2VUeXBlO1xuXG4gICAgICB0aGlzLmVtaXRQcm94eSh0eXBlKTtcbiAgICAgIC8vIFdlIGRvbid0IGVtaXQgSnNpaSREZWZhdWx0IGlmIHRoZSBhc3NlbWJseSBvcHRlZCBvdXQgb2YgaXQgZXhwbGljaXRseS5cbiAgICAgIC8vIFRoaXMgaXMgbW9zdGx5IHRvIGZhY2lsaXRhdGUgY29tcGF0aWJpbGl0eSB0ZXN0aW5nLi4uXG4gICAgICBpZiAoaGFzRGVmYXVsdEludGVyZmFjZXModGhpcy5yZWZsZWN0QXNzZW1ibHkpKSB7XG4gICAgICAgIHRoaXMuZW1pdERlZmF1bHRJbXBsZW1lbnRhdGlvbih0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoaWZjKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZChpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGhvZC5yZXR1cm5zXG4gICAgICA/IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShtZXRob2QucmV0dXJucylcbiAgICAgIDogJ3ZvaWQnO1xuICAgIHRoaXMuYWRkSmF2YURvY3MobWV0aG9kLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogbWV0aG9kLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMobWV0aG9kKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAke3JldHVyblR5cGV9ICR7bWV0aG9kLm5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZCl9KTtgLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2RPdmVybG9hZChcbiAgICBpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5vbkludGVyZmFjZU1ldGhvZChpZmMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZVByb3BlcnR5KGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgY29uc3QgZ2V0dGVyVHlwZSA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShwcm9wKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IGpzaWlUb1Bhc2NhbENhc2UoXG4gICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3AubmFtZSksXG4gICAgKTtcblxuICAgIC8vIGZvciB1bmlvbnMgd2Ugb25seSBnZW5lcmF0ZSBvdmVybG9hZHMgZm9yIHNldHRlcnMsIG5vdCBnZXR0ZXJzLlxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3ApO1xuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICBpZiAocHJvcC5vdmVycmlkZXMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgZGVmYXVsdCAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KClgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gbnVsbDsnKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KCk7YCk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgY29uc3Qgc2V0dGVyVHlwZXMgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGVzKHByb3ApO1xuICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHNldHRlclR5cGVzKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICAgICAgaWYgKHByb3Aub3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdAc29mdHdhcmUuYW1hem9uLmpzaWkuT3B0aW9uYWwnKTtcbiAgICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAgICAgYGRlZmF1bHQgdm9pZCBzZXQke3Byb3BOYW1lfShmaW5hbCAke3R5cGV9IHZhbHVlKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICAgIGB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oXCIndm9pZCBcIiArIGdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgXCIjc2V0JHtwcm9wTmFtZX0oJHt0eXBlfSknIGlzIG5vdCBpbXBsZW1lbnRlZCFcIik7YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHZvaWQgc2V0JHtwcm9wTmFtZX0oZmluYWwgJHt0eXBlfSB2YWx1ZSk7YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBsb2NhbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tXG4gICAqIG11bHRpcGxlIGRpc3RpbmN0IHBhcmVudCB0eXBlcy4gVGhpcyByZW12b2VzIHRoZSBkZWZhdWx0IG1ldGhvZCBkaXNwYXRjaFxuICAgKiBhbWJpZ3VpdHkgdGhhdCB3b3VsZCBvdGhlcndpc2UgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBpZmMgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIHRvIGJlIHByb2Nlc3NlZC5cblxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjI1NlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0TXVsdGlwbHlJbmhlcml0ZWRPcHRpb25hbFByb3BlcnRpZXMoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICBpZiAoaWZjLmludGVyZmFjZXMgPT0gbnVsbCB8fCBpZmMuaW50ZXJmYWNlcy5sZW5ndGggPD0gMSkge1xuICAgICAgLy8gTm90aGluZyB0byBkbyBpZiB3ZSBkb24ndCBoYXZlIHBhcmVudCBpbnRlcmZhY2VzLCBvciBpZiB3ZSBoYXZlIGV4YWN0bHkgb25lXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluaGVyaXRlZE9wdGlvbmFsUHJvcHMgPSBpZmMuaW50ZXJmYWNlc1xuICAgICAgLm1hcChhbGxPcHRpb25hbFByb3BzLmJpbmQodGhpcykpXG4gICAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgZGlyZWN0IHBhcmVudHMgYnJvdWdodCBhIGdpdmVuIG9wdGlvbmFsIHByb3BlcnR5XG4gICAgICAucmVkdWNlKChoaXN0b2dyYW0sIGVudHJ5KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJ5KSkge1xuICAgICAgICAgIGhpc3RvZ3JhbVtuYW1lXSA9IGhpc3RvZ3JhbVtuYW1lXSA/PyB7IHNwZWMsIGNvdW50OiAwIH07XG4gICAgICAgICAgaGlzdG9ncmFtW25hbWVdLmNvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcbiAgICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHsgcmVhZG9ubHkgc3BlYzogc3BlYy5Qcm9wZXJ0eTsgY291bnQ6IG51bWJlciB9Pik7XG5cbiAgICBjb25zdCBsb2NhbFByb3BzID0gbmV3IFNldChpZmMucHJvcGVydGllcz8ubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpID8/IFtdKTtcbiAgICBmb3IgKGNvbnN0IHsgc3BlYywgY291bnQgfSBvZiBPYmplY3QudmFsdWVzKGluaGVyaXRlZE9wdGlvbmFsUHJvcHMpKSB7XG4gICAgICBpZiAoY291bnQgPCAyIHx8IGxvY2FsUHJvcHMuaGFzKHNwZWMubmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLm9uSW50ZXJmYWNlUHJvcGVydHkoaWZjLCBzcGVjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhbGxPcHRpb25hbFByb3BzKHRoaXM6IEphdmFHZW5lcmF0b3IsIGZxbjogc3RyaW5nKSB7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5maW5kVHlwZShmcW4pIGFzIHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3BlYy5Qcm9wZXJ0eT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiB0eXBlLnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgLy8gQWRkaW5nIGFydGlmaWNhbCBcIm92ZXJyaWRlc1wiIGhlcmUgZm9yIGNvZGUtZ2VuIHF1YWxpdHkncyBzYWtlLlxuICAgICAgICByZXN1bHRbcHJvcC5uYW1lXSA9IHsgLi4ucHJvcCwgb3ZlcnJpZGVzOiB0eXBlLmZxbiB9O1xuICAgICAgfVxuICAgICAgLy8gSW5jbHVkZSBvcHRpb25hbCBwcm9wZXJ0aWVzIG9mIGFsbCBzdXBlciBpbnRlcmZhY2VzIGluIHRoZSByZXN1bHRcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0eXBlLmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgcHJvcF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgYWxsT3B0aW9uYWxQcm9wcy5jYWxsKHRoaXMsIGJhc2UpLFxuICAgICAgICApKSB7XG4gICAgICAgICAgaWYgKCEobmFtZSBpbiByZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBwcm9wO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBc3NlbWJseVBhY2thZ2VJbmZvKG1vZDogc3BlYy5Bc3NlbWJseSkge1xuICAgIGlmICghbW9kLmRvY3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lIH0gPSB0aGlzLnRvTmF0aXZlTmFtZShtb2QpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgoXG4gICAgICBtb2QsXG4gICAgICBgJHttb2QubmFtZX0ucGFja2FnZS1pbmZvYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBpZiAobW9kLnJlYWRtZSkge1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG1hcmtEb3duVG9KYXZhRG9jKFxuICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihtb2QucmVhZG1lLm1hcmtkb3duLCB7XG4gICAgICAgICAgYXBpOiAnbW9kdWxlUmVhZG1lJyxcbiAgICAgICAgICBtb2R1bGVGcW46IG1vZC5uYW1lLFxuICAgICAgICB9KSxcbiAgICAgICkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2xpbmUucmVwbGFjZSgvXFwqXFwvL2csICcqe0BsaXRlcmFsIC99Jyl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2QuZG9jcy5kZXByZWNhdGVkKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnIConKTtcbiAgICAgIC8vIEphdmFjIHdvbid0IGFsbG93IEBkZXByZWNhdGVkIG9uIHBhY2thZ2VzLCB3aGlsZSBARGVwcmVjYXRlZCBpcyBhYWFhYnNvbHV0ZWx5IGZpbmUuIER1aC5cbiAgICAgIHRoaXMuY29kZS5saW5lKGAgKiBEZXByZWNhdGVkOiAke21vZC5kb2NzLmRlcHJlY2F0ZWR9YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtb2QpO1xuICAgIHRoaXMuY29kZS5saW5lKGBwYWNrYWdlICR7cGFja2FnZU5hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUocGFja2FnZUluZm9GaWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN1Ym1vZHVsZVBhY2thZ2VJbmZvKGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5LCBtb2R1bGVGcW46IHN0cmluZykge1xuICAgIGNvbnN0IG1vZCA9IGFzc2VtYmx5LnN1Ym1vZHVsZXM/Llttb2R1bGVGcW5dO1xuICAgIGlmICghbW9kPy5yZWFkbWU/Lm1hcmtkb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSB9ID0gdHJhbnNsYXRlRnFuKGFzc2VtYmx5LCBtb2R1bGVGcW4pO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgoXG4gICAgICBhc3NlbWJseSxcbiAgICAgIGAke21vZHVsZUZxbn0ucGFja2FnZS1pbmZvYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBpZiAobW9kLnJlYWRtZSkge1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG1hcmtEb3duVG9KYXZhRG9jKFxuICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihtb2QucmVhZG1lLm1hcmtkb3duLCB7XG4gICAgICAgICAgYXBpOiAnbW9kdWxlUmVhZG1lJyxcbiAgICAgICAgICBtb2R1bGVGcW4sXG4gICAgICAgIH0pLFxuICAgICAgKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqICR7bGluZS5yZXBsYWNlKC9cXCpcXC8vZywgJyp7QGxpdGVyYWwgL30nKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuY29kZS5saW5lKGBwYWNrYWdlICR7cGFja2FnZU5hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUocGFja2FnZUluZm9GaWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1hdmVuUG9tKGFzc206IHNwZWMuQXNzZW1ibHksIGZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgaWYgKCFhc3NtLnRhcmdldHM/LmphdmEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZW1ibHkgJHthc3NtLm5hbWV9IGRvZXMgbm90IGRlY2xhcmUgYSBqYXZhIHRhcmdldGApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1lbnQgPSBmaW5nZXJwcmludFxuICAgICAgPyB7XG4gICAgICAgICAgJyNjb21tZW50JzogW1xuICAgICAgICAgICAgYEdlbmVyYXRlZCBieSBqc2lpLXBhY21ha0Ake1ZFUlNJT05fREVTQ30gb24gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIGBAanNpaS1wYWNtYWs6bWV0YUAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLm1ldGFkYXRhKX1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgIDoge307XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUoJ3BvbS54bWwnKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIHhtbGJ1aWxkZXJcbiAgICAgICAgLmNyZWF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm9qZWN0OiB7XG4gICAgICAgICAgICAgICdAeG1sbnMnOiAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJyxcbiAgICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgICAnQHhzaTpzY2hlbWFMb2NhdGlvbic6XG4gICAgICAgICAgICAgICAgJ2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkJyxcblxuICAgICAgICAgICAgICAuLi5jb21tZW50LFxuXG4gICAgICAgICAgICAgIG1vZGVsVmVyc2lvbjogJzQuMC4wJyxcbiAgICAgICAgICAgICAgbmFtZTogJyR7cHJvamVjdC5ncm91cElkfToke3Byb2plY3QuYXJ0aWZhY3RJZH0nLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYXNzbS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdXJsOiBhc3NtLmhvbWVwYWdlLFxuXG4gICAgICAgICAgICAgIGxpY2Vuc2VzOiB7XG4gICAgICAgICAgICAgICAgbGljZW5zZTogZ2V0TGljZW5zZSgpLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGRldmVsb3BlcnM6IHtcbiAgICAgICAgICAgICAgICBkZXZlbG9wZXI6IG1hdmVuRGV2ZWxvcGVycygpLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIHNjbToge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IGBzY206JHthc3NtLnJlcG9zaXRvcnkudHlwZX06JHthc3NtLnJlcG9zaXRvcnkudXJsfWAsXG4gICAgICAgICAgICAgICAgdXJsOiBhc3NtLnJlcG9zaXRvcnkudXJsLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGdyb3VwSWQ6IGFzc20udGFyZ2V0cy5qYXZhLm1hdmVuLmdyb3VwSWQsXG4gICAgICAgICAgICAgIGFydGlmYWN0SWQ6IGFzc20udGFyZ2V0cy5qYXZhLm1hdmVuLmFydGlmYWN0SWQsXG4gICAgICAgICAgICAgIHZlcnNpb246IG1ha2VWZXJzaW9uKFxuICAgICAgICAgICAgICAgIGFzc20udmVyc2lvbixcbiAgICAgICAgICAgICAgICBhc3NtLnRhcmdldHMuamF2YS5tYXZlbi52ZXJzaW9uU3VmZml4LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBwYWNrYWdpbmc6ICdqYXInLFxuXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHsgJ3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2RpbmcnOiAnVVRGLTgnIH0sXG5cbiAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB7IGRlcGVuZGVuY3k6IG1hdmVuRGVwZW5kZW5jaWVzLmNhbGwodGhpcykgfSxcblxuICAgICAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgICAgICAgIHBsdWdpbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLWNvbXBpbGVyLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuOC4xJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7IHNvdXJjZTogJzEuOCcsIHRhcmdldDogJzEuOCcgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1qYXItcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy4yLjAnLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tc291cmNlLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuMi4xJyxcbiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdhdHRhY2gtc291cmNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdvYWxzOiB7IGdvYWw6ICdqYXInIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tamF2YWRvYy1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjIuMCcsXG4gICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYXR0YWNoLWphdmFkb2NzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IHsgZ29hbDogJ2phcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsT25FcnJvcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93OiAncHJvdGVjdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVFeGNsdWRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGNsdWRpbmcgdGhlICRNb2R1bGUgY2xhc3NlcyBzbyB0aGV5IHdvbid0IHBvbGx1dGUgdGhlIGRvY3NpdGUuIFRoZXkgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhbGwgY29sbGVjdGVkIGF0IHRoZSB0b3Agb2YgdGhlIGNsYXNzbGlzdCwgYnVycnlpbmcgdXNlZnVsIGluZm9ybWF0aW9uIHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbG90IG9mIGRyeSBzY3JvbGxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnKiovJE1vZHVsZS5qYXZhJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZXNlIG1ha2VzIEphdmFEb2MgZ2VuZXJhdGlvbiBhYm91dCBhIDNyZCBmYXN0ZXIgKHdoaWNoIGlzIGZhciBhbmQgYXdheSB0aGUgbW9zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZW5zaXZlIHBhcnQgb2YgdGhlIGJ1aWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEpPcHRpb246IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJy1KLVhYOitUaWVyZWRDb21waWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICctSi1YWDpUaWVyZWRTdG9wQXRMZXZlbD0xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1lbmZvcmNlci1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjAuMC1NMycsXG4gICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnZW5mb3JjZS1tYXZlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdvYWxzOiB7IGdvYWw6ICdlbmZvcmNlJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVNYXZlblZlcnNpb246IHsgdmVyc2lvbjogJzMuNicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5jb2RlaGF1cy5tb2pvJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAndmVyc2lvbnMtbWF2ZW4tcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMi44LjEnLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmFja3VwUG9tczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGVuY29kaW5nOiAnVVRGLTgnIH0sXG4gICAgICAgIClcbiAgICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KSxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoJ3BvbS54bWwnKTtcblxuICAgIC8qKlxuICAgICAqIENvbWJpbmVzIGEgdmVyc2lvbiBudW1iZXIgd2l0aCBhbiBvcHRpb25hbCBzdWZmaXguIFRoZSBzdWZmaXgsIHdoZW4gcHJlc2VudCwgbXVzdCBiZWdpbiB3aXRoXG4gICAgICogJy0nIG9yICcuJywgYW5kIHdpbGwgYmUgY29uY2F0ZW5hdGVkIGFzLWlzIHRvIHRoZSB2ZXJzaW9uIG51bWJlci4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXJcbiAgICAgKiBAcGFyYW0gc3VmZml4ICB0aGUgc3VmZml4LCBpZiBhbnkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFrZVZlcnNpb24odmVyc2lvbjogc3RyaW5nLCBzdWZmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgaWYgKCFzdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRvUmVsZWFzZVZlcnNpb24odmVyc2lvbiwgVGFyZ2V0TmFtZS5KQVZBKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3VmZml4LnN0YXJ0c1dpdGgoJy0nKSAmJiAhc3VmZml4LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcnNpb25TdWZmaXggbXVzdCBzdGFydCB3aXRoICctJyBvciAnLicsIGJ1dCByZWNlaXZlZCAke3N1ZmZpeH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke3ZlcnNpb259JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXZlbkRlcGVuZGVuY2llcyh0aGlzOiBKYXZhR2VuZXJhdG9yKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8TWF2ZW5EZXBlbmRlbmN5PigpO1xuICAgICAgZm9yIChjb25zdCBbZGVwTmFtZSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jaWVzID8/IHt9LFxuICAgICAgKSkge1xuICAgICAgICBjb25zdCBkZXAgPSB0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY3lDbG9zdXJlPy5bZGVwTmFtZV07XG4gICAgICAgIGlmICghZGVwPy50YXJnZXRzPy5qYXZhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFzc2VtYmx5ICR7YXNzbS5uYW1lfSBkZXBlbmRzIG9uICR7ZGVwTmFtZX0sIHdoaWNoIGRvZXMgbm90IGRlY2xhcmUgYSBqYXZhIHRhcmdldGAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh7XG4gICAgICAgICAgZ3JvdXBJZDogZGVwLnRhcmdldHMuamF2YS5tYXZlbi5ncm91cElkLFxuICAgICAgICAgIGFydGlmYWN0SWQ6IGRlcC50YXJnZXRzLmphdmEubWF2ZW4uYXJ0aWZhY3RJZCxcbiAgICAgICAgICB2ZXJzaW9uOiB0b01hdmVuVmVyc2lvblJhbmdlKFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIGRlcC50YXJnZXRzLmphdmEubWF2ZW4udmVyc2lvblN1ZmZpeCxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBKU0lJIGphdmEgcnVudGltZSBiYXNlIGNsYXNzZXNcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHtcbiAgICAgICAgZ3JvdXBJZDogJ3NvZnR3YXJlLmFtYXpvbi5qc2lpJyxcbiAgICAgICAgYXJ0aWZhY3RJZDogJ2pzaWktcnVudGltZScsXG4gICAgICAgIHZlcnNpb246IHRvTWF2ZW5WZXJzaW9uUmFuZ2UoYF4ke1ZFUlNJT059YCksXG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZXMgQG9yZy5qZXRicmFpbnMuKlxuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goe1xuICAgICAgICBncm91cElkOiAnb3JnLmpldGJyYWlucycsXG4gICAgICAgIGFydGlmYWN0SWQ6ICdhbm5vdGF0aW9ucycsXG4gICAgICAgIHZlcnNpb246ICdbMTYuMC4zLDIwLjAuMCknLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGVzIEBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCBmb3IgSkRLcyA+PSA5XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7XG4gICAgICAgICcjY29tbWVudCc6ICdQcm92aWRlcyBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQgZm9yIEpES3MgPj0gOScsXG4gICAgICAgIGdyb3VwSWQ6ICdqYXZheC5hbm5vdGF0aW9uJyxcbiAgICAgICAgYXJ0aWZhY3RJZDogJ2phdmF4LmFubm90YXRpb24tYXBpJyxcbiAgICAgICAgdmVyc2lvbjogJ1sxLjMuMiwxLjQuMCknLFxuICAgICAgICBzY29wZTogJ2NvbXBpbGUnLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF2ZW5EZXZlbG9wZXJzKCkge1xuICAgICAgcmV0dXJuIFthc3NtLmF1dGhvciwgLi4uKGFzc20uY29udHJpYnV0b3JzID8/IFtdKV0ubWFwKHRvRGV2ZWxvcGVyKTtcblxuICAgICAgZnVuY3Rpb24gdG9EZXZlbG9wZXIocGVyc29uOiBzcGVjLlBlcnNvbikge1xuICAgICAgICBjb25zdCBkZXZlbG9wZXI6IGFueSA9IHtcbiAgICAgICAgICBbcGVyc29uLm9yZ2FuaXphdGlvbiA/ICdvcmdhbml6YXRpb24nIDogJ25hbWUnXTogcGVyc29uLm5hbWUsXG4gICAgICAgICAgcm9sZXM6IHsgcm9sZTogcGVyc29uLnJvbGVzIH0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFdlIGNhbm5vdCBzZXQgXCJ1bmRlZmluZWRcIiBvciBcIm51bGxcIiB0byBhIGZpZWxkIC0gdGhpcyBjYXVzZXMgaW52YWxpZCBYTUwgdG8gYmUgZW1pdHRlZCAocGVyIFBPTSBzY2hlbWEpLlxuICAgICAgICBpZiAocGVyc29uLmVtYWlsKSB7XG4gICAgICAgICAgZGV2ZWxvcGVyLmVtYWlsID0gcGVyc29uLmVtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJzb24udXJsKSB7XG4gICAgICAgICAgZGV2ZWxvcGVyW3BlcnNvbi5vcmdhbml6YXRpb24gPyAnb3JnYW5pemF0aW9uVXJsJyA6ICd1cmwnXSA9XG4gICAgICAgICAgICBwZXJzb24udXJsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXZlbG9wZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXZlbi1zdHlsZSBsaWNlbnNlIGJsb2NrIGZvciBhIHRoZSBhc3NlbWJseS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9wb20uaHRtbCNMaWNlbnNlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldExpY2Vuc2UoKSB7XG4gICAgICBjb25zdCBzcGR4ID0gc3BkeExpY2Vuc2VMaXN0W2Fzc20ubGljZW5zZV07XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzcGR4ICYmIHtcbiAgICAgICAgICBuYW1lOiBzcGR4Lm5hbWUsXG4gICAgICAgICAgdXJsOiBzcGR4LnVybCxcbiAgICAgICAgICBkaXN0cmlidXRpb246ICdyZXBvJyxcbiAgICAgICAgICBjb21tZW50czogc3BkeC5vc2lBcHByb3ZlZCA/ICdBbiBPU0ktYXBwcm92ZWQgbGljZW5zZScgOiB1bmRlZmluZWQsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGljSW5pdGlhbGl6ZXIoY2xzOiBzcGVjLkNsYXNzVHlwZSkge1xuICAgIGNvbnN0IGNvbnN0cyA9IChjbHMucHJvcGVydGllcyA/PyBbXSkuZmlsdGVyKCh4KSA9PiB4LmNvbnN0KTtcbiAgICBpZiAoY29uc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGphdmFDbGFzcyA9IHRoaXMudG9KYXZhVHlwZShjbHMpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdzdGF0aWMnKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBjb25zdHMpIHtcbiAgICAgIGNvbnN0IGNvbnN0TmFtZSA9IHRoaXMucmVuZGVyQ29uc3ROYW1lKHByb3ApO1xuICAgICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnRvTmF0aXZlVHlwZShwcm9wLnR5cGUsIHsgZm9yTWFyc2hhbGxpbmc6IHRydWUgfSk7XG4gICAgICBjb25zdCBzdGF0ZW1lbnQgPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljR2V0KCR7amF2YUNsYXNzfS5jbGFzcywgXCIke3Byb3AubmFtZX1cIiwgJHtwcm9wVHlwZX0pYDtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgJHtjb25zdE5hbWV9ID0gJHt0aGlzLndyYXBDb2xsZWN0aW9uKFxuICAgICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgICBwcm9wLnR5cGUsXG4gICAgICAgICAgcHJvcC5vcHRpb25hbCxcbiAgICAgICAgKX07YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29uc3ROYW1lKHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5jb2RlLnRvU25ha2VDYXNlKHByb3AubmFtZSkudG9Mb2NhbGVVcHBlckNhc2UoKTsgLy8gamF2YSBjb25zdHMgYXJlIFNOQUtFX1VQUEVSX0NBU0VcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0UHJvcGVydHkocGFyZW50VHlwZTogc3BlYy5UeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnRvSmF2YVR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IHRoaXMucmVuZGVyQ29uc3ROYW1lKHByb3ApO1xuICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogcGFyZW50VHlwZS5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMocHJvcCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCR7YWNjZXNzfSBmaW5hbCBzdGF0aWMgJHtwcm9wVHlwZX0gJHtwcm9wTmFtZX07YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuVHlwZSxcbiAgICBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICAgIHtcbiAgICAgIGRlZmF1bHRJbXBsID0gZmFsc2UsXG4gICAgICBmaW5hbCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZUdldHRlciA9IHRydWUsXG4gICAgICBvdmVycmlkZXMgPSAhIXByb3Aub3ZlcnJpZGVzLFxuICAgIH06IHtcbiAgICAgIGRlZmF1bHRJbXBsPzogYm9vbGVhbjtcbiAgICAgIGZpbmFsPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVHZXR0ZXI/OiBib29sZWFuO1xuICAgICAgb3ZlcnJpZGVzPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IGdldHRlclR5cGUgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGUocHJvcCk7XG4gICAgY29uc3Qgc2V0dGVyVHlwZXMgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGVzKHByb3AsIHtcbiAgICAgIGNvdmFyaWFudDogcHJvcC5zdGF0aWMsXG4gICAgfSk7XG4gICAgY29uc3QgcHJvcE5hbWUgPSBqc2lpVG9QYXNjYWxDYXNlKFxuICAgICAgSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwcm9wLm5hbWUpLFxuICAgICk7XG5cbiAgICBjb25zdCBtb2RpZmllcnMgPSBbZGVmYXVsdEltcGwgPyAnZGVmYXVsdCcgOiB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKHByb3ApXTtcbiAgICBpZiAocHJvcC5zdGF0aWMpIG1vZGlmaWVycy5wdXNoKCdzdGF0aWMnKTtcbiAgICBpZiAocHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIG1vZGlmaWVycy5wdXNoKCdhYnN0cmFjdCcpO1xuICAgIGlmIChmaW5hbCAmJiAhcHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIG1vZGlmaWVycy5wdXNoKCdmaW5hbCcpO1xuXG4gICAgY29uc3QgamF2YUNsYXNzID0gdGhpcy50b0phdmFUeXBlKGNscyk7XG5cbiAgICAvLyBmb3IgdW5pb25zIHdlIG9ubHkgZ2VuZXJhdGUgb3ZlcmxvYWRzIGZvciBzZXR0ZXJzLCBub3QgZ2V0dGVycy5cbiAgICBpZiAoaW5jbHVkZUdldHRlcikge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICBmcW46IGRlZmluaW5nVHlwZS5mcW4sXG4gICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlcyAmJiAhcHJvcC5zdGF0aWMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMocHJvcCk7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBgJHttb2RpZmllcnMuam9pbignICcpfSAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KClgO1xuICAgICAgaWYgKHByb3AuYWJzdHJhY3QgJiYgIWRlZmF1bHRJbXBsKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGAke3NpZ25hdHVyZX07YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKHNpZ25hdHVyZSk7XG4gICAgICAgIGxldCBzdGF0ZW1lbnQ7XG4gICAgICAgIGlmIChwcm9wLnN0YXRpYykge1xuICAgICAgICAgIHN0YXRlbWVudCA9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LmpzaWlTdGF0aWNHZXQoJHt0aGlzLnRvSmF2YVR5cGUoXG4gICAgICAgICAgICBjbHMsXG4gICAgICAgICAgKX0uY2xhc3MsIGA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGVtZW50ID0gJ3NvZnR3YXJlLmFtYXpvbi5qc2lpLktlcm5lbC5nZXQodGhpcywgJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlbWVudCArPSBgXCIke3Byb3AubmFtZX1cIiwgJHt0aGlzLnRvTmF0aXZlVHlwZShwcm9wLnR5cGUsIHtcbiAgICAgICAgICBmb3JNYXJzaGFsbGluZzogdHJ1ZSxcbiAgICAgICAgfSl9KWA7XG5cbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHJldHVybiAke3RoaXMud3JhcENvbGxlY3Rpb24oc3RhdGVtZW50LCBwcm9wLnR5cGUsIHByb3Aub3B0aW9uYWwpfTtgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvcC5pbW11dGFibGUpIHtcbiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBzZXR0ZXJUeXBlcykge1xuICAgICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgICB0aGlzLmFkZEphdmFEb2NzKHByb3AsIHtcbiAgICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICAgIGZxbjogY2xzLmZxbixcbiAgICAgICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3ZlcnJpZGVzICYmICFwcm9wLnN0YXRpYykge1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wKTtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7bW9kaWZpZXJzLmpvaW4oXG4gICAgICAgICAgJyAnLFxuICAgICAgICApfSB2b2lkIHNldCR7cHJvcE5hbWV9KGZpbmFsICR7dHlwZX0gdmFsdWUpYDtcbiAgICAgICAgaWYgKHByb3AuYWJzdHJhY3QgJiYgIWRlZmF1bHRJbXBsKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7c2lnbmF0dXJlfTtgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKHNpZ25hdHVyZSk7XG4gICAgICAgICAgbGV0IHN0YXRlbWVudCA9ICcnO1xuXG4gICAgICAgICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuanNpaVN0YXRpY1NldCgke2phdmFDbGFzc30uY2xhc3MsIGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlbWVudCArPSAnc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLnNldCh0aGlzLCAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb3Aub3B0aW9uYWxcbiAgICAgICAgICAgID8gJ3ZhbHVlJ1xuICAgICAgICAgICAgOiBgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGwodmFsdWUsIFwiJHtwcm9wLm5hbWV9IGlzIHJlcXVpcmVkXCIpYDtcbiAgICAgICAgICBzdGF0ZW1lbnQgKz0gYFwiJHtwcm9wLm5hbWV9XCIsICR7dmFsdWV9KTtgO1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKHN0YXRlbWVudCk7XG4gICAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1ldGhvZChcbiAgICBjbHM6IHNwZWMuVHlwZSxcbiAgICBtZXRob2Q6IHNwZWMuTWV0aG9kLFxuICAgIHtcbiAgICAgIGRlZmF1bHRJbXBsID0gZmFsc2UsXG4gICAgICBmaW5hbCA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gISFtZXRob2Qub3ZlcnJpZGVzLFxuICAgIH06IHsgZGVmYXVsdEltcGw/OiBib29sZWFuOyBmaW5hbD86IGJvb2xlYW47IG92ZXJyaWRlcz86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0aG9kLnJldHVybnNcbiAgICAgID8gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKG1ldGhvZC5yZXR1cm5zKVxuICAgICAgOiAndm9pZCc7XG5cbiAgICBjb25zdCBtb2RpZmllcnMgPSBbXG4gICAgICBkZWZhdWx0SW1wbCA/ICdkZWZhdWx0JyA6IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kKSxcbiAgICBdO1xuICAgIGlmIChtZXRob2Quc3RhdGljKSBtb2RpZmllcnMucHVzaCgnc3RhdGljJyk7XG4gICAgaWYgKG1ldGhvZC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIG1vZGlmaWVycy5wdXNoKCdhYnN0cmFjdCcpO1xuICAgIGlmIChmaW5hbCAmJiAhbWV0aG9kLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2ZpbmFsJyk7XG5cbiAgICBjb25zdCBhc3luYyA9ICEhbWV0aG9kLmFzeW5jO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhTWV0aG9kTmFtZShtZXRob2QubmFtZSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7cmV0dXJuVHlwZX0gJHttZXRob2ROYW1lfSgke3RoaXMucmVuZGVyTWV0aG9kUGFyYW1ldGVycyhcbiAgICAgIG1ldGhvZCxcbiAgICApfSlgO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGNscy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZXRob2QpO1xuICAgIGlmIChvdmVycmlkZXMgJiYgIW1ldGhvZC5zdGF0aWMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICB9XG4gICAgaWYgKG1ldGhvZC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke21vZGlmaWVycy5qb2luKCcgJyl9ICR7c2lnbmF0dXJlfTtgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHttb2RpZmllcnMuam9pbignICcpfSAke3NpZ25hdHVyZX1gKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKHRoaXMucmVuZGVyTWV0aG9kQ2FsbChjbHMsIG1ldGhvZCwgYXN5bmMpKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdlIGFyZSBub3cgZ29pbmcgdG8gYnVpbGQgYSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHVudHlwZWRcbiAgICogamF2YXNjcmlwdCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiB3ZSB3YW50IGphdmEgY29kZSB0byBiZVxuICAgKiBhYmxlIHRvIGludGVyYWN0IHdpdGggdGhlbSwgc28gd2Ugd2lsbCBjcmVhdGUgYSBwcm94eSBjbGFzcyB3aGljaFxuICAgKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGFuZCBoYXMgdGhlIHNhbWUgbWV0aG9kcy5cbiAgICpcbiAgICogVGhlc2UgcHJveGllcyBhcmUgYWxzbyB1c2VkIHRvIGV4dGVuZCBhYnN0cmFjdCBjbGFzc2VzIHRvIGFsbG93IHRoZSBKU0lJXG4gICAqIGVuZ2luZSB0byBpbnN0YW50aWF0ZSBhbiBhYnN0cmFjdCBjbGFzcyBpbiBKYXZhLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UHJveHkodHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlIHwgcmVmbGVjdC5DbGFzc1R5cGUpIHtcbiAgICBjb25zdCBuYW1lID0gSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUU7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBBIHByb3h5IGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgYSBjb25jcmV0ZSBqYXZhc2NyaXB0IGluc3RhbmNlIG9mIHRoaXMgdHlwZS4nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuXG4gICAgY29uc3QgYmFzZUludGVyZmFjZXMgPSB0aGlzLmRlZmF1bHRJbnRlcmZhY2VzRm9yKHR5cGUsIHtcbiAgICAgIGluY2x1ZGVUaGlzVHlwZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSgpICYmICFoYXNEZWZhdWx0SW50ZXJmYWNlcyh0eXBlLmFzc2VtYmx5KSkge1xuICAgICAgLy8gRXh0ZW5kIHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5IHNpbmNlIHRoaXMgbW9kdWxlIGRvZXMgbm90IGhhdmUgdGhlIEpzaWkkRGVmYXVsdFxuICAgICAgYmFzZUludGVyZmFjZXMucHVzaCh0aGlzLnRvTmF0aXZlRnFuKHR5cGUuZnFuKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VmZml4ID0gdHlwZS5pc0ludGVyZmFjZVR5cGUoKVxuICAgICAgPyBgZXh0ZW5kcyBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0IGltcGxlbWVudHMgJHtiYXNlSW50ZXJmYWNlcy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9YFxuICAgICAgOiBgZXh0ZW5kcyAke3RoaXMudG9OYXRpdmVGcW4odHlwZS5mcW4pfSR7XG4gICAgICAgICAgYmFzZUludGVyZmFjZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBgIGltcGxlbWVudHMgJHtiYXNlSW50ZXJmYWNlcy5qb2luKCcsICcpfWBcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgfWA7XG5cbiAgICBjb25zdCBtb2RpZmllcnMgPSB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpID8gJ2ZpbmFsJyA6ICdwcml2YXRlIHN0YXRpYyBmaW5hbCc7XG5cbiAgICB0aGlzLmNvZGUubGluZShBTk5fSU5URVJOQUwpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYCR7bW9kaWZpZXJzfSBjbGFzcyAke25hbWV9ICR7c3VmZml4fWApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7bmFtZX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBlbWl0IGFsbCBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCByZWZsZWN0UHJvcCBvZiB0eXBlLmFsbFByb3BlcnRpZXMuZmlsdGVyKFxuICAgICAgKHByb3ApID0+XG4gICAgICAgIHByb3AuYWJzdHJhY3QgJiZcbiAgICAgICAgKHByb3AucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgcHJvcC5wYXJlbnRUeXBlLmlzQ2xhc3NUeXBlKCkgfHxcbiAgICAgICAgICAhaGFzRGVmYXVsdEludGVyZmFjZXMocHJvcC5hc3NlbWJseSkpLFxuICAgICkpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjbG9uZShyZWZsZWN0UHJvcC5zcGVjKTtcbiAgICAgIHByb3AuYWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgIC8vIEVtaXR0aW5nIFwiZmluYWxcIiBzaW5jZSB0aGlzIGlzIGEgcHJveHkgYW5kIG5vdGhpbmcgd2lsbC9zaG91bGQgb3ZlcnJpZGUgdGhpc1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkodHlwZS5zcGVjLCBwcm9wLCByZWZsZWN0UHJvcC5kZWZpbmluZ1R5cGUuc3BlYywge1xuICAgICAgICBmaW5hbDogdHJ1ZSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZW1pdCBhbGwgdGhlIG1ldGhvZHNcbiAgICBmb3IgKGNvbnN0IHJlZmxlY3RNZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzLmZpbHRlcihcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5hYnN0cmFjdCAmJlxuICAgICAgICAobWV0aG9kLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgIG1ldGhvZC5wYXJlbnRUeXBlLmlzQ2xhc3NUeXBlKCkgfHxcbiAgICAgICAgICAhaGFzRGVmYXVsdEludGVyZmFjZXMobWV0aG9kLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgY29uc3QgbWV0aG9kID0gY2xvbmUocmVmbGVjdE1ldGhvZC5zcGVjKTtcbiAgICAgIG1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgLy8gRW1pdHRpbmcgXCJmaW5hbFwiIHNpbmNlIHRoaXMgaXMgYSBwcm94eSBhbmQgbm90aGluZyB3aWxsL3Nob3VsZCBvdmVycmlkZSB0aGlzXG4gICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBtZXRob2QsIHsgZmluYWw6IHRydWUsIG92ZXJyaWRlczogdHJ1ZSB9KTtcblxuICAgICAgZm9yIChjb25zdCBvdmVybG9hZGVkTWV0aG9kIG9mIHRoaXMuY3JlYXRlT3ZlcmxvYWRzRm9yT3B0aW9uYWxzKG1ldGhvZCkpIHtcbiAgICAgICAgb3ZlcmxvYWRlZE1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBvdmVybG9hZGVkTWV0aG9kLCB7XG4gICAgICAgICAgZmluYWw6IHRydWUsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVmYXVsdEltcGxlbWVudGF0aW9uKHR5cGU6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSkge1xuICAgIGNvbnN0IGJhc2VJbnRlcmZhY2VzID0gW3R5cGUubmFtZSwgLi4udGhpcy5kZWZhdWx0SW50ZXJmYWNlc0Zvcih0eXBlKV07XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBJbnRlcm5hbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgJHt0eXBlLm5hbWV9fS5gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBpbnRlcmZhY2UgJHtJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FfSBleHRlbmRzICR7YmFzZUludGVyZmFjZXNcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHR5cGUuYWxsUHJvcGVydGllcy5maWx0ZXIoXG4gICAgICAocHJvcCkgPT5cbiAgICAgICAgcHJvcC5hYnN0cmFjdCAmJlxuICAgICAgICAvLyBPbmx5IGNoZWNraW5nIHRoZSBnZXR0ZXIgLSBqYXZhLmxhbmcuT2JqZWN0IGhhcyBubyBzZXR0ZXJzLlxuICAgICAgICAhaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUoYGdldCR7anNpaVRvUGFzY2FsQ2FzZShwcm9wLm5hbWUpfWApICYmXG4gICAgICAgIChwcm9wLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhwcm9wLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkodHlwZS5zcGVjLCBwcm9wZXJ0eS5zcGVjLCBwcm9wZXJ0eS5kZWZpbmluZ1R5cGUuc3BlYywge1xuICAgICAgICBkZWZhdWx0SW1wbDogdHJ1ZSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIHR5cGUuYWxsTWV0aG9kcy5maWx0ZXIoXG4gICAgICAobWV0aG9kKSA9PlxuICAgICAgICBtZXRob2QuYWJzdHJhY3QgJiZcbiAgICAgICAgIWlzSmF2YUxhbmdPYmplY3RNZXRob2ROYW1lKG1ldGhvZC5uYW1lKSAmJlxuICAgICAgICAobWV0aG9kLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhtZXRob2QuYXNzZW1ibHkpKSxcbiAgICApKSB7XG4gICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBtZXRob2Quc3BlYywge1xuICAgICAgICBkZWZhdWx0SW1wbDogdHJ1ZSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhlbnRpdHk6IHNwZWMuRG9jdW1lbnRhYmxlKSB7XG4gICAgaWYgKCFlbnRpdHkuZG9jcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZW50aXR5LmRvY3Muc3RhYmlsaXR5KSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYEBzb2Z0d2FyZS5hbWF6b24uanNpaS5TdGFiaWxpdHkoc29mdHdhcmUuYW1hem9uLmpzaWkuU3RhYmlsaXR5LkxldmVsLiR7X2xldmVsKFxuICAgICAgICAgIGVudGl0eS5kb2NzLnN0YWJpbGl0eSxcbiAgICAgICAgKX0pYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGVudGl0eS5kb2NzLnN0YWJpbGl0eSA9PT0gc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZCB8fFxuICAgICAgZW50aXR5LmRvY3MuZGVwcmVjYXRlZFxuICAgICkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BEZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2xldmVsKHN0YWJpbGl0eTogc3BlYy5TdGFiaWxpdHkpOiBzdHJpbmcge1xuICAgICAgc3dpdGNoIChzdGFiaWxpdHkpIHtcbiAgICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkOlxuICAgICAgICAgIHJldHVybiAnRGVwcmVjYXRlZCc7XG4gICAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsOlxuICAgICAgICAgIHJldHVybiAnRXhwZXJpbWVudGFsJztcbiAgICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHRlcm5hbDpcbiAgICAgICAgICAvLyBSZW5kZXJpbmcgJ0V4dGVybmFsJyBvdXQgYXMgcHVibGljbHkgdmlzaWJsZSBzdGF0ZSBpcyBjb25mdXNpbmcuIEFzIGZhclxuICAgICAgICAgIC8vIGFzIHVzZXJzIGFyZSBjb25jZXJuZWQgd2UganVzdCBhZHZlcnRpc2UgdGhpcyBhcyBzdGFibGUuXG4gICAgICAgICAgcmV0dXJuICdTdGFibGUnO1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LlN0YWJsZTpcbiAgICAgICAgICByZXR1cm4gJ1N0YWJsZSc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHN0YWJpbGl0eTogJHtzdGFiaWxpdHkgYXMgYW55fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhUHJvcChcbiAgICBwcm9wZXJ0eTogc3BlYy5Qcm9wZXJ0eSxcbiAgICBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZSxcbiAgICBpbmhlcml0ZWQ6IGJvb2xlYW4sXG4gICk6IEphdmFQcm9wIHtcbiAgICBjb25zdCBzYWZlTmFtZSA9IEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcGVydHkubmFtZSk7XG4gICAgY29uc3QgcHJvcE5hbWUgPSBqc2lpVG9QYXNjYWxDYXNlKHNhZmVOYW1lKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb2NzOiBwcm9wZXJ0eS5kb2NzLFxuICAgICAgc3BlYzogcHJvcGVydHksXG4gICAgICBkZWZpbmluZ1R5cGUsXG4gICAgICBwcm9wTmFtZSxcbiAgICAgIGpzaWlOYW1lOiBwcm9wZXJ0eS5uYW1lLFxuICAgICAgbnVsbGFibGU6ICEhcHJvcGVydHkub3B0aW9uYWwsXG4gICAgICBmaWVsZE5hbWU6IHRoaXMuY29kZS50b0NhbWVsQ2FzZShzYWZlTmFtZSksXG4gICAgICBmaWVsZEphdmFUeXBlOiB0aGlzLnRvSmF2YVR5cGUocHJvcGVydHkudHlwZSksXG4gICAgICBwYXJhbUphdmFUeXBlOiB0aGlzLnRvSmF2YVR5cGUocHJvcGVydHkudHlwZSwgeyBjb3ZhcmlhbnQ6IHRydWUgfSksXG4gICAgICBmaWVsZE5hdGl2ZVR5cGU6IHRoaXMudG9OYXRpdmVUeXBlKHByb3BlcnR5LnR5cGUpLFxuICAgICAgZmllbGRKYXZhQ2xhc3M6IGAke3RoaXMudG9KYXZhVHlwZShwcm9wZXJ0eS50eXBlLCB7XG4gICAgICAgIGZvck1hcnNoYWxsaW5nOiB0cnVlLFxuICAgICAgfSl9LmNsYXNzYCxcbiAgICAgIGphdmFUeXBlczogdGhpcy50b0phdmFUeXBlcyhwcm9wZXJ0eS50eXBlLCB7IGNvdmFyaWFudDogdHJ1ZSB9KSxcbiAgICAgIGltbXV0YWJsZTogcHJvcGVydHkuaW1tdXRhYmxlID8/IGZhbHNlLFxuICAgICAgaW5oZXJpdGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRDbGFzc0J1aWxkZXIoY2xzOiBzcGVjLkNsYXNzVHlwZSkge1xuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlcmUgaXMgbm8gaW5pdGlhbGl6ZXIsIG9yIGlmIHRoZSBpbml0aWFsaXplciBpcyBwcm90ZWN0ZWQgb3IgdmFyaWFkaWNcbiAgICBpZiAoY2xzLmluaXRpYWxpemVyID09IG51bGwgfHwgY2xzLmluaXRpYWxpemVyLnByb3RlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBOb3QgcmVuZGVyaW5nIGlmIHRoZSBpbml0aWFsaXplciBoYXMgbm8gcGFyYW1ldGVyc1xuICAgIGlmIChjbHMuaW5pdGlhbGl6ZXIucGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlcmUgaXMgYSBuZXN0ZWQgXCJCdWlsZGVyXCIgY2xhc3NcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZmxlY3RBc3NlbWJseS50cnlGaW5kVHlwZShgJHtjbHMuZnFufS4ke0JVSUxERVJfQ0xBU1NfTkFNRX1gKSAhPVxuICAgICAgbnVsbFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHN0cnVjdCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yIChpZiBhbnkpXG4gICAgY29uc3QgZmlyc3RTdHJ1Y3QgPSBjbHMuaW5pdGlhbGl6ZXIucGFyYW1ldGVycy5maW5kKChwYXJhbSkgPT4ge1xuICAgICAgaWYgKCFzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKHBhcmFtLnR5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LnRyeUZpbmRUeXBlKHBhcmFtLnR5cGUuZnFuKTtcbiAgICAgIHJldHVybiBwYXJhbVR5cGU/LmlzRGF0YVR5cGUoKTtcbiAgICB9KTtcblxuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlcmUgaXMgbm8gc3RydWN0IHBhcmFtZXRlclxuICAgIGlmIChmaXJzdFN0cnVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RydWN0VHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LmZpbmRUeXBlKFxuICAgICAgKGZpcnN0U3RydWN0LnR5cGUgYXMgc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpLmZxbixcbiAgICApIGFzIHJlZmxlY3QuSW50ZXJmYWNlVHlwZTtcbiAgICBjb25zdCBzdHJ1Y3RQYXJhbU5hbWUgPSB0aGlzLmNvZGUudG9DYW1lbENhc2UoXG4gICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKGZpcnN0U3RydWN0Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3Qgc3RydWN0QnVpbGRlciA9IGAke3RoaXMudG9KYXZhVHlwZShcbiAgICAgIGZpcnN0U3RydWN0LnR5cGUsXG4gICAgKX0uJHtCVUlMREVSX0NMQVNTX05BTUV9YDtcblxuICAgIGNvbnN0IHBvc2l0aW9uYWxQYXJhbXMgPSBjbHMuaW5pdGlhbGl6ZXIucGFyYW1ldGVyc1xuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZmlyc3RTdHJ1Y3QpXG4gICAgICAubWFwKChwYXJhbSkgPT4gKHtcbiAgICAgICAgcGFyYW0sXG4gICAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2RlLnRvQ2FtZWxDYXNlKFxuICAgICAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocGFyYW0ubmFtZSksXG4gICAgICAgICksXG4gICAgICAgIGphdmFUeXBlOiB0aGlzLnRvSmF2YVR5cGUocGFyYW0udHlwZSksXG4gICAgICB9KSk7XG5cbiAgICBjb25zdCBidWlsdFR5cGUgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmV0dGllci9wcmV0dGllclxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCAqICR7c3RhYmlsaXR5UHJlZml4Rm9yKFxuICAgICAgICBjbHMuaW5pdGlhbGl6ZXIsXG4gICAgICApfUEgZmx1ZW50IGJ1aWxkZXIgZm9yIHtAbGluayAke2J1aWx0VHlwZX19LmAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xzLmluaXRpYWxpemVyKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgJHtCVUlMREVSX0NMQVNTX05BTUV9IGltcGxlbWVudHMgc29mdHdhcmUuYW1hem9uLmpzaWkuQnVpbGRlcjwke2J1aWx0VHlwZX0+YCxcbiAgICApO1xuXG4gICAgLy8gU3RhdGljIGZhY3RvcnkgbWV0aG9kKHMpXG4gICAgZm9yIChjb25zdCBwYXJhbXMgb2YgY29tcHV0ZU92ZXJyaWRlcyhwb3NpdGlvbmFsUGFyYW1zKSkge1xuICAgICAgY29uc3QgZHVtbXlNZXRob2Q6IHNwZWMuTWV0aG9kID0ge1xuICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgc3RhYmlsaXR5OiBjbHMuaW5pdGlhbGl6ZXIuZG9jcz8uc3RhYmlsaXR5ID8/IGNscy5kb2NzPy5zdGFiaWxpdHksXG4gICAgICAgICAgcmV0dXJuczogYGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayAke0JVSUxERVJfQ0xBU1NfTkFNRX19LmAsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6ICdjcmVhdGUnLFxuICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMubWFwKChwYXJhbSkgPT4gcGFyYW0ucGFyYW0pLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYWRkSmF2YURvY3MoZHVtbXlNZXRob2QsIHtcbiAgICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgICAgZnFuOiBjbHMuZnFuLFxuICAgICAgICBtZW1iZXJOYW1lOiBkdW1teU1ldGhvZC5uYW1lLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhjbHMuaW5pdGlhbGl6ZXIpO1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYHB1YmxpYyBzdGF0aWMgJHtCVUlMREVSX0NMQVNTX05BTUV9IGNyZWF0ZSgke3BhcmFtc1xuICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgIGBmaW5hbCAke3BhcmFtLmphdmFUeXBlfSR7cGFyYW0ucGFyYW0udmFyaWFkaWMgPyAnLi4uJyA6ICcnfSAke1xuICAgICAgICAgICAgICAgIHBhcmFtLmZpZWxkTmFtZVxuICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpvaW4oJywgJyl9KWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGByZXR1cm4gbmV3ICR7QlVJTERFUl9DTEFTU19OQU1FfSgke3Bvc2l0aW9uYWxQYXJhbXNcbiAgICAgICAgICAubWFwKChwYXJhbSwgaWR4KSA9PiAoaWR4IDwgcGFyYW1zLmxlbmd0aCA/IHBhcmFtLmZpZWxkTmFtZSA6ICdudWxsJykpXG4gICAgICAgICAgLmpvaW4oJywgJyl9KTtgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBvc2l0aW9uYWxQYXJhbXMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJpdmF0ZSBmaW5hbCAke3BhcmFtLmphdmFUeXBlfSR7cGFyYW0ucGFyYW0udmFyaWFkaWMgPyAnW10nIDogJyd9ICR7XG4gICAgICAgICAgcGFyYW0uZmllbGROYW1lXG4gICAgICAgIH07YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHByaXZhdGUgJHtcbiAgICAgICAgZmlyc3RTdHJ1Y3Qub3B0aW9uYWwgPyAnJyA6ICdmaW5hbCAnXG4gICAgICB9JHtzdHJ1Y3RCdWlsZGVyfSAke3N0cnVjdFBhcmFtTmFtZX07YCxcbiAgICApO1xuXG4gICAgLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcml2YXRlICR7QlVJTERFUl9DTEFTU19OQU1FfSgke3Bvc2l0aW9uYWxQYXJhbXNcbiAgICAgICAgLm1hcChcbiAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICBgZmluYWwgJHtwYXJhbS5qYXZhVHlwZX0ke3BhcmFtLnBhcmFtLnZhcmlhZGljID8gJy4uLicgOiAnJ30gJHtcbiAgICAgICAgICAgICAgcGFyYW0uZmllbGROYW1lXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignLCAnKX0pYCxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcG9zaXRpb25hbFBhcmFtcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHtwYXJhbS5maWVsZE5hbWV9ID0gJHtwYXJhbS5maWVsZE5hbWV9O2ApO1xuICAgIH1cbiAgICBpZiAoIWZpcnN0U3RydWN0Lm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0gPSBuZXcgJHtzdHJ1Y3RCdWlsZGVyfSgpO2ApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgLy8gRmllbGRzXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHN0cnVjdFR5cGUuYWxsUHJvcGVydGllcykge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5jb2RlLnRvQ2FtZWxDYXNlKFxuICAgICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3AubmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIGNvbnN0IHNldHRlcjogc3BlYy5NZXRob2QgPSB7XG4gICAgICAgIG5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgZG9jczoge1xuICAgICAgICAgIC4uLnByb3Auc3BlYy5kb2NzLFxuICAgICAgICAgIHN0YWJpbGl0eTogcHJvcC5zcGVjLmRvY3M/LnN0YWJpbGl0eSxcbiAgICAgICAgICByZXR1cm5zOiAne0Bjb2RlIHRoaXN9JyxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSwgLy8gV2UgZG9uJ3QgcXVpdGUgY2FyZSBpbiB0aGlzIGNvbnRleHQhXG4gICAgICAgICAgICBkb2NzOiBwcm9wLnNwZWMuZG9jcyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgamF2YVR5cGUgb2YgdGhpcy50b0phdmFUeXBlcyhwcm9wLnR5cGUuc3BlYyEsIHtcbiAgICAgICAgY292YXJpYW50OiB0cnVlLFxuICAgICAgfSkpIHtcbiAgICAgICAgdGhpcy5hZGRKYXZhRG9jcyhzZXR0ZXIsIHtcbiAgICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICAgIGZxbjogcHJvcC5kZWZpbmluZ1R5cGUuZnFuLCAvLyBDb3VsZCBiZSBpbmhlcml0ZWRcbiAgICAgICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wLnNwZWMpO1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAgIGBwdWJsaWMgJHtCVUlMREVSX0NMQVNTX05BTUV9ICR7ZmllbGROYW1lfShmaW5hbCAke2phdmFUeXBlfSAke2ZpZWxkTmFtZX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9JHtcbiAgICAgICAgICAgIGZpcnN0U3RydWN0Lm9wdGlvbmFsID8gJygpJyA6ICcnXG4gICAgICAgICAgfS4ke2ZpZWxkTmFtZX0oJHtmaWVsZE5hbWV9KTtgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHRoaXM7Jyk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmluYWwgYnVpbGQgbWV0aG9kXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgICogQHJldHVybnMgYSBuZXdseSBidWlsdCBpbnN0YW5jZSBvZiB7QGxpbmsgJHtidWlsdFR5cGV9fS5gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscy5pbml0aWFsaXplcik7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyAke2J1aWx0VHlwZX0gYnVpbGQoKWApO1xuICAgIGNvbnN0IHBhcmFtcyA9IGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgIGlmIChwYXJhbSA9PT0gZmlyc3RTdHJ1Y3QpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0U3RydWN0Lm9wdGlvbmFsXG4gICAgICAgICAgPyBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0gIT0gbnVsbCA/IHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9LmJ1aWxkKCkgOiBudWxsYFxuICAgICAgICAgIDogYHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9LmJ1aWxkKClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB0aGlzLiR7XG4gICAgICAgIHBvc2l0aW9uYWxQYXJhbXMuZmluZCgocCkgPT4gcGFyYW0gPT09IHAucGFyYW0pIS5maWVsZE5hbWVcbiAgICAgIH1gO1xuICAgIH0pO1xuICAgIHRoaXMuY29kZS5pbmRlbnQoYHJldHVybiBuZXcgJHtidWlsdFR5cGV9KGApO1xuICAgIHBhcmFtcy5mb3JFYWNoKChwYXJhbSwgaWR4KSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7cGFyYW19JHtpZHggPCBwYXJhbXMubGVuZ3RoIC0gMSA/ICcsJyA6ICcnfWApLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLnVuaW5kZW50KCcpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBPcHRpb25hbCBidWlsZGVyIGluaXRpYWxpemF0aW9uXG4gICAgaWYgKGZpcnN0U3RydWN0Lm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHJpdmF0ZSAke3N0cnVjdEJ1aWxkZXJ9ICR7c3RydWN0UGFyYW1OYW1lfSgpYCk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBpZiAodGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0gPT0gbnVsbClgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9IG5ldyAke3N0cnVjdEJ1aWxkZXJ9KCk7YCk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRCdWlsZGVyU2V0dGVyKFxuICAgIHByb3A6IEphdmFQcm9wLFxuICAgIGJ1aWxkZXJOYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50VHlwZTogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgcHJvcC5qYXZhVHlwZXMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYCAqIFNldHMgdGhlIHZhbHVlIG9mIHtAbGluayAke3BhcmVudFR5cGUubmFtZX0jJHtnZXR0ZXJGb3IoXG4gICAgICAgICAgcHJvcC5maWVsZE5hbWUsXG4gICAgICAgICl9fWAsXG4gICAgICApO1xuICAgICAgY29uc3Qgc3VtbWFyeSA9IHByb3AuZG9jcz8uc3VtbWFyeSA/PyAndGhlIHZhbHVlIHRvIGJlIHNldCc7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYCAqICR7cGFyYW1KYXZhZG9jKHByb3AuZmllbGROYW1lLCBwcm9wLm51bGxhYmxlLCBzdW1tYXJ5KX1gLFxuICAgICAgKTtcbiAgICAgIGlmIChwcm9wLmRvY3M/LnJlbWFya3MgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSAnICcucmVwZWF0KDcgKyBwcm9wLmZpZWxkTmFtZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCByZW1hcmtzID0gbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgICAgdGhpcy5jb252ZXJ0U2FtcGxlc0luTWFya2Rvd24ocHJvcC5kb2NzLnJlbWFya3MsIHtcbiAgICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgICBmcW46IHByb3AuZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AuanNpaU5hbWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICkudHJpbVJpZ2h0KCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiByZW1hcmtzLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2luZGVudH0gJHtsaW5lfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUubGluZSgnICogQHJldHVybiB7QGNvZGUgdGhpc30nKTtcbiAgICAgIGlmIChwcm9wLmRvY3M/LmRlcHJlY2F0ZWQpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqIEBkZXByZWNhdGVkICR7cHJvcC5kb2NzLmRlcHJlY2F0ZWR9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wLnNwZWMpO1xuICAgICAgLy8gV2UgYWRkIGFuIGV4cGxpY2l0IGNhc3QgaWYgYm90aCB0eXBlcyBhcmUgZ2VuZXJpYyBidXQgdGhleSBhcmUgbm90IGlkZW50aWNhbCAob25lIGlzIGNvdmFyaWFudCwgdGhlIG90aGVyIGlzbid0KVxuICAgICAgY29uc3QgZXhwbGljaXRDYXN0ID1cbiAgICAgICAgdHlwZS5pbmNsdWRlcygnPCcpICYmXG4gICAgICAgIHByb3AuZmllbGRKYXZhVHlwZS5pbmNsdWRlcygnPCcpICYmXG4gICAgICAgIHR5cGUgIT09IHByb3AuZmllbGRKYXZhVHlwZVxuICAgICAgICAgID8gYCgke3Byb3AuZmllbGRKYXZhVHlwZX0pYFxuICAgICAgICAgIDogJyc7XG4gICAgICBpZiAoZXhwbGljaXRDYXN0ICE9PSAnJykge1xuICAgICAgICAvLyBXZSdsbCBiZSBkb2luZyBhIHNhZmUsIGJ1dCB1bmNoZWNrZWQgY2FzdCwgc28gc3VwcHJlc3MgdGhhdCB3YXJuaW5nXG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKScpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYHB1YmxpYyAke2J1aWxkZXJOYW1lfSAke3Byb3AuZmllbGROYW1lfSgke3R5cGV9ICR7cHJvcC5maWVsZE5hbWV9KWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGB0aGlzLiR7cHJvcC5maWVsZE5hbWV9ID0gJHtleHBsaWNpdENhc3R9JHtwcm9wLmZpZWxkTmFtZX07YCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHRoaXM7Jyk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldHRlckZvcihmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gZmllbGROYW1lO1xuICAgICAgcmV0dXJuIGBnZXQke2ZpcnN0LnRvVXBwZXJDYXNlKCl9JHtyZXN0LmpvaW4oJycpfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SW50ZXJmYWNlQnVpbGRlcihcbiAgICBjbGFzc1NwZWM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBjb25zdHJ1Y3Rvck5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSmF2YVByb3BbXSxcbiAgKSB7XG4gICAgLy8gU3RhcnQgYnVpbGRlcigpXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgICogQHJldHVybiBhIHtAbGluayAke0JVSUxERVJfQ0xBU1NfTkFNRX19IG9mIHtAbGluayAke2NsYXNzU3BlYy5uYW1lfX1gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgc3RhdGljICR7QlVJTERFUl9DTEFTU19OQU1FfSBidWlsZGVyKClgKTtcbiAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIG5ldyAke0JVSUxERVJfQ0xBU1NfTkFNRX0oKTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBidWlsZGVyKClcblxuICAgIC8vIFN0YXJ0IEJ1aWxkZXJcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCAqIEEgYnVpbGRlciBmb3Ige0BsaW5rICR7Y2xhc3NTcGVjLm5hbWV9fWApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhjbGFzc1NwZWMpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gaW1wbGVtZW50cyBzb2Z0d2FyZS5hbWF6b24uanNpaS5CdWlsZGVyPCR7Y2xhc3NTcGVjLm5hbWV9PmAsXG4gICAgKTtcblxuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgJHtwcm9wLmZpZWxkSmF2YVR5cGV9ICR7cHJvcC5maWVsZE5hbWV9O2ApLFxuICAgICk7XG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT5cbiAgICAgIHRoaXMuZW1pdEJ1aWxkZXJTZXR0ZXIocHJvcCwgQlVJTERFUl9DTEFTU19OQU1FLCBjbGFzc1NwZWMpLFxuICAgICk7XG5cbiAgICAvLyBTdGFydCBidWlsZCgpXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqIEJ1aWxkcyB0aGUgY29uZmlndXJlZCBpbnN0YW5jZS4nKTtcbiAgICB0aGlzLmNvZGUubGluZShgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgJHtjbGFzc1NwZWMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgcmVxdWlyZWQgYXR0cmlidXRlIHdhcyBub3QgcHJvdmlkZWQnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyAke2NsYXNzU3BlYy5uYW1lfSBidWlsZCgpYCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIG5ldyAke2NvbnN0cnVjdG9yTmFtZX0odGhpcyk7YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgYnVpbGQoKVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgQnVpbGRlclxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGF0YVR5cGUoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICAvLyBjb2xsZWN0IGFsbCBwcm9wZXJ0aWVzIGZyb20gYWxsIGJhc2Ugc3RydWN0cyBhbmQgZGVkdXBlIGJ5IG5hbWUuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZ2VuZXJhdGlvbiBvZiB0aGVcbiAgICAvLyBhc3NlbWJseSB3aWxsIG5vdCBwZXJtaXQgbXVsdGlwbGUgb3ZlcmxvYWRlZCBpbmhlcml0ZWQgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHRoYXQgdGhpcyB3aWxsIGJlXG4gICAgLy8gZW5mb3JjZWQgYnkgVHlwZXNjcmlwdCBjb25zdHJhaW50cy5cbiAgICBjb25zdCBwcm9wc0J5TmFtZTogeyBbbmFtZTogc3RyaW5nXTogSmF2YVByb3AgfSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gY29sbGVjdFByb3BzKFxuICAgICAgdGhpczogSmF2YUdlbmVyYXRvcixcbiAgICAgIGN1cnJlbnRJZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICAgIGlzQmFzZUNsYXNzID0gZmFsc2UsXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGN1cnJlbnRJZmMucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBqYXZhUHJvcCA9IHRoaXMudG9KYXZhUHJvcChwcm9wZXJ0eSwgY3VycmVudElmYywgaXNCYXNlQ2xhc3MpO1xuICAgICAgICBwcm9wc0J5TmFtZVtqYXZhUHJvcC5wcm9wTmFtZV0gPSBqYXZhUHJvcDtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHByb3BzIG9mIGJhc2Ugc3RydWN0XG4gICAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgY3VycmVudElmYy5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICAgIGNvbGxlY3RQcm9wcy5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maW5kVHlwZShiYXNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb2xsZWN0UHJvcHMuY2FsbCh0aGlzLCBpZmMpO1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LnZhbHVlcyhwcm9wc0J5TmFtZSk7XG4gICAgdGhpcy5lbWl0SW50ZXJmYWNlQnVpbGRlcihpZmMsIElOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FLCBwcm9wcyk7XG5cbiAgICAvLyBTdGFydCBpbXBsZW1lbnRhdGlvbiBjbGFzc1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKGAgKiBBbiBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rICR7aWZjLm5hbWV9fWApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhpZmMpO1xuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBmaW5hbCBjbGFzcyAke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfSBleHRlbmRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QgaW1wbGVtZW50cyAke2lmYy5uYW1lfWAsXG4gICAgKTtcblxuICAgIC8vIEltbXV0YWJsZSBwcm9wZXJ0aWVzXG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT5cbiAgICAgIHRoaXMuY29kZS5saW5lKGBwcml2YXRlIGZpbmFsICR7cHJvcC5maWVsZEphdmFUeXBlfSAke3Byb3AuZmllbGROYW1lfTtgKSxcbiAgICApO1xuXG4gICAgLy8gU3RhcnQgSlNJSSByZWZlcmVuY2UgY29uc3RydWN0b3JcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBDb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBvYmplY3QgYmFzZWQgb24gdmFsdWVzIHJldHJpZXZlZCBmcm9tIHRoZSBKc2lpT2JqZWN0LicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICogQHBhcmFtIG9ialJlZiBSZWZlcmVuY2UgdG8gdGhlIEpTSUkgbWFuYWdlZCBvYmplY3QuJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9KGZpbmFsIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RSZWYgb2JqUmVmKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnc3VwZXIob2JqUmVmKTsnKTtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGB0aGlzLiR7cHJvcC5maWVsZE5hbWV9ID0gc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLmdldCh0aGlzLCBcIiR7cHJvcC5qc2lpTmFtZX1cIiwgJHtwcm9wLmZpZWxkTmF0aXZlVHlwZX0pO2AsXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgSlNJSSByZWZlcmVuY2UgY29uc3RydWN0b3JcblxuICAgIC8vIFN0YXJ0IGJ1aWxkZXIgY29uc3RydWN0b3JcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBDb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBvYmplY3QgYmFzZWQgb24gbGl0ZXJhbCBwcm9wZXJ0eSB2YWx1ZXMgcGFzc2VkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlcn0uJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICBpZiAocHJvcHMuc29tZSgocHJvcCkgPT4gcHJvcC5maWVsZEphdmFUeXBlICE9PSBwcm9wLnBhcmFtSmF2YVR5cGUpKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQFN1cHByZXNzV2FybmluZ3MoXCJ1bmNoZWNrZWRcIiknKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRX0oZmluYWwgJHtCVUlMREVSX0NMQVNTX05BTUV9IGJ1aWxkZXIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ3N1cGVyKHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuSW5pdGlhbGl6YXRpb25Nb2RlLkpTSUkpOycsXG4gICAgKTtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICBjb25zdCBleHBsaWNpdENhc3QgPVxuICAgICAgICBwcm9wLmZpZWxkSmF2YVR5cGUgIT09IHByb3AucGFyYW1KYXZhVHlwZVxuICAgICAgICAgID8gYCgke3Byb3AuZmllbGRKYXZhVHlwZX0pYFxuICAgICAgICAgIDogJyc7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSAke2V4cGxpY2l0Q2FzdH0ke192YWxpZGF0ZUlmTm9uT3B0aW9uYWwoXG4gICAgICAgICAgYGJ1aWxkZXIuJHtwcm9wLmZpZWxkTmFtZX1gLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICl9O2AsXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGxpdGVyYWwgY29uc3RydWN0b3JcblxuICAgIC8vIEdldHRlcnNcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYHB1YmxpYyBmaW5hbCAke3Byb3AuZmllbGRKYXZhVHlwZX0gZ2V0JHtwcm9wLnByb3BOYW1lfSgpYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIHRoaXMuJHtwcm9wLmZpZWxkTmFtZX07YCk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH0pO1xuXG4gICAgLy8gZW1pdCAkanNpaSR0b0pzb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgdG8gc2VyaWFsaXplIHRoaXMgb2JqZWN0IHdoZW4gc2VudCB0byBKU1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICdwdWJsaWMgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLkpzb25Ob2RlICRqc2lpJHRvSnNvbigpJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2ZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXIgb20gPSBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0TWFwcGVyLklOU1RBTkNFOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBmaW5hbCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5PYmplY3ROb2RlIGRhdGEgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpO2AsXG4gICAgKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBpZiAodGhpcy5nZXQke3Byb3AucHJvcE5hbWV9KCkgIT0gbnVsbClgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgZGF0YS5zZXQoXCIke3Byb3Auc3BlYy5uYW1lfVwiLCBvbS52YWx1ZVRvVHJlZSh0aGlzLmdldCR7cHJvcC5wcm9wTmFtZX0oKSkpO2AsXG4gICAgICApO1xuICAgICAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2ZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGUgc3RydWN0ID0gY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuSnNvbk5vZGVGYWN0b3J5Lmluc3RhbmNlLm9iamVjdE5vZGUoKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHN0cnVjdC5zZXQoXCJmcW5cIiwgb20udmFsdWVUb1RyZWUoXCIke2lmYy5mcW59XCIpKTtgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnc3RydWN0LnNldChcImRhdGFcIiwgZGF0YSk7Jyk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2ZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGUgb2JqID0gY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuSnNvbk5vZGVGYWN0b3J5Lmluc3RhbmNlLm9iamVjdE5vZGUoKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ29iai5zZXQoXCIkanNpaS5zdHJ1Y3RcIiwgc3RydWN0KTsnKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiBvYmo7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgJGpzaWkkdG9Kc29uXG5cbiAgICAvLyBHZW5lcmF0ZSBlcXVhbHMoKSBvdmVycmlkZVxuICAgIHRoaXMuZW1pdEVxdWFsc092ZXJyaWRlKGlmYy5uYW1lLCBwcm9wcyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBoYXNoQ29kZSgpIG92ZXJyaWRlXG4gICAgdGhpcy5lbWl0SGFzaENvZGVPdmVycmlkZShwcm9wcyk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBpbXBsZW1lbnRhdGlvbiBjbGFzc1xuXG4gICAgZnVuY3Rpb24gX3ZhbGlkYXRlSWZOb25PcHRpb25hbCh2YXJpYWJsZTogc3RyaW5nLCBwcm9wOiBKYXZhUHJvcCk6IHN0cmluZyB7XG4gICAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsKCR7dmFyaWFibGV9LCBcIiR7cHJvcC5maWVsZE5hbWV9IGlzIHJlcXVpcmVkXCIpYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRFcXVhbHNPdmVycmlkZShjbGFzc05hbWU6IHN0cmluZywgcHJvcHM6IEphdmFQcm9wW10pIHtcbiAgICAvLyBBIGNsYXNzIHdpdGhvdXQgcHJvcGVydGllcyBkb2VzIG5vdCBuZWVkIHRvIG92ZXJyaWRlIGVxdWFscygpXG4gICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbyknKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Jyk7XG5cbiAgICAvLyBUaGlzIHdhcyBhbHJlYWR5IGNoZWNrZWQgYnkgYHN1cGVyLmVxdWFscyhvKWAsIHNvIHdlIHNraXAgaXQgaGVyZS4uLlxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2lmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsnLFxuICAgICk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCR7Y2xhc3NOYW1lfS4ke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfSB0aGF0ID0gKCR7Y2xhc3NOYW1lfS4ke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfSkgbztgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIGNvbnN0IGluaXRpYWxQcm9wcyA9IHByb3BzLnNsaWNlKDAsIHByb3BzLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGZpbmFsUHJvcCA9IHByb3BzW3Byb3BzLmxlbmd0aCAtIDFdO1xuXG4gICAgaW5pdGlhbFByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHByZWRpY2F0ZSA9IHByb3AubnVsbGFibGVcbiAgICAgICAgPyBgdGhpcy4ke3Byb3AuZmllbGROYW1lfSAhPSBudWxsID8gIXRoaXMuJHtwcm9wLmZpZWxkTmFtZX0uZXF1YWxzKHRoYXQuJHtwcm9wLmZpZWxkTmFtZX0pIDogdGhhdC4ke3Byb3AuZmllbGROYW1lfSAhPSBudWxsYFxuICAgICAgICA6IGAhJHtwcm9wLmZpZWxkTmFtZX0uZXF1YWxzKHRoYXQuJHtwcm9wLmZpZWxkTmFtZX0pYDtcblxuICAgICAgdGhpcy5jb2RlLmxpbmUoYGlmICgke3ByZWRpY2F0ZX0pIHJldHVybiBmYWxzZTtgKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBmaW5hbCAocmV0dXJuZWQgcHJlZGljYXRlKSBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgb3RoZXIgb25lc1xuICAgIGNvbnN0IGZpbmFsUHJlZGljYXRlID0gZmluYWxQcm9wLm51bGxhYmxlXG4gICAgICA/IGB0aGlzLiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0gIT0gbnVsbCA/IHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9KSA6IGAgK1xuICAgICAgICBgdGhhdC4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9ID09IG51bGxgXG4gICAgICA6IGB0aGlzLiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0uZXF1YWxzKHRoYXQuJHtmaW5hbFByb3AuZmllbGROYW1lfSlgO1xuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gJHtmaW5hbFByZWRpY2F0ZX07YCk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SGFzaENvZGVPdmVycmlkZShwcm9wczogSmF2YVByb3BbXSkge1xuICAgIC8vIEEgY2xhc3Mgd2l0aG91dCBwcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgdG8gb3ZlcnJpZGUgaGFzaENvZGUoKVxuICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCknKTtcblxuICAgIGNvbnN0IGZpcnN0UHJvcCA9IHByb3BzWzBdO1xuICAgIGNvbnN0IHJlbWFpbmluZ1Byb3BzID0gcHJvcHMuc2xpY2UoMSk7XG5cbiAgICB0aGlzLmNvZGUubGluZShgaW50IHJlc3VsdCA9ICR7X2hhc2hDb2RlRm9yUHJvcChmaXJzdFByb3ApfTtgKTtcbiAgICByZW1haW5pbmdQcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKCR7X2hhc2hDb2RlRm9yUHJvcChwcm9wKX0pO2ApLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiByZXN1bHQ7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGZ1bmN0aW9uIF9oYXNoQ29kZUZvclByb3AocHJvcDogSmF2YVByb3ApIHtcbiAgICAgIHJldHVybiBwcm9wLm51bGxhYmxlXG4gICAgICAgID8gYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gIT0gbnVsbCA/IHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0uaGFzaENvZGUoKSA6IDBgXG4gICAgICAgIDogYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0uaGFzaENvZGUoKWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRmlsZUlmTmVlZGVkKHR5cGU6IHNwZWMuVHlwZSkge1xuICAgIGlmICh0aGlzLmlzTmVzdGVkKHR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKHRoaXMudG9KYXZhRmlsZVBhdGgodGhpcy5hc3NlbWJseSwgdHlwZSkpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHBhY2thZ2UgJHt0aGlzLnRvTmF0aXZlTmFtZSh0aGlzLmFzc2VtYmx5LCB0eXBlKS5wYWNrYWdlTmFtZX07YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlRmlsZUlmTmVlZGVkKHR5cGU6IHNwZWMuVHlwZSkge1xuICAgIGlmICh0aGlzLmlzTmVzdGVkKHR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUodGhpcy50b0phdmFGaWxlUGF0aCh0aGlzLmFzc2VtYmx5LCB0eXBlKSk7XG4gIH1cblxuICBwcml2YXRlIGlzTmVzdGVkKHR5cGU6IHNwZWMuVHlwZSkge1xuICAgIGlmICghdGhpcy5hc3NlbWJseS50eXBlcyB8fCAhdHlwZS5uYW1lc3BhY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gYCR7dHlwZS5hc3NlbWJseX0uJHt0eXBlLm5hbWVzcGFjZX1gO1xuICAgIHJldHVybiBwYXJlbnQgaW4gdGhpcy5hc3NlbWJseS50eXBlcztcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhRmlsZVBhdGgoYXNzbTogc3BlYy5Bc3NlbWJseSwgZnFuOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9KYXZhRmlsZVBhdGgoYXNzbTogc3BlYy5Bc3NlbWJseSwgdHlwZTogc3BlYy5UeXBlKTogc3RyaW5nO1xuICBwcml2YXRlIHRvSmF2YUZpbGVQYXRoKGFzc206IHNwZWMuQXNzZW1ibHksIHdoYXQ6IHNwZWMuVHlwZSB8IHN0cmluZykge1xuICAgIGNvbnN0IGZxbiA9IHR5cGVvZiB3aGF0ID09PSAnc3RyaW5nJyA/IHdoYXQgOiB3aGF0LmZxbjtcbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lLCB0eXBlTmFtZXMgfSA9IHRyYW5zbGF0ZUZxbihhc3NtLCBmcW4pO1xuXG4gICAgaWYgKHR5cGVOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRvSmF2YUZpbGVQYXRoOiAke2Zxbn0gbXVzdCBpbmRpY2F0ZSBhIHR5cGUsIGJ1dCBkb2Vzbid0OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHsgcGFja2FnZU5hbWUsIHR5cGVOYW1lcyB9LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXRoLmpvaW4oXG4gICAgICAnc3JjJyxcbiAgICAgICdtYWluJyxcbiAgICAgICdqYXZhJyxcbiAgICAgIC4uLnBhY2thZ2VOYW1lLnNwbGl0KCcuJyksXG4gICAgICB0eXBlTmFtZXNbMF0sXG4gICAgKX0uamF2YWA7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YVJlc291cmNlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCBmcW46IHN0cmluZywgZXh0ID0gJy50eHQnKSB7XG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWUgfSA9IHRoaXMudG9OYXRpdmVOYW1lKGFzc20sIHtcbiAgICAgIGZxbixcbiAgICAgIGtpbmQ6IHNwZWMuVHlwZUtpbmQuQ2xhc3MsXG4gICAgICBhc3NlbWJseTogYXNzbS5uYW1lLFxuICAgICAgbmFtZTogZnFuLnJlcGxhY2UoLy4qXFwuKFteLl0rKSQvLCAnJDEnKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgLi4ucGFja2FnZU5hbWUuc3BsaXQoJy4nKSxcbiAgICAgIGAke3R5cGVOYW1lLnNwbGl0KCcuJylbMF19JHtleHR9YCxcbiAgICBdO1xuICAgIC8vIFJlc291cmNlIG5hbWVzIGFyZSAvLWRlbGltaXRlZCBwYXRocyAoZXZlbiBvbiBXaW5kb3dzICp3aW5rIHdpbmsqKVxuICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5qb2luKCcvJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oJ3NyYycsICdtYWluJywgJ3Jlc291cmNlcycsIC4uLnBhcnRzKTtcblxuICAgIHJldHVybiB7IGZpbGVQYXRoLCBuYW1lIH07XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBwcml2YXRlIGFkZEphdmFEb2NzKFxuICAgIGRvYzogc3BlYy5Eb2N1bWVudGFibGUsXG4gICAgYXBpTG9jOiBBcGlMb2NhdGlvbixcbiAgICBkZWZhdWx0VGV4dD86IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgIWRlZmF1bHRUZXh0ICYmXG4gICAgICBPYmplY3Qua2V5cyhkb2MuZG9jcyA/PyB7fSkubGVuZ3RoID09PSAwICYmXG4gICAgICAhKChkb2MgYXMgc3BlYy5NZXRob2QpLnBhcmFtZXRlcnMgPz8gW10pLnNvbWUoXG4gICAgICAgIChwKSA9PiBPYmplY3Qua2V5cyhwLmRvY3MgPz8ge30pLmxlbmd0aCAhPT0gMCxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gKGRvYy5kb2NzID0gZG9jLmRvY3MgPz8ge30pO1xuXG4gICAgY29uc3QgcGFyYXMgPSBbXTtcblxuICAgIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICAgIHBhcmFzLnB1c2gocmVuZGVyU3VtbWFyeShkb2NzKSk7XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0VGV4dCkge1xuICAgICAgcGFyYXMucHVzaChkZWZhdWx0VGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgICAgcGFyYXMucHVzaChcbiAgICAgICAgbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgICAgdGhpcy5jb252ZXJ0U2FtcGxlc0luTWFya2Rvd24oZG9jcy5yZW1hcmtzLCBhcGlMb2MpLFxuICAgICAgICApLnRyaW1SaWdodCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgICBwYXJhcy5wdXNoKGBEZWZhdWx0OiAke2RvY3MuZGVmYXVsdH1gKTsgLy8gTk9URTogdGhlcmUgaXMgbm8gYW5ub3RhdGlvbiBpbiBKYXZhRG9jIGZvciB0aGlzXG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZXhhbXBsZSkge1xuICAgICAgcGFyYXMucHVzaCgnRXhhbXBsZTonKTtcblxuICAgICAgY29uc3QgY29udmVydGVkRXhhbXBsZSA9IHRoaXMuY29udmVydEV4YW1wbGUoZG9jcy5leGFtcGxlLCBhcGlMb2MpO1xuXG4gICAgICAvLyBXZSB1c2VkIHRvIHVzZSB0aGUgc2xpZ2h0bHkgbmljZXIgYDxwcmU+e0Bjb2RlIC4uLn08L3ByZT5gLCB3aGljaCBkb2Vzbid0XG4gICAgICAvLyByZXF1aXJlIChhbmQgdGhlcmVmb3JlIGFsc28gZG9lc24ndCBhbGxvdykgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGNvZGUgc2FtcGxlcyBtYXkgY29udGFpbiBibG9jayBxdW90ZXMgb2YgdGhlaXIgb3duICgnKi8nKSB0aGF0XG4gICAgICAvLyB3b3VsZCB0ZXJtaW5hdGUgdGhlIGJsb2NrIGNvbW1lbnQgZnJvbSB0aGUgUG9WIG9mIHRoZSBKYXZhIHRva2VuaXplciwgYW5kXG4gICAgICAvLyBzaW5jZSBge0Bjb2RlIC4uLiB9YCBkb2Vzbid0IGFsbG93IGFueSBlc2NhcGluZywgdGhlcmUncyBhbHNvIG5vIHdheSB0byBlbmNvZGVcbiAgICAgIC8vICcqLycgaW4gYSB3YXkgdGhhdCB3b3VsZCAoYSkgaGlkZSBpdCBmcm9tIHRoZSB0b2tlbml6ZXIgYW5kIChiKSBnaXZlICcqLycgYmFja1xuICAgICAgLy8gYWZ0ZXIgcHJvY2Vzc2luZyBKYXZhRG9jcy5cbiAgICAgIC8vXG4gICAgICAvLyBIZW5jZSwgd2UganVzdCByZXNvcnQgdG8gSFRNTC1lbmNvZGluZyBldmVyeXRoaW5nIChzYW1lIGFzIHdlIGRvIGZvciBjb2RlXG4gICAgICAvLyBleGFtcGxlcyB0aGF0IGhhdmUgYmVlbiB0cmFuc2xhdGVkIGZyb20gTWFya0Rvd24pLlxuICAgICAgcGFyYXMucHVzaChcbiAgICAgICAgbWFya0Rvd25Ub0phdmFEb2MoWydgYGAnLCBjb252ZXJ0ZWRFeGFtcGxlLCAnYGBgJ10uam9pbignXFxuJykpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdMaW5lcyA9IFtdO1xuXG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgdGFnTGluZXMucHVzaChgQHJldHVybiAke2RvY3MucmV0dXJuc31gKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICB0YWdMaW5lcy5wdXNoKGBAc2VlICR7ZG9jcy5zZWV9YCk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIHRhZ0xpbmVzLnB1c2goYEBkZXByZWNhdGVkICR7ZG9jcy5kZXByZWNhdGVkfWApO1xuICAgIH1cblxuICAgIC8vIFBhcmFtc1xuICAgIGlmICgoZG9jIGFzIHNwZWMuTWV0aG9kKS5wYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBkb2MgYXMgc3BlYy5NZXRob2Q7XG4gICAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBwYXJhbS5kb2NzPy5zdW1tYXJ5O1xuICAgICAgICAgIHRhZ0xpbmVzLnB1c2gocGFyYW1KYXZhZG9jKHBhcmFtLm5hbWUsIHBhcmFtLm9wdGlvbmFsLCBzdW1tYXJ5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFnTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYXMucHVzaCh0YWdMaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGFyYSBvZiBwYXJhcykge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnPHA+Jyk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKC4uLnBhcmEuc3BsaXQoJ1xcbicpLmZpbHRlcigobCkgPT4gbCAhPT0gJycpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgICogJHtsaW5lfWApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gIH1cblxuICBwcml2YXRlIGdldENsYXNzQmFzZShjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgaWYgKCFjbHMuYmFzZSkge1xuICAgICAgcmV0dXJuICdzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0JztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0phdmFUeXBlKHsgZnFuOiBjbHMuYmFzZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdG9EZWNvcmF0ZWRKYXZhVHlwZShcbiAgICBvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUsXG4gICAgeyBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlcyhvcHRpb25hbFZhbHVlLCB7IGNvdmFyaWFudCB9KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBgJHtcbiAgICAgICAgb3B0aW9uYWxWYWx1ZS5vcHRpb25hbCA/IEFOTl9OVUxMQUJMRSA6IEFOTl9OT1RfTlVMTFxuICAgICAgfSBqYXZhLmxhbmcuT2JqZWN0YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXTtcbiAgfVxuXG4gIHByaXZhdGUgdG9EZWNvcmF0ZWRKYXZhVHlwZXMoXG4gICAgb3B0aW9uYWxWYWx1ZTogc3BlYy5PcHRpb25hbFZhbHVlLFxuICAgIHsgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudG9KYXZhVHlwZXMob3B0aW9uYWxWYWx1ZS50eXBlLCB7IGNvdmFyaWFudCB9KS5tYXAoXG4gICAgICAobmFrZWRUeXBlKSA9PlxuICAgICAgICBgJHtvcHRpb25hbFZhbHVlLm9wdGlvbmFsID8gQU5OX05VTExBQkxFIDogQU5OX05PVF9OVUxMfSAke25ha2VkVHlwZX1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YVR5cGUoXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG9wdHM/OiB7IGZvck1hcnNoYWxsaW5nPzogYm9vbGVhbjsgY292YXJpYW50PzogYm9vbGVhbiB9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVzID0gdGhpcy50b0phdmFUeXBlcyh0eXBlLCBvcHRzKTtcbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuICdqYXZhLmxhbmcuT2JqZWN0JztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVzWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSB0b05hdGl2ZVR5cGUoXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIHsgZm9yTWFyc2hhbGxpbmcgPSBmYWxzZSwgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZSkpIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnRUeXBlID0gdGhpcy50b05hdGl2ZVR5cGUodHlwZS5jb2xsZWN0aW9uLmVsZW1lbnR0eXBlLCB7XG4gICAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgICBjb3ZhcmlhbnQsXG4gICAgICB9KTtcbiAgICAgIHN3aXRjaCAodHlwZS5jb2xsZWN0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5OlxuICAgICAgICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5saXN0T2YoJHtuYXRpdmVFbGVtZW50VHlwZX0pYDtcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgICByZXR1cm4gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLk5hdGl2ZVR5cGUubWFwT2YoJHtuYXRpdmVFbGVtZW50VHlwZX0pYDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29sbGVjdGlvbiBraW5kOiAke3R5cGUuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5mb3JDbGFzcygke3RoaXMudG9KYXZhVHlwZSh0eXBlLCB7XG4gICAgICBmb3JNYXJzaGFsbGluZyxcbiAgICAgIGNvdmFyaWFudCxcbiAgICB9KX0uY2xhc3MpYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhVHlwZXMoXG4gICAgdHlwZXJlZjogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIHsgZm9yTWFyc2hhbGxpbmcgPSBmYWxzZSwgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgaWYgKHNwZWMuaXNQcmltaXRpdmVUeXBlUmVmZXJlbmNlKHR5cGVyZWYpKSB7XG4gICAgICByZXR1cm4gW3RoaXMudG9KYXZhUHJpbWl0aXZlKHR5cGVyZWYucHJpbWl0aXZlKV07XG4gICAgfSBlbHNlIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZXJlZikpIHtcbiAgICAgIHJldHVybiBbdGhpcy50b0phdmFDb2xsZWN0aW9uKHR5cGVyZWYsIHsgZm9yTWFyc2hhbGxpbmcsIGNvdmFyaWFudCB9KV07XG4gICAgfSBlbHNlIGlmIChzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKHR5cGVyZWYpKSB7XG4gICAgICByZXR1cm4gW3RoaXMudG9OYXRpdmVGcW4odHlwZXJlZi5mcW4pXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVyZWYudW5pb24pIHtcbiAgICAgIGNvbnN0IHR5cGVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3Qgc3VidHlwZSBvZiB0eXBlcmVmLnVuaW9uLnR5cGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLnRvSmF2YVR5cGVzKHN1YnR5cGUsIHtcbiAgICAgICAgICBmb3JNYXJzaGFsbGluZyxcbiAgICAgICAgICBjb3ZhcmlhbnQsXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgdHlwZXMucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSByZWZlcmVuY2U6ICR7SlNPTi5zdHJpbmdpZnkodHlwZXJlZil9YCk7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YUNvbGxlY3Rpb24oXG4gICAgcmVmOiBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlLFxuICAgIHtcbiAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgY292YXJpYW50LFxuICAgIH06IHsgZm9yTWFyc2hhbGxpbmc6IGJvb2xlYW47IGNvdmFyaWFudDogYm9vbGVhbiB9LFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50SmF2YVR5cGUgPSB0aGlzLnRvSmF2YVR5cGUocmVmLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUsIHtcbiAgICAgIGNvdmFyaWFudCxcbiAgICB9KTtcbiAgICBjb25zdCB0eXBlQ29uc3RyYWludCA9IGNvdmFyaWFudFxuICAgICAgPyBtYWtlQ292YXJpYW50KGVsZW1lbnRKYXZhVHlwZSlcbiAgICAgIDogZWxlbWVudEphdmFUeXBlO1xuICAgIHN3aXRjaCAocmVmLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5OlxuICAgICAgICByZXR1cm4gZm9yTWFyc2hhbGxpbmdcbiAgICAgICAgICA/ICdqYXZhLnV0aWwuTGlzdCdcbiAgICAgICAgICA6IGBqYXZhLnV0aWwuTGlzdDwke3R5cGVDb25zdHJhaW50fT5gO1xuICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgcmV0dXJuIGZvck1hcnNoYWxsaW5nXG4gICAgICAgICAgPyAnamF2YS51dGlsLk1hcCdcbiAgICAgICAgICA6IGBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICR7dHlwZUNvbnN0cmFpbnR9PmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbGxlY3Rpb24ga2luZDogJHtyZWYuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VDb3ZhcmlhbnQoamF2YVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAvLyBEb24ndCBlbWl0IGEgY292YXJpYW50IGV4cHJlc3Npb24gZm9yIFN0cmluZyAoaXQncyBgZmluYWxgIGluIEphdmEpXG4gICAgICBpZiAoamF2YVR5cGUgPT09ICdqYXZhLmxhbmcuU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gamF2YVR5cGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD8gZXh0ZW5kcyAke2phdmFUeXBlfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFQcmltaXRpdmUocHJpbWl0aXZlOiBzcGVjLlByaW1pdGl2ZVR5cGUpIHtcbiAgICBzd2l0Y2ggKHByaW1pdGl2ZSkge1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuQm9vbGVhbjpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuQm9vbGVhbic7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5EYXRlOlxuICAgICAgICByZXR1cm4gJ2phdmEudGltZS5JbnN0YW50JztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkpzb246XG4gICAgICAgIHJldHVybiAnY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSc7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5OdW1iZXI6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLk51bWJlcic7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLlN0cmluZyc7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Bbnk6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLk9iamVjdCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJpbWl0aXZlIHR5cGU6ICR7cHJpbWl0aXZlIGFzIGFueX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1ldGhvZENhbGxBcmd1bWVudHMobWV0aG9kOiBzcGVjLkNhbGxhYmxlKSB7XG4gICAgaWYgKCFtZXRob2QucGFyYW1ldGVycyB8fCBtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgcmVndWxhclBhcmFtcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLmZpbHRlcigocCkgPT4gIXAudmFyaWFkaWMpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJlZ3VsYXJQYXJhbXMubWFwKF9yZW5kZXJQYXJhbWV0ZXIpO1xuICAgIGNvbnN0IHZhbHVlU3RyID0gYG5ldyBPYmplY3RbXSB7ICR7dmFsdWVzLmpvaW4oJywgJyl9IH1gO1xuICAgIGlmIChtZXRob2QudmFyaWFkaWMpIHtcbiAgICAgIGNvbnN0IHZhbHVlc1N0cmVhbSA9IGBqYXZhLnV0aWwuQXJyYXlzLjxPYmplY3Q+c3RyZWFtKCR7dmFsdWVTdHJ9KWA7XG5cbiAgICAgIGNvbnN0IGxhc3RQYXJhbSA9IG1ldGhvZC5wYXJhbWV0ZXJzW21ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgcmVzdFN0cmVhbSA9IGBqYXZhLnV0aWwuQXJyYXlzLjxPYmplY3Q+c3RyZWFtKCR7bGFzdFBhcmFtLm5hbWV9KWA7XG5cbiAgICAgIGNvbnN0IGZ1bGxTdHJlYW0gPVxuICAgICAgICByZWd1bGFyUGFyYW1zLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb25jYXQoJHt2YWx1ZXNTdHJlYW19LCAke3Jlc3RTdHJlYW19KWBcbiAgICAgICAgICA6IHJlc3RTdHJlYW07XG4gICAgICByZXR1cm4gYCwgJHtmdWxsU3RyZWFtfS50b0FycmF5KE9iamVjdFtdOjpuZXcpYDtcbiAgICB9XG4gICAgcmV0dXJuIGAsICR7dmFsdWVTdHJ9YDtcblxuICAgIGZ1bmN0aW9uIF9yZW5kZXJQYXJhbWV0ZXIocGFyYW06IHNwZWMuUGFyYW1ldGVyKSB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocGFyYW0ubmFtZSk7XG4gICAgICByZXR1cm4gaXNOdWxsYWJsZShwYXJhbSlcbiAgICAgICAgPyBzYWZlTmFtZVxuICAgICAgICA6IGBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCgke3NhZmVOYW1lfSwgXCIke3NhZmVOYW1lfSBpcyByZXF1aXJlZFwiKWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJNZXRob2RDYWxsKFxuICAgIGNsczogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QsXG4gICAgYXN5bmM6IGJvb2xlYW4sXG4gICkge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJztcblxuICAgIGlmIChtZXRob2Quc3RhdGljKSB7XG4gICAgICBjb25zdCBqYXZhQ2xhc3MgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcbiAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljQ2FsbCgke2phdmFDbGFzc30uY2xhc3MsIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLiR7XG4gICAgICAgIGFzeW5jID8gJ2FzeW5jQ2FsbCcgOiAnY2FsbCdcbiAgICAgIH0odGhpcywgYDtcbiAgICB9XG5cbiAgICBzdGF0ZW1lbnQgKz0gYFwiJHttZXRob2QubmFtZX1cImA7XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHN0YXRlbWVudCArPSBgLCAke3RoaXMudG9OYXRpdmVUeXBlKG1ldGhvZC5yZXR1cm5zLnR5cGUsIHtcbiAgICAgICAgZm9yTWFyc2hhbGxpbmc6IHRydWUsXG4gICAgICB9KX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZW1lbnQgKz0gJywgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5WT0lEJztcbiAgICB9XG4gICAgc3RhdGVtZW50ICs9IGAke3RoaXMucmVuZGVyTWV0aG9kQ2FsbEFyZ3VtZW50cyhtZXRob2QpfSlgO1xuXG4gICAgaWYgKG1ldGhvZC5yZXR1cm5zKSB7XG4gICAgICBzdGF0ZW1lbnQgPSB0aGlzLndyYXBDb2xsZWN0aW9uKFxuICAgICAgICBzdGF0ZW1lbnQsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLnR5cGUsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLm9wdGlvbmFsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHJldHVybiBgcmV0dXJuICR7c3RhdGVtZW50fTtgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7c3RhdGVtZW50fTtgO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgY29sbGVjdGlvbiBpbnRvIGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIGVsc2UgcmV0dXJucyB0aGUgZXhpc3Rpbmcgc3RhdGVtZW50LlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IFRoZSBzdGF0ZW1lbnQgdG8gd3JhcCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9wdGlvbmFsIFdoZXRoZXIgdGhlIHZhbHVlIGlzIG9wdGlvbmFsIChjYW4gYmUgbnVsbC91bmRlZmluZWQpIG9yIG5vdC5cbiAgICogQHJldHVybnMgVGhlIG1vZGlmaWVkIG9yIG9yaWdpbmFsIHN0YXRlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd3JhcENvbGxlY3Rpb24oXG4gICAgc3RhdGVtZW50OiBzdHJpbmcsXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG9wdGlvbmFsPzogYm9vbGVhbixcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoc3BlYy5pc0NvbGxlY3Rpb25UeXBlUmVmZXJlbmNlKHR5cGUpKSB7XG4gICAgICBsZXQgd3JhcHBlcjogc3RyaW5nO1xuICAgICAgc3dpdGNoICh0eXBlLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuQXJyYXk6XG4gICAgICAgICAgd3JhcHBlciA9ICd1bm1vZGlmaWFibGVMaXN0JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgICB3cmFwcGVyID0gJ3VubW9kaWZpYWJsZU1hcCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbGxlY3Rpb24ga2luZDogJHt0eXBlLmNvbGxlY3Rpb24ua2luZCBhcyBhbnl9YCxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgXCJvcHRpb25hbFwiLCB0aGUgdmFsdWUgbmVlZHMgb3QgYmUgZXhwbGljaXRseSBjYXN0IHRvIGFsbG93IGZvciBjYXNlcyB3aGVyZSB0aGUgcmF3IHR5cGUgd2FzIHJldHVybmVkLlxuICAgICAgcmV0dXJuIG9wdGlvbmFsXG4gICAgICAgID8gYGphdmEudXRpbC5PcHRpb25hbC5vZk51bGxhYmxlKCgke3RoaXMudG9KYXZhVHlwZShcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgKX0pKCR7c3RhdGVtZW50fSkpLm1hcChqYXZhLnV0aWwuQ29sbGVjdGlvbnM6OiR7d3JhcHBlcn0pLm9yRWxzZShudWxsKWBcbiAgICAgICAgOiBgamF2YS51dGlsLkNvbGxlY3Rpb25zLiR7d3JhcHBlcn0oJHtzdGF0ZW1lbnR9KWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWV0aG9kUGFyYW1ldGVycyhtZXRob2Q6IHNwZWMuQ2FsbGFibGUpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICAvLyBXZSBjYW4gcmVuZGVyIGNvdmFyaWFudCBwYXJhbWV0ZXJzIG9ubHkgZm9yIG1ldGhvZHMgdGhhdCBhcmVuJ3Qgb3ZlcnJpZGFibGUuLi4gc28gb25seSBmb3Igc3RhdGljIG1ldGhvZHMgY3VycmVudGx5LlxuICAgICAgICBwYXJhbXMucHVzaChcbiAgICAgICAgICBgZmluYWwgJHt0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGUocCwge1xuICAgICAgICAgICAgY292YXJpYW50OiAobWV0aG9kIGFzIHNwZWMuTWV0aG9kKS5zdGF0aWMsXG4gICAgICAgICAgfSl9JHtwLnZhcmlhZGljID8gJy4uLicgOiAnJ30gJHtKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKFxuICAgICAgICAgICAgcC5uYW1lLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcy5qb2luKCcsICcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBY2Nlc3NMZXZlbChtZXRob2Q6IHNwZWMuQ2FsbGFibGUgfCBzcGVjLlByb3BlcnR5KSB7XG4gICAgcmV0dXJuIG1ldGhvZC5wcm90ZWN0ZWQgPyAncHJvdGVjdGVkJyA6ICdwdWJsaWMnO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlTW9kdWxlQ2xhc3MobW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudG9OYXRpdmVGcW4obW9kdWxlTmFtZSl9LiR7TU9EVUxFX0NMQVNTX05BTUV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1vZHVsZUZpbGUobW9kOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZC5uYW1lO1xuICAgIGNvbnN0IG1vZHVsZUNsYXNzID0gdGhpcy5tYWtlTW9kdWxlQ2xhc3MobW9kdWxlTmFtZSk7XG5cbiAgICBjb25zdCB7IGZpbGVQYXRoOiBtb2R1bGVSZXNGaWxlLCBuYW1lOiBtb2R1bGVSZXNOYW1lIH0gPVxuICAgICAgdGhpcy50b0phdmFSZXNvdXJjZVBhdGgobW9kLCBgJHttb2QubmFtZX0uJHtNT0RVTEVfQ0xBU1NfTkFNRX1gKTtcbiAgICB0aGlzLmNvZGUub3BlbkZpbGUobW9kdWxlUmVzRmlsZSk7XG4gICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS50eXBlcyA/PyB7fSkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2Zxbn09JHt0aGlzLnRvTmF0aXZlRnFuKGZxbiwgeyBiaW5hcnlOYW1lOiB0cnVlIH0pfWApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKG1vZHVsZVJlc0ZpbGUpO1xuXG4gICAgY29uc3QgbW9kdWxlRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgobW9kLCB7XG4gICAgICBhc3NlbWJseTogbW9kLm5hbWUsXG4gICAgICBmcW46IGAke21vZC5uYW1lfS4ke01PRFVMRV9DTEFTU19OQU1FfWAsXG4gICAgICBraW5kOiBzcGVjLlR5cGVLaW5kLkNsYXNzLFxuICAgICAgbmFtZTogTU9EVUxFX0NMQVNTX05BTUUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUobW9kdWxlRmlsZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHBhY2thZ2UgJHt0aGlzLnRvTmF0aXZlTmFtZShtb2QpLnBhY2thZ2VOYW1lfTtgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGlmIChPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzID8/IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsnKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5VbmNoZWNrZWRJT0V4Y2VwdGlvbjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsnKTtcbiAgICBpZiAoT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcyA/PyB7fSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsnKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuTWFwOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpTW9kdWxlOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShBTk5fSU5URVJOQUwpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIGZpbmFsIGNsYXNzICR7TU9EVUxFX0NMQVNTX05BTUV9IGV4dGVuZHMgSnNpaU1vZHVsZWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IE1PRFVMRV9UWVBFUyA9IGxvYWQoKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3ByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9hZCgpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOycpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYGZpbmFsIENsYXNzTG9hZGVyIGNsID0gJHtNT0RVTEVfQ0xBU1NfTkFNRX0uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgdHJ5IChmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0oXCIke21vZHVsZVJlc05hbWV9XCIpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgICAgIGZpbmFsIFJlYWRlciByZCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAnICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZCkpJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdici5saW5lcygpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAgLmZpbHRlcihsaW5lIC0+ICFsaW5lLnRyaW0oKS5pc0VtcHR5KCkpJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnICAuZm9yRWFjaChsaW5lIC0+ICcpO1xuICAgIHRoaXMuY29kZS5saW5lKCdmaW5hbCBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoXCI9XCIsIDIpOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdmaW5hbCBTdHJpbmcgZnFuID0gcGFydHNbMF07Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBwYXJ0c1sxXTsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmVzdWx0LnB1dChmcW4sIGNsYXNzTmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLnVuaW5kZW50KCd9KTsnKTsgLy8gUHJveHkgZm9yIGNsb3NlQmxvY2tcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2NhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleGNlcHRpb24pJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3Rocm93IG5ldyBVbmNoZWNrZWRJT0V4Y2VwdGlvbihleGNlcHRpb24pOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiByZXN1bHQ7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAncHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gY2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICAvLyBjdG9yXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7TU9EVUxFX0NMQVNTX05BTUV9KClgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBzdXBlcihcIiR7bW9kdWxlTmFtZX1cIiwgXCIke1xuICAgICAgICBtb2QudmVyc2lvblxuICAgICAgfVwiLCAke01PRFVMRV9DTEFTU19OQU1FfS5jbGFzcywgXCIke3RoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpfVwiKTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTsgLy8gY3RvclxuXG4gICAgLy8gZGVwZW5kZW5jaWVzXG4gICAgaWYgKG1vZC5kZXBlbmRlbmNpZXMgJiYgT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVwcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgZGVwcy5wdXNoKGAke3RoaXMubWFrZU1vZHVsZUNsYXNzKGRlcCl9LmNsYXNzYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAncHVibGljIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEpzaWlNb2R1bGU+PiBnZXREZXBlbmRlbmNpZXMoKScsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiBhc0xpc3QoJHtkZXBzLmpvaW4oJywgJyl9KTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICdwcm90ZWN0ZWQgQ2xhc3M8Pz4gcmVzb2x2ZUNsYXNzKGZpbmFsIFN0cmluZyBmcW4pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2lmICghTU9EVUxFX1RZUEVTLmNvbnRhaW5zS2V5KGZxbikpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAndGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oXCJVbmtub3duIEpTSUkgdHlwZTogXCIgKyBmcW4pOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKCdTdHJpbmcgY2xhc3NOYW1lID0gTU9EVUxFX1RZUEVTLmdldChmcW4pOycpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2lmICghdGhpcy5jYWNoZS5jb250YWluc0tleShjbGFzc05hbWUpKScpO1xuICAgIHRoaXMuY29kZS5saW5lKCd0aGlzLmNhY2hlLnB1dChjbGFzc05hbWUsIHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSkpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiB0aGlzLmNhY2hlLmdldChjbGFzc05hbWUpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwcml2YXRlIENsYXNzPD8+IGZpbmRDbGFzcyhmaW5hbCBTdHJpbmcgYmluYXJ5TmFtZSknKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCd0cnknKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIENsYXNzLmZvck5hbWUoYmluYXJ5TmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGNlcHRpb24pJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUobW9kdWxlRmlsZSk7XG5cbiAgICByZXR1cm4gbW9kdWxlQ2xhc3M7XG4gIH1cblxuICBwcml2YXRlIGVtaXRKc2lpSW5pdGlhbGl6ZXJzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xzLm5hbWV9KGZpbmFsIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RSZWYgb2JqUmVmKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnc3VwZXIob2JqUmVmKTsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke2Nscy5uYW1lfShmaW5hbCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LkluaXRpYWxpemF0aW9uTW9kZSBpbml0aWFsaXphdGlvbk1vZGUpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihpbml0aWFsaXphdGlvbk1vZGUpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGphdmEgRlFOIGZvciBhIEpTSUkgRlFOOlxuICAgKiAxLiBEZXRlcm1pbmUgd2hpY2ggYXNzZW1ibHkgdGhlIEZRTiBiZWxvbmdzIHRvIChmaXJzdCBjb21wb25lbnQgb2YgdGhlIEZRTilcbiAgICogMi4gTG9jYXRlIHRoZSBgdGFyZ2V0cy5qYXZhLnBhY2thZ2VgIHZhbHVlIGZvciB0aGF0IGFzc2VtYmx5ICh0aGlzIGFzc2VtYmx5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcylcbiAgICogMy4gUmV0dXJuIHRoZSBqYXZhIEZRTjogYGA8bW9kdWxlLnRhcmdldHMuamF2YS5wYWNrYWdlPi48RlFOIHN0aXBwZWQgb2YgZmlyc3QgY29tcG9uZW50PmBgXG4gICAqXG4gICAqIFJlY29yZHMgYW4gYXNzZW1ibHkgcmVmZXJlbmNlIGlmIHRoZSByZWZlcmVuY2VkIEZRTiBjb21lcyBmcm9tIGEgZGlmZmVyZW50IGFzc2VtYmx5LlxuICAgKlxuICAgKiBAcGFyYW0gZnFuIHRoZSBKU0lJIEZRTiB0byBiZSB1c2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBKYXZhIEZRTi5cbiAgICpcbiAgICogQHRocm93cyBpZiB0aGUgYXNzZW1ibHkgdGhlIEZRTiBiZWxvbmdzIHRvIGRvZXMgbm90IGhhdmUgYSBgdGFyZ2V0cy5qYXZhLnBhY2thZ2VgIHNldC5cbiAgICovXG4gIHByaXZhdGUgdG9OYXRpdmVGcW4oXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgeyBiaW5hcnlOYW1lIH06IHsgYmluYXJ5TmFtZTogYm9vbGVhbiB9ID0geyBiaW5hcnlOYW1lOiBmYWxzZSB9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IFttb2RdID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZGVwTW9kID0gdGhpcy5maW5kTW9kdWxlKG1vZCk7XG4gICAgLy8gTWFrZSBzdXJlIGFueSBkZXBlbmRlbmN5IChkaXJlY3Qgb3IgdHJhbnNpdGl2ZSkgb2Ygd2hpY2ggYW55IHR5cGUgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkIGJ5IHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBjb2RlIGlzIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgUE9NJ3MgZGVwZW5kZW5jaWVzIHNlY3Rpb24gKHByb3RlY3RpbmcgdGhlIGFydGlmYWN0IGZyb20gY2hhbmdlcyBpbiB0aGVcbiAgICAvLyBkZXBlbmRlbmNpZXMnIGRlcGVuZGVuY3kgc3RydWN0dXJlKS5cbiAgICBpZiAobW9kICE9PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlZE1vZHVsZXNbbW9kXSA9IGRlcE1vZDtcblxuICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRyYW5zbGF0ZUZxbih7IC4uLmRlcE1vZCwgbmFtZTogbW9kIH0sIGZxbik7XG4gICAgICByZXR1cm4gW3RyYW5zbGF0ZWQucGFja2FnZU5hbWUsIC4uLnRyYW5zbGF0ZWQudHlwZU5hbWVzXS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWUgfSA9XG4gICAgICBmcW4gPT09IHRoaXMuYXNzZW1ibHkubmFtZVxuICAgICAgICA/IHRoaXMudG9OYXRpdmVOYW1lKHRoaXMuYXNzZW1ibHkpXG4gICAgICAgIDogdGhpcy50b05hdGl2ZU5hbWUodGhpcy5hc3NlbWJseSwgdGhpcy5hc3NlbWJseS50eXBlcyFbZnFuXSk7XG4gICAgY29uc3QgY2xhc3NOYW1lID1cbiAgICAgIHR5cGVOYW1lICYmIGJpbmFyeU5hbWUgPyB0eXBlTmFtZS5yZXBsYWNlKCcuJywgJyQnKSA6IHR5cGVOYW1lO1xuICAgIHJldHVybiBgJHtwYWNrYWdlTmFtZX0ke2NsYXNzTmFtZSA/IGAuJHtjbGFzc05hbWV9YCA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgSmF2YSBuYW1lIGZvciBhIGpzaWkgYXNzZW1ibHkgb3IgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIGFzc20gVGhlIGFzc2VtYmx5IHRoYXQgY29udGFpbnMgdGhlIHR5cGVcbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgd2Ugd2FudCB0aGUgbmFtZSBvZlxuICAgKi9cbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHR5cGVOYW1lOiB1bmRlZmluZWQ7XG4gIH07XG4gIHByaXZhdGUgdG9OYXRpdmVOYW1lKFxuICAgIGFzc206IHNwZWMuQXNzZW1ibHksXG4gICAgdHlwZTogc3BlYy5UeXBlLFxuICApOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoXG4gICAgYXNzbTogc3BlYy5Bc3NlbWJseSxcbiAgICB0eXBlPzogc3BlYy5UeXBlLFxuICApOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lPzogc3RyaW5nIH0ge1xuICAgIGlmICghdHlwZSkge1xuICAgICAgcmV0dXJuIHsgcGFja2FnZU5hbWU6IHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc20pIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRyYW5zbGF0ZUZxbihhc3NtLCB0eXBlLmZxbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhY2thZ2VOYW1lOiB0cmFuc2xhdGVkLnBhY2thZ2VOYW1lLFxuICAgICAgdHlwZU5hbWU6IHRyYW5zbGF0ZWQudHlwZU5hbWVzLmpvaW4oJy4nKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGBgQEdlbmVyYXRlZGBgIGFubm90YXRpb24gaG9ub3JpbmcgdGhlIGBgdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9gYCBzZXR0aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0R2VuZXJhdGVkQW5ub3RhdGlvbigpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9cbiAgICAgID8gYCwgZGF0ZSA9IFwiJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IHRoaXMuZW1pdEZ1bGxHZW5lcmF0b3JJbmZvXG4gICAgICA/IGBqc2lpLXBhY21hay8ke1ZFUlNJT05fREVTQ31gXG4gICAgICA6ICdqc2lpLXBhY21hayc7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkKHZhbHVlID0gXCIke2dlbmVyYXRvcn1cIiR7ZGF0ZX0pYCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RXhhbXBsZShleGFtcGxlOiBzdHJpbmcsIGFwaTogQXBpTG9jYXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJvc2V0dGEudHJhbnNsYXRlRXhhbXBsZShcbiAgICAgIGFwaSxcbiAgICAgIGV4YW1wbGUsXG4gICAgICBUYXJnZXRMYW5ndWFnZS5KQVZBLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U2FtcGxlc0luTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgYXBpOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBhcGksXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5zIHRoZSBKYXZhIEZRTiBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbnRlcmZhY2VzIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIHdoZW4gYSBuZXdcbiAgICogZGVmYXVsdCBpbnRlcmZhY2Ugb3IgcHJveHkgY2xhc3MgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgZm9yIHdoaWNoIGEgZGVmYXVsdCBpbnRlcmZhY2Ugb3IgcHJveHkgaXMgZW1pdHRlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVUaGlzVHlwZSB3aGV0aGVyIHRoaXMgY2xhc3MncyBkZWZhdWx0IGludGVyZmFjZSBzaG91bGQgYmUgaW5jbHVkZWQgb3Igbm90LlxuICAgKlxuICAgKiBAcmV0dXJucyBhIGxpc3Qgb2YgSmF2YSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMuXG4gICAqL1xuICBwcml2YXRlIGRlZmF1bHRJbnRlcmZhY2VzRm9yKFxuICAgIHR5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlIHwgcmVmbGVjdC5JbnRlcmZhY2VUeXBlLFxuICAgIHsgaW5jbHVkZVRoaXNUeXBlID0gZmFsc2UgfTogeyBpbmNsdWRlVGhpc1R5cGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgaWYgKFxuICAgICAgaW5jbHVkZVRoaXNUeXBlICYmXG4gICAgICBoYXNEZWZhdWx0SW50ZXJmYWNlcyh0eXBlLmFzc2VtYmx5KSAmJlxuICAgICAgdHlwZS5pc0ludGVyZmFjZVR5cGUoKVxuICAgICkge1xuICAgICAgcmVzdWx0LmFkZChcbiAgICAgICAgYCR7dGhpcy50b05hdGl2ZUZxbih0eXBlLmZxbil9LiR7SU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiB0eXBlLmludGVyZmFjZXMpIHtcbiAgICAgICAgaWYgKGhhc0RlZmF1bHRJbnRlcmZhY2VzKGlmYWNlLmFzc2VtYmx5KSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoXG4gICAgICAgICAgICBgJHt0aGlzLnRvTmF0aXZlRnFuKGlmYWNlLmZxbil9LiR7SU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGVmYXVsdEludGVyZmFjZXNGb3IoaWZhY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGUuaXNDbGFzc1R5cGUoKSAmJiB0eXBlLmJhc2UgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kZWZhdWx0SW50ZXJmYWNlc0Zvcih0eXBlLmJhc2UpKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIG1vZGVscyB0aGUgUE9NIHNjaGVtYSBmb3IgYSA8ZGVwZW5kZW5jeT4gZW50aXR5XG4gKiBAc2VlIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9wb20uaHRtbCNEZXBlbmRlbmNpZXNcbiAqL1xuaW50ZXJmYWNlIE1hdmVuRGVwZW5kZW5jeSB7XG4gIGdyb3VwSWQ6IHN0cmluZztcbiAgYXJ0aWZhY3RJZDogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgdHlwZT86IHN0cmluZztcbiAgc2NvcGU/OiAnY29tcGlsZScgfCAncHJvdmlkZWQnIHwgJ3J1bnRpbWUnIHwgJ3Rlc3QnIHwgJ3N5c3RlbSc7XG4gIHN5c3RlbVBhdGg/OiBzdHJpbmc7XG4gIG9wdGlvbmFsPzogYm9vbGVhbjtcblxuICAnI2NvbW1lbnQnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIExvb2tzIHVwIHRoZSBgQGpzaWkvamF2YS1ydW50aW1lYCBwYWNrYWdlIGZyb20gdGhlIGxvY2FsIHJlcG9zaXRvcnkuXG4gKiBJZiBpdCBjb250YWlucyBhIFwibWF2ZW4tcmVwb1wiIGRpcmVjdG9yeSwgaXQgd2lsbCBiZSBhZGRlZCBhcyBhIGxvY2FsIG1hdmVuIHJlcG9cbiAqIHNvIHdoZW4gd2UgYnVpbGQgbG9jYWxseSwgd2UgYnVpbGQgYWdhaW5zdCBpdCBhbmQgbm90IGFnYWluc3QgdGhlIG9uZSBwdWJsaXNoZWRcbiAqIHRvIE1hdmVuIENlbnRyYWwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRKYXZhUnVudGltZUxvY2FsUmVwb3NpdG9yeSgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGphdmFSdW50aW1lID0gcmVxdWlyZSgnQGpzaWkvamF2YS1ydW50aW1lJyk7XG4gICAgbG9nZ2luZy5pbmZvKFxuICAgICAgYFVzaW5nIGxvY2FsIHZlcnNpb24gb2YgdGhlIEphdmEganNpaSBydW50aW1lIHBhY2thZ2UgYXQ6ICR7amF2YVJ1bnRpbWUucmVwb3NpdG9yeX1gLFxuICAgICk7XG4gICAgcmV0dXJuIGphdmFSdW50aW1lLnJlcG9zaXRvcnk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOdWxsYWJsZShvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFvcHRpb25hbFZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgb3B0aW9uYWxWYWx1ZS5vcHRpb25hbCB8fFxuICAgIChzcGVjLmlzUHJpbWl0aXZlVHlwZVJlZmVyZW5jZShvcHRpb25hbFZhbHVlLnR5cGUpICYmXG4gICAgICBvcHRpb25hbFZhbHVlLnR5cGUucHJpbWl0aXZlID09PSBzcGVjLlByaW1pdGl2ZVR5cGUuQW55KVxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJhbUphdmFkb2MoXG4gIG5hbWU6IHN0cmluZyxcbiAgb3B0aW9uYWw/OiBib29sZWFuLFxuICBzdW1tYXJ5Pzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBbJ0BwYXJhbScsIG5hbWVdO1xuICBpZiAoc3VtbWFyeSkge1xuICAgIHBhcnRzLnB1c2goZW5kV2l0aFBlcmlvZChzdW1tYXJ5KSk7XG4gIH1cbiAgaWYgKCFvcHRpb25hbCkge1xuICAgIHBhcnRzLnB1c2goJ1RoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gZW5kV2l0aFBlcmlvZChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzID0gcy50cmltUmlnaHQoKTtcbiAgaWYgKCFzLmVuZHNXaXRoKCcuJykpIHtcbiAgICByZXR1cm4gYCR7c30uYDtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU92ZXJyaWRlczxUIGV4dGVuZHMgeyBwYXJhbTogc3BlYy5QYXJhbWV0ZXIgfT4oXG4gIGFsbFBhcmFtczogVFtdLFxuKTogSXRlcmFibGU8VFtdPiB7XG4gIHJldHVybiB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06IGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCBhbGxQYXJhbXM7XG4gICAgICB3aGlsZSAoYWxsUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtID0gYWxsUGFyYW1zW2FsbFBhcmFtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFsYXN0UGFyYW0ucGFyYW0udmFyaWFkaWMgJiYgIWxhc3RQYXJhbS5wYXJhbS5vcHRpb25hbCkge1xuICAgICAgICAgIC8vIE5laXRoZXIgdmFyaWFkaWMgbm9yIG9wdGlvbmFsIC0tIHdlJ3JlIGRvbmUgaGVyZSFcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWxsUGFyYW1zID0gYWxsUGFyYW1zLnNsaWNlKDAsIGFsbFBhcmFtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgLy8gSWYgdGhlIGxhc3RQYXJhbSB3YXMgdmFyaWFkaWMsIHdlIHNob3VsZG4ndCBnZW5lcmF0ZSBhbiBvdmVycmlkZSB3aXRob3V0IGl0IG9ubHkuXG4gICAgICAgIGlmIChsYXN0UGFyYW0ucGFyYW0ub3B0aW9uYWwpIHtcbiAgICAgICAgICB5aWVsZCBhbGxQYXJhbXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG50eXBlIEFzc2VtYmx5TGlrZSA9IHNwZWMuQXNzZW1ibHlDb25maWd1cmF0aW9uICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5hdGl2ZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBhc3NlbWJseVxuICovXG5mdW5jdGlvbiBwYWNrYWdlTmFtZUZyb21Bc3NlbWJseShhc3NtOiBBc3NlbWJseUxpa2UpIHtcbiAgY29uc3QgamF2YVBhY2thZ2UgPSBhc3NtLnRhcmdldHM/LmphdmE/LnBhY2thZ2U7XG4gIGlmICghamF2YVBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIG1vZHVsZSAke2Fzc20ubmFtZX0gZG9lcyBub3QgaGF2ZSBhIGphdmEucGFja2FnZSBzZXR0aW5nYCxcbiAgICApO1xuICB9XG4gIHJldHVybiBqYXZhUGFja2FnZTtcbn1cblxuLyoqXG4gKiBBbmFseXplcyBhbmQgdHJhbnNsYXRlcyBhIGpzaWkgRlFOIHRvIEphdmEgY29tcG9uZW50c1xuICpcbiAqIFRoZSBGUU4gY2FuIGJlIG9mIHRoZSBhc3NlbWJseSwgYSBzdWJtb2R1bGUsIG9yIGEgdHlwZS5cbiAqXG4gKiBBbnkgdHlwZSBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAqXG4gKiAtIExvY2F0ZWQgaW4gemVybyBvciBtb3JlIG5lc3RlZCBzdWJtb2R1bGVzLiBBbnkgb2YgdGhlc2UgY2FuIGhhdmUgYSBKYXZhXG4gKiAgIHBhY2thZ2UgbmFtZSBhc3NpZ25lZC0taWYgbm9uZSwgdGhlIG5hbWUgaXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJ5XG4gKiAgIHNuYWtlIGNhc2luZy4gQXQgbGVhc3QgdGhlIGFzc2VtYmx5IG11c3QgaGF2ZSBhIEphdmEgcGFja2FnZSBuYW1lIGFzc2lnbmVkLlxuICogLSBMb2NhdGVkIGluIHplcm8gb3IgbW9yZSBuZXN0ZWQgdHlwZXMgKGNsYXNzZXMpLlxuICpcbiAqIEZpbmQgdXAgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHVudGlsIHdlIGZpbmQgYSBzdWJtb2R1bGUgKG9yIHRoZSBhc3NlbWJseVxuICogaXRzZWxmKSB0aGF0IGhhcyBhbiBleHBsaWNpdCBKYXZhIHBhY2thZ2UgbmFtZSBkZWZpbmVkLlxuICpcbiAqIEFwcGVuZCBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCB3ZSBjcm9zc2VkIHRoYXQgZGlkbid0IGhhdmUgYSBwYWNrYWdlIG5hbWUgZGVmaW5lZC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBKYXZhIHBhY2thZ2UgbmFtZSBkZXRlcm1pbmVkIHRoaXMgd2F5LCBhcyB3ZWxsIGFzIHRoZSBoaWVyYXJjaHkgb2YgdHlwZVxuICogbmFtZXMgaW5zaWRlIHRoZSBwYWNrYWdlLiBgdHlwZU5hbWVzYCBtYXkgYmUgbWlzc2luZyBvciBlbXB0eSBpZiB0aGUgRlFOIGluZGljYXRlZFxuICogdGhlIGFzc2VtYmx5IG9yIGEgc3VibW9kdWxlLCBjb250YWlucyAxIGVsZW1lbnQgaWYgdGhlIEZRTiBpbmRpY2F0ZWQgYSB0b3AtbGV2ZWwgdHlwZSxcbiAqIG11bHRpcGxlIGVsZW1lbnRzIGlmIHRoZSBGUU4gaW5kaWNhdGVkIGEgbmVzdGVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZUZxbihcbiAgYXNzbTogQXNzZW1ibHlMaWtlLFxuICBvcmlnaW5hbEZxbjogc3RyaW5nLFxuKTogeyBwYWNrYWdlTmFtZTogc3RyaW5nOyB0eXBlTmFtZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBpbXBsaWNpdFBhY2thZ2VOYW1lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgLy8gV2Ugd29yayBvdXJzZWx2ZXMgdXB3YXJkIHRocm91Z2ggdGhlIEZRTiB1bnRpbCB3ZSd2ZSBmb3VuZCBhbiBleHBsaWNpdCBwYWNrYWdlXG4gIGxldCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc20pO1xuICBsZXQgZnFuID0gb3JpZ2luYWxGcW47XG4gIHdoaWxlIChmcW4gIT09ICcnICYmIGZxbiAhPT0gYXNzbS5uYW1lKSB7XG4gICAgY29uc3QgW3BhcmVudEZxbiwgbGFzdFBhcnRdID0gc3BsaXROYW1lc3BhY2UoZnFuKTtcblxuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IGFzc20uc3VibW9kdWxlcz8uW2Zxbl07XG4gICAgaWYgKHN1Ym1vZHVsZSkge1xuICAgICAgY29uc3QgZXhwbGljaXRQYWNrYWdlID0gc3VibW9kdWxlLnRhcmdldHM/LmphdmE/LnBhY2thZ2U7XG4gICAgICBpZiAoZXhwbGljaXRQYWNrYWdlKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gZXhwbGljaXRQYWNrYWdlO1xuICAgICAgICAvLyBXZSBjYW4gc3RvcCByZWN1cnNpbmcsIHR5cGVzIGNhbm5vdCBiZSB0aGUgcGFyZW50IG9mIGEgbW9kdWxlIGFuZCBub3RoaW5nIHVwd2FyZHMgY2FuIGNoYW5nZVxuICAgICAgICAvLyB0aGUgcGFja2FnZSBuYW1lIGFueW1vcmVcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbXBsaWNpdFBhY2thZ2VOYW1lcy51bnNoaWZ0KGAuJHt0b1NuYWtlQ2FzZShsYXN0UGFydCl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGl0J3Mgbm90IGEgc3VibW9kdWxlLCBpdCBtdXN0IGJlIGEgdHlwZS5cbiAgICAgIHR5cGVOYW1lcy51bnNoaWZ0KGxhc3RQYXJ0KTtcbiAgICB9XG5cbiAgICBmcW4gPSBwYXJlbnRGcW47XG4gIH1cbiAgaWYgKGZxbiA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICcke29yaWdpbmFsRnFufScgaW5zaWRlICcke2Fzc20ubmFtZX0nYCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZTogYCR7cGFja2FnZU5hbWV9JHtpbXBsaWNpdFBhY2thZ2VOYW1lcy5qb2luKCcnKX1gLFxuICAgIHR5cGVOYW1lcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGFzc2VtYmx5IGV4cG9zZXMgdGhlIFwiaGFzRGVmYXVsdEludGVyZmFjZXNcIlxuICoganNpaS1wYWNtYWsgZmVhdHVyZSBmbGFnLlxuICpcbiAqIEBwYXJhbSBhc3NlbWJseSB0aGUgYXNzZW1ibHkgdGhhdCBpcyB0ZXN0ZWRcbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBKc2lpJERlZmF1bHQgaW50ZXJmYWNlcyBjYW4gYmUgdXNlZFxuICovXG5mdW5jdGlvbiBoYXNEZWZhdWx0SW50ZXJmYWNlcyhhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFhc3NlbWJseS5tZXRhZGF0YT8uanNpaT8ucGFjbWFrPy5oYXNEZWZhdWx0SW50ZXJmYWNlcztcbn1cblxuLyoqXG4gKiBXaGVja3Mgd2hldGhlciBhIG5hbWUgY29ycmVzcG9uZHMgdG8gYSBtZXRob2Qgb24gYGphdmEubGFuZy5PYmplY3RgLiBJdCBpcyBub3RcbiAqIHBvc3NpYmxlIHRvIGVtaXQgZGVmYXVsdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHRob3NlIG5hbWVzIGJlY2F1c2VcbiAqIHRoZXNlIHdvdWxkIGFsd2F5cyBiZSByZXBsYWNlZCBieSB0aGUgaW1wbGVtZW50YXRpb25zIG9uIGBPYmplY3RgLlxuICpcbiAqIEBwYXJhbSBuYW1lIHRoZSBjaGVja2VkIG5hbWVcbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgbmFtZS5cbiAqL1xuZnVuY3Rpb24gaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBKQVZBX0xBTkdfT0JKRUNUX01FVEhPRF9OQU1FUy5oYXMobmFtZSk7XG59XG5jb25zdCBKQVZBX0xBTkdfT0JKRUNUX01FVEhPRF9OQU1FUyA9IG5ldyBTZXQoW1xuICAnY2xvbmUnLFxuICAnZXF1YWxzJyxcbiAgJ2ZpbmFsaXplJyxcbiAgJ2dldENsYXNzJyxcbiAgJ2hhc2hDb2RlJyxcbiAgJ25vdGlmeScsXG4gICdub3RpZnlBbGwnLFxuICAndG9TdHJpbmcnLFxuICAnd2FpdCcsXG5dKTtcblxuLyoqXG4gKiBJbiBhIGRvdHRlZCBzdHJpbmcsIHN0cmlwIG9mZiB0aGUgbGFzdCBkb3R0ZWQgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIHNwbGl0TmFtZXNwYWNlKG5zOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgZG90ID0gbnMubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGRvdCA9PT0gLTEpIHtcbiAgICByZXR1cm4gWycnLCBuc107XG4gIH1cbiAgcmV0dXJuIFtucy5zdWJzdHIoMCwgZG90KSwgbnMuc3Vic3RyKGRvdCArIDEpXTtcbn1cbiJdfQ==