cdklabs-projen-project-types 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -7403,7 +7403,7 @@
7403
7403
  },
7404
7404
  "locationInModule": {
7405
7405
  "filename": "src/yarn/monorepo.ts",
7406
- "line": 334
7406
+ "line": 340
7407
7407
  },
7408
7408
  "parameters": [
7409
7409
  {
@@ -7417,7 +7417,7 @@
7417
7417
  "kind": "class",
7418
7418
  "locationInModule": {
7419
7419
  "filename": "src/yarn/monorepo.ts",
7420
- "line": 333
7420
+ "line": 339
7421
7421
  },
7422
7422
  "name": "CdkLabsMonorepo",
7423
7423
  "namespace": "yarn",
@@ -7437,7 +7437,7 @@
7437
7437
  "kind": "interface",
7438
7438
  "locationInModule": {
7439
7439
  "filename": "src/yarn/monorepo.ts",
7440
- "line": 327
7440
+ "line": 333
7441
7441
  },
7442
7442
  "name": "CdkLabsMonorepoOptions",
7443
7443
  "namespace": "yarn",
@@ -7562,7 +7562,7 @@
7562
7562
  "kind": "interface",
7563
7563
  "locationInModule": {
7564
7564
  "filename": "src/yarn/monorepo.ts",
7565
- "line": 316
7565
+ "line": 322
7566
7566
  },
7567
7567
  "methods": [
7568
7568
  {
@@ -7572,7 +7572,7 @@
7572
7572
  },
7573
7573
  "locationInModule": {
7574
7574
  "filename": "src/yarn/monorepo.ts",
7575
- "line": 317
7575
+ "line": 323
7576
7576
  },
7577
7577
  "name": "resolveDepsAndWritePackageJson",
7578
7578
  "returns": {
@@ -8131,7 +8131,7 @@
8131
8131
  },
8132
8132
  "locationInModule": {
8133
8133
  "filename": "src/yarn/monorepo.ts",
8134
- "line": 301
8134
+ "line": 307
8135
8135
  },
8136
8136
  "name": "postSynthesize",
8137
8137
  "overrides": "projen.Project"
@@ -11663,7 +11663,7 @@
11663
11663
  "kind": "interface",
11664
11664
  "locationInModule": {
11665
11665
  "filename": "src/yarn/typescript-workspace.ts",
11666
- "line": 445
11666
+ "line": 473
11667
11667
  },
11668
11668
  "name": "ReferenceOptions",
11669
11669
  "namespace": "yarn",
@@ -11679,7 +11679,7 @@
11679
11679
  "immutable": true,
11680
11680
  "locationInModule": {
11681
11681
  "filename": "src/yarn/typescript-workspace.ts",
11682
- "line": 456
11682
+ "line": 484
11683
11683
  },
11684
11684
  "name": "versionType",
11685
11685
  "optional": true,
@@ -11732,7 +11732,7 @@
11732
11732
  },
11733
11733
  "locationInModule": {
11734
11734
  "filename": "src/yarn/typescript-workspace.ts",
11735
- "line": 336
11735
+ "line": 315
11736
11736
  },
11737
11737
  "name": "addEslintRcFix",
11738
11738
  "protected": true
@@ -11744,7 +11744,7 @@
11744
11744
  },
11745
11745
  "locationInModule": {
11746
11746
  "filename": "src/yarn/typescript-workspace.ts",
11747
- "line": 322
11747
+ "line": 301
11748
11748
  },
11749
11749
  "name": "addTsconfigDevFix",
11750
11750
  "protected": true
@@ -11757,7 +11757,7 @@
11757
11757
  },
11758
11758
  "locationInModule": {
11759
11759
  "filename": "src/yarn/typescript-workspace.ts",
11760
- "line": 355
11760
+ "line": 334
11761
11761
  },
11762
11762
  "name": "addWorkspaceDep",
11763
11763
  "parameters": [
@@ -11783,7 +11783,7 @@
11783
11783
  },
11784
11784
  "locationInModule": {
11785
11785
  "filename": "src/yarn/typescript-workspace.ts",
11786
- "line": 432
11786
+ "line": 460
11787
11787
  },
11788
11788
  "name": "customizeReference",
11789
11789
  "parameters": [
@@ -11808,7 +11808,7 @@
11808
11808
  },
11809
11809
  "locationInModule": {
11810
11810
  "filename": "src/yarn/typescript-workspace.ts",
11811
- "line": 386
11811
+ "line": 365
11812
11812
  },
11813
11813
  "name": "preSynthesize",
11814
11814
  "overrides": "projen.Project"
@@ -11821,7 +11821,7 @@
11821
11821
  },
11822
11822
  "locationInModule": {
11823
11823
  "filename": "src/yarn/typescript-workspace.ts",
11824
- "line": 423
11824
+ "line": 451
11825
11825
  },
11826
11826
  "name": "workspaceDependencies",
11827
11827
  "parameters": [
@@ -15241,6 +15241,6 @@
15241
15241
  "usedFeatures": [
15242
15242
  "class-covariant-overrides"
15243
15243
  ],
15244
- "version": "0.6.3",
15245
- "fingerprint": "nOgBLTt4D7c+f7wIYiOmyHOk8XFpwtt8LuBDLYFedsg="
15244
+ "version": "0.6.4",
15245
+ "fingerprint": "T1iG01ivB1eA0r4QBLWQK3NkBEXZshY9UlVEYlOZzlI="
15246
15246
  }
package/lib/cdk.js CHANGED
@@ -12,7 +12,7 @@ const rosetta_1 = require("./rosetta");
12
12
  * @pjid cdk-construct-lib
13
13
  */
14
14
  class CdkConstructLibrary extends projen_1.awscdk.AwsCdkConstructLibrary {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdkConstructLibrary", version: "0.6.3" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdkConstructLibrary", version: "0.6.4" };
16
16
  static stabilityRequirements(options) {
17
17
  const errors = [];
18
18
  if (!options.publishToPypi) {
@@ -61,7 +61,7 @@ exports.CdkConstructLibrary = CdkConstructLibrary;
61
61
  * @pjid cdk-ts-proj
62
62
  */
63
63
  class CdkTypeScriptProject extends projen_1.typescript.TypeScriptProject {
64
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdkTypeScriptProject", version: "0.6.3" };
64
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdkTypeScriptProject", version: "0.6.4" };
65
65
  private;
66
66
  constructor(options) {
67
67
  const opts = (0, common_options_1.withCommonOptionsDefaults)(options);
package/lib/cdklabs.js CHANGED
@@ -112,7 +112,7 @@ function createNpmPublishingDefaults() {
112
112
  * @pjid cdklabs-construct-lib
113
113
  */
114
114
  class CdklabsConstructLibrary extends cdk_1.CdkConstructLibrary {
115
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdklabsConstructLibrary", version: "0.6.3" };
115
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdklabsConstructLibrary", version: "0.6.4" };
116
116
  constructor(options) {
117
117
  const cdklabsPublishingDefaultProps = (options.cdklabsPublishingDefaults ?? true) ?
118
118
  createCdklabsPublishingDefaults(options.name, options.jsiiTargetLanguages) : {};
@@ -134,7 +134,7 @@ exports.CdklabsConstructLibrary = CdklabsConstructLibrary;
134
134
  * @pjid cdklabs-ts-proj
135
135
  */
136
136
  class CdklabsTypeScriptProject extends cdk_1.CdkTypeScriptProject {
137
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdklabsTypeScriptProject", version: "0.6.3" };
137
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdklabsTypeScriptProject", version: "0.6.4" };
138
138
  constructor(options) {
139
139
  // the leftmost object is mutated and returned by deepMerge
140
140
  const mergedOptions = (0, util_1.deepMerge)([
@@ -154,7 +154,7 @@ exports.CdklabsTypeScriptProject = CdklabsTypeScriptProject;
154
154
  * @pjid cdklabs-jsii-proj
155
155
  */
156
156
  class CdklabsJsiiProject extends jsii_1.CdkJsiiProject {
157
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdklabsJsiiProject", version: "0.6.3" };
157
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdklabsJsiiProject", version: "0.6.4" };
158
158
  constructor(options) {
159
159
  const cdklabsPublishingDefaultProps = (options.cdklabsPublishingDefaults ?? true) ?
160
160
  createCdklabsPublishingDefaults(options.name, options.jsiiTargetLanguages) : {};
package/lib/jsii.js CHANGED
@@ -10,7 +10,7 @@ const common_options_1 = require("./common-options");
10
10
  * @pjid cdk-jsii-proj
11
11
  */
12
12
  class CdkJsiiProject extends projen_1.cdk.JsiiProject {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdkJsiiProject", version: "0.6.3" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.CdkJsiiProject", version: "0.6.4" };
14
14
  private;
15
15
  constructor(options) {
16
16
  const opts = (0, common_options_1.withCommonOptionsDefaults)({
package/lib/rosetta.js CHANGED
@@ -10,7 +10,7 @@ const projen_1 = require("projen");
10
10
  * ensure that rosetta will run successfully
11
11
  */
12
12
  class Rosetta extends projen_1.Component {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.Rosetta", version: "0.6.3" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.Rosetta", version: "0.6.4" };
14
14
  constructor(project, options = {}) {
15
15
  super(project);
16
16
  const strict = options.strict ?? true;
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const projen_1 = require("projen");
6
6
  const DEV_DEP_TYPES = [projen_1.DependencyType.BUILD, projen_1.DependencyType.DEVENV, projen_1.DependencyType.TEST];
7
7
  class Constraints extends projen_1.Component {
8
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.Constraints", version: "0.6.3" };
8
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.Constraints", version: "0.6.4" };
9
9
  packages;
10
10
  constructor(project, options) {
11
11
  super(project);
@@ -11,7 +11,7 @@ const rosetta_1 = require("../rosetta");
11
11
  * adding monorepo-appropriate defaults (Rosetta, composite, pypiClassifiers).
12
12
  */
13
13
  class WorkspaceJsiiBuild {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.WorkspaceJsiiBuild", version: "0.6.3" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.WorkspaceJsiiBuild", version: "0.6.4" };
15
15
  options;
16
16
  constructor(options = {}) {
17
17
  this.options = options;
@@ -47,7 +47,7 @@ const LATEST_COMMIT_OUTPUT = 'latest_commit';
47
47
  const ALL_PACKAGES_INPUT = '*all packages*';
48
48
  class MonorepoRelease extends projen_1.Component {
49
49
  options;
50
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.MonorepoRelease", version: "0.6.3" };
50
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.MonorepoRelease", version: "0.6.4" };
51
51
  /**
52
52
  * Returns the `MonorepoReleaseWorkflow` component of a project or `undefined` if the project
53
53
  * does not have a MonorepoReleaseWorkflow component.
@@ -46,7 +46,7 @@ const MONOREPO_SYM = Symbol.for('cdklabs-projen-project-types.yarn.Monorepo');
46
46
  */
47
47
  class Monorepo extends projen_1.typescript.TypeScriptProject {
48
48
  settings;
49
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.Monorepo", version: "0.6.3" };
49
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.Monorepo", version: "0.6.4" };
50
50
  static isMonorepo(x) {
51
51
  return Boolean(x && typeof x === 'object' && MONOREPO_SYM in x);
52
52
  }
@@ -270,6 +270,12 @@ class Monorepo extends projen_1.typescript.TypeScriptProject {
270
270
  for (const tsconfig of new Set([this.tsconfig, this.tsconfigDev])) {
271
271
  tsconfig?.file.addOverride('include', ['.projenrc.ts', 'projenrc/**/*.ts']);
272
272
  tsconfig?.file.addOverride('references', this.subprojects.map((p) => ({ path: p.workspaceDirectory })));
273
+ // The root is not a real compilation unit: it only type-checks projenrc
274
+ // files and holds project references. Emit nothing and root everything at
275
+ // the repo root so the references resolve correctly.
276
+ tsconfig?.file.addOverride('compilerOptions.rootDir', '.');
277
+ tsconfig?.file.addOverride('compilerOptions.outDir', undefined);
278
+ tsconfig?.file.addOverride('compilerOptions.noEmit', true);
273
279
  }
274
280
  this.package.addField('jest', {
275
281
  projects: this.subprojects.map((p) => `<rootDir>/${p.workspaceDirectory}`),
@@ -315,7 +321,7 @@ function getObjFromFile(project, file) {
315
321
  * @pjid cdklabs-yarn-monorepo
316
322
  */
317
323
  class CdkLabsMonorepo extends Monorepo {
318
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.CdkLabsMonorepo", version: "0.6.3" };
324
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.CdkLabsMonorepo", version: "0.6.4" };
319
325
  constructor(options) {
320
326
  super({
321
327
  projenrcTs: true,
@@ -342,4 +348,4 @@ class CdkLabsMonorepo extends Monorepo {
342
348
  }
343
349
  }
344
350
  exports.CdkLabsMonorepo = CdkLabsMonorepo;
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ub3JlcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMveWFybi9tb25vcmVwby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBQTZDO0FBQzdDLG1DQUFzRztBQUN0RywrQ0FBNEM7QUFFNUMseURBQXFEO0FBQ3JELDZCQUEwQjtBQUcxQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7QUFFOUU7O0dBRUc7QUFDSCxNQUFhLFFBQVMsU0FBUSxtQkFBVSxDQUFDLGlCQUFpQjtJQWlCNUI7O0lBaEJyQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQVU7UUFDakMsT0FBTyxPQUFPLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ2EsZUFBZSxDQUFtQjtJQUVsRDs7T0FFRztJQUNhLGFBQWEsQ0FBVTtJQUUvQix1QkFBdUIsR0FBRyxJQUFJLEtBQUssRUFBa0IsQ0FBQztJQUU5RCxZQUE0QixRQUF5QjtRQUNuRCxLQUFLLENBQUM7WUFDSixHQUFHLFFBQVE7WUFDWCxjQUFjLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG1CQUFVLENBQUMsa0JBQWtCLENBQUMsWUFBWTtZQUMxSCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDckMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCO2dCQUM1QixhQUFhLEVBQUU7b0JBQ2IsVUFBVSxFQUFFLG1CQUFVLENBQUMsY0FBYyxDQUFDLFlBQVk7b0JBQ2xELEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLGFBQWE7aUJBQzVDO2FBQ0Ys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QUFFLHFCQUFxQixFQUFFLENBQUM7YUFDdkc7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTFCSCwwQ0EyQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoUG9zaXggZnJvbSAnbm9kZTpwYXRoL3Bvc2l4JztcbmltcG9ydCB7IEpzb25GaWxlLCBQcm9qZWN0LCBqYXZhc2NyaXB0LCB0eXBlc2NyaXB0LCBnaXRodWIsIERlcGVuZGVuY3lUeXBlLCBKc29uUGF0Y2ggfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQ29uc3RyYWludHMgfSBmcm9tICcuL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7IE1vbm9yZXBvT3B0aW9ucyB9IGZyb20gJy4vbW9ub3JlcG8tb3B0aW9ucyc7XG5pbXBvcnQgeyBNb25vcmVwb1JlbGVhc2UgfSBmcm9tICcuL21vbm9yZXBvLXJlbGVhc2UnO1xuaW1wb3J0IHsgTnggfSBmcm9tICcuL254JztcbmltcG9ydCB7IFR5cGVTY3JpcHRXb3Jrc3BhY2UgfSBmcm9tICcuL3R5cGVzY3JpcHQtd29ya3NwYWNlJztcblxuY29uc3QgTU9OT1JFUE9fU1lNID0gU3ltYm9sLmZvcignY2RrbGFicy1wcm9qZW4tcHJvamVjdC10eXBlcy55YXJuLk1vbm9yZXBvJyk7XG5cbi8qKlxuICogQSBtb25vcmVwbyB1c2luZyB5YXJuIHdvcmtzcGFjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25vcmVwbyBleHRlbmRzIHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3Qge1xuICBwdWJsaWMgc3RhdGljIGlzTW9ub3JlcG8oeDogUHJvamVjdCk6IHggaXMgTW9ub3JlcG8ge1xuICAgIHJldHVybiBCb29sZWFuKHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmIE1PTk9SRVBPX1NZTSBpbiB4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTW9ub3JlcG8gUmVsZWFzZSBjb21wb25lbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb25vcmVwb1JlbGVhc2U/OiBNb25vcmVwb1JlbGVhc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgd2hlcmUgdGhlIGFjdHVhbCBjb2RlIGZvciB0aGUgcGFja2FnZSBsaXZlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5VXJsPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcG9zdEluc3RhbGxEZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8KCkgPT4gc3RyaW5nW10+KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHNldHRpbmdzOiBNb25vcmVwb09wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5zZXR0aW5ncyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiBzZXR0aW5ncy55YXJuQmVycnkgPyBqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZIDogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDLFxuICAgICAgeWFybkJlcnJ5T3B0aW9uczogc2V0dGluZ3MueWFybkJlcnJ5ID8ge1xuICAgICAgICAuLi5zZXR0aW5ncy55YXJuQmVycnlPcHRpb25zLFxuICAgICAgICB5YXJuUmNPcHRpb25zOiB7XG4gICAgICAgICAgbm9kZUxpbmtlcjogamF2YXNjcmlwdC5ZYXJuTm9kZUxpbmtlci5OT0RFX01PRFVMRVMsXG4gICAgICAgICAgLi4uc2V0dGluZ3MueWFybkJlcnJ5T3B0aW9ucz8ueWFyblJjT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzYW1wbGVDb2RlOiBmYWxzZSxcbiAgICAgIGplc3Q6IGZhbHNlLFxuICAgICAgZXNsaW50OiBmYWxzZSxcbiAgICAgIHJlbGVhc2U6IGZhbHNlLFxuICAgICAgLy8gVGhlIG1vbm9yZXBvIHJvb3QgaXMgbm90IGEgcmVhbCBjb21waWxhdGlvbiB1bml0OyBpdHMgc2luZ2xlIHRzY29uZmlnXG4gICAgICAvLyBvbmx5IGV4aXN0cyB0byB0eXBlLWNoZWNrIHRoZSBwcm9qZW5yYyBmaWxlcyBhbmQgaG9sZCBwcm9qZWN0XG4gICAgICAvLyByZWZlcmVuY2VzIHRvIHRoZSB3b3Jrc3BhY2VzLiBBIHNlcGFyYXRlIGRldiB0c2NvbmZpZyBpcyBub3QganVzdFxuICAgICAgLy8gcmVkdW5kYW50LCBpdCBhY3RpdmVseSByZXNvbHZlcyB0byBgdGVzdC90c2NvbmZpZy5qc29uYCBpbiBwcm9qZW4gYW5kXG4gICAgICAvLyB3b3VsZCBwb2xsdXRlIHRoYXQgZmlsZS4gRGlzYWJsaW5nIGl0IG1ha2VzIGB0c2NvbmZpZ0RldmAgYWxpYXNcbiAgICAgIC8vIGB0c2NvbmZpZ2AsIGNvbnNvbGlkYXRpbmcgZXZlcnl0aGluZyBvbnRvIHRoZSByb290IGB0c2NvbmZpZy5qc29uYC5cbiAgICAgIGRpc2FibGVUc2NvbmZpZ0RldjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNT05PUkVQT19TWU0sIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnJlcG9zaXRvcnlVcmwgPSBzZXR0aW5ncy5yZXBvc2l0b3J5O1xuICAgIGNvbnN0IGJ1aWxkV2l0aE54ID0gQm9vbGVhbihzZXR0aW5ncy5ueCAmJiBzZXR0aW5ncy5idWlsZFdpdGhOeCk7XG5cbiAgICAvLyBZYXJuIEJlcnJ5IGRlcGVuZGVuY2llc01ldGEgZm9yIGJ1aWxkYWJsZSBwYWNrYWdlc1xuICAgIGlmIChzZXR0aW5ncy5idWlsZGFibGVQYWNrYWdlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ2RlcGVuZGVuY2llc01ldGEnLCBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHNldHRpbmdzLmJ1aWxkYWJsZVBhY2thZ2VzLm1hcCgocGtnKSA9PiBbcGtnLCB7IGJ1aWx0OiB0cnVlIH1dKSxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXR0aWVyIGZvcm1hdHRpbmdcbiAgICAgKi9cbiAgICBpZiAoc2V0dGluZ3MucHJldHRpZXIpIHtcbiAgICAgIHRoaXMuYWRkRGV2RGVwcygnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyk7XG4gICAgICBuZXcgSnNvbkZpbGUodGhpcywgJy5lc2xpbnRyYy5qc29uJywge1xuICAgICAgICBhbGxvd0NvbW1lbnRzOiB0cnVlLFxuICAgICAgICBvYmo6IHtcbiAgICAgICAgICBwbHVnaW5zOiBbJ0B0eXBlc2NyaXB0LWVzbGludCcsICdwcmV0dGllciddLFxuICAgICAgICAgIHBhcnNlcjogJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAgICAgICAgIHBhcnNlck9wdGlvbnM6IHtcbiAgICAgICAgICAgIGVjbWFWZXJzaW9uOiAyMDE4LFxuICAgICAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgICBwcm9qZWN0OiBgLi8keyh0aGlzLnRzY29uZmlnRGV2ID8/IHRoaXMudHNjb25maWcpPy5maWxlTmFtZSA/PyAndHNjb25maWcuanNvbid9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlnbm9yZVBhdHRlcm5zOiBbJyEucHJvamVucmMudHMnXSxcbiAgICAgICAgICBleHRlbmRzOiBbJ3BsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCddLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnRhc2tzLmFkZFRhc2soJ2ZtdCcsIHsgZXhlYzogJ2VzbGludCAtLWV4dCAudHMgLS1maXggLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiBwcm9qZW5yYyAucHJvamVucmMudHMnIH0pO1xuXG4gICAgICB0aGlzLnZzY29kZT8uZXh0ZW5zaW9ucy5hZGRSZWNvbW1lbmRhdGlvbnMoJ2VzYmVucC5wcmV0dGllci12c2NvZGUnLCAnZGJhZXVtZXIudnNjb2RlLWVzbGludCcpO1xuICAgICAgdGhpcy52c2NvZGU/LnNldHRpbmdzLmFkZFNldHRpbmcoJ2VkaXRvci5kZWZhdWx0Rm9ybWF0dGVyJywgJ2VzYmVucC5wcmV0dGllci12c2NvZGUnKTtcbiAgICAgIHRoaXMudnNjb2RlPy5zZXR0aW5ncy5hZGRTZXR0aW5nKCdlc2xpbnQuZm9ybWF0LmVuYWJsZScsIHRydWUpO1xuICAgICAgdGhpcy52c2NvZGU/LnNldHRpbmdzLmFkZFNldHRpbmdzKHsgJ2VkaXRvci5kZWZhdWx0Rm9ybWF0dGVyJzogJ2RiYWV1bWVyLnZzY29kZS1lc2xpbnQnIH0sIFtcbiAgICAgICAgJ2phdmFzY3JpcHQnLFxuICAgICAgICAndHlwZXNjcmlwdCcsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBWU0NvZGUgV29ya3NwYWNlXG4gICAgICovXG4gICAgaWYgKHNldHRpbmdzLnZzY29kZVdvcmtzcGFjZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlRmlsZSA9IGAke3RoaXMubmFtZX0uY29kZS13b3Jrc3BhY2VgO1xuICAgICAgbmV3IEpzb25GaWxlKHRoaXMsIHdvcmtzcGFjZUZpbGUsIHtcbiAgICAgICAgYWxsb3dDb21tZW50czogdHJ1ZSxcbiAgICAgICAgb2JqOiAoKSA9PiAoe1xuICAgICAgICAgIGZvbGRlcnM6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvbGRlcnM6IEFycmF5PHtcbiAgICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgfT4gPSB0aGlzLnN1YnByb2plY3RzXG4gICAgICAgICAgICAgIC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSlcbiAgICAgICAgICAgICAgLm1hcCgocCkgPT4gKHsgcGF0aDogcC53b3Jrc3BhY2VEaXJlY3RvcnkgfSkpO1xuXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MudnNjb2RlV29ya3NwYWNlT3B0aW9ucz8uaW5jbHVkZVJvb3RXb3Jrc3BhY2UpIHtcbiAgICAgICAgICAgICAgZm9sZGVycy51bnNoaWZ0KHsgcGF0aDogJy4nLCBuYW1lOiBzZXR0aW5ncy52c2NvZGVXb3Jrc3BhY2VPcHRpb25zPy5yb290V29ya3NwYWNlTmFtZSA/PyAnPHJvb3Q+JyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZvbGRlcnM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXR0aW5nczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdnNjb2RlU2V0dGluZ3MgPSAoZ2V0T2JqRnJvbUZpbGUodGhpcywgJy52c2NvZGUvc2V0dGluZ3MuanNvbicpID8/IHt9KSBhcyBhbnk7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MudnNjb2RlV29ya3NwYWNlT3B0aW9ucz8uaW5jbHVkZVJvb3RXb3Jrc3BhY2UgJiYgdGhpcy5zdWJwcm9qZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdnNjb2RlU2V0dGluZ3NbJ2ZpbGVzLmV4Y2x1ZGUnXSA9IHRoaXMuc3VicHJvamVjdHMucmVkdWNlKChleGNsdWRlcywgcCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAuLi5leGNsdWRlcyxcbiAgICAgICAgICAgICAgICAgIFtwLndvcmtzcGFjZURpcmVjdG9yeS5zcGxpdChwYXRoUG9zaXguc2VwKVswXV06IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSwgdnNjb2RlU2V0dGluZ3NbJ2ZpbGVzLmV4Y2x1ZGUnXSA/PyB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdnNjb2RlU2V0dGluZ3M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBleHRlbnNpb25zOiAoKSA9PiBnZXRPYmpGcm9tRmlsZSh0aGlzLCAnLnZzY29kZS9leHRlbnNpb25zLmpzb24nKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYXNrc1xuICAgICAqL1xuICAgIC8vIGJ1aWxkIHRhc2tcbiAgICB0aGlzLnRhc2tzLnJlbW92ZVRhc2soJ2J1aWxkJyk7XG4gICAgY29uc3QgZm10VGFzayA9IHRoaXMudGFza3MudHJ5RmluZCgnZm10Jyk7XG4gICAgY29uc3QgYnVpbGRUYXNrID0gdGhpcy50YXNrcy5hZGRUYXNrKCdidWlsZCcpO1xuICAgIGlmICh0aGlzLmRlZmF1bHRUYXNrKSB7XG4gICAgICBidWlsZFRhc2suc3Bhd24odGhpcy5kZWZhdWx0VGFzayk7XG4gICAgfVxuICAgIGlmIChmbXRUYXNrKSB7XG4gICAgICBidWlsZFRhc2suc3Bhd24oZm10VGFzayk7XG4gICAgfVxuICAgIGNvbnN0IHdzUnVuID0gc2V0dGluZ3MueWFybkJlcnJ5ID8gJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tZXhjbHVkZSAuIC0tdG9wb2xvZ2ljYWwtZGV2IHJ1bicgOiAneWFybiB3b3Jrc3BhY2VzIHJ1bic7XG5cbiAgICBpZiAoYnVpbGRXaXRoTngpIHtcbiAgICAgIGJ1aWxkVGFzay5leGVjKCdueCBydW4tbWFueSAtdCBidWlsZCcpO1xuICAgICAgdGhpcy5naXRodWI/LnRyeUZpbmRXb3JrZmxvdygnYnVpbGQnKT8uZmlsZT8ucGF0Y2goXG4gICAgICAgIEpzb25QYXRjaC5hZGQoJy9qb2JzL2J1aWxkL2Vudi9OWF9TS0lQX05YX0NBQ0hFJywgJ3RydWUnKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1aWxkVGFzay5leGVjKGAke3dzUnVufSBidWlsZGApO1xuICAgIH1cblxuICAgIC8vIFJ1biBpbiBhbGwgd29ya3NwYWNlcyB0YXNrc1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgnY29tcGlsZScpPy5yZXNldChgJHt3c1J1bn0gY29tcGlsZWApO1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgncGFja2FnZScpPy5yZXNldChgJHt3c1J1bn0gcGFja2FnZWApO1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgndGVzdCcpPy5yZXNldChgJHt3c1J1bn0gdGVzdGApO1xuICAgIHRoaXMuYWRkVGFzaygncnVuJywge1xuICAgICAgZXhlYzogd3NSdW4sXG4gICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFVwZ3JhZGUgYWxsIHBhY2thZ2VzXG4gICAgY29uc3QgY29vbGRvd24gPSBzZXR0aW5ncy5kZXBzVXBncmFkZU9wdGlvbnM/LmNvb2xkb3duID8/IChzZXR0aW5ncy55YXJuQmVycnkgPyAzIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCB1cGdyYWRlRW52ID0geyAuLi50aGlzLnVwZ3JhZGVXb3JrZmxvdz8udXBncmFkZVRhc2suZW52VmFycyB8fCB7fSB9O1xuICAgIGlmIChjb29sZG93biAmJiBzZXR0aW5ncy55YXJuQmVycnkpIHtcbiAgICAgIHVwZ3JhZGVFbnYuWUFSTl9OUE1fTUlOSU1BTF9BR0VfR0FURSA9IFN0cmluZyhjb29sZG93biAqIDI0ICogNjApO1xuICAgIH1cbiAgICB0aGlzLnRhc2tzLnJlbW92ZVRhc2soJ3VwZ3JhZGUnKTtcbiAgICB0aGlzLnRhc2tzLmFkZFRhc2soJ3VwZ3JhZGUnLCB7XG4gICAgICBlbnY6IHVwZ3JhZGVFbnYsXG4gICAgICBkZXNjcmlwdGlvbjogJ1VwZ3JhZGUgZGVwZW5kZW5jaWVzIGluIGFsbCB3b3Jrc3BhY2VzJyxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIC8vIEl0IGlzIG5vdCBzYWZlIGFueW1vcmUgdG8gaGF2ZSAnbnBtLWNoZWNrLXVwZGF0ZXMnIGluIGEgWWFybiAxIGRlcGVuZGVuY3kgdHJlZSwgc28gcnVuIGl0IGluIGEgc2VwYXJhdGUgdHJlZS5cbiAgICAgICAgeyBleGVjOiBgJHtzZXR0aW5ncy55YXJuQmVycnkgPyAneWFybiBkbHgnIDogJ25weCd9IG5wbS1jaGVjay11cGRhdGVzQDIwIC0tZGVwPWRldixvcHRpb25hbCxwZWVyLHByb2QsYnVuZGxlIC0tdXBncmFkZSAtLXRhcmdldD1taW5vciR7Y29vbGRvd24gPyBgIC0tY29vbGRvd249JHtjb29sZG93bn1gIDogJyd9YCB9LFxuICAgICAgICB7IGV4ZWM6IGAke3dzUnVufSBjaGVjay1mb3ItdXBkYXRlc2AgfSxcbiAgICAgICAgeyBleGVjOiBzZXR0aW5ncy55YXJuQmVycnkgPyAneWFybiBpbnN0YWxsJyA6ICd5YXJuIGluc3RhbGwgLS1jaGVjay1maWxlcycgfSxcbiAgICAgICAgeyBleGVjOiBzZXR0aW5ncy55YXJuQmVycnkgPyAneWFybiB1cCcgOiAneWFybiB1cGdyYWRlJyB9LFxuICAgICAgICB7IHNwYXduOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgeyBzcGF3bjogJ3Bvc3QtdXBncmFkZScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbiB1cCB0YXNrcyBub3QgcmVxdWlyZWQgYXQgdG9wLWxldmVsXG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdlamVjdCcpO1xuICAgIHRoaXMudGFza3MucmVtb3ZlVGFzaygnd2F0Y2gnKTtcbiAgICB0aGlzLnRhc2tzLnJlbW92ZVRhc2soJ3ByZS1jb21waWxlJyk7XG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdwb3N0LWNvbXBpbGUnKTtcblxuICAgIC8vIE54XG4gICAgaWYgKHNldHRpbmdzLm54KSB7XG4gICAgICBuZXcgTngodGhpcywge1xuICAgICAgICBkZWZhdWx0QmFzZTogc2V0dGluZ3MuZGVmYXVsdFJlbGVhc2VCcmFuY2gsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBZYXJuIENvbnN0cmFpbnRzXG4gICAgY29uc3QgY29uc2lzdGVudFZlcnNpb25zID0gWy4uLihzZXR0aW5ncy5jb25zaXN0ZW50VmVyc2lvbnMgPz8gW10pXTtcbiAgICBpZiAoc2V0dGluZ3MubngpIHtcbiAgICAgIGNvbnNpc3RlbnRWZXJzaW9ucy5wdXNoKCdueCcpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MueWFybkJlcnJ5ICYmIGNvbnNpc3RlbnRWZXJzaW9ucy5sZW5ndGgpIHtcbiAgICAgIG5ldyBDb25zdHJhaW50cyh0aGlzLCB7IGNvbnNpc3RlbnRWZXJzaW9ucyB9KTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIFdvcmtmbG93XG4gICAgaWYgKHNldHRpbmdzLnJlbGVhc2UpIHtcbiAgICAgIHRoaXMubW9ub3JlcG9SZWxlYXNlID0gbmV3IE1vbm9yZXBvUmVsZWFzZSh0aGlzLCB7XG4gICAgICAgIHdvcmtmbG93UnVuc09uOiBzZXR0aW5ncy53b3JrZmxvd1J1bnNPbixcbiAgICAgICAgYnVpbGRXaXRoTngsXG4gICAgICAgIHlhcm5CZXJyeTogc2V0dGluZ3MueWFybkJlcnJ5LFxuICAgICAgICAuLi5zZXR0aW5ncy5yZWxlYXNlT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgc3VicHJvamVjdHMoKTogVHlwZVNjcmlwdFdvcmtzcGFjZVtdIHtcbiAgICByZXR1cm4gc3VwZXIuc3VicHJvamVjdHMgYXMgVHlwZVNjcmlwdFdvcmtzcGFjZVtdO1xuICB9XG5cbiAgcHVibGljIHN5bnRoKCkge1xuICAgIHRoaXMuZmluYWxFc2NhcGVIYXRjaGVzKCk7XG4gICAgc3VwZXIuc3ludGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBzdWIgcHJvamVjdCB0byByZXF1ZXN0IGluc3RhbGxhdGlvbiBvZiBkZXBlbmRlbmN5IGF0IHRoZSBNb25vcmVwbyByb290XG4gICAqIFRoZXkgbXVzdCBwcm92aWRlIGEgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBhZnRlciBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZFxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGluc3RhbGwgY29tbWFuZCBpcyBydW4gZm9yIGEgc2Vjb25kIHRpbWUgYWZ0ZXIgYWxsIHN1YiBwcm9qZWN0IHJlcXVlc3RzIGhhdmUgcnVuLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gcmVzb2x2ZSBkZXBlbmRlbmN5IHZlcnNpb25zIGZyb20gYCpgIHRvIGEgY29uY3JldGUgdmVyc2lvbiBjb25zdHJhaW50LlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RJbnN0YWxsRGVwZW5kZW5jaWVzKHJlc29sdmVyOiBJRGVwZW5kZW5jeVJlc29sdmVyKSB7XG4gICAgdGhpcy5wb3N0SW5zdGFsbERlcGVuZGVuY2llcy5wdXNoKHJlc29sdmVyLnJlc29sdmVEZXBzQW5kV3JpdGVQYWNrYWdlSnNvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29kZSB0aGF0IG5lZWRzIHRvIHJ1biBqdXN0IGJlZm9yZSBzeW50aCwgYnV0IGFmdGVyIGFsbCBvdGhlciBjb2RlXG4gICAqL1xuICBwcml2YXRlIGZpbmFsRXNjYXBlSGF0Y2hlcygpIHtcbiAgICAvLyBHZXQgdGhlIE9iamVjdEZpbGVcbiAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ3ByaXZhdGUnLCB0cnVlKTtcbiAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ3dvcmtzcGFjZXMnLCB7XG4gICAgICBwYWNrYWdlczogdGhpcy5zdWJwcm9qZWN0cy5tYXAoKHApID0+IHAud29ya3NwYWNlRGlyZWN0b3J5KSxcbiAgICAgIC4uLighdGhpcy5zZXR0aW5ncy55YXJuQmVycnkgPyB0aGlzLnJlbmRlck5vSG9pc3QoKSA6IHVuZGVmaW5lZCksXG4gICAgfSk7XG5cbiAgICAvLyBBdXRvLXNldCBob2lzdGluZ0xpbWl0cyBmb3Igd29ya3NwYWNlcyB3aXRoIGJ1bmRsZWQgZGVwcyB3aGVuIHVzaW5nIFlhcm4gQmVycnlcbiAgICBpZiAodGhpcy5zZXR0aW5ncy55YXJuQmVycnkpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnN1YnByb2plY3RzKSB7XG4gICAgICAgIGlmIChwLmJ1bmRsZWREZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwLnBhY2thZ2UuYWRkRmllbGQoJ2luc3RhbGxDb25maWcnLCB7IGhvaXN0aW5nTGltaXRzOiAnd29ya3NwYWNlcycgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcm9vdCB0c2NvbmZpZyBpcyBvbmx5IHRoZXJlIHRvIHR5cGUtY2hlY2sgdGhlIHByb2plbnJjIGZpbGVzIGFuZCB0b1xuICAgIC8vIGhvbGQgcHJvamVjdCByZWZlcmVuY2VzIHRvIHRoZSB3b3Jrc3BhY2VzLiBCZWNhdXNlIHRoZSBkZXYgdHNjb25maWcgaXNcbiAgICAvLyBkaXNhYmxlZCwgYHRzY29uZmlnRGV2YCBhbGlhc2VzIGB0c2NvbmZpZ2AsIHNvIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBmaWxlXG4gICAgLy8gdG8gY29uZmlndXJlIGhlcmUgKHRoZSBgU2V0YCBkZWR1cGVzIGluIGNhc2UgdGhhdCBldmVyIGNoYW5nZXMpLlxuICAgIGZvciAoY29uc3QgdHNjb25maWcgb2YgbmV3IFNldChbdGhpcy50c2NvbmZpZywgdGhpcy50c2NvbmZpZ0Rldl0pKSB7XG4gICAgICB0c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZSgnaW5jbHVkZScsIFsnLnByb2plbnJjLnRzJywgJ3Byb2plbnJjLyoqLyoudHMnXSk7XG4gICAgICB0c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZShcbiAgICAgICAgJ3JlZmVyZW5jZXMnLFxuICAgICAgICB0aGlzLnN1YnByb2plY3RzLm1hcCgocCkgPT4gKHsgcGF0aDogcC53b3Jrc3BhY2VEaXJlY3RvcnkgfSkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ2plc3QnLCB7XG4gICAgICBwcm9qZWN0czogdGhpcy5zdWJwcm9qZWN0cy5tYXAoKHApID0+IGA8cm9vdERpcj4vJHtwLndvcmtzcGFjZURpcmVjdG9yeX1gKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlICdub2hvaXN0JyBkaXJlY3RpdmVcbiAgICpcbiAgICogQnVuZGxlZCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBub2hvaXN0J2VkLCBvdGhlcndpc2UgTlBNIHNpbGVudGx5IHdvbid0IGJ1bmRsZSB0aGVtLlxuICAgKlxuICAgKiBSZW5kZXJzIGFuIG9iamVjdCB0aGF0IHNob3VsZCBiZSBtaXhlZCBpbnRvIHRoZSBgd29ya3NwYWNlc2Agb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJOb0hvaXN0KCk6IGFueSB7XG4gICAgY29uc3Qgbm9ob2lzdCA9IHRoaXMuc3VicHJvamVjdHMuZmxhdE1hcCgocCkgPT5cbiAgICAgIHAuZGVwcy5hbGxcbiAgICAgICAgLmZpbHRlcigoZGVwKSA9PiBkZXAudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuQlVORExFRClcbiAgICAgICAgLmZsYXRNYXAoKGRlcCkgPT4gW1xuICAgICAgICAgIGAke3AubmFtZX0vJHtkZXAubmFtZX1gLFxuICAgICAgICAgIGAke3AubmFtZX0vJHtkZXAubmFtZX0vKipgLFxuICAgICAgICBdKSxcbiAgICApO1xuICAgIHJldHVybiBub2hvaXN0Lmxlbmd0aCA+IDAgPyB7IG5vaG9pc3QgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rcyBpbnRvIHRoZSBpbnN0YWxsIGRlcGVuZGVuY2llcyBjeWNsZVxuICAgKi9cbiAgcHVibGljIHBvc3RTeW50aGVzaXplKCkge1xuICAgIGlmICh0aGlzLnBvc3RJbnN0YWxsRGVwZW5kZW5jaWVzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgbm9kZVBrZzogYW55ID0gdGhpcy5wYWNrYWdlO1xuICAgICAgbm9kZVBrZy5pbnN0YWxsRGVwZW5kZW5jaWVzKHsgcmVhc29uOiBqYXZhc2NyaXB0Lkluc3RhbGxSZWFzb24uUEFDS0FHRV9KU09OX0NIQU5HRUQgfSk7XG5cbiAgICAgIGNvbnN0IHJlc29sdXRpb25zID0gdGhpcy5wb3N0SW5zdGFsbERlcGVuZGVuY2llcy5mbGF0TWFwKChyZXF1ZXN0KSA9PiByZXF1ZXN0KCkpO1xuICAgICAgaWYgKHJlc29sdXRpb25zLmxlbmd0aCkge1xuICAgICAgICBub2RlUGtnLmluc3RhbGxEZXBlbmRlbmNpZXMoeyByZWFzb246IGphdmFzY3JpcHQuSW5zdGFsbFJlYXNvbi5ERVBTX1JFU09MVkVELCByZXNvbHV0aW9ucyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3N0SW5zdGFsbERlcGVuZGVuY2llcyA9IFtdO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXBlbmRlbmN5UmVzb2x2ZXIge1xuICByZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb24oKTogc3RyaW5nW107XG59XG5cbmZ1bmN0aW9uIGdldE9iakZyb21GaWxlKHByb2plY3Q6IFByb2plY3QsIGZpbGU6IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiAocHJvamVjdC50cnlGaW5kT2JqZWN0RmlsZShmaWxlKSBhcyBhbnkpPy5vYmo7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgQ2RrTGFic01vbm9yZXBvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrTGFic01vbm9yZXBvT3B0aW9ucyBleHRlbmRzIE1vbm9yZXBvT3B0aW9ucyB7fVxuXG4vKipcbiAqIE9waW5pb25hdGVkIGltcGxlbWVudGF0aW9uIG9mIHlhcm4uTW9ub3JlcG9cbiAqIEBwamlkIGNka2xhYnMteWFybi1tb25vcmVwb1xuICovXG5leHBvcnQgY2xhc3MgQ2RrTGFic01vbm9yZXBvIGV4dGVuZHMgTW9ub3JlcG8ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDZGtMYWJzTW9ub3JlcG9PcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgcHJvamVucmNUczogdHJ1ZSxcblxuICAgICAgYXV0b0FwcHJvdmVVcGdyYWRlczogdHJ1ZSxcbiAgICAgIGF1dG9BcHByb3ZlT3B0aW9uczoge1xuICAgICAgICBhbGxvd2VkVXNlcm5hbWVzOiBbJ2dpdGh1Yi1ib3QnLCAnY2RrbGFicy1hdXRvbWF0aW9uJywgJ2RlcGVuZGFib3RbYm90XSddLFxuICAgICAgICBzZWNyZXQ6ICdHSVRIVUJfVE9LRU4nLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBnaXRodWJPcHRpb25zOiB7XG4gICAgICAgIC4uLm9wdGlvbnMuZ2l0aHViT3B0aW9ucyxcbiAgICAgICAgbWVyZ2lmeTogZmFsc2UsXG4gICAgICAgIGRlcGVuZGVuY3lSZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAgLy8gRGV2aWF0aW9uIGZyb20gdXBzdHJlYW0gcHJvamVuOiB1cHN0cmVhbSBwcm9qZW4gZGVmYXVsdHMgdG8gbWluTm9kZVZlcnNpb24sIGJ1dCB3ZSBoYXZlIHRvbyBtYW55IHdvcmtmbG93c1xuICAgICAgLy8gdGhhdCB1c2UgdG9vbHMgdGhhdCB3YW50IGEgcmVjZW50IE5vZGUgdmVyc2lvbiwgc28gZGVmYXVsdCB0byBhIHJlYXNvbmFibGUgZmxvYXRpbmcgdmVyc2lvbi5cbiAgICAgIHdvcmtmbG93Tm9kZVZlcnNpb246IG9wdGlvbnMud29ya2Zsb3dOb2RlVmVyc2lvbiA/PyAnbHRzLyonLFxuICAgIH0pO1xuXG4gICAgbmV3IGdpdGh1Yi5NZXJnZVF1ZXVlKHRoaXMsIHtcbiAgICAgIGF1dG9RdWV1ZU9wdGlvbnM6IHtcbiAgICAgICAgcHJvamVuQ3JlZGVudGlhbHM6IGdpdGh1Yi5HaXRodWJDcmVkZW50aWFscy5mcm9tUGVyc29uYWxBY2Nlc3NUb2tlbih7IHNlY3JldDogJ1BST0pFTl9HSVRIVUJfVE9LRU4nIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ub3JlcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMveWFybi9tb25vcmVwby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBQTZDO0FBQzdDLG1DQUFzRztBQUN0RywrQ0FBNEM7QUFFNUMseURBQXFEO0FBQ3JELDZCQUEwQjtBQUcxQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7QUFFOUU7O0dBRUc7QUFDSCxNQUFhLFFBQVMsU0FBUSxtQkFBVSxDQUFDLGlCQUFpQjtJQWlCNUI7O0lBaEJyQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQVU7UUFDakMsT0FBTyxPQUFPLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ2EsZUFBZSxDQUFtQjtJQUVsRDs7T0FFRztJQUNhLGFBQWEsQ0FBVTtJQUUvQix1QkFBdUIsR0FBRyxJQUFJLEtBQUssRUFBa0IsQ0FBQztJQUU5RCxZQUE0QixRQUF5QjtRQUNuRCxLQUFLLENBQUM7WUFDSixHQUFHLFFBQVE7WUFDWCxjQUFjLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG1CQUFVLENBQUMsa0JBQWtCLENBQUMsWUFBWTtZQUMxSCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDckMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCO2dCQUM1QixhQUFhLEVBQUU7b0JBQ2IsVUFBVSxFQUFFLG1CQUFVLENBQUMsY0FBYyxDQUFDLFlBQVk7b0JBQ2xELEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLGFBQWE7aUJBQzVDO2FBQ0Ys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QWdCLEVBQUUsSUFBSTthQUN2QjtZQUNELDZHQUE2RztZQUM3RywrRkFBK0Y7WUFDL0YsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixJQUFJLE9BQU87U0FDNUQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxlQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUMxQixnQkFBZ0IsRUFBRTtnQkFDaEIsaUJBQWlCLEVBQUUsZUFBTSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLENBQUM7YUFDdkc7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTFCSCwwQ0EyQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoUG9zaXggZnJvbSAnbm9kZTpwYXRoL3Bvc2l4JztcbmltcG9ydCB7IEpzb25GaWxlLCBQcm9qZWN0LCBqYXZhc2NyaXB0LCB0eXBlc2NyaXB0LCBnaXRodWIsIERlcGVuZGVuY3lUeXBlLCBKc29uUGF0Y2ggfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQ29uc3RyYWludHMgfSBmcm9tICcuL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7IE1vbm9yZXBvT3B0aW9ucyB9IGZyb20gJy4vbW9ub3JlcG8tb3B0aW9ucyc7XG5pbXBvcnQgeyBNb25vcmVwb1JlbGVhc2UgfSBmcm9tICcuL21vbm9yZXBvLXJlbGVhc2UnO1xuaW1wb3J0IHsgTnggfSBmcm9tICcuL254JztcbmltcG9ydCB7IFR5cGVTY3JpcHRXb3Jrc3BhY2UgfSBmcm9tICcuL3R5cGVzY3JpcHQtd29ya3NwYWNlJztcblxuY29uc3QgTU9OT1JFUE9fU1lNID0gU3ltYm9sLmZvcignY2RrbGFicy1wcm9qZW4tcHJvamVjdC10eXBlcy55YXJuLk1vbm9yZXBvJyk7XG5cbi8qKlxuICogQSBtb25vcmVwbyB1c2luZyB5YXJuIHdvcmtzcGFjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25vcmVwbyBleHRlbmRzIHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3Qge1xuICBwdWJsaWMgc3RhdGljIGlzTW9ub3JlcG8oeDogUHJvamVjdCk6IHggaXMgTW9ub3JlcG8ge1xuICAgIHJldHVybiBCb29sZWFuKHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmIE1PTk9SRVBPX1NZTSBpbiB4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTW9ub3JlcG8gUmVsZWFzZSBjb21wb25lbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb25vcmVwb1JlbGVhc2U/OiBNb25vcmVwb1JlbGVhc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgd2hlcmUgdGhlIGFjdHVhbCBjb2RlIGZvciB0aGUgcGFja2FnZSBsaXZlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5VXJsPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcG9zdEluc3RhbGxEZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8KCkgPT4gc3RyaW5nW10+KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHNldHRpbmdzOiBNb25vcmVwb09wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5zZXR0aW5ncyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiBzZXR0aW5ncy55YXJuQmVycnkgPyBqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZIDogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDLFxuICAgICAgeWFybkJlcnJ5T3B0aW9uczogc2V0dGluZ3MueWFybkJlcnJ5ID8ge1xuICAgICAgICAuLi5zZXR0aW5ncy55YXJuQmVycnlPcHRpb25zLFxuICAgICAgICB5YXJuUmNPcHRpb25zOiB7XG4gICAgICAgICAgbm9kZUxpbmtlcjogamF2YXNjcmlwdC5ZYXJuTm9kZUxpbmtlci5OT0RFX01PRFVMRVMsXG4gICAgICAgICAgLi4uc2V0dGluZ3MueWFybkJlcnJ5T3B0aW9ucz8ueWFyblJjT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzYW1wbGVDb2RlOiBmYWxzZSxcbiAgICAgIGplc3Q6IGZhbHNlLFxuICAgICAgZXNsaW50OiBmYWxzZSxcbiAgICAgIHJlbGVhc2U6IGZhbHNlLFxuICAgICAgLy8gVGhlIG1vbm9yZXBvIHJvb3QgaXMgbm90IGEgcmVhbCBjb21waWxhdGlvbiB1bml0OyBpdHMgc2luZ2xlIHRzY29uZmlnXG4gICAgICAvLyBvbmx5IGV4aXN0cyB0byB0eXBlLWNoZWNrIHRoZSBwcm9qZW5yYyBmaWxlcyBhbmQgaG9sZCBwcm9qZWN0XG4gICAgICAvLyByZWZlcmVuY2VzIHRvIHRoZSB3b3Jrc3BhY2VzLiBBIHNlcGFyYXRlIGRldiB0c2NvbmZpZyBpcyBub3QganVzdFxuICAgICAgLy8gcmVkdW5kYW50LCBpdCBhY3RpdmVseSByZXNvbHZlcyB0byBgdGVzdC90c2NvbmZpZy5qc29uYCBpbiBwcm9qZW4gYW5kXG4gICAgICAvLyB3b3VsZCBwb2xsdXRlIHRoYXQgZmlsZS4gRGlzYWJsaW5nIGl0IG1ha2VzIGB0c2NvbmZpZ0RldmAgYWxpYXNcbiAgICAgIC8vIGB0c2NvbmZpZ2AsIGNvbnNvbGlkYXRpbmcgZXZlcnl0aGluZyBvbnRvIHRoZSByb290IGB0c2NvbmZpZy5qc29uYC5cbiAgICAgIGRpc2FibGVUc2NvbmZpZ0RldjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNT05PUkVQT19TWU0sIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnJlcG9zaXRvcnlVcmwgPSBzZXR0aW5ncy5yZXBvc2l0b3J5O1xuICAgIGNvbnN0IGJ1aWxkV2l0aE54ID0gQm9vbGVhbihzZXR0aW5ncy5ueCAmJiBzZXR0aW5ncy5idWlsZFdpdGhOeCk7XG5cbiAgICAvLyBZYXJuIEJlcnJ5IGRlcGVuZGVuY2llc01ldGEgZm9yIGJ1aWxkYWJsZSBwYWNrYWdlc1xuICAgIGlmIChzZXR0aW5ncy5idWlsZGFibGVQYWNrYWdlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ2RlcGVuZGVuY2llc01ldGEnLCBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHNldHRpbmdzLmJ1aWxkYWJsZVBhY2thZ2VzLm1hcCgocGtnKSA9PiBbcGtnLCB7IGJ1aWx0OiB0cnVlIH1dKSxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXR0aWVyIGZvcm1hdHRpbmdcbiAgICAgKi9cbiAgICBpZiAoc2V0dGluZ3MucHJldHRpZXIpIHtcbiAgICAgIHRoaXMuYWRkRGV2RGVwcygnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyk7XG4gICAgICBuZXcgSnNvbkZpbGUodGhpcywgJy5lc2xpbnRyYy5qc29uJywge1xuICAgICAgICBhbGxvd0NvbW1lbnRzOiB0cnVlLFxuICAgICAgICBvYmo6IHtcbiAgICAgICAgICBwbHVnaW5zOiBbJ0B0eXBlc2NyaXB0LWVzbGludCcsICdwcmV0dGllciddLFxuICAgICAgICAgIHBhcnNlcjogJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAgICAgICAgIHBhcnNlck9wdGlvbnM6IHtcbiAgICAgICAgICAgIGVjbWFWZXJzaW9uOiAyMDE4LFxuICAgICAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgICBwcm9qZWN0OiBgLi8keyh0aGlzLnRzY29uZmlnRGV2ID8/IHRoaXMudHNjb25maWcpPy5maWxlTmFtZSA/PyAndHNjb25maWcuanNvbid9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlnbm9yZVBhdHRlcm5zOiBbJyEucHJvamVucmMudHMnXSxcbiAgICAgICAgICBleHRlbmRzOiBbJ3BsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCddLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnRhc2tzLmFkZFRhc2soJ2ZtdCcsIHsgZXhlYzogJ2VzbGludCAtLWV4dCAudHMgLS1maXggLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiBwcm9qZW5yYyAucHJvamVucmMudHMnIH0pO1xuXG4gICAgICB0aGlzLnZzY29kZT8uZXh0ZW5zaW9ucy5hZGRSZWNvbW1lbmRhdGlvbnMoJ2VzYmVucC5wcmV0dGllci12c2NvZGUnLCAnZGJhZXVtZXIudnNjb2RlLWVzbGludCcpO1xuICAgICAgdGhpcy52c2NvZGU/LnNldHRpbmdzLmFkZFNldHRpbmcoJ2VkaXRvci5kZWZhdWx0Rm9ybWF0dGVyJywgJ2VzYmVucC5wcmV0dGllci12c2NvZGUnKTtcbiAgICAgIHRoaXMudnNjb2RlPy5zZXR0aW5ncy5hZGRTZXR0aW5nKCdlc2xpbnQuZm9ybWF0LmVuYWJsZScsIHRydWUpO1xuICAgICAgdGhpcy52c2NvZGU/LnNldHRpbmdzLmFkZFNldHRpbmdzKHsgJ2VkaXRvci5kZWZhdWx0Rm9ybWF0dGVyJzogJ2RiYWV1bWVyLnZzY29kZS1lc2xpbnQnIH0sIFtcbiAgICAgICAgJ2phdmFzY3JpcHQnLFxuICAgICAgICAndHlwZXNjcmlwdCcsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBWU0NvZGUgV29ya3NwYWNlXG4gICAgICovXG4gICAgaWYgKHNldHRpbmdzLnZzY29kZVdvcmtzcGFjZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlRmlsZSA9IGAke3RoaXMubmFtZX0uY29kZS13b3Jrc3BhY2VgO1xuICAgICAgbmV3IEpzb25GaWxlKHRoaXMsIHdvcmtzcGFjZUZpbGUsIHtcbiAgICAgICAgYWxsb3dDb21tZW50czogdHJ1ZSxcbiAgICAgICAgb2JqOiAoKSA9PiAoe1xuICAgICAgICAgIGZvbGRlcnM6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvbGRlcnM6IEFycmF5PHtcbiAgICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgfT4gPSB0aGlzLnN1YnByb2plY3RzXG4gICAgICAgICAgICAgIC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSlcbiAgICAgICAgICAgICAgLm1hcCgocCkgPT4gKHsgcGF0aDogcC53b3Jrc3BhY2VEaXJlY3RvcnkgfSkpO1xuXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MudnNjb2RlV29ya3NwYWNlT3B0aW9ucz8uaW5jbHVkZVJvb3RXb3Jrc3BhY2UpIHtcbiAgICAgICAgICAgICAgZm9sZGVycy51bnNoaWZ0KHsgcGF0aDogJy4nLCBuYW1lOiBzZXR0aW5ncy52c2NvZGVXb3Jrc3BhY2VPcHRpb25zPy5yb290V29ya3NwYWNlTmFtZSA/PyAnPHJvb3Q+JyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZvbGRlcnM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXR0aW5nczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdnNjb2RlU2V0dGluZ3MgPSAoZ2V0T2JqRnJvbUZpbGUodGhpcywgJy52c2NvZGUvc2V0dGluZ3MuanNvbicpID8/IHt9KSBhcyBhbnk7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MudnNjb2RlV29ya3NwYWNlT3B0aW9ucz8uaW5jbHVkZVJvb3RXb3Jrc3BhY2UgJiYgdGhpcy5zdWJwcm9qZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdnNjb2RlU2V0dGluZ3NbJ2ZpbGVzLmV4Y2x1ZGUnXSA9IHRoaXMuc3VicHJvamVjdHMucmVkdWNlKChleGNsdWRlcywgcCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAuLi5leGNsdWRlcyxcbiAgICAgICAgICAgICAgICAgIFtwLndvcmtzcGFjZURpcmVjdG9yeS5zcGxpdChwYXRoUG9zaXguc2VwKVswXV06IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSwgdnNjb2RlU2V0dGluZ3NbJ2ZpbGVzLmV4Y2x1ZGUnXSA/PyB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdnNjb2RlU2V0dGluZ3M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBleHRlbnNpb25zOiAoKSA9PiBnZXRPYmpGcm9tRmlsZSh0aGlzLCAnLnZzY29kZS9leHRlbnNpb25zLmpzb24nKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYXNrc1xuICAgICAqL1xuICAgIC8vIGJ1aWxkIHRhc2tcbiAgICB0aGlzLnRhc2tzLnJlbW92ZVRhc2soJ2J1aWxkJyk7XG4gICAgY29uc3QgZm10VGFzayA9IHRoaXMudGFza3MudHJ5RmluZCgnZm10Jyk7XG4gICAgY29uc3QgYnVpbGRUYXNrID0gdGhpcy50YXNrcy5hZGRUYXNrKCdidWlsZCcpO1xuICAgIGlmICh0aGlzLmRlZmF1bHRUYXNrKSB7XG4gICAgICBidWlsZFRhc2suc3Bhd24odGhpcy5kZWZhdWx0VGFzayk7XG4gICAgfVxuICAgIGlmIChmbXRUYXNrKSB7XG4gICAgICBidWlsZFRhc2suc3Bhd24oZm10VGFzayk7XG4gICAgfVxuICAgIGNvbnN0IHdzUnVuID0gc2V0dGluZ3MueWFybkJlcnJ5ID8gJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tZXhjbHVkZSAuIC0tdG9wb2xvZ2ljYWwtZGV2IHJ1bicgOiAneWFybiB3b3Jrc3BhY2VzIHJ1bic7XG5cbiAgICBpZiAoYnVpbGRXaXRoTngpIHtcbiAgICAgIGJ1aWxkVGFzay5leGVjKCdueCBydW4tbWFueSAtdCBidWlsZCcpO1xuICAgICAgdGhpcy5naXRodWI/LnRyeUZpbmRXb3JrZmxvdygnYnVpbGQnKT8uZmlsZT8ucGF0Y2goXG4gICAgICAgIEpzb25QYXRjaC5hZGQoJy9qb2JzL2J1aWxkL2Vudi9OWF9TS0lQX05YX0NBQ0hFJywgJ3RydWUnKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1aWxkVGFzay5leGVjKGAke3dzUnVufSBidWlsZGApO1xuICAgIH1cblxuICAgIC8vIFJ1biBpbiBhbGwgd29ya3NwYWNlcyB0YXNrc1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgnY29tcGlsZScpPy5yZXNldChgJHt3c1J1bn0gY29tcGlsZWApO1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgncGFja2FnZScpPy5yZXNldChgJHt3c1J1bn0gcGFja2FnZWApO1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgndGVzdCcpPy5yZXNldChgJHt3c1J1bn0gdGVzdGApO1xuICAgIHRoaXMuYWRkVGFzaygncnVuJywge1xuICAgICAgZXhlYzogd3NSdW4sXG4gICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFVwZ3JhZGUgYWxsIHBhY2thZ2VzXG4gICAgY29uc3QgY29vbGRvd24gPSBzZXR0aW5ncy5kZXBzVXBncmFkZU9wdGlvbnM/LmNvb2xkb3duID8/IChzZXR0aW5ncy55YXJuQmVycnkgPyAzIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCB1cGdyYWRlRW52ID0geyAuLi50aGlzLnVwZ3JhZGVXb3JrZmxvdz8udXBncmFkZVRhc2suZW52VmFycyB8fCB7fSB9O1xuICAgIGlmIChjb29sZG93biAmJiBzZXR0aW5ncy55YXJuQmVycnkpIHtcbiAgICAgIHVwZ3JhZGVFbnYuWUFSTl9OUE1fTUlOSU1BTF9BR0VfR0FURSA9IFN0cmluZyhjb29sZG93biAqIDI0ICogNjApO1xuICAgIH1cbiAgICB0aGlzLnRhc2tzLnJlbW92ZVRhc2soJ3VwZ3JhZGUnKTtcbiAgICB0aGlzLnRhc2tzLmFkZFRhc2soJ3VwZ3JhZGUnLCB7XG4gICAgICBlbnY6IHVwZ3JhZGVFbnYsXG4gICAgICBkZXNjcmlwdGlvbjogJ1VwZ3JhZGUgZGVwZW5kZW5jaWVzIGluIGFsbCB3b3Jrc3BhY2VzJyxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIC8vIEl0IGlzIG5vdCBzYWZlIGFueW1vcmUgdG8gaGF2ZSAnbnBtLWNoZWNrLXVwZGF0ZXMnIGluIGEgWWFybiAxIGRlcGVuZGVuY3kgdHJlZSwgc28gcnVuIGl0IGluIGEgc2VwYXJhdGUgdHJlZS5cbiAgICAgICAgeyBleGVjOiBgJHtzZXR0aW5ncy55YXJuQmVycnkgPyAneWFybiBkbHgnIDogJ25weCd9IG5wbS1jaGVjay11cGRhdGVzQDIwIC0tZGVwPWRldixvcHRpb25hbCxwZWVyLHByb2QsYnVuZGxlIC0tdXBncmFkZSAtLXRhcmdldD1taW5vciR7Y29vbGRvd24gPyBgIC0tY29vbGRvd249JHtjb29sZG93bn1gIDogJyd9YCB9LFxuICAgICAgICB7IGV4ZWM6IGAke3dzUnVufSBjaGVjay1mb3ItdXBkYXRlc2AgfSxcbiAgICAgICAgeyBleGVjOiBzZXR0aW5ncy55YXJuQmVycnkgPyAneWFybiBpbnN0YWxsJyA6ICd5YXJuIGluc3RhbGwgLS1jaGVjay1maWxlcycgfSxcbiAgICAgICAgeyBleGVjOiBzZXR0aW5ncy55YXJuQmVycnkgPyAneWFybiB1cCcgOiAneWFybiB1cGdyYWRlJyB9LFxuICAgICAgICB7IHNwYXduOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgeyBzcGF3bjogJ3Bvc3QtdXBncmFkZScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbiB1cCB0YXNrcyBub3QgcmVxdWlyZWQgYXQgdG9wLWxldmVsXG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdlamVjdCcpO1xuICAgIHRoaXMudGFza3MucmVtb3ZlVGFzaygnd2F0Y2gnKTtcbiAgICB0aGlzLnRhc2tzLnJlbW92ZVRhc2soJ3ByZS1jb21waWxlJyk7XG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdwb3N0LWNvbXBpbGUnKTtcblxuICAgIC8vIE54XG4gICAgaWYgKHNldHRpbmdzLm54KSB7XG4gICAgICBuZXcgTngodGhpcywge1xuICAgICAgICBkZWZhdWx0QmFzZTogc2V0dGluZ3MuZGVmYXVsdFJlbGVhc2VCcmFuY2gsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBZYXJuIENvbnN0cmFpbnRzXG4gICAgY29uc3QgY29uc2lzdGVudFZlcnNpb25zID0gWy4uLihzZXR0aW5ncy5jb25zaXN0ZW50VmVyc2lvbnMgPz8gW10pXTtcbiAgICBpZiAoc2V0dGluZ3MubngpIHtcbiAgICAgIGNvbnNpc3RlbnRWZXJzaW9ucy5wdXNoKCdueCcpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MueWFybkJlcnJ5ICYmIGNvbnNpc3RlbnRWZXJzaW9ucy5sZW5ndGgpIHtcbiAgICAgIG5ldyBDb25zdHJhaW50cyh0aGlzLCB7IGNvbnNpc3RlbnRWZXJzaW9ucyB9KTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIFdvcmtmbG93XG4gICAgaWYgKHNldHRpbmdzLnJlbGVhc2UpIHtcbiAgICAgIHRoaXMubW9ub3JlcG9SZWxlYXNlID0gbmV3IE1vbm9yZXBvUmVsZWFzZSh0aGlzLCB7XG4gICAgICAgIHdvcmtmbG93UnVuc09uOiBzZXR0aW5ncy53b3JrZmxvd1J1bnNPbixcbiAgICAgICAgYnVpbGRXaXRoTngsXG4gICAgICAgIHlhcm5CZXJyeTogc2V0dGluZ3MueWFybkJlcnJ5LFxuICAgICAgICAuLi5zZXR0aW5ncy5yZWxlYXNlT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgc3VicHJvamVjdHMoKTogVHlwZVNjcmlwdFdvcmtzcGFjZVtdIHtcbiAgICByZXR1cm4gc3VwZXIuc3VicHJvamVjdHMgYXMgVHlwZVNjcmlwdFdvcmtzcGFjZVtdO1xuICB9XG5cbiAgcHVibGljIHN5bnRoKCkge1xuICAgIHRoaXMuZmluYWxFc2NhcGVIYXRjaGVzKCk7XG4gICAgc3VwZXIuc3ludGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBzdWIgcHJvamVjdCB0byByZXF1ZXN0IGluc3RhbGxhdGlvbiBvZiBkZXBlbmRlbmN5IGF0IHRoZSBNb25vcmVwbyByb290XG4gICAqIFRoZXkgbXVzdCBwcm92aWRlIGEgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBhZnRlciBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZFxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGluc3RhbGwgY29tbWFuZCBpcyBydW4gZm9yIGEgc2Vjb25kIHRpbWUgYWZ0ZXIgYWxsIHN1YiBwcm9qZWN0IHJlcXVlc3RzIGhhdmUgcnVuLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gcmVzb2x2ZSBkZXBlbmRlbmN5IHZlcnNpb25zIGZyb20gYCpgIHRvIGEgY29uY3JldGUgdmVyc2lvbiBjb25zdHJhaW50LlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RJbnN0YWxsRGVwZW5kZW5jaWVzKHJlc29sdmVyOiBJRGVwZW5kZW5jeVJlc29sdmVyKSB7XG4gICAgdGhpcy5wb3N0SW5zdGFsbERlcGVuZGVuY2llcy5wdXNoKHJlc29sdmVyLnJlc29sdmVEZXBzQW5kV3JpdGVQYWNrYWdlSnNvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29kZSB0aGF0IG5lZWRzIHRvIHJ1biBqdXN0IGJlZm9yZSBzeW50aCwgYnV0IGFmdGVyIGFsbCBvdGhlciBjb2RlXG4gICAqL1xuICBwcml2YXRlIGZpbmFsRXNjYXBlSGF0Y2hlcygpIHtcbiAgICAvLyBHZXQgdGhlIE9iamVjdEZpbGVcbiAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ3ByaXZhdGUnLCB0cnVlKTtcbiAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ3dvcmtzcGFjZXMnLCB7XG4gICAgICBwYWNrYWdlczogdGhpcy5zdWJwcm9qZWN0cy5tYXAoKHApID0+IHAud29ya3NwYWNlRGlyZWN0b3J5KSxcbiAgICAgIC4uLighdGhpcy5zZXR0aW5ncy55YXJuQmVycnkgPyB0aGlzLnJlbmRlck5vSG9pc3QoKSA6IHVuZGVmaW5lZCksXG4gICAgfSk7XG5cbiAgICAvLyBBdXRvLXNldCBob2lzdGluZ0xpbWl0cyBmb3Igd29ya3NwYWNlcyB3aXRoIGJ1bmRsZWQgZGVwcyB3aGVuIHVzaW5nIFlhcm4gQmVycnlcbiAgICBpZiAodGhpcy5zZXR0aW5ncy55YXJuQmVycnkpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnN1YnByb2plY3RzKSB7XG4gICAgICAgIGlmIChwLmJ1bmRsZWREZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwLnBhY2thZ2UuYWRkRmllbGQoJ2luc3RhbGxDb25maWcnLCB7IGhvaXN0aW5nTGltaXRzOiAnd29ya3NwYWNlcycgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcm9vdCB0c2NvbmZpZyBpcyBvbmx5IHRoZXJlIHRvIHR5cGUtY2hlY2sgdGhlIHByb2plbnJjIGZpbGVzIGFuZCB0b1xuICAgIC8vIGhvbGQgcHJvamVjdCByZWZlcmVuY2VzIHRvIHRoZSB3b3Jrc3BhY2VzLiBCZWNhdXNlIHRoZSBkZXYgdHNjb25maWcgaXNcbiAgICAvLyBkaXNhYmxlZCwgYHRzY29uZmlnRGV2YCBhbGlhc2VzIGB0c2NvbmZpZ2AsIHNvIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBmaWxlXG4gICAgLy8gdG8gY29uZmlndXJlIGhlcmUgKHRoZSBgU2V0YCBkZWR1cGVzIGluIGNhc2UgdGhhdCBldmVyIGNoYW5nZXMpLlxuICAgIGZvciAoY29uc3QgdHNjb25maWcgb2YgbmV3IFNldChbdGhpcy50c2NvbmZpZywgdGhpcy50c2NvbmZpZ0Rldl0pKSB7XG4gICAgICB0c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZSgnaW5jbHVkZScsIFsnLnByb2plbnJjLnRzJywgJ3Byb2plbnJjLyoqLyoudHMnXSk7XG4gICAgICB0c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZShcbiAgICAgICAgJ3JlZmVyZW5jZXMnLFxuICAgICAgICB0aGlzLnN1YnByb2plY3RzLm1hcCgocCkgPT4gKHsgcGF0aDogcC53b3Jrc3BhY2VEaXJlY3RvcnkgfSkpLFxuICAgICAgKTtcbiAgICAgIC8vIFRoZSByb290IGlzIG5vdCBhIHJlYWwgY29tcGlsYXRpb24gdW5pdDogaXQgb25seSB0eXBlLWNoZWNrcyBwcm9qZW5yY1xuICAgICAgLy8gZmlsZXMgYW5kIGhvbGRzIHByb2plY3QgcmVmZXJlbmNlcy4gRW1pdCBub3RoaW5nIGFuZCByb290IGV2ZXJ5dGhpbmcgYXRcbiAgICAgIC8vIHRoZSByZXBvIHJvb3Qgc28gdGhlIHJlZmVyZW5jZXMgcmVzb2x2ZSBjb3JyZWN0bHkuXG4gICAgICB0c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZSgnY29tcGlsZXJPcHRpb25zLnJvb3REaXInLCAnLicpO1xuICAgICAgdHNjb25maWc/LmZpbGUuYWRkT3ZlcnJpZGUoJ2NvbXBpbGVyT3B0aW9ucy5vdXREaXInLCB1bmRlZmluZWQpO1xuICAgICAgdHNjb25maWc/LmZpbGUuYWRkT3ZlcnJpZGUoJ2NvbXBpbGVyT3B0aW9ucy5ub0VtaXQnLCB0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ2plc3QnLCB7XG4gICAgICBwcm9qZWN0czogdGhpcy5zdWJwcm9qZWN0cy5tYXAoKHApID0+IGA8cm9vdERpcj4vJHtwLndvcmtzcGFjZURpcmVjdG9yeX1gKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlICdub2hvaXN0JyBkaXJlY3RpdmVcbiAgICpcbiAgICogQnVuZGxlZCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBub2hvaXN0J2VkLCBvdGhlcndpc2UgTlBNIHNpbGVudGx5IHdvbid0IGJ1bmRsZSB0aGVtLlxuICAgKlxuICAgKiBSZW5kZXJzIGFuIG9iamVjdCB0aGF0IHNob3VsZCBiZSBtaXhlZCBpbnRvIHRoZSBgd29ya3NwYWNlc2Agb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJOb0hvaXN0KCk6IGFueSB7XG4gICAgY29uc3Qgbm9ob2lzdCA9IHRoaXMuc3VicHJvamVjdHMuZmxhdE1hcCgocCkgPT5cbiAgICAgIHAuZGVwcy5hbGxcbiAgICAgICAgLmZpbHRlcigoZGVwKSA9PiBkZXAudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuQlVORExFRClcbiAgICAgICAgLmZsYXRNYXAoKGRlcCkgPT4gW1xuICAgICAgICAgIGAke3AubmFtZX0vJHtkZXAubmFtZX1gLFxuICAgICAgICAgIGAke3AubmFtZX0vJHtkZXAubmFtZX0vKipgLFxuICAgICAgICBdKSxcbiAgICApO1xuICAgIHJldHVybiBub2hvaXN0Lmxlbmd0aCA+IDAgPyB7IG5vaG9pc3QgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rcyBpbnRvIHRoZSBpbnN0YWxsIGRlcGVuZGVuY2llcyBjeWNsZVxuICAgKi9cbiAgcHVibGljIHBvc3RTeW50aGVzaXplKCkge1xuICAgIGlmICh0aGlzLnBvc3RJbnN0YWxsRGVwZW5kZW5jaWVzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgbm9kZVBrZzogYW55ID0gdGhpcy5wYWNrYWdlO1xuICAgICAgbm9kZVBrZy5pbnN0YWxsRGVwZW5kZW5jaWVzKHsgcmVhc29uOiBqYXZhc2NyaXB0Lkluc3RhbGxSZWFzb24uUEFDS0FHRV9KU09OX0NIQU5HRUQgfSk7XG5cbiAgICAgIGNvbnN0IHJlc29sdXRpb25zID0gdGhpcy5wb3N0SW5zdGFsbERlcGVuZGVuY2llcy5mbGF0TWFwKChyZXF1ZXN0KSA9PiByZXF1ZXN0KCkpO1xuICAgICAgaWYgKHJlc29sdXRpb25zLmxlbmd0aCkge1xuICAgICAgICBub2RlUGtnLmluc3RhbGxEZXBlbmRlbmNpZXMoeyByZWFzb246IGphdmFzY3JpcHQuSW5zdGFsbFJlYXNvbi5ERVBTX1JFU09MVkVELCByZXNvbHV0aW9ucyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3N0SW5zdGFsbERlcGVuZGVuY2llcyA9IFtdO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXBlbmRlbmN5UmVzb2x2ZXIge1xuICByZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb24oKTogc3RyaW5nW107XG59XG5cbmZ1bmN0aW9uIGdldE9iakZyb21GaWxlKHByb2plY3Q6IFByb2plY3QsIGZpbGU6IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiAocHJvamVjdC50cnlGaW5kT2JqZWN0RmlsZShmaWxlKSBhcyBhbnkpPy5vYmo7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgQ2RrTGFic01vbm9yZXBvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrTGFic01vbm9yZXBvT3B0aW9ucyBleHRlbmRzIE1vbm9yZXBvT3B0aW9ucyB7fVxuXG4vKipcbiAqIE9waW5pb25hdGVkIGltcGxlbWVudGF0aW9uIG9mIHlhcm4uTW9ub3JlcG9cbiAqIEBwamlkIGNka2xhYnMteWFybi1tb25vcmVwb1xuICovXG5leHBvcnQgY2xhc3MgQ2RrTGFic01vbm9yZXBvIGV4dGVuZHMgTW9ub3JlcG8ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDZGtMYWJzTW9ub3JlcG9PcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgcHJvamVucmNUczogdHJ1ZSxcblxuICAgICAgYXV0b0FwcHJvdmVVcGdyYWRlczogdHJ1ZSxcbiAgICAgIGF1dG9BcHByb3ZlT3B0aW9uczoge1xuICAgICAgICBhbGxvd2VkVXNlcm5hbWVzOiBbJ2dpdGh1Yi1ib3QnLCAnY2RrbGFicy1hdXRvbWF0aW9uJywgJ2RlcGVuZGFib3RbYm90XSddLFxuICAgICAgICBzZWNyZXQ6ICdHSVRIVUJfVE9LRU4nLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBnaXRodWJPcHRpb25zOiB7XG4gICAgICAgIC4uLm9wdGlvbnMuZ2l0aHViT3B0aW9ucyxcbiAgICAgICAgbWVyZ2lmeTogZmFsc2UsXG4gICAgICAgIGRlcGVuZGVuY3lSZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAgLy8gRGV2aWF0aW9uIGZyb20gdXBzdHJlYW0gcHJvamVuOiB1cHN0cmVhbSBwcm9qZW4gZGVmYXVsdHMgdG8gbWluTm9kZVZlcnNpb24sIGJ1dCB3ZSBoYXZlIHRvbyBtYW55IHdvcmtmbG93c1xuICAgICAgLy8gdGhhdCB1c2UgdG9vbHMgdGhhdCB3YW50IGEgcmVjZW50IE5vZGUgdmVyc2lvbiwgc28gZGVmYXVsdCB0byBhIHJlYXNvbmFibGUgZmxvYXRpbmcgdmVyc2lvbi5cbiAgICAgIHdvcmtmbG93Tm9kZVZlcnNpb246IG9wdGlvbnMud29ya2Zsb3dOb2RlVmVyc2lvbiA/PyAnbHRzLyonLFxuICAgIH0pO1xuXG4gICAgbmV3IGdpdGh1Yi5NZXJnZVF1ZXVlKHRoaXMsIHtcbiAgICAgIGF1dG9RdWV1ZU9wdGlvbnM6IHtcbiAgICAgICAgcHJvamVuQ3JlZGVudGlhbHM6IGdpdGh1Yi5HaXRodWJDcmVkZW50aWFscy5mcm9tUGVyc29uYWxBY2Nlc3NUb2tlbih7IHNlY3JldDogJ1BST0pFTl9HSVRIVUJfVE9LRU4nIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -39,7 +39,7 @@ const path = __importStar(require("node:path"));
39
39
  const projen_1 = require("projen");
40
40
  const gather_versions_task_1 = require("./gather-versions.task");
41
41
  class WorkspaceRelease extends projen_1.Component {
42
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.WorkspaceRelease", version: "0.6.3" };
42
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.WorkspaceRelease", version: "0.6.4" };
43
43
  publisher;
44
44
  version;
45
45
  workspace;
@@ -81,6 +81,21 @@ export declare class TypeScriptWorkspace extends typescript.TypeScriptProject im
81
81
  */
82
82
  addWorkspaceDep(ref: IWorkspaceReference, type?: DependencyType): void;
83
83
  preSynthesize(): void;
84
+ /**
85
+ * Type-check tests against the library *source* rather than its emitted declarations.
86
+ *
87
+ * The dev/test tsconfig is a separate `composite` project, so it doesn't see the library
88
+ * source by default. Rather than referencing the main project (which would consume its
89
+ * `stripInternal`'d declarations and hide `@internal` members from tests under `tsc --build`),
90
+ * we mirror the main project's `include` into the test program, path-adjusted to the test dir.
91
+ *
92
+ * Excludes are only mirrored when they target the source dir (`src/...`): a `src/`-prefixed
93
+ * pattern can only match source files, so it can never drop a test file the test build owns
94
+ * (e.g. `test/.../integ.*.ts`, which the library build excludes but the test build must keep).
95
+ *
96
+ * Runs at `preSynthesize` since the main tsconfig's patterns may be modified after construction.
97
+ */
98
+ private typecheckTestsAgainstLibrarySource;
84
99
  private validateNoPrivateWorkspaceDeps;
85
100
  /**
86
101
  * Return all Projects in the workspace that are also dependencies.
@@ -8,7 +8,7 @@ const projen_1 = require("projen");
8
8
  * A TypeScript workspace in a `yarn.Monorepo`
9
9
  */
10
10
  class TypeScriptWorkspace extends projen_1.typescript.TypeScriptProject {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.TypeScriptWorkspace", version: "0.6.3" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdklabs-projen-project-types.yarn.TypeScriptWorkspace", version: "0.6.4" };
12
12
  workspaceDirectory;
13
13
  bundledDeps = [];
14
14
  isPrivatePackage;
@@ -138,27 +138,6 @@ class TypeScriptWorkspace extends projen_1.typescript.TypeScriptProject {
138
138
  tsconfig?.file.addOverride('compilerOptions.composite', true);
139
139
  tsconfig?.file.addOverride('references', []);
140
140
  }
141
- // Self-reference from the dev/test tsconfig to the main project tsconfig.
142
- //
143
- // By default the dev tsconfig lives in a subdirectory (e.g. `test/tsconfig.json`)
144
- // and extends the main `tsconfig.json`. Under `composite: true`, TypeScript treats
145
- // the dev tsconfig as a separate compilation unit with strict project boundaries:
146
- // its `include` only covers files under its own directory. Test files that import
147
- // from the parent `lib/` (`../lib/...`) are then reachable via imports but are not
148
- // part of the dev project's file set, which fails with TS6307 on `tsc --build`.
149
- //
150
- // Adding a project reference from the dev tsconfig back to the directory of the main
151
- // tsconfig tells TypeScript that the lib source is a separate, already-built project
152
- // and to consume its declarations. We only do this when the two tsconfigs are not
153
- // co-located (i.e. the dev tsconfig is not aliased to / sitting next to the main one).
154
- if (this.tsconfig && this.tsconfigDev && this.tsconfig !== this.tsconfigDev) {
155
- const mainTsconfigDir = (0, path_1.dirname)(this.tsconfig.file.absolutePath);
156
- const devTsconfigDir = (0, path_1.dirname)(this.tsconfigDev.file.absolutePath);
157
- const selfReference = (0, path_1.relative)(devTsconfigDir, mainTsconfigDir);
158
- if (selfReference !== '') {
159
- this.tsconfigDev.file.addToArray('references', { path: selfReference });
160
- }
161
- }
162
141
  // Add workspace references
163
142
  for (const dep of options.deps?.filter(isWorkspaceReference) ?? []) {
164
143
  this.addWorkspaceDep(dep, projen_1.DependencyType.RUNTIME);
@@ -282,8 +261,53 @@ class TypeScriptWorkspace extends projen_1.typescript.TypeScriptProject {
282
261
  }
283
262
  preSynthesize() {
284
263
  super.preSynthesize();
264
+ this.typecheckTestsAgainstLibrarySource();
285
265
  this.validateNoPrivateWorkspaceDeps();
286
266
  }
267
+ /**
268
+ * Type-check tests against the library *source* rather than its emitted declarations.
269
+ *
270
+ * The dev/test tsconfig is a separate `composite` project, so it doesn't see the library
271
+ * source by default. Rather than referencing the main project (which would consume its
272
+ * `stripInternal`'d declarations and hide `@internal` members from tests under `tsc --build`),
273
+ * we mirror the main project's `include` into the test program, path-adjusted to the test dir.
274
+ *
275
+ * Excludes are only mirrored when they target the source dir (`src/...`): a `src/`-prefixed
276
+ * pattern can only match source files, so it can never drop a test file the test build owns
277
+ * (e.g. `test/.../integ.*.ts`, which the library build excludes but the test build must keep).
278
+ *
279
+ * Runs at `preSynthesize` since the main tsconfig's patterns may be modified after construction.
280
+ */
281
+ typecheckTestsAgainstLibrarySource() {
282
+ const mainTsconfig = this.tsconfig;
283
+ const testTsconfig = this.tsconfigDev;
284
+ // When the dev tsconfig is disabled it aliases the main one (`tsconfig === tsconfigDev`),
285
+ // so there is nothing to wire up.
286
+ if (!mainTsconfig || !testTsconfig || mainTsconfig === testTsconfig) {
287
+ return;
288
+ }
289
+ // The relative path from the test tsconfig directory to the main tsconfig directory
290
+ // (e.g. `..`). When the two are co-located there is no project boundary to cross and the
291
+ // library source is already part of the test program's file set, so there is nothing to do.
292
+ const toMain = (0, path_1.relative)((0, path_1.dirname)(testTsconfig.file.absolutePath), (0, path_1.dirname)(mainTsconfig.file.absolutePath));
293
+ if (toMain === '') {
294
+ return;
295
+ }
296
+ // Compile the same set of library source files as the main build, so `@internal` members
297
+ // remain visible. The main tsconfig's patterns are relative to the package root; the test
298
+ // tsconfig lives one directory deeper, so prefix them with the path back to the main dir.
299
+ const srcPrefix = `${this.srcdir}/`;
300
+ for (const pattern of mainTsconfig.include) {
301
+ testTsconfig.addInclude(`${toMain}/${pattern}`);
302
+ }
303
+ // Only mirror excludes that target the source directory; test-directory excludes belong to
304
+ // the library build alone (see above).
305
+ for (const pattern of mainTsconfig.exclude) {
306
+ if (pattern.startsWith(srcPrefix)) {
307
+ testTsconfig.addExclude(`${toMain}/${pattern}`);
308
+ }
309
+ }
310
+ }
287
311
  validateNoPrivateWorkspaceDeps() {
288
312
  if (this.isPrivatePackage)
289
313
  return;
@@ -342,4 +366,4 @@ function isWorkspaceReference(x) {
342
366
  function isNotWorkspaceReference(x) {
343
367
  return !isWorkspaceReference(x);
344
368
  }
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC13b3Jrc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMveWFybi90eXBlc2NyaXB0LXdvcmtzcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsK0JBQXlDO0FBQ3pDLG1DQUEwRztBQW1EMUc7O0dBRUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLG1CQUFVLENBQUMsaUJBQWlCOztJQUVuRCxrQkFBa0IsQ0FBUztJQUMzQixXQUFXLEdBQWEsRUFBRSxDQUFDO0lBQzNCLGdCQUFnQixDQUFVO0lBQzFCLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFFNUIsUUFBUSxDQUFXO0lBQ25CLGdCQUFnQixDQUFVO0lBQzFCLGtCQUFrQixDQUFXO0lBQzdCLGVBQWUsR0FBZ0MsRUFBRSxDQUFDO0lBRW5FLFlBQVksT0FBbUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUN2QixPQUFPLEVBQ1AsUUFBUSxFQUNSLE1BQU0sRUFDTixhQUFhLEVBQ2IsTUFBTSxFQUNOLFVBQVUsRUFDVixTQUFTLEVBQ1Qsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLENBQ25CLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztRQUUvQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQztRQUN2RCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1CQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENB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TUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVc7U0FDdEQsQ0FBQztJQUNKLENBQUM7O0FBOVhILGtEQStYQztBQW1CRCxTQUFTLE9BQU8sQ0FBc0MsQ0FBSSxFQUFFLEdBQUcsRUFBTztJQUNwRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDckIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxDQUFVO0lBQ3RDLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUssQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBNkMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7QUFDcEwsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsQ0FBVTtJQUN6QyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgZGlybmFtZSwgcmVsYXRpdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IENvbXBvbmVudCwgamF2YXNjcmlwdCwgdHlwZXNjcmlwdCwgVGFza1N0ZXAsIFNvdXJjZUNvZGUsIERlcGVuZGVuY3lUeXBlLCBQcm9qZWN0IH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IE1vbm9yZXBvIH0gZnJvbSAnLi9tb25vcmVwbyc7XG5pbXBvcnQgeyBUeXBlU2NyaXB0V29ya3NwYWNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXNjcmlwdC13b3Jrc3BhY2Utb3B0aW9ucyc7XG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHNlbXZlciBkZXBlbmRlbmN5IHRvIHRha2VcbiAqXG4gKiAtICdhbnktbWlub3InIGNvcnJlc3BvbmRzIHRvICdeMSdcbiAqIC0gJ2Z1dHVyZS1taW5vcicgY29ycmVzcG9uZHMgdG8gJ14xLjIuMydcbiAqIC0gJ2FueS1wYXRjaCcgdG8gJ34xLjInXG4gKiAtICdmdXR1cmUtcGF0Y2gnIGNvcnJlc3BvbmRzIHRvICd+MS4yLjMnXG4gKiAtICdleGFjdCcgY29ycmVzcG9uZHMgdG8gJzEuMi4zJ1xuICogLSAnYW55LWZ1dHVyZScgY29ycmVzcG9uZHMgdG8gJz49MS4yLjMnXG4gKiAtICdhbnknIGNvcnJlc3BvbmRzIHRvICcqJ1xuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uVHlwZSA9ICdhbnktbWlub3InIHwgJ2Z1dHVyZS1taW5vcicgfCAnYW55LXBhdGNoJyB8ICdmdXR1cmUtcGF0Y2gnIHwgJ2V4YWN0JyB8ICdhbnktZnV0dXJlJyB8ICdhbnknO1xuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGEgd29ya3NwYWNlIGluIHRoZSBzYW1lIG1vbm9yZXBvXG4gKlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgcGFja2FnZXMgaW4gdGhlIHNhbWUgbW9ub3JlcG8gd2hlbiBkZWNsYXJpbmdcbiAqIGBkZXBzYCBhbmQgYGRldkRlcHNgLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGFsbCBgVHlwZVNjcmlwdFdvcmtzcGFjZWBzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgcmVwcmVzZW50aW5nIHRoZW1zZWx2ZXNcbiAqIHdpdGggYSBgXmAgZGVwZW5kZW5jeSBhbmQgYSByZXN0cmljdGlvbiB0aGF0IHB1YmxpYyBwYWNrYWdlcyBtdXN0IGhhdmUgcHVibGljIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBUaGUgbWV0aG9kIGAuY3VzdG9taXplUmVmZXJlbmNlKHsgLi4uIH0pYCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB3b3Jrc3BhY2UgcmVmZXJlbmNlIHdpdGhcbiAqIGRpZmZlcmVudCBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV29ya3NwYWNlUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlZmVyZW5jZWQgd29ya3NwYWNlIHBhY2thZ2UgaXMgcHJpdmF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcml2YXRlUGFja2FnZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY3kgbmFtZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgcGFja2FnZSB3aGVuIGl0IGlzIHJlbGVhc2VkXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVHlwZTogVmVyc2lvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgdGhhdCBob2xkcyB0aGlzIHBhY2thZ2UgaW4gdGhlIG1vbm9yZXBvXG4gICAqL1xuICByZWFkb25seSBvdXRkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIFR5cGVTY3JpcHQgd29ya3NwYWNlIGluIGEgYHlhcm4uTW9ub3JlcG9gXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0V29ya3NwYWNlIGV4dGVuZHMgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdCBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSZWZlcmVuY2Uge1xuICBwdWJsaWMgZGVjbGFyZSByZWFkb25seSBwYXJlbnQ6IE1vbm9yZXBvIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya3NwYWNlRGlyZWN0b3J5OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBidW5kbGVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHJlYWRvbmx5IGlzUHJpdmF0ZVBhY2thZ2U6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uVHlwZSA9ICdmdXR1cmUtbWlub3InO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9ub3JlcG86IE1vbm9yZXBvO1xuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93UHJpdmF0ZURlcHM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZUZyb21VcGdyYWRlOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvUnVudGltZURlcHM6IFJlY29yZDxzdHJpbmcsIFZlcnNpb25UeXBlPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRXb3Jrc3BhY2VPcHRpb25zKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gd2l0aG91dChcbiAgICAgIG9wdGlvbnMsXG4gICAgICAncGFyZW50JyxcbiAgICAgICduYW1lJyxcbiAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAnZGVwcycsXG4gICAgICAncGVlckRlcHMnLFxuICAgICAgJ2RldkRlcHMnLFxuICAgICAgJ2V4Y2x1ZGVEZXBzRnJvbVVwZ3JhZGUnLFxuICAgICAgJ3JlcG9zaXRvcnknLFxuICAgICAgJ3dvcmtmbG93Tm9kZVZlcnNpb24nLFxuICAgICAgJ2FsbG93UHJpdmF0ZURlcHMnLFxuICAgICk7XG5cbiAgICBjb25zdCB1c2VFc2xpbnQgPSByZW1haW5kZXIuZXNsaW50ID8/IHRydWU7XG4gICAgY29uc3QgdXNlUHJldHRpZXIgPSByZW1haW5kZXIucHJldHRpZXIgPz8gdHJ1ZTtcblxuICAgIGNvbnN0IHdzU2NvcGUgPSByZW1haW5kZXIud29ya3NwYWNlU2NvcGUgPz8gJ3BhY2thZ2VzJztcbiAgICBjb25zdCB3b3Jrc3BhY2VEaXJlY3RvcnkgPSBgJHt3c1Njb3BlfS8ke29wdGlvbnMubmFtZX1gO1xuXG4gICAgY29uc3QgbnBtQWNjZXNzID0gb3B0aW9ucy5wYXJlbnQubW9ub3JlcG9SZWxlYXNlICYmICFvcHRpb25zLnByaXZhdGUgPyBqYXZhc2NyaXB0Lk5wbUFjY2Vzcy5QVUJMSUMgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZWxlYXNlRW52aXJvbm1lbnQgPSBvcHRpb25zLnJlbGVhc2VFbnZpcm9ubWVudCA/PyBvcHRpb25zLnBhcmVudC5zZXR0aW5ncy5yZWxlYXNlRW52aXJvbm1lbnQ7XG5cbiAgICBjb25zdCBleGNsdWRlRnJvbVVwZ3JhZGUgPSBbXG4gICAgICAuLi4ob3B0aW9ucy5leGNsdWRlRGVwc0Zyb21VcGdyYWRlID8/IFtdKSxcbiAgICBdO1xuXG4gICAgc3VwZXIoe1xuICAgICAgcGFyZW50OiBvcHRpb25zLnBhcmVudCxcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgcmVwb3NpdG9yeTogb3B0aW9ucy5yZXBvc2l0b3J5ID8/IG9wdGlvbnMucGFyZW50LnJlcG9zaXRvcnlVcmwsXG4gICAgICByZXBvc2l0b3J5RGlyZWN0b3J5OiB3b3Jrc3BhY2VEaXJlY3RvcnksXG4gICAgICBvdXRkaXI6IHdvcmtzcGFjZURpcmVjdG9yeSxcbiAgICAgIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiAnUkVRVUlSRUQtQlVULVNIT1VMRC1OT1QtQkUnLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IG9wdGlvbnMucGFyZW50LnBhY2thZ2UucGFja2FnZU1hbmFnZXIsXG4gICAgICByZWxlYXNlOiBmYWxzZSxcbiAgICAgIHBhY2thZ2U6ICFvcHRpb25zLnByaXZhdGUsXG4gICAgICBlc2xpbnQ6IHVzZUVzbGludCxcbiAgICAgIHByZXR0aWVyOiB1c2VQcmV0dGllcixcbiAgICAgIHByZXR0aWVyT3B0aW9uczogdXNlUHJldHRpZXJcbiAgICAgICAgPyB7XG4gICAgICAgICAgb3ZlcnJpZGVzOiBvcHRpb25zLnBhcmVudC5wcmV0dGllcj8ub3ZlcnJpZGVzLFxuICAgICAgICAgIHNldHRpbmdzOiBvcHRpb25zLnBhcmVudC5wcmV0dGllcj8uc2V0dGluZ3MsXG4gICAgICAgICAgLi4ucmVtYWluZGVyLnByZXR0aWVyT3B0aW9ucyxcbiAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGVzbGludE9wdGlvbnM6IHVzZUVzbGludFxuICAgICAgICA/IHtcbiAgICAgICAgICBkaXJzOiBbcmVtYWluZGVyLnNyY2RpciA/PyAnc3JjJ10sXG4gICAgICAgICAgZGV2ZGlyczogW3JlbWFpbmRlci50ZXN0ZGlyID8/ICd0ZXN0JywgJ2J1aWxkLXRvb2xzJ10sXG4gICAgICAgICAgLi4ucmVtYWluZGVyLmVzbGludE9wdGlvbnMsXG4gICAgICAgICAgcHJldHRpZXI6IHVzZVByZXR0aWVyLFxuICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc2FtcGxlQ29kZTogZmFsc2UsXG5cbiAgICAgIC8vIGFkZCBub24gd29ya3NwYWNlIGRlcGVuZGVuY2llcyBoZXJlXG4gICAgICAvLyB3b3Jrc3BhY2UgcmVmcyBhcmUgYWRkZWQgbGF0ZXJcbiAgICAgIGRlcHM6IG9wdGlvbnMuZGVwcz8uZmlsdGVyKGlzTm90V29ya3NwYWNlUmVmZXJlbmNlKSxcbiAgICAgIHBlZXJEZXBzOiBvcHRpb25zLnBlZXJEZXBzPy5maWx0ZXIoaXNOb3RXb3Jrc3BhY2VSZWZlcmVuY2UpLFxuICAgICAgZGV2RGVwczogb3B0aW9ucy5kZXZEZXBzPy5maWx0ZXIoaXNOb3RXb3Jrc3BhY2VSZWZlcmVuY2UpLFxuXG4gICAgICBwcm9qZW5EZXZEZXBlbmRlbmN5OiB0cnVlLFxuICAgICAgcmVsZWFzZUVudmlyb25tZW50LFxuXG4gICAgICBkZXBzVXBncmFkZTogb3B0aW9ucy5kZXBzVXBncmFkZSA/PyB0cnVlLFxuICAgICAgZGVwc1VwZ3JhZGVPcHRpb25zOiB7XG4gICAgICAgIHdvcmtmbG93OiBmYWxzZSxcbiAgICAgICAgY29vbGRvd246IG9wdGlvbnMucGFyZW50LnNldHRpbmdzLmRlcHNVcGdyYWRlT3B0aW9ucz8uY29vbGRvd24gPz8gKG9wdGlvbnMucGFyZW50LnNldHRpbmdzLnlhcm5CZXJyeSA/IDMgOiB1bmRlZmluZWQpLFxuICAgICAgICBleGNsdWRlOiBleGNsdWRlRnJvbVVwZ3JhZGUsXG4gICAgICB9LFxuXG4gICAgICBucG1BY2Nlc3MsXG5cbiAgICAgIC8vIERldmlhdGlvbiBmcm9tIHVwc3RyZWFtIHByb2plbjogdXBzdHJlYW0gcHJvamVuIGRlZmF1bHRzIHRvIG1pbk5vZGVWZXJzaW9uLCBidXQgd2UgaGF2ZSB0b28gbWFueSB3b3JrZmxvd3NcbiAgICAgIC8vIHRoYXQgdXNlIHRvb2xzIHRoYXQgd2FudCBhIHJlY2VudCBOb2RlIHZlcnNpb24sIHNvIGRlZmF1bHQgdG8gYSByZWFzb25hYmxlIGZsb2F0aW5nIHZlcnNpb24uXG4gICAgICB3b3JrZmxvd05vZGVWZXJzaW9uOiBvcHRpb25zLndvcmtmbG93Tm9kZVZlcnNpb24gPz8gJ2x0cy8qJyxcblxuICAgICAgLi4ucmVtYWluZGVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy5tb25vcmVwbyA9IG9wdGlvbnMucGFyZW50O1xuICAgIHRoaXMuaXNQcml2YXRlUGFja2FnZSA9IG9wdGlvbnMucHJpdmF0ZSA/PyBmYWxzZTtcbiAgICB0aGlzLmFsbG93UHJpdmF0ZURlcHMgPSBvcHRpb25zLmFsbG93UHJpdmF0ZURlcHMgPz8gZmFsc2U7XG4gICAgdGhpcy5leGNsdWRlRnJvbVVwZ3JhZGUgPSBleGNsdWRlRnJvbVVwZ3JhZGU7XG4gICAgdGhpcy53b3Jrc3BhY2VEaXJlY3RvcnkgPSB3b3Jrc3BhY2VEaXJlY3Rvcnk7XG5cbiAgICAvLyBSZWdpc3RlciB3aXRoIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICB0aGlzLm1vbm9yZXBvLm1vbm9yZXBvUmVsZWFzZT8uYWRkV29ya3NwYWNlKHRoaXMsIHtcbiAgICAgIHByaXZhdGU6IHRoaXMuaXNQcml2YXRlUGFja2FnZSxcbiAgICAgIHdvcmtmbG93Tm9kZVZlcnNpb246IHRoaXMubm9kZVZlcnNpb24sXG4gICAgICBucG1EaXN0VGFnOiBvcHRpb25zLm5wbURpc3RUYWcsXG4gICAgICAvLyBJbmhlcml0IHNldHRpbmcgZnJvbSBNb25vcmVwbyBpZiBjb25maWd1cmVkXG4gICAgICBucG1UcnVzdGVkUHVibGlzaGluZzogb3B0aW9ucy5ucG1UcnVzdGVkUHVibGlzaGluZyA/PyB0aGlzLm1vbm9yZXBvLnNldHRpbmdzLm5wbVRydXN0ZWRQdWJsaXNoaW5nLFxuICAgICAgZW52aXJvbm1lbnQ6IHJlbGVhc2VFbnZpcm9ubWVudCxcbiAgICAgIHJlbGVhc2FibGVDb21taXRzOiBvcHRpb25zLnJlbGVhc2FibGVDb21taXRzLFxuICAgICAgbmV4dFZlcnNpb25Db21tYW5kOiBvcHRpb25zLm5leHRWZXJzaW9uQ29tbWFuZCxcbiAgICAgIHZlcnNpb25CcmFuY2hPcHRpb25zOiB7XG4gICAgICAgIG1ham9yVmVyc2lvbjogb3B0aW9ucy5tYWpvclZlcnNpb24sXG4gICAgICAgIG1pbk1ham9yVmVyc2lvbjogb3B0aW9ucy5taW5NYWpvclZlcnNpb24sXG4gICAgICAgIHByZXJlbGVhc2U6IG9wdGlvbnMucHJlcmVsZWFzZSxcbiAgICAgIH0sXG4gICAgICByZXBvUnVudGltZURlcGVuZGVuY2llczogdGhpcy5yZXBvUnVudGltZURlcHMsXG4gICAgfSk7XG5cbiAgICAvLyBFeHBvc2UgdGhlIG1vbm9yZXBvIHB1Ymxpc2hlciBhcyBwcm9qZWN0LnJlbGVhc2Ugc28gdGhhdCBvdGhlciBjb2RlIGNhbiBmaW5kIGl0IHZpYSBwcm9qZWN0LnJlbGVhc2U/LnB1Ymxpc2hlclxuICAgIC8vIE1VU1QgYmUgY2FsbGVkIGFmdGVyIGB0aGlzLm1vbm9yZXBvLm1vbm9yZXBvUmVsZWFzZT8uYWRkV29ya3NwYWNlKC4uLilgXG4gICAgLy8gQHRzLWlnbm9yZSAtIHJlYWRvbmx5IHByb3BlcnR5LCBidXQgd2UgbmVlZCB0byBzZXQgaXQgZm9yIHVwc3RyZWFtIG1peGluIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLnJlbGVhc2UgPSB0aGlzLm1vbm9yZXBvLm1vbm9yZXBvUmVsZWFzZT8ud29ya3NwYWNlUmVsZWFzZSh0aGlzKTtcblxuICAgIC8vIGplc3QgY29uZmlnXG4gICAgaWYgKHRoaXMuamVzdD8uY29uZmlnICYmIHRoaXMuamVzdC5jb25maWcucHJlc2V0ID09PSAndHMtamVzdCcpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmplc3QuY29uZmlnLmdsb2JhbHM/LlsndHMtamVzdCddO1xuICAgICAgdGhpcy5qZXN0LmNvbmZpZy50cmFuc2Zvcm0gPSB7XG4gICAgICAgICdeLitcXFxcLnRzeD8kJzogW1xuICAgICAgICAgICd0cy1qZXN0JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0c2NvbmZpZzogdGhpcy50c2NvbmZpZ0Rldi5maWxlTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUYXNrc1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgnZGVmYXVsdCcpPy5yZXNldCgncHJvamVuIGRlZmF1bHQnLCB7IGN3ZDogcmVsYXRpdmUodGhpcy5vdXRkaXIsIG9wdGlvbnMucGFyZW50Lm91dGRpcikgfSk7XG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdjbG9iYmVyJyk7XG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdlamVjdCcpO1xuXG4gICAgY29uc3QgdXBncmFkZVRhc2tOYW1lID0gJ3VwZ3JhZGUnO1xuICAgIGNvbnN0IHVwZ3JhZGVzID0gdGhpcy5jb21wb25lbnRzLmZpbmQoXG4gICAgICAoYzogQ29tcG9uZW50KTogYyBpcyBqYXZhc2NyaXB0LlVwZ3JhZGVEZXBlbmRlbmNpZXMgPT4gKFxuICAgICAgICBjIGluc3RhbmNlb2YgamF2YXNjcmlwdC5VcGdyYWRlRGVwZW5kZW5jaWVzICYmIGMudXBncmFkZVRhc2submFtZSA9PT0gdXBncmFkZVRhc2tOYW1lXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAodXBncmFkZXMpIHtcbiAgICAgIHRoaXMudGFza3MucmVtb3ZlVGFzayh1cGdyYWRlcy51cGdyYWRlVGFzay5uYW1lKTtcbiAgICAgIHRoaXMudGFza3MucmVtb3ZlVGFzayh1cGdyYWRlcy5wb3N0VXBncmFkZVRhc2submFtZSk7XG4gICAgICB0aGlzLnRhc2tzLmFkZFRhc2soJ2NoZWNrLWZvci11cGRhdGVzJywge1xuICAgICAgICBlbnY6IHsgLi4udXBncmFkZXMudXBncmFkZVRhc2suZW52VmFycyB9LFxuICAgICAgICBzdGVwczoge1xuICAgICAgICAgIHRvSlNPTjogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSAodXBncmFkZXMgYXMgYW55KS5yZW5kZXJUYXNrU3RlcHMoKSBhcyBUYXNrU3RlcFtdO1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHN0ZXApID0+IHN0ZXAuZXhlYyAmJiB0eXBlb2Ygc3RlcC5leGVjID09PSAnc3RyaW5nJyAmJiBzdGVwLmV4ZWM/LmluY2x1ZGVzKCducG0tY2hlY2stdXBkYXRlcycpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXBvc2l0ZSBwcm9qZWN0IGFuZCByZWZlcmVuY2VzXG4gICAgZm9yIChjb25zdCB0c2NvbmZpZyBvZiBbdGhpcy50c2NvbmZpZywgdGhpcy50c2NvbmZpZ0Rldl0pIHtcbiAgICAgIHRzY29uZmlnPy5maWxlLmFkZE92ZXJyaWRlKCdjb21waWxlck9wdGlvbnMuY29tcG9zaXRlJywgdHJ1ZSk7XG4gICAgICB0c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZSgncmVmZXJlbmNlcycsIFtdKTtcbiAgICB9XG5cbiAgICAvLyBTZWxmLXJlZmVyZW5jZSBmcm9tIHRoZSBkZXYvdGVzdCB0c2NvbmZpZyB0byB0aGUgbWFpbiBwcm9qZWN0IHRzY29uZmlnLlxuICAgIC8vXG4gICAgLy8gQnkgZGVmYXVsdCB0aGUgZGV2IHRzY29uZmlnIGxpdmVzIGluIGEgc3ViZGlyZWN0b3J5IChlLmcuIGB0ZXN0L3RzY29uZmlnLmpzb25gKVxuICAgIC8vIGFuZCBleHRlbmRzIHRoZSBtYWluIGB0c2NvbmZpZy5qc29uYC4gVW5kZXIgYGNvbXBvc2l0ZTogdHJ1ZWAsIFR5cGVTY3JpcHQgdHJlYXRzXG4gICAgLy8gdGhlIGRldiB0c2NvbmZpZyBhcyBhIHNlcGFyYXRlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCBzdHJpY3QgcHJvamVjdCBib3VuZGFyaWVzOlxuICAgIC8vIGl0cyBgaW5jbHVkZWAgb25seSBjb3ZlcnMgZmlsZXMgdW5kZXIgaXRzIG93biBkaXJlY3RvcnkuIFRlc3QgZmlsZXMgdGhhdCBpbXBvcnRcbiAgICAvLyBmcm9tIHRoZSBwYXJlbnQgYGxpYi9gIChgLi4vbGliLy4uLmApIGFyZSB0aGVuIHJlYWNoYWJsZSB2aWEgaW1wb3J0cyBidXQgYXJlIG5vdFxuICAgIC8vIHBhcnQgb2YgdGhlIGRldiBwcm9qZWN0J3MgZmlsZSBzZXQsIHdoaWNoIGZhaWxzIHdpdGggVFM2MzA3IG9uIGB0c2MgLS1idWlsZGAuXG4gICAgLy9cbiAgICAvLyBBZGRpbmcgYSBwcm9qZWN0IHJlZmVyZW5jZSBmcm9tIHRoZSBkZXYgdHNjb25maWcgYmFjayB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBtYWluXG4gICAgLy8gdHNjb25maWcgdGVsbHMgVHlwZVNjcmlwdCB0aGF0IHRoZSBsaWIgc291cmNlIGlzIGEgc2VwYXJhdGUsIGFscmVhZHktYnVpbHQgcHJvamVjdFxuICAgIC8vIGFuZCB0byBjb25zdW1lIGl0cyBkZWNsYXJhdGlvbnMuIFdlIG9ubHkgZG8gdGhpcyB3aGVuIHRoZSB0d28gdHNjb25maWdzIGFyZSBub3RcbiAgICAvLyBjby1sb2NhdGVkIChpLmUuIHRoZSBkZXYgdHNjb25maWcgaXMgbm90IGFsaWFzZWQgdG8gLyBzaXR0aW5nIG5leHQgdG8gdGhlIG1haW4gb25lKS5cbiAgICBpZiAodGhpcy50c2NvbmZpZyAmJiB0aGlzLnRzY29uZmlnRGV2ICYmIHRoaXMudHNjb25maWcgIT09IHRoaXMudHNjb25maWdEZXYpIHtcbiAgICAgIGNvbnN0IG1haW5Uc2NvbmZpZ0RpciA9IGRpcm5hbWUodGhpcy50c2NvbmZpZy5maWxlLmFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBkZXZUc2NvbmZpZ0RpciA9IGRpcm5hbWUodGhpcy50c2NvbmZpZ0Rldi5maWxlLmFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBzZWxmUmVmZXJlbmNlID0gcmVsYXRpdmUoZGV2VHNjb25maWdEaXIsIG1haW5Uc2NvbmZpZ0Rpcik7XG4gICAgICBpZiAoc2VsZlJlZmVyZW5jZSAhPT0gJycpIHtcbiAgICAgICAgdGhpcy50c2NvbmZpZ0Rldi5maWxlLmFkZFRvQXJyYXkoJ3JlZmVyZW5jZXMnLCB7IHBhdGg6IHNlbGZSZWZlcmVuY2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHdvcmtzcGFjZSByZWZlcmVuY2VzXG4gICAgZm9yIChjb25zdCBkZXAgb2Ygb3B0aW9ucy5kZXBzPy5maWx0ZXIoaXNXb3Jrc3BhY2VSZWZlcmVuY2UpID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZFdvcmtzcGFjZURlcChkZXAsIERlcGVuZGVuY3lUeXBlLlJVTlRJTUUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlcCBvZiBvcHRpb25zLnBlZXJEZXBzPy5maWx0ZXIoaXNXb3Jrc3BhY2VSZWZlcmVuY2UpID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZFdvcmtzcGFjZURlcChkZXAsIERlcGVuZGVuY3lUeXBlLlBFRVIpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlcCBvZiBvcHRpb25zLmRldkRlcHM/LmZpbHRlcihpc1dvcmtzcGFjZVJlZmVyZW5jZSkgPz8gW10pIHtcbiAgICAgIHRoaXMuYWRkV29ya3NwYWNlRGVwKGRlcCwgRGVwZW5kZW5jeVR5cGUuQlVJTEQpO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHBhc3NpbmcgYWRkaXRpb25hbCBhcmdzIGxpa2UgYC0tZm9yY2VgIHRvIHRoZSBjb21waWxlIHRhc2tcbiAgICAvLyBOZWVkZWQgYmVjYXVzZSB3ZSB1c2UgY29tcG9zaXRlIHByb2plY3RzIHRoYXQgb2Z0ZW4gbmVlZCBhIHRzYyAtLWJ1aWxkIC0tZm9yY2VcbiAgICB0aGlzLnRhc2tzLnRyeUZpbmQoJ2NvbXBpbGUnKT8ucmVzZXQoJ3RzYyAtLWJ1aWxkJywge1xuICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBXZSBoYW5kbGUgZGVwZW5kZW5jaWVzIHZpYSB0aGUgcGFyZW50IHByb2plY3RcblxuICAgIC8vIERpc2FibGUgd29ya3NwYWNlIHJlc29sdmVEZXBzQW5kV3JpdGVQYWNrYWdlSnNvblxuICAgIC8qIEB0cy1pZ25vcmUgYWNjZXNzIHByaXZhdGUgbWV0aG9kICovXG4gICAgY29uc3Qgb3JpZ2luYWxSZXNvbHZlID0gdGhpcy5wYWNrYWdlLnJlc29sdmVEZXBzQW5kV3JpdGVQYWNrYWdlSnNvbjtcbiAgICAvKiBAdHMtaWdub3JlIGFjY2VzcyBwcml2YXRlIG1ldGhvZCAqL1xuICAgIHRoaXMucGFja2FnZS5yZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb24gPSAoKSA9PiBbXTtcblxuICAgIC8vIEluc3RlYWQgb2YgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMsIHJlcXVlc3QgZnJvbSB0aGUgcGFyZW50XG4gICAgLyogQHRzLWlnbm9yZSBhY2Nlc3MgcHJpdmF0ZSBtZXRob2QgKi9cbiAgICB0aGlzLnBhY2thZ2UuaW5zdGFsbERlcGVuZGVuY2llcyA9ICh0cmlnZ2VyOiBqYXZhc2NyaXB0Lkluc3RhbGxUcmlnZ2VyKSA9PiB7XG4gICAgICBpZiAodHJpZ2dlci5yZWFzb24gPT09IGphdmFzY3JpcHQuSW5zdGFsbFJlYXNvbi5OT19OT0RFX01PRFVMRVMpIHtcbiAgICAgICAgLy8gSW4gYSBtb25vcmVwbywgYSB3b3Jrc3BhY2Ugbm9kZV9tb2R1bGVzIG1heSBsZWdpdGltYXRlbHkgbm90IGV4aXN0IGR1ZSB0byBob2lzdGluZy4gV2UganVzdCBza2lwIHRoaXMgY2FzZS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5wYXJlbnQucmVxdWVzdEluc3RhbGxEZXBlbmRlbmNpZXMoeyByZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb246ICgpID0+IG9yaWdpbmFsUmVzb2x2ZS5hcHBseSh0aGlzLnBhY2thZ2UpIH0pO1xuICAgIH07XG5cbiAgICAvLyBGaXggdGhlIGluc3RhbGwgdHJpZ2dlciBsb2dnaW5nIHRvIG1hdGNoIGFjdHVhbCByZXF1ZXN0c1xuICAgIC8qIEB0cy1pZ25vcmUgYWNjZXNzIHByaXZhdGUgbWV0aG9kICovXG4gICAgY29uc3Qgb3JpZ2luYWxMb2dUcmlnZ2VyID0gdGhpcy5wYWNrYWdlLmxvZ0luc3RhbGxUcmlnZ2VyO1xuICAgIC8qIEB0cy1pZ25vcmUgYWNjZXNzIHByaXZhdGUgbWV0aG9kICovXG4gICAgdGhpcy5wYWNrYWdlLmxvZ0luc3RhbGxUcmlnZ2VyID0gKHRyaWdnZXI6IEluc3RhbGxUcmlnZ2VyKSA9PiB7XG4gICAgICBpZiAodHJpZ2dlci5yZWFzb24gPT09IGphdmFzY3JpcHQuSW5zdGFsbFJlYXNvbi5OT19OT0RFX01PRFVMRVMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLyogQHRzLWlnbm9yZSBhY2Nlc3MgcHJpdmF0ZSBtZXRob2QgKi9cbiAgICAgIHJldHVybiBvcmlnaW5hbExvZ1RyaWdnZXIuYXBwbHkodGhpcy5wYWNrYWdlLCBbdHJpZ2dlcl0pO1xuICAgIH07XG5cbiAgICAvLyBQcml2YXRlIHBhY2thZ2VcbiAgICBpZiAob3B0aW9ucy5wcml2YXRlKSB7XG4gICAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ3ByaXZhdGUnLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBZYXJuIEJlcnJ5IGluc3RhbGxDb25maWdcbiAgICBpZiAob3B0aW9ucy5ob2lzdGluZ0xpbWl0cykge1xuICAgICAgdGhpcy5wYWNrYWdlLmFkZEZpZWxkKCdpbnN0YWxsQ29uZmlnJywgeyBob2lzdGluZ0xpbWl0czogb3B0aW9ucy5ob2lzdGluZ0xpbWl0cyB9KTtcbiAgICB9XG5cbiAgICAvLyBGaXhlc1xuICAgIHRoaXMuYWRkVHNjb25maWdEZXZGaXgoKTtcbiAgICB0aGlzLmFkZEVzbGludFJjRml4KCk7XG5cbiAgICB0aGlzLmJ1bmRsZWREZXBzLnB1c2goLi4ub3B0aW9ucy5idW5kbGVkRGVwcyA/PyBbXSk7XG5cbiAgICAvLyBJbmRpdmlkdWFsIHdvcmtzcGFjZSBwYWNrYWdlcyBzaG91bGRuJ3QgZGVwZW5kIG9uIFwicHJvamVuXCIsIGl0IGdldHMgYnJvdWdodCBpbiBhdCB0aGUgbW9ub3JlcG8gcm9vdFxuICAgIHRoaXMuZGVwcy5yZW1vdmVEZXBlbmRlbmN5KCdwcm9qZW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJIGRvbid0IGtub3cgd2h5IGB0c2NvbmZpZy5kZXYuanNvbmAgZG9lc24ndCBoYXZlIGFuIG91dGRpciwgb3Igd2hlcmUgaXQncyB1c2VkLFxuICAgKiBidXQgaXQncyBjYXVzaW5nIGluLXBsYWNlIGAuanNgIGZpbGVzIHRvIGFwcGVhci5cbiAgICovXG4gIHByb3RlY3RlZCBhZGRUc2NvbmZpZ0RldkZpeCgpIHtcbiAgICB0aGlzLnRzY29uZmlnRGV2LmZpbGUuYWRkT3ZlcnJpZGUoJ2NvbXBpbGVyT3B0aW9ucy5vdXREaXInLCAnbGliJyk7XG4gIH1cblxuICAvKipcbiAgICogTmVlZCB0byBoYWNrIEVTTGludCBjb25maWdcbiAgICpcbiAgICogLmVzbGludHJjLmpzIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIEpTT04gZmlsZSwgaXQgd2lsbCBsb2FkIHRoZVxuICAgKiBKU09OIGZpbGUgYW5kIHBhdGNoIGl0IHdpdGggYSBkeW5hbWljIGRpcmVjdG9yeSBuYW1lIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluXG4gICAqIHBsYWluIEpTT04gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvamVuL3Byb2plbi9pc3N1ZXMvMjQwNSkuXG4gICAqXG4gICAqIFNpbmNlIGVzbGludCBjb25maWcgaXMgbG9hZGVkIHdpdGggZGlmZmVyZW50IGN3ZCdzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0J3NcbiAgICogZnJvbSB0aGUgVlNDb2RlIHBsdWdpbiBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHVzZSBhYnNvbHV0ZSBwYXRocyBldmVyeXdoZXJlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFkZEVzbGludFJjRml4KCkge1xuICAgIGNvbnN0IGVzbGludFJjID0gbmV3IFNvdXJjZUNvZGUodGhpcywgJy5lc2xpbnRyYy5qcycpO1xuICAgIGVzbGludFJjLmxpbmUoJ3ZhciBwYXRoID0gcmVxdWlyZShcXCdwYXRoXFwnKTsnKTtcbiAgICBlc2xpbnRSYy5saW5lKCd2YXIgZnMgPSByZXF1aXJlKFxcJ2ZzXFwnKTsnKTtcbiAgICBlc2xpbnRSYy5saW5lKCd2YXIgY29udGVudHMgPSBmcy5yZWFkRmlsZVN5bmMoYCR7X19kaXJuYW1lfS8uZXNsaW50cmMuanNvbmAsIHsgZW5jb2Rpbmc6IFxcJ3V0Zi04XFwnIH0pOycpO1xuICAgIGVzbGludFJjLmxpbmUoJy8vIFN0cmlwIGNvbW1lbnRzLCBKU09OLnBhcnNlKCkgZG9lc25cXCd0IGxpa2UgdGhvc2UnKTtcbiAgICBlc2xpbnRSYy5saW5lKCdjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoL15cXFxcL1xcXFwvLiokL20sIFxcJ1xcJyk7Jyk7XG4gICAgZXNsaW50UmMubGluZSgndmFyIGpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnRzKTsnKTtcbiAgICBlc2xpbnRSYy5saW5lKCcvLyBQYXRjaCB0aGUgLmpzb24gY29uZmlnIHdpdGggc29tZXRoaW5nIHRoYXQgY2FuIG9ubHkgYmUgcmVwcmVzZW50ZWQgaW4gSlMnKTtcbiAgICBlc2xpbnRSYy5saW5lKCdqc29uLnBhcnNlck9wdGlvbnMudHNjb25maWdSb290RGlyID0gX19kaXJuYW1lOycpO1xuICAgIGVzbGludFJjLmxpbmUoJ21vZHVsZS5leHBvcnRzID0ganNvbjsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB3b3Jrc3BhY2UgcGFja2FnZSBhcyBhIGRlcGVuZGVuY3ksIGluY2x1ZGluZyB0c2NvbmZpZyBwcm9qZWN0IHJlZmVyZW5jZXMuXG4gICAqXG4gICAqIFVzZSB0aGlzIHRvIGFkZCB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFmdGVyIGNvbnN0cnVjdGlvbiAoZS5nLiBmcm9tIGEgbWl4aW4pLlxuICAgKiBJdCBkb2VzIHRoZSBzYW1lIGFzIHBhc3NpbmcgdGhlIHdvcmtzcGFjZSBpbiB0aGUgYGRlcHNgL2BkZXZEZXBzYC9gcGVlckRlcHNgIGNvbnN0cnVjdG9yIG9wdGlvbi5cbiAgICovXG4gIHB1YmxpYyBhZGRXb3Jrc3BhY2VEZXAocmVmOiBJV29ya3NwYWNlUmVmZXJlbmNlLCB0eXBlOiBEZXBlbmRlbmN5VHlwZSA9IERlcGVuZGVuY3lUeXBlLlJVTlRJTUUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXBzLnRyeUdldERlcGVuZGVuY3kocmVmLm5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5SVU5USU1FOlxuICAgICAgICB0aGlzLmFkZERlcHMocmVmLm5hbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuUEVFUjpcbiAgICAgICAgdGhpcy5hZGRQZWVyRGVwcyhyZWYubmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5ERVZFTlY6XG4gICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkJVSUxEOlxuICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5URVNUOlxuICAgICAgICB0aGlzLmFkZERldkRlcHMocmVmLm5hbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuYWRkRGVwcyhyZWYubmFtZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNjb25maWcgb2YgW3RoaXMudHNjb25maWcsIHRoaXMudHNjb25maWdEZXZdKSB7XG4gICAgICBpZiAodHNjb25maWcpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoZGlybmFtZSh0c2NvbmZpZy5maWxlLmFic29sdXRlUGF0aCksIHJlZi5vdXRkaXIpO1xuICAgICAgICB0c2NvbmZpZz8uZmlsZS5hZGRUb0FycmF5KCdyZWZlcmVuY2VzJywgeyBwYXRoOiByZWxhdGl2ZVBhdGggfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZXhjbHVkZUZyb21VcGdyYWRlLnB1c2gocmVmLm5hbWUpO1xuICAgIGlmICh0eXBlID09PSBEZXBlbmRlbmN5VHlwZS5SVU5USU1FIHx8IHR5cGUgPT09IERlcGVuZGVuY3lUeXBlLlBFRVIpIHtcbiAgICAgIHRoaXMucmVwb1J1bnRpbWVEZXBzW3JlZi5uYW1lXSA9IHJlZi52ZXJzaW9uVHlwZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJlU3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5wcmVTeW50aGVzaXplKCk7XG4gICAgdGhpcy52YWxpZGF0ZU5vUHJpdmF0ZVdvcmtzcGFjZURlcHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVOb1ByaXZhdGVXb3Jrc3BhY2VEZXBzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUHJpdmF0ZVBhY2thZ2UpIHJldHVybjtcblxuICAgIGNvbnN0IHNpYmxpbmdzID0gbmV3IE1hcChcbiAgICAgIHRoaXMubW9ub3JlcG8uc3VicHJvamVjdHNcbiAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgVHlwZVNjcmlwdFdvcmtzcGFjZSA9PiBwIGluc3RhbmNlb2YgVHlwZVNjcmlwdFdvcmtzcGFjZSlcbiAgICAgICAgLm1hcCgocCkgPT4gW3AubmFtZSwgcF0pLFxuICAgICk7XG5cbiAgICBjb25zdCBpbGxlZ2FsRGVwcyA9IHRoaXMuZGVwcy5hbGxcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuUlVOVElNRSB8fCBkLnR5cGUgPT09IERlcGVuZGVuY3lUeXBlLlBFRVIpXG4gICAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAgIGNvbnN0IHdzID0gc2libGluZ3MuZ2V0KGQubmFtZSk7XG4gICAgICAgIGlmICghd3M/LmlzUHJpdmF0ZVBhY2thZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGQudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuUlVOVElNRSAmJiB0aGlzLmFsbG93UHJpdmF0ZURlcHMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KVxuICAgICAgLm1hcCgoZCkgPT4gZC5uYW1lKTtcblxuICAgIGlmIChpbGxlZ2FsRGVwcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGAke3RoaXMubmFtZX0gaXMgcHVibGljIGFuZCBjYW5ub3QgZGVwZW5kIG9uIHByaXZhdGUgd29ya3NwYWNlIHBhY2thZ2VzLmAsXG4gICAgICAgIGBJbGxlZ2FsIGRlcGVuZGVuY2llczpcXG4gICAgLSAke2lsbGVnYWxEZXBzLmpvaW4oJ1xcbiAgICAtICcpfWAsXG4gICAgICBdLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCBQcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlIHRoYXQgYXJlIGFsc28gZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IGZpbHRlciBieSBkZXBlbmRlbmN5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgd29ya3NwYWNlRGVwZW5kZW5jaWVzKHR5cGVzPzogRGVwZW5kZW5jeVR5cGVbXSk6IFByb2plY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMubW9ub3JlcG8uc3VicHJvamVjdHMuZmlsdGVyKChzaWJsaW5nKSA9PlxuICAgICAgdGhpcy5kZXBzLmFsbC5zb21lKChkKSA9PiBkLm5hbWUgPT09IHNpYmxpbmcubmFtZSAmJiAoIXR5cGVzIHx8IHR5cGVzLmluY2x1ZGVzKGQudHlwZSkpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHNwZWNpYWxpemVkIHJlZmVyZW5jZSB0byB0aGlzIHdvcmtzcGFjZVxuICAgKi9cbiAgcHVibGljIGN1c3RvbWl6ZVJlZmVyZW5jZShyZWZPcHRzPzogUmVmZXJlbmNlT3B0aW9ucyk6IElXb3Jrc3BhY2VSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBvdXRkaXI6IHRoaXMub3V0ZGlyLFxuICAgICAgaXNQcml2YXRlUGFja2FnZTogdGhpcy5pc1ByaXZhdGVQYWNrYWdlLFxuICAgICAgdmVyc2lvblR5cGU6IHJlZk9wdHM/LnZlcnNpb25UeXBlID8/IHRoaXMudmVyc2lvblR5cGUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBgd29ya3NwYWNlLmN1c3RvbWl6ZVJlZmVyZW5jZSgpYCBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWZlcmVuY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoYXQgdHlwZSBvZiBkZXBlbmRlbmN5IHRvIHRha2Ugb24gdGhpcyBwYWNrYWdlXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGRlcGVuZGVuY2llcyB3aWxsIGJlIHJlZmVyZW5jZWQgd2l0aCBhIGBeYCwgd2hpY2ggbWVhbnMgdGhhdFxuICAgKiBjb21lIGluc3RhbGwgdGltZSBhIG5ld2VyIHZlcnNpb24gbWF5IGJlIGluc3RhbGxlZC5cbiAgICpcbiAgICogQ2hvb3NlIGEgZGlmZmVyZW50IHJhbmdlIHR5cGUgdG8gdGFrZSwgZm9yIGV4YW1wbGUsIGFuIGBleGFjdGAgZGVwZW5kZW5jeS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2Z1dHVyZS1taW5vcidcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25UeXBlPzogVmVyc2lvblR5cGU7XG59XG5cbmZ1bmN0aW9uIHdpdGhvdXQ8QSBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIEE+KHg6IEEsIC4uLmtzOiBLW10pOiBPbWl0PEEsIEs+IHtcbiAgY29uc3QgcmV0ID0geyAuLi54IH07XG4gIGZvciAoY29uc3QgayBvZiBrcykge1xuICAgIGRlbGV0ZSByZXRba107XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VSZWZlcmVuY2UoeDogdW5rbm93bik6IHggaXMgSVdvcmtzcGFjZVJlZmVyZW5jZSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgISF4ICYmIChbJ2lzUHJpdmF0ZVBhY2thZ2UnLCAndmVyc2lvblR5cGUnLCAnbmFtZScsICdvdXRkaXInXSBzYXRpc2ZpZXMgQXJyYXk8a2V5b2YgSVdvcmtzcGFjZVJlZmVyZW5jZT4pLmV2ZXJ5KGsgPT4gKHggYXMgYW55KVtrXSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gaXNOb3RXb3Jrc3BhY2VSZWZlcmVuY2UoeDogdW5rbm93bik6IHggaXMgc3RyaW5nIHtcbiAgcmV0dXJuICFpc1dvcmtzcGFjZVJlZmVyZW5jZSh4KTtcbn1cbiJdfQ==
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC13b3Jrc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMveWFybi90eXBlc2NyaXB0LXdvcmtzcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsK0JBQXlDO0FBQ3pDLG1DQUEwRztBQW1EMUc7O0dBRUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLG1CQUFVLENBQUMsaUJBQWlCOztJQUVuRCxrQkFBa0IsQ0FBUztJQUMzQixXQUFXLEdBQWEsRUFBRSxDQUFDO0lBQzNCLGdCQUFnQixDQUFVO0lBQzFCLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFFNUIsUUFBUSxDQUFXO0lBQ25CLGdCQUFnQixDQUFVO0lBQzFCLGtCQUFrQixDQUFXO0lBQzdCLGVBQWUsR0FBZ0MsRUFBRSxDQUFDO0lBRW5FLFlBQVksT0FBbUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUN2QixPQUFPLEVBQ1AsUUFBUSxFQUNSLE1BQU0sRUFDTixhQUFhLEVBQ2IsTUFBTSxFQUNOLFVBQVUsRUFDVixTQUFTLEVBQ1Qsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLENBQ25CLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztRQUUvQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQztRQUN2RCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1CQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENB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QyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgZGlybmFtZSwgcmVsYXRpdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IENvbXBvbmVudCwgamF2YXNjcmlwdCwgdHlwZXNjcmlwdCwgVGFza1N0ZXAsIFNvdXJjZUNvZGUsIERlcGVuZGVuY3lUeXBlLCBQcm9qZWN0IH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IE1vbm9yZXBvIH0gZnJvbSAnLi9tb25vcmVwbyc7XG5pbXBvcnQgeyBUeXBlU2NyaXB0V29ya3NwYWNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXNjcmlwdC13b3Jrc3BhY2Utb3B0aW9ucyc7XG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHNlbXZlciBkZXBlbmRlbmN5IHRvIHRha2VcbiAqXG4gKiAtICdhbnktbWlub3InIGNvcnJlc3BvbmRzIHRvICdeMSdcbiAqIC0gJ2Z1dHVyZS1taW5vcicgY29ycmVzcG9uZHMgdG8gJ14xLjIuMydcbiAqIC0gJ2FueS1wYXRjaCcgdG8gJ34xLjInXG4gKiAtICdmdXR1cmUtcGF0Y2gnIGNvcnJlc3BvbmRzIHRvICd+MS4yLjMnXG4gKiAtICdleGFjdCcgY29ycmVzcG9uZHMgdG8gJzEuMi4zJ1xuICogLSAnYW55LWZ1dHVyZScgY29ycmVzcG9uZHMgdG8gJz49MS4yLjMnXG4gKiAtICdhbnknIGNvcnJlc3BvbmRzIHRvICcqJ1xuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uVHlwZSA9ICdhbnktbWlub3InIHwgJ2Z1dHVyZS1taW5vcicgfCAnYW55LXBhdGNoJyB8ICdmdXR1cmUtcGF0Y2gnIHwgJ2V4YWN0JyB8ICdhbnktZnV0dXJlJyB8ICdhbnknO1xuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGEgd29ya3NwYWNlIGluIHRoZSBzYW1lIG1vbm9yZXBvXG4gKlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgcGFja2FnZXMgaW4gdGhlIHNhbWUgbW9ub3JlcG8gd2hlbiBkZWNsYXJpbmdcbiAqIGBkZXBzYCBhbmQgYGRldkRlcHNgLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGFsbCBgVHlwZVNjcmlwdFdvcmtzcGFjZWBzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgcmVwcmVzZW50aW5nIHRoZW1zZWx2ZXNcbiAqIHdpdGggYSBgXmAgZGVwZW5kZW5jeSBhbmQgYSByZXN0cmljdGlvbiB0aGF0IHB1YmxpYyBwYWNrYWdlcyBtdXN0IGhhdmUgcHVibGljIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBUaGUgbWV0aG9kIGAuY3VzdG9taXplUmVmZXJlbmNlKHsgLi4uIH0pYCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB3b3Jrc3BhY2UgcmVmZXJlbmNlIHdpdGhcbiAqIGRpZmZlcmVudCBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV29ya3NwYWNlUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlZmVyZW5jZWQgd29ya3NwYWNlIHBhY2thZ2UgaXMgcHJpdmF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcml2YXRlUGFja2FnZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY3kgbmFtZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgcGFja2FnZSB3aGVuIGl0IGlzIHJlbGVhc2VkXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVHlwZTogVmVyc2lvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgdGhhdCBob2xkcyB0aGlzIHBhY2thZ2UgaW4gdGhlIG1vbm9yZXBvXG4gICAqL1xuICByZWFkb25seSBvdXRkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIFR5cGVTY3JpcHQgd29ya3NwYWNlIGluIGEgYHlhcm4uTW9ub3JlcG9gXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0V29ya3NwYWNlIGV4dGVuZHMgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdCBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSZWZlcmVuY2Uge1xuICBwdWJsaWMgZGVjbGFyZSByZWFkb25seSBwYXJlbnQ6IE1vbm9yZXBvIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya3NwYWNlRGlyZWN0b3J5OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBidW5kbGVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHJlYWRvbmx5IGlzUHJpdmF0ZVBhY2thZ2U6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uVHlwZSA9ICdmdXR1cmUtbWlub3InO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9ub3JlcG86IE1vbm9yZXBvO1xuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93UHJpdmF0ZURlcHM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZUZyb21VcGdyYWRlOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvUnVudGltZURlcHM6IFJlY29yZDxzdHJpbmcsIFZlcnNpb25UeXBlPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRXb3Jrc3BhY2VPcHRpb25zKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gd2l0aG91dChcbiAgICAgIG9wdGlvbnMsXG4gICAgICAncGFyZW50JyxcbiAgICAgICduYW1lJyxcbiAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAnZGVwcycsXG4gICAgICAncGVlckRlcHMnLFxuICAgICAgJ2RldkRlcHMnLFxuICAgICAgJ2V4Y2x1ZGVEZXBzRnJvbVVwZ3JhZGUnLFxuICAgICAgJ3JlcG9zaXRvcnknLFxuICAgICAgJ3dvcmtmbG93Tm9kZVZlcnNpb24nLFxuICAgICAgJ2FsbG93UHJpdmF0ZURlcHMnLFxuICAgICk7XG5cbiAgICBjb25zdCB1c2VFc2xpbnQgPSByZW1haW5kZXIuZXNsaW50ID8/IHRydWU7XG4gICAgY29uc3QgdXNlUHJldHRpZXIgPSByZW1haW5kZXIucHJldHRpZXIgPz8gdHJ1ZTtcblxuICAgIGNvbnN0IHdzU2NvcGUgPSByZW1haW5kZXIud29ya3NwYWNlU2NvcGUgPz8gJ3BhY2thZ2VzJztcbiAgICBjb25zdCB3b3Jrc3BhY2VEaXJlY3RvcnkgPSBgJHt3c1Njb3BlfS8ke29wdGlvbnMubmFtZX1gO1xuXG4gICAgY29uc3QgbnBtQWNjZXNzID0gb3B0aW9ucy5wYXJlbnQubW9ub3JlcG9SZWxlYXNlICYmICFvcHRpb25zLnByaXZhdGUgPyBqYXZhc2NyaXB0Lk5wbUFjY2Vzcy5QVUJMSUMgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZWxlYXNlRW52aXJvbm1lbnQgPSBvcHRpb25zLnJlbGVhc2VFbnZpcm9ubWVudCA/PyBvcHRpb25zLnBhcmVudC5zZXR0aW5ncy5yZWxlYXNlRW52aXJvbm1lbnQ7XG5cbiAgICBjb25zdCBleGNsdWRlRnJvbVVwZ3JhZGUgPSBbXG4gICAgICAuLi4ob3B0aW9ucy5leGNsdWRlRGVwc0Zyb21VcGdyYWRlID8/IFtdKSxcbiAgICBdO1xuXG4gICAgc3VwZXIoe1xuICAgICAgcGFyZW50OiBvcHRpb25zLnBhcmVudCxcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgcmVwb3NpdG9yeTogb3B0aW9ucy5yZXBvc2l0b3J5ID8/IG9wdGlvbnMucGFyZW50LnJlcG9zaXRvcnlVcmwsXG4gICAgICByZXBvc2l0b3J5RGlyZWN0b3J5OiB3b3Jrc3BhY2VEaXJlY3RvcnksXG4gICAgICBvdXRkaXI6IHdvcmtzcGFjZURpcmVjdG9yeSxcbiAgICAgIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiAnUkVRVUlSRUQtQlVULVNIT1VMRC1OT1QtQkUnLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IG9wdGlvbnMucGFyZW50LnBhY2thZ2UucGFja2FnZU1hbmFnZXIsXG4gICAgICByZWxlYXNlOiBmYWxzZSxcbiAgICAgIHBhY2thZ2U6ICFvcHRpb25zLnByaXZhdGUsXG4gICAgICBlc2xpbnQ6IHVzZUVzbGludCxcbiAgICAgIHByZXR0aWVyOiB1c2VQcmV0dGllcixcbiAgICAgIHByZXR0aWVyT3B0aW9uczogdXNlUHJldHRpZXJcbiAgICAgICAgPyB7XG4gICAgICAgICAgb3ZlcnJpZGVzOiBvcHRpb25zLnBhcmVudC5wcmV0dGllcj8ub3ZlcnJpZGVzLFxuICAgICAgICAgIHNldHRpbmdzOiBvcHRpb25zLnBhcmVudC5wcmV0dGllcj8uc2V0dGluZ3MsXG4gICAgICAgICAgLi4ucmVtYWluZGVyLnByZXR0aWVyT3B0aW9ucyxcbiAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGVzbGludE9wdGlvbnM6IHVzZUVzbGludFxuICAgICAgICA/IHtcbiAgICAgICAgICBkaXJzOiBbcmVtYWluZGVyLnNyY2RpciA/PyAnc3JjJ10sXG4gICAgICAgICAgZGV2ZGlyczogW3JlbWFpbmRlci50ZXN0ZGlyID8/ICd0ZXN0JywgJ2J1aWxkLXRvb2xzJ10sXG4gICAgICAgICAgLi4ucmVtYWluZGVyLmVzbGludE9wdGlvbnMsXG4gICAgICAgICAgcHJldHRpZXI6IHVzZVByZXR0aWVyLFxuICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc2FtcGxlQ29kZTogZmFsc2UsXG5cbiAgICAgIC8vIGFkZCBub24gd29ya3NwYWNlIGRlcGVuZGVuY2llcyBoZXJlXG4gICAgICAvLyB3b3Jrc3BhY2UgcmVmcyBhcmUgYWRkZWQgbGF0ZXJcbiAgICAgIGRlcHM6IG9wdGlvbnMuZGVwcz8uZmlsdGVyKGlzTm90V29ya3NwYWNlUmVmZXJlbmNlKSxcbiAgICAgIHBlZXJEZXBzOiBvcHRpb25zLnBlZXJEZXBzPy5maWx0ZXIoaXNOb3RXb3Jrc3BhY2VSZWZlcmVuY2UpLFxuICAgICAgZGV2RGVwczogb3B0aW9ucy5kZXZEZXBzPy5maWx0ZXIoaXNOb3RXb3Jrc3BhY2VSZWZlcmVuY2UpLFxuXG4gICAgICBwcm9qZW5EZXZEZXBlbmRlbmN5OiB0cnVlLFxuICAgICAgcmVsZWFzZUVudmlyb25tZW50LFxuXG4gICAgICBkZXBzVXBncmFkZTogb3B0aW9ucy5kZXBzVXBncmFkZSA/PyB0cnVlLFxuICAgICAgZGVwc1VwZ3JhZGVPcHRpb25zOiB7XG4gICAgICAgIHdvcmtmbG93OiBmYWxzZSxcbiAgICAgICAgY29vbGRvd246IG9wdGlvbnMucGFyZW50LnNldHRpbmdzLmRlcHNVcGdyYWRlT3B0aW9ucz8uY29vbGRvd24gPz8gKG9wdGlvbnMucGFyZW50LnNldHRpbmdzLnlhcm5CZXJyeSA/IDMgOiB1bmRlZmluZWQpLFxuICAgICAgICBleGNsdWRlOiBleGNsdWRlRnJvbVVwZ3JhZGUsXG4gICAgICB9LFxuXG4gICAgICBucG1BY2Nlc3MsXG5cbiAgICAgIC8vIERldmlhdGlvbiBmcm9tIHVwc3RyZWFtIHByb2plbjogdXBzdHJlYW0gcHJvamVuIGRlZmF1bHRzIHRvIG1pbk5vZGVWZXJzaW9uLCBidXQgd2UgaGF2ZSB0b28gbWFueSB3b3JrZmxvd3NcbiAgICAgIC8vIHRoYXQgdXNlIHRvb2xzIHRoYXQgd2FudCBhIHJlY2VudCBOb2RlIHZlcnNpb24sIHNvIGRlZmF1bHQgdG8gYSByZWFzb25hYmxlIGZsb2F0aW5nIHZlcnNpb24uXG4gICAgICB3b3JrZmxvd05vZGVWZXJzaW9uOiBvcHRpb25zLndvcmtmbG93Tm9kZVZlcnNpb24gPz8gJ2x0cy8qJyxcblxuICAgICAgLi4ucmVtYWluZGVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy5tb25vcmVwbyA9IG9wdGlvbnMucGFyZW50O1xuICAgIHRoaXMuaXNQcml2YXRlUGFja2FnZSA9IG9wdGlvbnMucHJpdmF0ZSA/PyBmYWxzZTtcbiAgICB0aGlzLmFsbG93UHJpdmF0ZURlcHMgPSBvcHRpb25zLmFsbG93UHJpdmF0ZURlcHMgPz8gZmFsc2U7XG4gICAgdGhpcy5leGNsdWRlRnJvbVVwZ3JhZGUgPSBleGNsdWRlRnJvbVVwZ3JhZGU7XG4gICAgdGhpcy53b3Jrc3BhY2VEaXJlY3RvcnkgPSB3b3Jrc3BhY2VEaXJlY3Rvcnk7XG5cbiAgICAvLyBSZWdpc3RlciB3aXRoIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICB0aGlzLm1vbm9yZXBvLm1vbm9yZXBvUmVsZWFzZT8uYWRkV29ya3NwYWNlKHRoaXMsIHtcbiAgICAgIHByaXZhdGU6IHRoaXMuaXNQcml2YXRlUGFja2FnZSxcbiAgICAgIHdvcmtmbG93Tm9kZVZlcnNpb246IHRoaXMubm9kZVZlcnNpb24sXG4gICAgICBucG1EaXN0VGFnOiBvcHRpb25zLm5wbURpc3RUYWcsXG4gICAgICAvLyBJbmhlcml0IHNldHRpbmcgZnJvbSBNb25vcmVwbyBpZiBjb25maWd1cmVkXG4gICAgICBucG1UcnVzdGVkUHVibGlzaGluZzogb3B0aW9ucy5ucG1UcnVzdGVkUHVibGlzaGluZyA/PyB0aGlzLm1vbm9yZXBvLnNldHRpbmdzLm5wbVRydXN0ZWRQdWJsaXNoaW5nLFxuICAgICAgZW52aXJvbm1lbnQ6IHJlbGVhc2VFbnZpcm9ubWVudCxcbiAgICAgIHJlbGVhc2FibGVDb21taXRzOiBvcHRpb25zLnJlbGVhc2FibGVDb21taXRzLFxuICAgICAgbmV4dFZlcnNpb25Db21tYW5kOiBvcHRpb25zLm5leHRWZXJzaW9uQ29tbWFuZCxcbiAgICAgIHZlcnNpb25CcmFuY2hPcHRpb25zOiB7XG4gICAgICAgIG1ham9yVmVyc2lvbjogb3B0aW9ucy5tYWpvclZlcnNpb24sXG4gICAgICAgIG1pbk1ham9yVmVyc2lvbjogb3B0aW9ucy5taW5NYWpvclZlcnNpb24sXG4gICAgICAgIHByZXJlbGVhc2U6IG9wdGlvbnMucHJlcmVsZWFzZSxcbiAgICAgIH0sXG4gICAgICByZXBvUnVudGltZURlcGVuZGVuY2llczogdGhpcy5yZXBvUnVudGltZURlcHMsXG4gICAgfSk7XG5cbiAgICAvLyBFeHBvc2UgdGhlIG1vbm9yZXBvIHB1Ymxpc2hlciBhcyBwcm9qZWN0LnJlbGVhc2Ugc28gdGhhdCBvdGhlciBjb2RlIGNhbiBmaW5kIGl0IHZpYSBwcm9qZWN0LnJlbGVhc2U/LnB1Ymxpc2hlclxuICAgIC8vIE1VU1QgYmUgY2FsbGVkIGFmdGVyIGB0aGlzLm1vbm9yZXBvLm1vbm9yZXBvUmVsZWFzZT8uYWRkV29ya3NwYWNlKC4uLilgXG4gICAgLy8gQHRzLWlnbm9yZSAtIHJlYWRvbmx5IHByb3BlcnR5LCBidXQgd2UgbmVlZCB0byBzZXQgaXQgZm9yIHVwc3RyZWFtIG1peGluIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLnJlbGVhc2UgPSB0aGlzLm1vbm9yZXBvLm1vbm9yZXBvUmVsZWFzZT8ud29ya3NwYWNlUmVsZWFzZSh0aGlzKTtcblxuICAgIC8vIGplc3QgY29uZmlnXG4gICAgaWYgKHRoaXMuamVzdD8uY29uZmlnICYmIHRoaXMuamVzdC5jb25maWcucHJlc2V0ID09PSAndHMtamVzdCcpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmplc3QuY29uZmlnLmdsb2JhbHM/LlsndHMtamVzdCddO1xuICAgICAgdGhpcy5qZXN0LmNvbmZpZy50cmFuc2Zvcm0gPSB7XG4gICAgICAgICdeLitcXFxcLnRzeD8kJzogW1xuICAgICAgICAgICd0cy1qZXN0JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0c2NvbmZpZzogdGhpcy50c2NvbmZpZ0Rldi5maWxlTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUYXNrc1xuICAgIHRoaXMudGFza3MudHJ5RmluZCgnZGVmYXVsdCcpPy5yZXNldCgncHJvamVuIGRlZmF1bHQnLCB7IGN3ZDogcmVsYXRpdmUodGhpcy5vdXRkaXIsIG9wdGlvbnMucGFyZW50Lm91dGRpcikgfSk7XG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdjbG9iYmVyJyk7XG4gICAgdGhpcy50YXNrcy5yZW1vdmVUYXNrKCdlamVjdCcpO1xuXG4gICAgY29uc3QgdXBncmFkZVRhc2tOYW1lID0gJ3VwZ3JhZGUnO1xuICAgIGNvbnN0IHVwZ3JhZGVzID0gdGhpcy5jb21wb25lbnRzLmZpbmQoXG4gICAgICAoYzogQ29tcG9uZW50KTogYyBpcyBqYXZhc2NyaXB0LlVwZ3JhZGVEZXBlbmRlbmNpZXMgPT4gKFxuICAgICAgICBjIGluc3RhbmNlb2YgamF2YXNjcmlwdC5VcGdyYWRlRGVwZW5kZW5jaWVzICYmIGMudXBncmFkZVRhc2submFtZSA9PT0gdXBncmFkZVRhc2tOYW1lXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAodXBncmFkZXMpIHtcbiAgICAgIHRoaXMudGFza3MucmVtb3ZlVGFzayh1cGdyYWRlcy51cGdyYWRlVGFzay5uYW1lKTtcbiAgICAgIHRoaXMudGFza3MucmVtb3ZlVGFzayh1cGdyYWRlcy5wb3N0VXBncmFkZVRhc2submFtZSk7XG4gICAgICB0aGlzLnRhc2tzLmFkZFRhc2soJ2NoZWNrLWZvci11cGRhdGVzJywge1xuICAgICAgICBlbnY6IHsgLi4udXBncmFkZXMudXBncmFkZVRhc2suZW52VmFycyB9LFxuICAgICAgICBzdGVwczoge1xuICAgICAgICAgIHRvSlNPTjogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSAodXBncmFkZXMgYXMgYW55KS5yZW5kZXJUYXNrU3RlcHMoKSBhcyBUYXNrU3RlcFtdO1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHN0ZXApID0+IHN0ZXAuZXhlYyAmJiB0eXBlb2Ygc3RlcC5leGVjID09PSAnc3RyaW5nJyAmJiBzdGVwLmV4ZWM/LmluY2x1ZGVzKCducG0tY2hlY2stdXBkYXRlcycpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXBvc2l0ZSBwcm9qZWN0IGFuZCByZWZlcmVuY2VzXG4gICAgZm9yIChjb25zdCB0c2NvbmZpZyBvZiBbdGhpcy50c2NvbmZpZywgdGhpcy50c2NvbmZpZ0Rldl0pIHtcbiAgICAgIHRzY29uZmlnPy5maWxlLmFkZE92ZXJyaWRlKCdjb21waWxlck9wdGlvbnMuY29tcG9zaXRlJywgdHJ1ZSk7XG4gICAgICB0c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZSgncmVmZXJlbmNlcycsIFtdKTtcbiAgICB9XG5cblxuICAgIC8vIEFkZCB3b3Jrc3BhY2UgcmVmZXJlbmNlc1xuICAgIGZvciAoY29uc3QgZGVwIG9mIG9wdGlvbnMuZGVwcz8uZmlsdGVyKGlzV29ya3NwYWNlUmVmZXJlbmNlKSA/PyBbXSkge1xuICAgICAgdGhpcy5hZGRXb3Jrc3BhY2VEZXAoZGVwLCBEZXBlbmRlbmN5VHlwZS5SVU5USU1FKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkZXAgb2Ygb3B0aW9ucy5wZWVyRGVwcz8uZmlsdGVyKGlzV29ya3NwYWNlUmVmZXJlbmNlKSA/PyBbXSkge1xuICAgICAgdGhpcy5hZGRXb3Jrc3BhY2VEZXAoZGVwLCBEZXBlbmRlbmN5VHlwZS5QRUVSKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkZXAgb2Ygb3B0aW9ucy5kZXZEZXBzPy5maWx0ZXIoaXNXb3Jrc3BhY2VSZWZlcmVuY2UpID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZFdvcmtzcGFjZURlcChkZXAsIERlcGVuZGVuY3lUeXBlLkJVSUxEKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBwYXNzaW5nIGFkZGl0aW9uYWwgYXJncyBsaWtlIGAtLWZvcmNlYCB0byB0aGUgY29tcGlsZSB0YXNrXG4gICAgLy8gTmVlZGVkIGJlY2F1c2Ugd2UgdXNlIGNvbXBvc2l0ZSBwcm9qZWN0cyB0aGF0IG9mdGVuIG5lZWQgYSB0c2MgLS1idWlsZCAtLWZvcmNlXG4gICAgdGhpcy50YXNrcy50cnlGaW5kKCdjb21waWxlJyk/LnJlc2V0KCd0c2MgLS1idWlsZCcsIHtcbiAgICAgIHJlY2VpdmVBcmdzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgaGFuZGxlIGRlcGVuZGVuY2llcyB2aWEgdGhlIHBhcmVudCBwcm9qZWN0XG5cbiAgICAvLyBEaXNhYmxlIHdvcmtzcGFjZSByZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb25cbiAgICAvKiBAdHMtaWdub3JlIGFjY2VzcyBwcml2YXRlIG1ldGhvZCAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUmVzb2x2ZSA9IHRoaXMucGFja2FnZS5yZXNvbHZlRGVwc0FuZFdyaXRlUGFja2FnZUpzb247XG4gICAgLyogQHRzLWlnbm9yZSBhY2Nlc3MgcHJpdmF0ZSBtZXRob2QgKi9cbiAgICB0aGlzLnBhY2thZ2UucmVzb2x2ZURlcHNBbmRXcml0ZVBhY2thZ2VKc29uID0gKCkgPT4gW107XG5cbiAgICAvLyBJbnN0ZWFkIG9mIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLCByZXF1ZXN0IGZyb20gdGhlIHBhcmVudFxuICAgIC8qIEB0cy1pZ25vcmUgYWNjZXNzIHByaXZhdGUgbWV0aG9kICovXG4gICAgdGhpcy5wYWNrYWdlLmluc3RhbGxEZXBlbmRlbmNpZXMgPSAodHJpZ2dlcjogamF2YXNjcmlwdC5JbnN0YWxsVHJpZ2dlcikgPT4ge1xuICAgICAgaWYgKHRyaWdnZXIucmVhc29uID09PSBqYXZhc2NyaXB0Lkluc3RhbGxSZWFzb24uTk9fTk9ERV9NT0RVTEVTKSB7XG4gICAgICAgIC8vIEluIGEgbW9ub3JlcG8sIGEgd29ya3NwYWNlIG5vZGVfbW9kdWxlcyBtYXkgbGVnaXRpbWF0ZWx5IG5vdCBleGlzdCBkdWUgdG8gaG9pc3RpbmcuIFdlIGp1c3Qgc2tpcCB0aGlzIGNhc2UuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMucGFyZW50LnJlcXVlc3RJbnN0YWxsRGVwZW5kZW5jaWVzKHsgcmVzb2x2ZURlcHNBbmRXcml0ZVBhY2thZ2VKc29uOiAoKSA9PiBvcmlnaW5hbFJlc29sdmUuYXBwbHkodGhpcy5wYWNrYWdlKSB9KTtcbiAgICB9O1xuXG4gICAgLy8gRml4IHRoZSBpbnN0YWxsIHRyaWdnZXIgbG9nZ2luZyB0byBtYXRjaCBhY3R1YWwgcmVxdWVzdHNcbiAgICAvKiBAdHMtaWdub3JlIGFjY2VzcyBwcml2YXRlIG1ldGhvZCAqL1xuICAgIGNvbnN0IG9yaWdpbmFsTG9nVHJpZ2dlciA9IHRoaXMucGFja2FnZS5sb2dJbnN0YWxsVHJpZ2dlcjtcbiAgICAvKiBAdHMtaWdub3JlIGFjY2VzcyBwcml2YXRlIG1ldGhvZCAqL1xuICAgIHRoaXMucGFja2FnZS5sb2dJbnN0YWxsVHJpZ2dlciA9ICh0cmlnZ2VyOiBJbnN0YWxsVHJpZ2dlcikgPT4ge1xuICAgICAgaWYgKHRyaWdnZXIucmVhc29uID09PSBqYXZhc2NyaXB0Lkluc3RhbGxSZWFzb24uTk9fTk9ERV9NT0RVTEVTKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qIEB0cy1pZ25vcmUgYWNjZXNzIHByaXZhdGUgbWV0aG9kICovXG4gICAgICByZXR1cm4gb3JpZ2luYWxMb2dUcmlnZ2VyLmFwcGx5KHRoaXMucGFja2FnZSwgW3RyaWdnZXJdKTtcbiAgICB9O1xuXG4gICAgLy8gUHJpdmF0ZSBwYWNrYWdlXG4gICAgaWYgKG9wdGlvbnMucHJpdmF0ZSkge1xuICAgICAgdGhpcy5wYWNrYWdlLmFkZEZpZWxkKCdwcml2YXRlJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gWWFybiBCZXJyeSBpbnN0YWxsQ29uZmlnXG4gICAgaWYgKG9wdGlvbnMuaG9pc3RpbmdMaW1pdHMpIHtcbiAgICAgIHRoaXMucGFja2FnZS5hZGRGaWVsZCgnaW5zdGFsbENvbmZpZycsIHsgaG9pc3RpbmdMaW1pdHM6IG9wdGlvbnMuaG9pc3RpbmdMaW1pdHMgfSk7XG4gICAgfVxuXG4gICAgLy8gRml4ZXNcbiAgICB0aGlzLmFkZFRzY29uZmlnRGV2Rml4KCk7XG4gICAgdGhpcy5hZGRFc2xpbnRSY0ZpeCgpO1xuXG4gICAgdGhpcy5idW5kbGVkRGVwcy5wdXNoKC4uLm9wdGlvbnMuYnVuZGxlZERlcHMgPz8gW10pO1xuXG4gICAgLy8gSW5kaXZpZHVhbCB3b3Jrc3BhY2UgcGFja2FnZXMgc2hvdWxkbid0IGRlcGVuZCBvbiBcInByb2plblwiLCBpdCBnZXRzIGJyb3VnaHQgaW4gYXQgdGhlIG1vbm9yZXBvIHJvb3RcbiAgICB0aGlzLmRlcHMucmVtb3ZlRGVwZW5kZW5jeSgncHJvamVuJyk7XG4gIH1cblxuICAvKipcbiAgICogSSBkb24ndCBrbm93IHdoeSBgdHNjb25maWcuZGV2Lmpzb25gIGRvZXNuJ3QgaGF2ZSBhbiBvdXRkaXIsIG9yIHdoZXJlIGl0J3MgdXNlZCxcbiAgICogYnV0IGl0J3MgY2F1c2luZyBpbi1wbGFjZSBgLmpzYCBmaWxlcyB0byBhcHBlYXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWRkVHNjb25maWdEZXZGaXgoKSB7XG4gICAgdGhpcy50c2NvbmZpZ0Rldi5maWxlLmFkZE92ZXJyaWRlKCdjb21waWxlck9wdGlvbnMub3V0RGlyJywgJ2xpYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5lZWQgdG8gaGFjayBFU0xpbnQgY29uZmlnXG4gICAqXG4gICAqIC5lc2xpbnRyYy5qcyB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBKU09OIGZpbGUsIGl0IHdpbGwgbG9hZCB0aGVcbiAgICogSlNPTiBmaWxlIGFuZCBwYXRjaCBpdCB3aXRoIGEgZHluYW1pYyBkaXJlY3RvcnkgbmFtZSB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpblxuICAgKiBwbGFpbiBKU09OIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2plbi9wcm9qZW4vaXNzdWVzLzI0MDUpLlxuICAgKlxuICAgKiBTaW5jZSBlc2xpbnQgY29uZmlnIGlzIGxvYWRlZCB3aXRoIGRpZmZlcmVudCBjd2QncyBkZXBlbmRpbmcgb24gd2hldGhlciBpdCdzXG4gICAqIGZyb20gdGhlIFZTQ29kZSBwbHVnaW4gb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB1c2UgYWJzb2x1dGUgcGF0aHMgZXZlcnl3aGVyZS5cbiAgICovXG4gIHByb3RlY3RlZCBhZGRFc2xpbnRSY0ZpeCgpIHtcbiAgICBjb25zdCBlc2xpbnRSYyA9IG5ldyBTb3VyY2VDb2RlKHRoaXMsICcuZXNsaW50cmMuanMnKTtcbiAgICBlc2xpbnRSYy5saW5lKCd2YXIgcGF0aCA9IHJlcXVpcmUoXFwncGF0aFxcJyk7Jyk7XG4gICAgZXNsaW50UmMubGluZSgndmFyIGZzID0gcmVxdWlyZShcXCdmc1xcJyk7Jyk7XG4gICAgZXNsaW50UmMubGluZSgndmFyIGNvbnRlbnRzID0gZnMucmVhZEZpbGVTeW5jKGAke19fZGlybmFtZX0vLmVzbGludHJjLmpzb25gLCB7IGVuY29kaW5nOiBcXCd1dGYtOFxcJyB9KTsnKTtcbiAgICBlc2xpbnRSYy5saW5lKCcvLyBTdHJpcCBjb21tZW50cywgSlNPTi5wYXJzZSgpIGRvZXNuXFwndCBsaWtlIHRob3NlJyk7XG4gICAgZXNsaW50UmMubGluZSgnY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlKC9eXFxcXC9cXFxcLy4qJC9tLCBcXCdcXCcpOycpO1xuICAgIGVzbGludFJjLmxpbmUoJ3ZhciBqc29uID0gSlNPTi5wYXJzZShjb250ZW50cyk7Jyk7XG4gICAgZXNsaW50UmMubGluZSgnLy8gUGF0Y2ggdGhlIC5qc29uIGNvbmZpZyB3aXRoIHNvbWV0aGluZyB0aGF0IGNhbiBvbmx5IGJlIHJlcHJlc2VudGVkIGluIEpTJyk7XG4gICAgZXNsaW50UmMubGluZSgnanNvbi5wYXJzZXJPcHRpb25zLnRzY29uZmlnUm9vdERpciA9IF9fZGlybmFtZTsnKTtcbiAgICBlc2xpbnRSYy5saW5lKCdtb2R1bGUuZXhwb3J0cyA9IGpzb247Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgd29ya3NwYWNlIHBhY2thZ2UgYXMgYSBkZXBlbmRlbmN5LCBpbmNsdWRpbmcgdHNjb25maWcgcHJvamVjdCByZWZlcmVuY2VzLlxuICAgKlxuICAgKiBVc2UgdGhpcyB0byBhZGQgd29ya3NwYWNlIGRlcGVuZGVuY2llcyBhZnRlciBjb25zdHJ1Y3Rpb24gKGUuZy4gZnJvbSBhIG1peGluKS5cbiAgICogSXQgZG9lcyB0aGUgc2FtZSBhcyBwYXNzaW5nIHRoZSB3b3Jrc3BhY2UgaW4gdGhlIGBkZXBzYC9gZGV2RGVwc2AvYHBlZXJEZXBzYCBjb25zdHJ1Y3RvciBvcHRpb24uXG4gICAqL1xuICBwdWJsaWMgYWRkV29ya3NwYWNlRGVwKHJlZjogSVdvcmtzcGFjZVJlZmVyZW5jZSwgdHlwZTogRGVwZW5kZW5jeVR5cGUgPSBEZXBlbmRlbmN5VHlwZS5SVU5USU1FKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVwcy50cnlHZXREZXBlbmRlbmN5KHJlZi5uYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuUlVOVElNRTpcbiAgICAgICAgdGhpcy5hZGREZXBzKHJlZi5uYW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlBFRVI6XG4gICAgICAgIHRoaXMuYWRkUGVlckRlcHMocmVmLm5hbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuREVWRU5WOlxuICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5CVUlMRDpcbiAgICAgIGNhc2UgRGVwZW5kZW5jeVR5cGUuVEVTVDpcbiAgICAgICAgdGhpcy5hZGREZXZEZXBzKHJlZi5uYW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmFkZERlcHMocmVmLm5hbWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzY29uZmlnIG9mIFt0aGlzLnRzY29uZmlnLCB0aGlzLnRzY29uZmlnRGV2XSkge1xuICAgICAgaWYgKHRzY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKGRpcm5hbWUodHNjb25maWcuZmlsZS5hYnNvbHV0ZVBhdGgpLCByZWYub3V0ZGlyKTtcbiAgICAgICAgdHNjb25maWc/LmZpbGUuYWRkVG9BcnJheSgncmVmZXJlbmNlcycsIHsgcGF0aDogcmVsYXRpdmVQYXRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmV4Y2x1ZGVGcm9tVXBncmFkZS5wdXNoKHJlZi5uYW1lKTtcbiAgICBpZiAodHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuUlVOVElNRSB8fCB0eXBlID09PSBEZXBlbmRlbmN5VHlwZS5QRUVSKSB7XG4gICAgICB0aGlzLnJlcG9SdW50aW1lRGVwc1tyZWYubmFtZV0gPSByZWYudmVyc2lvblR5cGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuICAgIHRoaXMudHlwZWNoZWNrVGVzdHNBZ2FpbnN0TGlicmFyeVNvdXJjZSgpO1xuICAgIHRoaXMudmFsaWRhdGVOb1ByaXZhdGVXb3Jrc3BhY2VEZXBzKCk7XG4gIH1cblxuICAvKipcbiAgICogVHlwZS1jaGVjayB0ZXN0cyBhZ2FpbnN0IHRoZSBsaWJyYXJ5ICpzb3VyY2UqIHJhdGhlciB0aGFuIGl0cyBlbWl0dGVkIGRlY2xhcmF0aW9ucy5cbiAgICpcbiAgICogVGhlIGRldi90ZXN0IHRzY29uZmlnIGlzIGEgc2VwYXJhdGUgYGNvbXBvc2l0ZWAgcHJvamVjdCwgc28gaXQgZG9lc24ndCBzZWUgdGhlIGxpYnJhcnlcbiAgICogc291cmNlIGJ5IGRlZmF1bHQuIFJhdGhlciB0aGFuIHJlZmVyZW5jaW5nIHRoZSBtYWluIHByb2plY3QgKHdoaWNoIHdvdWxkIGNvbnN1bWUgaXRzXG4gICAqIGBzdHJpcEludGVybmFsYCdkIGRlY2xhcmF0aW9ucyBhbmQgaGlkZSBgQGludGVybmFsYCBtZW1iZXJzIGZyb20gdGVzdHMgdW5kZXIgYHRzYyAtLWJ1aWxkYCksXG4gICAqIHdlIG1pcnJvciB0aGUgbWFpbiBwcm9qZWN0J3MgYGluY2x1ZGVgIGludG8gdGhlIHRlc3QgcHJvZ3JhbSwgcGF0aC1hZGp1c3RlZCB0byB0aGUgdGVzdCBkaXIuXG4gICAqXG4gICAqIEV4Y2x1ZGVzIGFyZSBvbmx5IG1pcnJvcmVkIHdoZW4gdGhleSB0YXJnZXQgdGhlIHNvdXJjZSBkaXIgKGBzcmMvLi4uYCk6IGEgYHNyYy9gLXByZWZpeGVkXG4gICAqIHBhdHRlcm4gY2FuIG9ubHkgbWF0Y2ggc291cmNlIGZpbGVzLCBzbyBpdCBjYW4gbmV2ZXIgZHJvcCBhIHRlc3QgZmlsZSB0aGUgdGVzdCBidWlsZCBvd25zXG4gICAqIChlLmcuIGB0ZXN0Ly4uLi9pbnRlZy4qLnRzYCwgd2hpY2ggdGhlIGxpYnJhcnkgYnVpbGQgZXhjbHVkZXMgYnV0IHRoZSB0ZXN0IGJ1aWxkIG11c3Qga2VlcCkuXG4gICAqXG4gICAqIFJ1bnMgYXQgYHByZVN5bnRoZXNpemVgIHNpbmNlIHRoZSBtYWluIHRzY29uZmlnJ3MgcGF0dGVybnMgbWF5IGJlIG1vZGlmaWVkIGFmdGVyIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgdHlwZWNoZWNrVGVzdHNBZ2FpbnN0TGlicmFyeVNvdXJjZSgpOiB2b2lkIHtcbiAgICBjb25zdCBtYWluVHNjb25maWcgPSB0aGlzLnRzY29uZmlnO1xuICAgIGNvbnN0IHRlc3RUc2NvbmZpZyA9IHRoaXMudHNjb25maWdEZXY7XG5cbiAgICAvLyBXaGVuIHRoZSBkZXYgdHNjb25maWcgaXMgZGlzYWJsZWQgaXQgYWxpYXNlcyB0aGUgbWFpbiBvbmUgKGB0c2NvbmZpZyA9PT0gdHNjb25maWdEZXZgKSxcbiAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHdpcmUgdXAuXG4gICAgaWYgKCFtYWluVHNjb25maWcgfHwgIXRlc3RUc2NvbmZpZyB8fCBtYWluVHNjb25maWcgPT09IHRlc3RUc2NvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIHRlc3QgdHNjb25maWcgZGlyZWN0b3J5IHRvIHRoZSBtYWluIHRzY29uZmlnIGRpcmVjdG9yeVxuICAgIC8vIChlLmcuIGAuLmApLiBXaGVuIHRoZSB0d28gYXJlIGNvLWxvY2F0ZWQgdGhlcmUgaXMgbm8gcHJvamVjdCBib3VuZGFyeSB0byBjcm9zcyBhbmQgdGhlXG4gICAgLy8gbGlicmFyeSBzb3VyY2UgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoZSB0ZXN0IHByb2dyYW0ncyBmaWxlIHNldCwgc28gdGhlcmUgaXMgbm90aGluZyB0byBkby5cbiAgICBjb25zdCB0b01haW4gPSByZWxhdGl2ZShkaXJuYW1lKHRlc3RUc2NvbmZpZy5maWxlLmFic29sdXRlUGF0aCksIGRpcm5hbWUobWFpblRzY29uZmlnLmZpbGUuYWJzb2x1dGVQYXRoKSk7XG4gICAgaWYgKHRvTWFpbiA9PT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb21waWxlIHRoZSBzYW1lIHNldCBvZiBsaWJyYXJ5IHNvdXJjZSBmaWxlcyBhcyB0aGUgbWFpbiBidWlsZCwgc28gYEBpbnRlcm5hbGAgbWVtYmVyc1xuICAgIC8vIHJlbWFpbiB2aXNpYmxlLiBUaGUgbWFpbiB0c2NvbmZpZydzIHBhdHRlcm5zIGFyZSByZWxhdGl2ZSB0byB0aGUgcGFja2FnZSByb290OyB0aGUgdGVzdFxuICAgIC8vIHRzY29uZmlnIGxpdmVzIG9uZSBkaXJlY3RvcnkgZGVlcGVyLCBzbyBwcmVmaXggdGhlbSB3aXRoIHRoZSBwYXRoIGJhY2sgdG8gdGhlIG1haW4gZGlyLlxuICAgIGNvbnN0IHNyY1ByZWZpeCA9IGAke3RoaXMuc3JjZGlyfS9gO1xuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBtYWluVHNjb25maWcuaW5jbHVkZSkge1xuICAgICAgdGVzdFRzY29uZmlnLmFkZEluY2x1ZGUoYCR7dG9NYWlufS8ke3BhdHRlcm59YCk7XG4gICAgfVxuICAgIC8vIE9ubHkgbWlycm9yIGV4Y2x1ZGVzIHRoYXQgdGFyZ2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5OyB0ZXN0LWRpcmVjdG9yeSBleGNsdWRlcyBiZWxvbmcgdG9cbiAgICAvLyB0aGUgbGlicmFyeSBidWlsZCBhbG9uZSAoc2VlIGFib3ZlKS5cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgbWFpblRzY29uZmlnLmV4Y2x1ZGUpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoc3JjUHJlZml4KSkge1xuICAgICAgICB0ZXN0VHNjb25maWcuYWRkRXhjbHVkZShgJHt0b01haW59LyR7cGF0dGVybn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlTm9Qcml2YXRlV29ya3NwYWNlRGVwcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1ByaXZhdGVQYWNrYWdlKSByZXR1cm47XG5cbiAgICBjb25zdCBzaWJsaW5ncyA9IG5ldyBNYXAoXG4gICAgICB0aGlzLm1vbm9yZXBvLnN1YnByb2plY3RzXG4gICAgICAgIC5maWx0ZXIoKHApOiBwIGlzIFR5cGVTY3JpcHRXb3Jrc3BhY2UgPT4gcCBpbnN0YW5jZW9mIFR5cGVTY3JpcHRXb3Jrc3BhY2UpXG4gICAgICAgIC5tYXAoKHApID0+IFtwLm5hbWUsIHBdKSxcbiAgICApO1xuXG4gICAgY29uc3QgaWxsZWdhbERlcHMgPSB0aGlzLmRlcHMuYWxsXG4gICAgICAuZmlsdGVyKChkKSA9PiBkLnR5cGUgPT09IERlcGVuZGVuY3lUeXBlLlJVTlRJTUUgfHwgZC50eXBlID09PSBEZXBlbmRlbmN5VHlwZS5QRUVSKVxuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICBjb25zdCB3cyA9IHNpYmxpbmdzLmdldChkLm5hbWUpO1xuICAgICAgICBpZiAoIXdzPy5pc1ByaXZhdGVQYWNrYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLnR5cGUgPT09IERlcGVuZGVuY3lUeXBlLlJVTlRJTUUgJiYgdGhpcy5hbGxvd1ByaXZhdGVEZXBzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGQpID0+IGQubmFtZSk7XG5cbiAgICBpZiAoaWxsZWdhbERlcHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuICAgICAgICBgJHt0aGlzLm5hbWV9IGlzIHB1YmxpYyBhbmQgY2Fubm90IGRlcGVuZCBvbiBwcml2YXRlIHdvcmtzcGFjZSBwYWNrYWdlcy5gLFxuICAgICAgICBgSWxsZWdhbCBkZXBlbmRlbmNpZXM6XFxuICAgIC0gJHtpbGxlZ2FsRGVwcy5qb2luKCdcXG4gICAgLSAnKX1gLFxuICAgICAgXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgUHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGFyZSBhbHNvIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogT3B0aW9uYWxseSBmaWx0ZXIgYnkgZGVwZW5kZW5jeSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHdvcmtzcGFjZURlcGVuZGVuY2llcyh0eXBlcz86IERlcGVuZGVuY3lUeXBlW10pOiBQcm9qZWN0W10ge1xuICAgIHJldHVybiB0aGlzLm1vbm9yZXBvLnN1YnByb2plY3RzLmZpbHRlcigoc2libGluZykgPT5cbiAgICAgIHRoaXMuZGVwcy5hbGwuc29tZSgoZCkgPT4gZC5uYW1lID09PSBzaWJsaW5nLm5hbWUgJiYgKCF0eXBlcyB8fCB0eXBlcy5pbmNsdWRlcyhkLnR5cGUpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBzcGVjaWFsaXplZCByZWZlcmVuY2UgdG8gdGhpcyB3b3Jrc3BhY2VcbiAgICovXG4gIHB1YmxpYyBjdXN0b21pemVSZWZlcmVuY2UocmVmT3B0cz86IFJlZmVyZW5jZU9wdGlvbnMpOiBJV29ya3NwYWNlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgb3V0ZGlyOiB0aGlzLm91dGRpcixcbiAgICAgIGlzUHJpdmF0ZVBhY2thZ2U6IHRoaXMuaXNQcml2YXRlUGFja2FnZSxcbiAgICAgIHZlcnNpb25UeXBlOiByZWZPcHRzPy52ZXJzaW9uVHlwZSA/PyB0aGlzLnZlcnNpb25UeXBlLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgYHdvcmtzcGFjZS5jdXN0b21pemVSZWZlcmVuY2UoKWAgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVmZXJlbmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGF0IHR5cGUgb2YgZGVwZW5kZW5jeSB0byB0YWtlIG9uIHRoaXMgcGFja2FnZVxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBkZXBlbmRlbmNpZXMgd2lsbCBiZSByZWZlcmVuY2VkIHdpdGggYSBgXmAsIHdoaWNoIG1lYW5zIHRoYXRcbiAgICogY29tZSBpbnN0YWxsIHRpbWUgYSBuZXdlciB2ZXJzaW9uIG1heSBiZSBpbnN0YWxsZWQuXG4gICAqXG4gICAqIENob29zZSBhIGRpZmZlcmVudCByYW5nZSB0eXBlIHRvIHRha2UsIGZvciBleGFtcGxlLCBhbiBgZXhhY3RgIGRlcGVuZGVuY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdmdXR1cmUtbWlub3InXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVHlwZT86IFZlcnNpb25UeXBlO1xufVxuXG5mdW5jdGlvbiB3aXRob3V0PEEgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBBPih4OiBBLCAuLi5rczogS1tdKTogT21pdDxBLCBLPiB7XG4gIGNvbnN0IHJldCA9IHsgLi4ueCB9O1xuICBmb3IgKGNvbnN0IGsgb2Yga3MpIHtcbiAgICBkZWxldGUgcmV0W2tdO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUmVmZXJlbmNlKHg6IHVua25vd24pOiB4IGlzIElXb3Jrc3BhY2VSZWZlcmVuY2Uge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnICYmICEheCAmJiAoWydpc1ByaXZhdGVQYWNrYWdlJywgJ3ZlcnNpb25UeXBlJywgJ25hbWUnLCAnb3V0ZGlyJ10gc2F0aXNmaWVzIEFycmF5PGtleW9mIElXb3Jrc3BhY2VSZWZlcmVuY2U+KS5ldmVyeShrID0+ICh4IGFzIGFueSlba10gIT09IHVuZGVmaW5lZCk7XG59XG5cbmZ1bmN0aW9uIGlzTm90V29ya3NwYWNlUmVmZXJlbmNlKHg6IHVua25vd24pOiB4IGlzIHN0cmluZyB7XG4gIHJldHVybiAhaXNXb3Jrc3BhY2VSZWZlcmVuY2UoeCk7XG59XG4iXX0=
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "publishConfig": {
83
83
  "access": "public"
84
84
  },
85
- "version": "0.6.3",
85
+ "version": "0.6.4",
86
86
  "packageManager": "yarn@4.13.0",
87
87
  "jest": {
88
88
  "coverageProvider": "v8",