aws-cdk 2.1033.0 → 2.1034.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/THIRD_PARTY_LICENSES +515 -130
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/api/bootstrap/bootstrap-template.yaml +3 -2
  5. package/lib/cli/cdk-toolkit.d.ts +1 -1
  6. package/lib/cli/cdk-toolkit.js +4 -9
  7. package/lib/cli/cli-config.js +3 -1
  8. package/lib/cli/cli-type-registry.json +10 -0
  9. package/lib/cli/cli.js +3 -2
  10. package/lib/cli/convert-to-user-input.js +3 -1
  11. package/lib/cli/io-host/cli-io-host.d.ts +1 -1
  12. package/lib/cli/io-host/cli-io-host.js +35 -17
  13. package/lib/cli/parse-command-line-arguments.js +14 -2
  14. package/lib/cli/telemetry/collect-telemetry.js +3 -2
  15. package/lib/cli/telemetry/sink/endpoint-sink.js +8 -5
  16. package/lib/cli/user-input.d.ts +6 -0
  17. package/lib/cli/user-input.js +1 -1
  18. package/lib/commands/flags/flags.js +2 -2
  19. package/lib/commands/flags/operations.d.ts +21 -2
  20. package/lib/commands/flags/operations.js +57 -13
  21. package/lib/commands/init/init.d.ts +6 -0
  22. package/lib/commands/init/init.js +20 -11
  23. package/lib/commands/init/package-manager.d.ts +2 -0
  24. package/lib/commands/init/package-manager.js +5 -0
  25. package/lib/index.js +139816 -202487
  26. package/lib/init-templates/.init-version.json +1 -1
  27. package/lib/init-templates/.recommended-feature-flags.json +3 -1
  28. package/lib/init-templates/app/javascript/jest.config.js +2 -1
  29. package/lib/init-templates/app/typescript/jest.config.js +2 -1
  30. package/lib/init-templates/lib/typescript/jest.config.js +2 -1
  31. package/lib/init-templates/sample-app/javascript/jest.config.js +2 -1
  32. package/lib/init-templates/sample-app/typescript/jest.config.js +2 -1
  33. package/package.json +21 -21
  34. package/lib/commands/flag-operations.d.ts +0 -23
  35. package/lib/commands/flag-operations.js +0 -416
  36. /package/lib/{obsolete-flags.d.ts → commands/flags/obsolete-flags.d.ts} +0 -0
  37. /package/lib/{obsolete-flags.js → commands/flags/obsolete-flags.js} +0 -0
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FlagOperations = void 0;
4
+ exports.isEffectiveValueEqualToRecommended = isEffectiveValueEqualToRecommended;
4
5
  const os = require("os");
5
6
  const path = require("path");
6
7
  const cloudformation_diff_1 = require("@aws-cdk/cloudformation-diff");
@@ -8,8 +9,33 @@ const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
8
9
  const chalk = require("chalk");
9
10
  const fs = require("fs-extra");
10
11
  const p_queue_1 = require("p-queue");
12
+ const obsolete_flags_1 = require("./obsolete-flags");
11
13
  const api_1 = require("../../api");
12
14
  class FlagOperations {
15
+ /**
16
+ * Returns only those feature flags that need configuration
17
+ *
18
+ * That is those flags:
19
+ * - That are unconfigured
20
+ * - That are not obsolete
21
+ * - Whose default value is different from the recommended value
22
+ *
23
+ * The default value being equal to the recommended value sounds odd, but
24
+ * crops up in a number of situtations:
25
+ *
26
+ * - Security-related fixes that we want to force on people, but want to
27
+ * give them a flag to back out of the changes if they really need to.
28
+ * - Flags that changed their default value in the most recent major
29
+ * version.
30
+ * - Flags that we've introduced at some point in the past, but have gone
31
+ * back on.
32
+ */
33
+ static filterNeedsAttention(flags) {
34
+ return flags
35
+ .filter(flag => !obsolete_flags_1.OBSOLETE_FLAGS.includes(flag.name))
36
+ .filter(flag => flag.userValue === undefined)
37
+ .filter(flag => defaultValue(flag) !== flag.recommendedValue);
38
+ }
13
39
  constructor(flags, toolkit, ioHelper) {
14
40
  this.flags = flags;
15
41
  this.toolkit = toolkit;
@@ -71,7 +97,7 @@ class FlagOperations {
71
97
  }
72
98
  else if (params.all) {
73
99
  return this.flags
74
- .filter(flag => flag.userValue === undefined || !this.isUserValueEqualToRecommended(flag))
100
+ .filter(flag => flag.userValue === undefined || !isEffectiveValueEqualToRecommended(flag))
75
101
  .filter(flag => this.isBooleanFlag(flag))
76
102
  .map(flag => flag.name);
77
103
  }
@@ -269,7 +295,7 @@ class FlagOperations {
269
295
  }
270
296
  const newValue = params.recommended
271
297
  ? flag.recommendedValue
272
- : String(flag.unconfiguredBehavesLike?.v2) === 'true';
298
+ : String(defaultValue(flag)) === 'true';
273
299
  updateObj[flagName] = newValue;
274
300
  }
275
301
  }
@@ -319,7 +345,7 @@ class FlagOperations {
319
345
  const flag = this.flags.find(f => f.name === flagName);
320
346
  const newValue = params.recommended || params.safe
321
347
  ? flag.recommendedValue
322
- : String(flag.unconfiguredBehavesLike?.v2) === 'true';
348
+ : String(defaultValue(flag)) === 'true';
323
349
  cdkJson.context[flagName] = newValue;
324
350
  }
325
351
  }
@@ -332,7 +358,10 @@ class FlagOperations {
332
358
  await this.displaySpecificFlags(FLAGNAME);
333
359
  return;
334
360
  }
335
- const flagsToDisplay = all ? this.flags : this.flags.filter(flag => flag.userValue === undefined || !this.isUserValueEqualToRecommended(flag));
361
+ const [flagsToDisplay, header] = all
362
+ ? [this.flags, 'All feature flags']
363
+ : [FlagOperations.filterNeedsAttention(this.flags), 'Unconfigured feature flags'];
364
+ await this.ioHelper.defaults.info(header);
336
365
  await this.displayFlagTable(flagsToDisplay);
337
366
  // Add helpful message after empty table when not using --all
338
367
  if (!all && flagsToDisplay.length === 0) {
@@ -353,17 +382,19 @@ class FlagOperations {
353
382
  await this.ioHelper.defaults.info(`Flag name: ${flag.name}`);
354
383
  await this.ioHelper.defaults.info(`Description: ${flag.explanation}`);
355
384
  await this.ioHelper.defaults.info(`Recommended value: ${flag.recommendedValue}`);
385
+ await this.ioHelper.defaults.info(`Default value: ${defaultValue(flag)}`);
356
386
  await this.ioHelper.defaults.info(`User value: ${flag.userValue}`);
387
+ await this.ioHelper.defaults.info(`Effective value: ${effectiveValue(flag)}`);
357
388
  return;
358
389
  }
359
- await this.ioHelper.defaults.info(`Found ${matchingFlags.length} flags matching "${flagNames.join(', ')}":`);
390
+ await this.ioHelper.defaults.info(`Found ${matchingFlags.length} flags matching "${flagNames.join(', ')}"`);
360
391
  await this.displayFlagTable(matchingFlags);
361
392
  }
362
393
  /** Returns sort order for flags */
363
394
  getFlagSortOrder(flag) {
364
395
  if (flag.userValue === undefined)
365
396
  return 3;
366
- if (this.isUserValueEqualToRecommended(flag))
397
+ if (isEffectiveValueEqualToRecommended(flag))
367
398
  return 1;
368
399
  return 2;
369
400
  }
@@ -378,17 +409,18 @@ class FlagOperations {
378
409
  return a.module.localeCompare(b.module);
379
410
  return a.name.localeCompare(b.name);
380
411
  });
381
- const rows = [['Feature Flag Name', 'Recommended Value', 'User Value']];
412
+ const rows = [['Feature Flag', 'Recommended', 'User', 'Effective']];
382
413
  let currentModule = '';
383
414
  sortedFlags.forEach((flag) => {
384
415
  if (flag.module !== currentModule) {
385
- rows.push([chalk.bold(`Module: ${flag.module}`), '', '']);
416
+ rows.push([chalk.bold(`Module: ${flag.module}`), '', '', '']);
386
417
  currentModule = flag.module;
387
418
  }
388
419
  rows.push([
389
420
  ` ${flag.name}`,
390
421
  String(flag.recommendedValue),
391
422
  flag.userValue === undefined ? '<unset>' : String(flag.userValue),
423
+ String(effectiveValue(flag)),
392
424
  ]);
393
425
  });
394
426
  const formattedTable = (0, cloudformation_diff_1.formatTable)(rows, undefined, true);
@@ -401,10 +433,6 @@ class FlagOperations {
401
433
  recommended === 'true' ||
402
434
  recommended === 'false';
403
435
  }
404
- /** Checks if the user's current value matches the recommended value */
405
- isUserValueEqualToRecommended(flag) {
406
- return String(flag.userValue) === String(flag.recommendedValue);
407
- }
408
436
  /** Shows helpful usage examples and available command options */
409
437
  async displayHelpMessage() {
410
438
  await this.ioHelper.defaults.info('\n' + chalk.bold('Available options:'));
@@ -418,4 +446,20 @@ class FlagOperations {
418
446
  }
419
447
  }
420
448
  exports.FlagOperations = FlagOperations;
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QixzRUFBMkQ7QUFHM0Qsc0RBQXFGO0FBQ3JGLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IscUNBQTZCO0FBRTdCLG1DQUFtRDtBQUduRCxNQUFhLGNBQWM7SUFPekIsWUFDbUIsS0FBb0IsRUFDcEIsT0FBZ0IsRUFDaEIsUUFBa0I7UUFGbEIsVUFBSyxHQUFMLEtBQUssQ0FBZTtRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFFbkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQTRCO1FBQ3hDLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFB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Q0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDN0gsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMseUVBQXlFLENBQUMsQ0FBQztRQUM3RyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JILENBQUM7Q0FDRjtBQXpkRCx3Q0F5ZEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZm9ybWF0VGFibGUgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0IH0gZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWcsIFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBDZGtBcHBNdWx0aUNvbnRleHQsIE1lbW9yeUNvbnRleHQsIERpZmZNZXRob2QgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgUFF1ZXVlIGZyb20gJ3AtcXVldWUnO1xuaW1wb3J0IHR5cGUgeyBGbGFnT3BlcmF0aW9uc1BhcmFtcyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vLi4vYXBpLXByaXZhdGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhZ09wZXJhdGlvbnMge1xuICBwcml2YXRlIGFwcDogc3RyaW5nO1xuICBwcml2YXRlIGJhc2VDb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIGFsbFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0W107XG4gIHByaXZhdGUgcXVldWU6IFBRdWV1ZTtcbiAgcHJpdmF0ZSBiYXNlbGluZVRlbXBEaXI/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmbGFnczogRmVhdHVyZUZsYWdbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvb2xraXQ6IFRvb2xraXQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICkge1xuICAgIHRoaXMuYXBwID0gJyc7XG4gICAgdGhpcy5iYXNlQ29udGV4dFZhbHVlcyA9IHt9O1xuICAgIHRoaXMuYWxsU3RhY2tzID0gW107XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBQUXVldWUoeyBjb25jdXJyZW5jeTogNCB9KTtcbiAgfVxuXG4gIC8qKiBNYWluIGVudHJ5IHBvaW50IHRoYXQgcm91dGVzIHRvIGVpdGhlciBmbGFnIHNldHRpbmcgb3IgZGlzcGxheSBvcGVyYXRpb25zICovXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuc2V0KSB7XG4gICAgICBpZiAocGFyYW1zLkZMQUdOQU1FICYmIHBhcmFtcy52YWx1ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNldEZsYWcocGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BsYXlGbGFncyhwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIGEgc2luZ2xlIHNwZWNpZmljIGZsYWcgd2l0aCB2YWxpZGF0aW9uIGFuZCB1c2VyIGNvbmZpcm1hdGlvbiAqL1xuICBhc3luYyBzZXRGbGFnKHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmbGFnTmFtZSA9IHBhcmFtcy5GTEFHTkFNRSFbMF07XG4gICAgY29uc3QgZmxhZyA9IHRoaXMuZmxhZ3MuZmluZChmID0+IGYubmFtZSA9PT0gZmxhZ05hbWUpO1xuXG4gICAgaWYgKCFmbGFnKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdGbGFnIG5vdCBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5lcnJvcihgRmxhZyAnJHtmbGFnTmFtZX0nIGlzIG5vdCBhIGJvb2xlYW4gZmxhZy4gT25seSBib29sZWFuIGZsYWdzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvdHlwZVN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnByb3RvdHlwZUNoYW5nZXMoW2ZsYWdOYW1lXSwgcGFyYW1zKTtcbiAgICBpZiAocHJvdG90eXBlU3VjY2Vzcykge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVVc2VyUmVzcG9uc2UoW2ZsYWdOYW1lXSwgcGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0cyBtdWx0aXBsZSBmbGFncyAoYWxsIG9yIHVuY29uZmlndXJlZCkgd2l0aCB2YWxpZGF0aW9uIGFuZCB1c2VyIGNvbmZpcm1hdGlvbiAqL1xuICBhc3luYyBzZXRNdWx0aXBsZUZsYWdzKHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLmRlZmF1bHQgJiYgIXRoaXMuZmxhZ3Muc29tZShmID0+IGYudW5jb25maWd1cmVkQmVoYXZlc0xpa2UpKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdUaGUgLS1kZWZhdWx0IG9wdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIEFXUyBDREsgbGlicmFyeSB1c2VkIGJ5IHlvdXIgYXBwbGljYXRpb24uIFBsZWFzZSB1cGdyYWRlIHRvIDIuMjEyLjAgb3IgYWJvdmUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmxhZ3NUb1NldCA9IHRoaXMuZ2V0RmxhZ3NUb1NldChwYXJhbXMpO1xuICAgIGNvbnN0IHByb3RvdHlwZVN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnByb3RvdHlwZUNoYW5nZXMoZmxhZ3NUb1NldCwgcGFyYW1zKTtcblxuICAgIGlmIChwcm90b3R5cGVTdWNjZXNzKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVVzZXJSZXNwb25zZShmbGFnc1RvU2V0LCBwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGZsYWdzIHNob3VsZCBiZSBzZXQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKi9cbiAgcHJpdmF0ZSBnZXRGbGFnc1RvU2V0KHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHBhcmFtcy5hbGwgJiYgcGFyYW1zLmRlZmF1bHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZsYWdzXG4gICAgICAgIC5maWx0ZXIoZmxhZyA9PiB0aGlzLmlzQm9vbGVhbkZsYWcoZmxhZykpXG4gICAgICAgIC5tYXAoZmxhZyA9PiBmbGFnLm5hbWUpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmFsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NcbiAgICAgICAgLmZpbHRlcihmbGFnID0+IGZsYWcudXNlclZhbHVlID09PSB1bmRlZmluZWQgfHwgIXRoaXMuaXNVc2VyVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZykpXG4gICAgICAgIC5maWx0ZXIoZmxhZyA9PiB0aGlzLmlzQm9vbGVhbkZsYWcoZmxhZykpXG4gICAgICAgIC5tYXAoZmxhZyA9PiBmbGFnLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5mbGFnc1xuICAgICAgICAuZmlsdGVyKGZsYWcgPT4gZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgLmZpbHRlcihmbGFnID0+IHRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSlcbiAgICAgICAgLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgZmxhZ3MgdGhhdCBkb24ndCBjYXVzZSB0ZW1wbGF0ZSBjaGFuZ2VzICovXG4gIGFzeW5jIHNldFNhZmVGbGFncyhwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2RrSnNvbiA9IGF3YWl0IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpLCAndXRmLTgnKSk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwIHx8IGNka0pzb24uYXBwO1xuXG4gICAgY29uc3QgaXNVc2luZ1RzTm9kZSA9IHRoaXMuYXBwLmluY2x1ZGVzKCd0cy1ub2RlJyk7XG4gICAgaWYgKGlzVXNpbmdUc05vZGUgJiYgIXRoaXMuYXBwLmluY2x1ZGVzKCctVCcpICYmICF0aGlzLmFwcC5pbmNsdWRlcygnLS10cmFuc3BpbGVPbmx5JykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnUmVwZWF0ZWQgc3ludGhzIHdpdGggdHMtbm9kZSB3aWxsIHR5cGUtY2hlY2sgdGhlIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHN5bnRoLiBBZGQgLS10cmFuc3BpbGVPbmx5IHRvIGNkay5qc29uXFwncyBcImFwcFwiIGNvbW1hbmQgdG8gbWFrZSB0aGlzIG9wZXJhdGlvbiBmYXN0ZXIuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5jb25maWd1cmVkRmxhZ3MgPSB0aGlzLmZsYWdzLmZpbHRlcihmbGFnID0+XG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSk7XG5cbiAgICBpZiAodW5jb25maWd1cmVkRmxhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0FsbCBmZWF0dXJlIGZsYWdzIGFyZSBjb25maWd1cmVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVNhZmV0eUNoZWNrKCk7XG4gICAgY29uc3Qgc2FmZUZsYWdzID0gYXdhaXQgdGhpcy5iYXRjaFRlc3RGbGFncyh1bmNvbmZpZ3VyZWRGbGFncyk7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwU2FmZXR5Q2hlY2soKTtcblxuICAgIGlmIChzYWZlRmxhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFncyB0aGF0IGNhbiBiZSBzZXQgd2l0aG91dCB0ZW1wbGF0ZSBjaGFuZ2VzOicpO1xuICAgICAgZm9yIChjb25zdCBmbGFnIG9mIHNhZmVGbGFncykge1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYC0gJHtmbGFnLm5hbWV9IC0+ICR7ZmxhZy5yZWNvbW1lbmRlZFZhbHVlfWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVVc2VyUmVzcG9uc2Uoc2FmZUZsYWdzLm1hcChmbGFnID0+IGZsYWcubmFtZSksIHsgLi4ucGFyYW1zLCByZWNvbW1lbmRlZDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdObyBtb3JlIGZsYWdzIGNhbiBiZSBzZXQgd2l0aG91dCBjYXVzaW5nIHRlbXBsYXRlIGNoYW5nZXMuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSBzYWZldHkgY2hlY2sgYnkgcmVhZGluZyBjb250ZXh0IGFuZCBzeW50aGVzaXppbmcgYmFzZWxpbmUgdGVtcGxhdGVzICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVNhZmV0eUNoZWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJhc2VDb250ZXh0ID0gbmV3IENka0FwcE11bHRpQ29udGV4dChwcm9jZXNzLmN3ZCgpKTtcbiAgICB0aGlzLmJhc2VDb250ZXh0VmFsdWVzID0gYXdhaXQgYmFzZUNvbnRleHQucmVhZCgpO1xuXG4gICAgdGhpcy5iYXNlbGluZVRlbXBEaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjZGstYmFzZWxpbmUtJykpO1xuICAgIGNvbnN0IGJhc2VTb3VyY2UgPSBhd2FpdCB0aGlzLnRvb2xraXQuZnJvbUNka0FwcCh0aGlzLmFwcCwge1xuICAgICAgY29udGV4dFN0b3JlOiBiYXNlQ29udGV4dCxcbiAgICAgIG91dGRpcjogdGhpcy5iYXNlbGluZVRlbXBEaXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBiYXNlQ3ggPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgoYmFzZVNvdXJjZSk7XG4gICAgY29uc3QgYmFzZUFzc2VtYmx5ID0gYmFzZUN4LmNsb3VkQXNzZW1ibHk7XG4gICAgdGhpcy5hbGxTdGFja3MgPSBiYXNlQXNzZW1ibHkuc3RhY2tzUmVjdXJzaXZlbHk7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBQUXVldWUoeyBjb25jdXJyZW5jeTogNCB9KTtcbiAgfVxuXG4gIC8qKiBDbGVhbnMgdXAgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGNyZWF0ZWQgZHVyaW5nIHNhZmV0eSBjaGVja3MgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU2FmZXR5Q2hlY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuYmFzZWxpbmVUZW1wRGlyKSB7XG4gICAgICBhd2FpdCBmcy5yZW1vdmUodGhpcy5iYXNlbGluZVRlbXBEaXIpO1xuICAgICAgdGhpcy5iYXNlbGluZVRlbXBEaXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRlc3RzIG11bHRpcGxlIGZsYWdzIHRvZ2V0aGVyIGFuZCBpc29sYXRlcyB1bnNhZmUgb25lcyB1c2luZyBiaW5hcnkgc2VhcmNoICovXG4gIHByaXZhdGUgYXN5bmMgYmF0Y2hUZXN0RmxhZ3MoZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICBpZiAoZmxhZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBhbGxGbGFnc0NvbnRleHQgPSB7IC4uLnRoaXMuYmFzZUNvbnRleHRWYWx1ZXMgfTtcbiAgICBmbGFncy5mb3JFYWNoKGZsYWcgPT4ge1xuICAgICAgYWxsRmxhZ3NDb250ZXh0W2ZsYWcubmFtZV0gPSBmbGFnLnJlY29tbWVuZGVkVmFsdWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxTYWZlID0gYXdhaXQgdGhpcy50ZXN0QmF0Y2goYWxsRmxhZ3NDb250ZXh0KTtcbiAgICBpZiAoYWxsU2FmZSkgcmV0dXJuIGZsYWdzO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNvbGF0ZVVuc2FmZUZsYWdzKGZsYWdzKTtcbiAgfVxuXG4gIC8qKiBUZXN0cyBpZiBhIHNldCBvZiBjb250ZXh0IHZhbHVlcyBjYXVzZXMgdGVtcGxhdGUgY2hhbmdlcyBieSBzeW50aGVzaXppbmcgYW5kIGRpZmZpbmcgKi9cbiAgcHJpdmF0ZSBhc3luYyB0ZXN0QmF0Y2goY29udGV4dFZhbHVlczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRlc3RDb250ZXh0ID0gbmV3IE1lbW9yeUNvbnRleHQoY29udGV4dFZhbHVlcyk7XG4gICAgY29uc3QgdGVtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nkay10ZXN0LScpKTtcbiAgICBjb25zdCB0ZXN0U291cmNlID0gYXdhaXQgdGhpcy50b29sa2l0LmZyb21DZGtBcHAodGhpcy5hcHAsIHtcbiAgICAgIGNvbnRleHRTdG9yZTogdGVzdENvbnRleHQsXG4gICAgICBvdXRkaXI6IHRlbXBEaXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZXN0Q3ggPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgodGVzdFNvdXJjZSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzdGFjayBvZiB0aGlzLmFsbFN0YWNrcykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBzdGFjay50ZW1wbGF0ZUZ1bGxQYXRoO1xuICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy50b29sa2l0LmRpZmYodGVzdEN4LCB7XG4gICAgICAgICAgbWV0aG9kOiBEaWZmTWV0aG9kLkxvY2FsRmlsZSh0ZW1wbGF0ZVBhdGgpLFxuICAgICAgICAgIHN0YWNrczoge1xuICAgICAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiBbc3RhY2suaGllcmFyY2hpY2FsSWRdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhY2tEaWZmIG9mIE9iamVjdC52YWx1ZXMoZGlmZikpIHtcbiAgICAgICAgICBpZiAoc3RhY2tEaWZmLmRpZmZlcmVuY2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yZW1vdmUodGVtcERpcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVzZXMgYmluYXJ5IHNlYXJjaCB0byBpc29sYXRlIHdoaWNoIGZsYWdzIGFyZSBzYWZlIHRvIHNldCB3aXRob3V0IHRlbXBsYXRlIGNoYW5nZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc29sYXRlVW5zYWZlRmxhZ3MoZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICBjb25zdCBzYWZlRmxhZ3M6IEZlYXR1cmVGbGFnW10gPSBbXTtcblxuICAgIGNvbnN0IHByb2Nlc3NCYXRjaCA9IGFzeW5jIChiYXRjaDogRmVhdHVyZUZsYWdbXSwgY29udGV4dFZhbHVlczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBpc1NhZmUgPSBhd2FpdCB0aGlzLnRlc3RCYXRjaChcbiAgICAgICAgICB7IC4uLmNvbnRleHRWYWx1ZXMsIFtiYXRjaFswXS5uYW1lXTogYmF0Y2hbMF0ucmVjb21tZW5kZWRWYWx1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNTYWZlKSBzYWZlRmxhZ3MucHVzaChiYXRjaFswXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmF0Y2hDb250ZXh0ID0geyAuLi5jb250ZXh0VmFsdWVzIH07XG4gICAgICBiYXRjaC5mb3JFYWNoKGZsYWcgPT4ge1xuICAgICAgICBiYXRjaENvbnRleHRbZmxhZy5uYW1lXSA9IGZsYWcucmVjb21tZW5kZWRWYWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc1NhZmVCYXRjaCA9IGF3YWl0IHRoaXMudGVzdEJhdGNoKGJhdGNoQ29udGV4dCk7XG4gICAgICBpZiAoaXNTYWZlQmF0Y2gpIHtcbiAgICAgICAgc2FmZUZsYWdzLnB1c2goLi4uYmF0Y2gpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoYmF0Y2gubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBsZWZ0ID0gYmF0Y2guc2xpY2UoMCwgbWlkKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gYmF0Y2guc2xpY2UobWlkKTtcblxuICAgICAgdm9pZCB0aGlzLnF1ZXVlLmFkZCgoKSA9PiBwcm9jZXNzQmF0Y2gobGVmdCwgY29udGV4dFZhbHVlcykpO1xuICAgICAgdm9pZCB0aGlzLnF1ZXVlLmFkZCgoKSA9PiBwcm9jZXNzQmF0Y2gocmlnaHQsIGNvbnRleHRWYWx1ZXMpKTtcbiAgICB9O1xuXG4gICAgdm9pZCB0aGlzLnF1ZXVlLmFkZCgoKSA9PiBwcm9jZXNzQmF0Y2goZmxhZ3MsIHRoaXMuYmFzZUNvbnRleHRWYWx1ZXMpKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uSWRsZSgpO1xuICAgIHJldHVybiBzYWZlRmxhZ3M7XG4gIH1cblxuICAvKiogUHJvdG90eXBlcyBmbGFnIGNoYW5nZXMgYnkgc3ludGhlc2l6aW5nIHRlbXBsYXRlcyBhbmQgc2hvd2luZyBkaWZmcyB0byB0aGUgdXNlciAqL1xuICBwcml2YXRlIGFzeW5jIHByb3RvdHlwZUNoYW5nZXMoZmxhZ05hbWVzOiBzdHJpbmdbXSwgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGJhc2VDb250ZXh0ID0gbmV3IENka0FwcE11bHRpQ29udGV4dChwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBiYXNlQ29udGV4dFZhbHVlcyA9IGF3YWl0IGJhc2VDb250ZXh0LnJlYWQoKTtcbiAgICBjb25zdCBtZW1vcnlDb250ZXh0ID0gbmV3IE1lbW9yeUNvbnRleHQoYmFzZUNvbnRleHRWYWx1ZXMpO1xuXG4gICAgY29uc3QgY2RrSnNvbiA9IGF3YWl0IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpLCAndXRmLTgnKSk7XG4gICAgY29uc3QgYXBwID0gY2RrSnNvbi5hcHA7XG5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLnRvb2xraXQuZnJvbUNka0FwcChhcHAsIHtcbiAgICAgIGNvbnRleHRTdG9yZTogYmFzZUNvbnRleHQsXG4gICAgICBvdXRkaXI6IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nkay1vcmlnaW5hbC0nKSksXG4gICAgfSk7XG5cbiAgICBjb25zdCB1cGRhdGVPYmogPSBhd2FpdCB0aGlzLmJ1aWxkVXBkYXRlT2JqZWN0KGZsYWdOYW1lcywgcGFyYW1zLCBiYXNlQ29udGV4dFZhbHVlcyk7XG4gICAgaWYgKCF1cGRhdGVPYmopIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IG1lbW9yeUNvbnRleHQudXBkYXRlKHVwZGF0ZU9iaik7XG4gICAgY29uc3QgY3ggPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgoc291cmNlKTtcbiAgICBjb25zdCBhc3NlbWJseSA9IGN4LmNsb3VkQXNzZW1ibHk7XG5cbiAgICBjb25zdCBtb2RpZmllZFNvdXJjZSA9IGF3YWl0IHRoaXMudG9vbGtpdC5mcm9tQ2RrQXBwKGFwcCwge1xuICAgICAgY29udGV4dFN0b3JlOiBtZW1vcnlDb250ZXh0LFxuICAgICAgb3V0ZGlyOiBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjZGstdGVtcC0nKSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBtb2RpZmllZEN4ID0gYXdhaXQgdGhpcy50b29sa2l0LnN5bnRoKG1vZGlmaWVkU291cmNlKTtcbiAgICBjb25zdCBhbGxTdGFja3MgPSBhc3NlbWJseS5zdGFja3NSZWN1cnNpdmVseTtcblxuICAgIGZvciAoY29uc3Qgc3RhY2sgb2YgYWxsU3RhY2tzKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBzdGFjay50ZW1wbGF0ZUZ1bGxQYXRoO1xuICAgICAgYXdhaXQgdGhpcy50b29sa2l0LmRpZmYobW9kaWZpZWRDeCwge1xuICAgICAgICBtZXRob2Q6IERpZmZNZXRob2QuTG9jYWxGaWxlKHRlbXBsYXRlUGF0aCksXG4gICAgICAgIHN0YWNrczoge1xuICAgICAgICAgIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUsXG4gICAgICAgICAgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRpc3BsYXlGbGFnQ2hhbmdlcyh1cGRhdGVPYmosIGJhc2VDb250ZXh0VmFsdWVzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5cyBhIHN1bW1hcnkgb2YgZmxhZyBjaGFuZ2VzIHNob3dpbmcgb2xkIGFuZCBuZXcgdmFsdWVzICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGxheUZsYWdDaGFuZ2VzKHVwZGF0ZU9iajogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sIGJhc2VDb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdcXG5GbGFnIGNoYW5nZXM6Jyk7XG4gICAgZm9yIChjb25zdCBbZmxhZ05hbWUsIG5ld1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGVPYmopKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBiYXNlQ29udGV4dFZhbHVlc1tmbGFnTmFtZV07XG4gICAgICBjb25zdCBjdXJyZW50RGlzcGxheSA9IGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gJzx1bnNldD4nIDogU3RyaW5nKGN1cnJlbnRWYWx1ZSk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYCAgJHtmbGFnTmFtZX06ICR7Y3VycmVudERpc3BsYXl9IOKGkiAke25ld1ZhbHVlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZHMgdGhlIHVwZGF0ZSBvYmplY3Qgd2l0aCBuZXcgZmxhZyB2YWx1ZXMgYmFzZWQgb24gcGFyYW1ldGVycyBhbmQgY3VycmVudCBjb250ZXh0ICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRVcGRhdGVPYmplY3QoZmxhZ05hbWVzOiBzdHJpbmdbXSwgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcywgYmFzZUNvbnRleHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHVwZGF0ZU9iajogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuICAgIGlmIChmbGFnTmFtZXMubGVuZ3RoID09PSAxICYmIHBhcmFtcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmbGFnTmFtZSA9IGZsYWdOYW1lc1swXTtcbiAgICAgIGNvbnN0IGJvb2xWYWx1ZSA9IHBhcmFtcy52YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgaWYgKGJhc2VDb250ZXh0VmFsdWVzW2ZsYWdOYW1lXSA9PT0gYm9vbFZhbHVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnRmxhZyBpcyBhbHJlYWR5IHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBObyBjaGFuZ2VzIG5lZWRlZC4nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gYm9vbFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGZsYWdOYW1lIG9mIGZsYWdOYW1lcykge1xuICAgICAgICBjb25zdCBmbGFnID0gdGhpcy5mbGFncy5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gICAgICAgIGlmICghZmxhZykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoYEZsYWcgJHtmbGFnTmFtZX0gbm90IGZvdW5kLmApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcGFyYW1zLnJlY29tbWVuZGVkXG4gICAgICAgICAgPyBmbGFnLnJlY29tbWVuZGVkVmFsdWUgYXMgYm9vbGVhblxuICAgICAgICAgIDogU3RyaW5nKGZsYWcudW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyKSA9PT0gJ3RydWUnO1xuICAgICAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGVPYmo7XG4gIH1cblxuICAvKiogUHJvbXB0cyB1c2VyIGZvciBjb25maXJtYXRpb24gYW5kIGFwcGxpZXMgY2hhbmdlcyBpZiBhY2NlcHRlZCAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZVVzZXJSZXNwb25zZShmbGFnTmFtZXM6IHN0cmluZ1tdLCBwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXNlckFjY2VwdGVkID0gYXdhaXQgdGhpcy5pb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTkzMDAnLFxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSB3YW50IHRvIGFjY2VwdCB0aGVzZSBjaGFuZ2VzPycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZsYWdOYW1lcyxcbiAgICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0UmVzcG9uc2U6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZXJBY2NlcHRlZCkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RpZnlWYWx1ZXMoZmxhZ05hbWVzLCBwYXJhbXMpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIHZhbHVlKHMpIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNsZWFudXBUZW1wRGlyZWN0b3JpZXMoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBjcmVhdGVkIGR1cmluZyBmbGFnIG9wZXJhdGlvbnMgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwVGVtcERpcmVjdG9yaWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9yaWdpbmFsRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvcmlnaW5hbCcpO1xuICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKTtcbiAgICBhd2FpdCBmcy5yZW1vdmUob3JpZ2luYWxEaXIpO1xuICAgIGF3YWl0IGZzLnJlbW92ZSh0ZW1wRGlyKTtcbiAgfVxuXG4gIC8qKiBBY3R1YWxseSBtb2RpZmllcyB0aGUgY2RrLmpzb24gZmlsZSB3aXRoIHRoZSBuZXcgZmxhZyB2YWx1ZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb2RpZnlWYWx1ZXMoZmxhZ05hbWVzOiBzdHJpbmdbXSwgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICAgIGNvbnN0IGNka0pzb25Db250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoY2RrSnNvblBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGNka0pzb24gPSBKU09OLnBhcnNlKGNka0pzb25Db250ZW50KTtcblxuICAgIGlmIChmbGFnTmFtZXMubGVuZ3RoID09PSAxICYmICFwYXJhbXMuc2FmZSkge1xuICAgICAgY29uc3QgYm9vbFZhbHVlID0gcGFyYW1zLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICBjZGtKc29uLmNvbnRleHRbU3RyaW5nKGZsYWdOYW1lc1swXSldID0gYm9vbFZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBTZXR0aW5nIGZsYWcgJyR7ZmxhZ05hbWVzfScgdG86ICR7Ym9vbFZhbHVlfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGZsYWdOYW1lIG9mIGZsYWdOYW1lcykge1xuICAgICAgICBjb25zdCBmbGFnID0gdGhpcy5mbGFncy5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcGFyYW1zLnJlY29tbWVuZGVkIHx8IHBhcmFtcy5zYWZlXG4gICAgICAgICAgPyBmbGFnIS5yZWNvbW1lbmRlZFZhbHVlIGFzIGJvb2xlYW5cbiAgICAgICAgICA6IFN0cmluZyhmbGFnIS51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIpID09PSAndHJ1ZSc7XG4gICAgICAgIGNka0pzb24uY29udGV4dFtmbGFnTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGNka0pzb25QYXRoLCBKU09OLnN0cmluZ2lmeShjZGtKc29uLCBudWxsLCAyKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvKiogRGlzcGxheXMgZmxhZ3MgaW4gYSB0YWJsZSBmb3JtYXQsIGVpdGhlciBzcGVjaWZpYyBmbGFncyBvciBmaWx0ZXJlZCBieSBjcml0ZXJpYSAqL1xuICBhc3luYyBkaXNwbGF5RmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgRkxBR05BTUUsIGFsbCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKEZMQUdOQU1FICYmIEZMQUdOQU1FLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGxheVNwZWNpZmljRmxhZ3MoRkxBR05BTUUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYWdzVG9EaXNwbGF5ID0gYWxsID8gdGhpcy5mbGFncyA6IHRoaXMuZmxhZ3MuZmlsdGVyKGZsYWcgPT5cbiAgICAgIGZsYWcudXNlclZhbHVlID09PSB1bmRlZmluZWQgfHwgIXRoaXMuaXNVc2VyVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZykpO1xuXG4gICAgYXdhaXQgdGhpcy5kaXNwbGF5RmxhZ1RhYmxlKGZsYWdzVG9EaXNwbGF5KTtcblxuICAgIC8vIEFkZCBoZWxwZnVsIG1lc3NhZ2UgYWZ0ZXIgZW1wdHkgdGFibGUgd2hlbiBub3QgdXNpbmcgLS1hbGxcbiAgICBpZiAoIWFsbCAmJiBmbGFnc1RvRGlzcGxheS5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnJyk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ+KchSBBbGwgZmVhdHVyZSBmbGFncyBhcmUgYWxyZWFkeSBzZXQgdG8gdGhlaXIgcmVjb21tZW5kZWQgdmFsdWVzLicpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdVc2UgXFwnY2RrIGZsYWdzIC0tYWxsIC0tdW5zdGFibGU9ZmxhZ3NcXCcgdG8gc2VlIGFsbCBmbGFncyBhbmQgdGhlaXIgY3VycmVudCB2YWx1ZXMuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGZvciBzcGVjaWZpYyBmbGFncyBtYXRjaGluZyB0aGUgZ2l2ZW4gbmFtZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwbGF5U3BlY2lmaWNGbGFncyhmbGFnTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF0Y2hpbmdGbGFncyA9IHRoaXMuZmxhZ3MuZmlsdGVyKGYgPT5cbiAgICAgIGZsYWdOYW1lcy5zb21lKHNlYXJjaFRlcm0gPT4gZi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSkpO1xuXG4gICAgaWYgKG1hdGNoaW5nRmxhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnIG1hdGNoaW5nIFwiJHtmbGFnTmFtZXMuam9pbignLCAnKX1cIiBub3QgZm91bmQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoaW5nRmxhZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBmbGFnID0gbWF0Y2hpbmdGbGFnc1swXTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRmxhZyBuYW1lOiAke2ZsYWcubmFtZX1gKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVzY3JpcHRpb246ICR7ZmxhZy5leHBsYW5hdGlvbn1gKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgUmVjb21tZW5kZWQgdmFsdWU6ICR7ZmxhZy5yZWNvbW1lbmRlZFZhbHVlfWApO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBVc2VyIHZhbHVlOiAke2ZsYWcudXNlclZhbHVlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRm91bmQgJHttYXRjaGluZ0ZsYWdzLmxlbmd0aH0gZmxhZ3MgbWF0Y2hpbmcgXCIke2ZsYWdOYW1lcy5qb2luKCcsICcpfVwiOmApO1xuICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdUYWJsZShtYXRjaGluZ0ZsYWdzKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHNvcnQgb3JkZXIgZm9yIGZsYWdzICovXG4gIHByaXZhdGUgZ2V0RmxhZ1NvcnRPcmRlcihmbGFnOiBGZWF0dXJlRmxhZyk6IG51bWJlciB7XG4gICAgaWYgKGZsYWcudXNlclZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAzO1xuICAgIGlmICh0aGlzLmlzVXNlclZhbHVlRXF1YWxUb1JlY29tbWVuZGVkKGZsYWcpKSByZXR1cm4gMTtcbiAgICByZXR1cm4gMjtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5cyBmbGFncyBpbiBhIGZvcm1hdHRlZCB0YWJsZSBncm91cGVkIGJ5IG1vZHVsZSBhbmQgc29ydGVkICovXG4gIGFzeW5jIGRpc3BsYXlGbGFnVGFibGUoZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3J0ZWRGbGFncyA9IFsuLi5mbGFnc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3Qgb3JkZXJBID0gdGhpcy5nZXRGbGFnU29ydE9yZGVyKGEpO1xuICAgICAgY29uc3Qgb3JkZXJCID0gdGhpcy5nZXRGbGFnU29ydE9yZGVyKGIpO1xuXG4gICAgICBpZiAob3JkZXJBICE9PSBvcmRlckIpIHJldHVybiBvcmRlckEgLSBvcmRlckI7XG4gICAgICBpZiAoYS5tb2R1bGUgIT09IGIubW9kdWxlKSByZXR1cm4gYS5tb2R1bGUubG9jYWxlQ29tcGFyZShiLm1vZHVsZSk7XG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvd3M6IHN0cmluZ1tdW10gPSBbWydGZWF0dXJlIEZsYWcgTmFtZScsICdSZWNvbW1lbmRlZCBWYWx1ZScsICdVc2VyIFZhbHVlJ11dO1xuICAgIGxldCBjdXJyZW50TW9kdWxlID0gJyc7XG5cbiAgICBzb3J0ZWRGbGFncy5mb3JFYWNoKChmbGFnKSA9PiB7XG4gICAgICBpZiAoZmxhZy5tb2R1bGUgIT09IGN1cnJlbnRNb2R1bGUpIHtcbiAgICAgICAgcm93cy5wdXNoKFtjaGFsay5ib2xkKGBNb2R1bGU6ICR7ZmxhZy5tb2R1bGV9YCksICcnLCAnJ10pO1xuICAgICAgICBjdXJyZW50TW9kdWxlID0gZmxhZy5tb2R1bGU7XG4gICAgICB9XG4gICAgICByb3dzLnB1c2goW1xuICAgICAgICBgICAke2ZsYWcubmFtZX1gLFxuICAgICAgICBTdHJpbmcoZmxhZy5yZWNvbW1lbmRlZFZhbHVlKSxcbiAgICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCA/ICc8dW5zZXQ+JyA6IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSksXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvcm1hdHRlZFRhYmxlID0gZm9ybWF0VGFibGUocm93cywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oZm9ybWF0dGVkVGFibGUpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBhIGZsYWcgaGFzIGEgYm9vbGVhbiByZWNvbW1lbmRlZCB2YWx1ZSAqL1xuICBpc0Jvb2xlYW5GbGFnKGZsYWc6IEZlYXR1cmVGbGFnKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb21tZW5kZWQgPSBmbGFnLnJlY29tbWVuZGVkVmFsdWU7XG4gICAgcmV0dXJuIHR5cGVvZiByZWNvbW1lbmRlZCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICByZWNvbW1lbmRlZCA9PT0gJ3RydWUnIHx8XG4gICAgICByZWNvbW1lbmRlZCA9PT0gJ2ZhbHNlJztcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdGhlIHVzZXIncyBjdXJyZW50IHZhbHVlIG1hdGNoZXMgdGhlIHJlY29tbWVuZGVkIHZhbHVlICovXG4gIHByaXZhdGUgaXNVc2VyVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZzogRmVhdHVyZUZsYWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gU3RyaW5nKGZsYWcudXNlclZhbHVlKSA9PT0gU3RyaW5nKGZsYWcucmVjb21tZW5kZWRWYWx1ZSk7XG4gIH1cblxuICAvKiogU2hvd3MgaGVscGZ1bCB1c2FnZSBleGFtcGxlcyBhbmQgYXZhaWxhYmxlIGNvbW1hbmQgb3B0aW9ucyAqL1xuICBhc3luYyBkaXNwbGF5SGVscE1lc3NhZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdcXG4nICsgY2hhbGsuYm9sZCgnQXZhaWxhYmxlIG9wdGlvbnM6JykpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICBjZGsgZmxhZ3MgLS1pbnRlcmFjdGl2ZSAgICAgIyBJbnRlcmFjdGl2ZSBtZW51IHRvIG1hbmFnZSBmbGFncycpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICBjZGsgZmxhZ3MgLS1hbGwgICAgICAgICAgICAgIyBTaG93IGFsbCBmbGFncyAoaW5jbHVkaW5nIGNvbmZpZ3VyZWQgb25lcyknKTtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJyAgY2RrIGZsYWdzIC0tc2V0IC0tYWxsIC0tcmVjb21tZW5kZWQgICAgIyBTZXQgYWxsIGZsYWdzIHRvIHJlY29tbWVuZGVkIHZhbHVlcycpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICBjZGsgZmxhZ3MgLS1zZXQgLS1hbGwgLS1kZWZhdWx0ICAgICAgICMgU2V0IGFsbCBmbGFncyB0byBkZWZhdWx0IHZhbHVlcycpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICBjZGsgZmxhZ3MgLS1zZXQgLS11bmNvbmZpZ3VyZWQgLS1yZWNvbW1lbmRlZCAgIyBTZXQgdW5jb25maWd1cmVkIGZsYWdzIHRvIHJlY29tbWVuZGVkJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLXNldCA8ZmxhZy1uYW1lPiAtLXZhbHVlIDx0cnVlfGZhbHNlPiAgIyBTZXQgc3BlY2lmaWMgZmxhZycpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICBjZGsgZmxhZ3MgLS1zYWZlICAgICAgICAgICAgIyBTYWZlbHkgc2V0IGZsYWdzIHRoYXQgZG9uXFwndCBjaGFuZ2UgdGVtcGxhdGVzJyk7XG4gIH1cbn1cbiJdfQ==
449
+ /** Checks if the flags current effective value matches the recommended value */
450
+ function isEffectiveValueEqualToRecommended(flag) {
451
+ return String(effectiveValue(flag)) === String(flag.recommendedValue);
452
+ }
453
+ /**
454
+ * Return the effective value of a flag (user value or default)
455
+ */
456
+ function effectiveValue(flag) {
457
+ return flag.userValue ?? defaultValue(flag);
458
+ }
459
+ /**
460
+ * Return the default value for a flag, assume it's `false` if not given
461
+ */
462
+ function defaultValue(flag) {
463
+ return flag.unconfiguredBehavesLike?.v2 ?? false;
464
+ }
465
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbWdCQSxnRkFFQztBQXJnQkQseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QixzRUFBMkQ7QUFHM0Qsc0RBQXFGO0FBQ3JGLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IscUNBQTZCO0FBQzdCLHFEQUFrRDtBQUVsRCxtQ0FBbUQ7QUFHbkQsTUFBYSxjQUFjO0lBQ3pCOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFvQjtRQUNyRCxPQUFPLEtBQUs7YUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLCtCQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQzthQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQVFELFlBQ21CLEtBQW9CLEVBQ3BCLE9BQWdCLEVBQ2hCLFFBQWtCO1FBRmxCLFVBQUssR0FBTCxLQUFLLENBQWU7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRW5DLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksaUJBQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFF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SSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBaUI7SUFDckMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEtBQUssQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZvcm1hdFRhYmxlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnLCBUb29sa2l0IH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgQ2RrQXBwTXVsdGlDb250ZXh0LCBNZW1vcnlDb250ZXh0LCBEaWZmTWV0aG9kIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IFBRdWV1ZSBmcm9tICdwLXF1ZXVlJztcbmltcG9ydCB7IE9CU09MRVRFX0ZMQUdTIH0gZnJvbSAnLi9vYnNvbGV0ZS1mbGFncyc7XG5pbXBvcnQgdHlwZSB7IEZsYWdPcGVyYXRpb25zUGFyYW1zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi8uLi9hcGktcHJpdmF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGFnT3BlcmF0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhvc2UgZmVhdHVyZSBmbGFncyB0aGF0IG5lZWQgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGF0IGlzIHRob3NlIGZsYWdzOlxuICAgKiAtIFRoYXQgYXJlIHVuY29uZmlndXJlZFxuICAgKiAtIFRoYXQgYXJlIG5vdCBvYnNvbGV0ZVxuICAgKiAtIFdob3NlIGRlZmF1bHQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlY29tbWVuZGVkIHZhbHVlXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGJlaW5nIGVxdWFsIHRvIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSBzb3VuZHMgb2RkLCBidXRcbiAgICogY3JvcHMgdXAgaW4gYSBudW1iZXIgb2Ygc2l0dXRhdGlvbnM6XG4gICAqXG4gICAqIC0gU2VjdXJpdHktcmVsYXRlZCBmaXhlcyB0aGF0IHdlIHdhbnQgdG8gZm9yY2Ugb24gcGVvcGxlLCBidXQgd2FudCB0b1xuICAgKiAgIGdpdmUgdGhlbSBhIGZsYWcgdG8gYmFjayBvdXQgb2YgdGhlIGNoYW5nZXMgaWYgdGhleSByZWFsbHkgbmVlZCB0by5cbiAgICogLSBGbGFncyB0aGF0IGNoYW5nZWQgdGhlaXIgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbW9zdCByZWNlbnQgbWFqb3JcbiAgICogICB2ZXJzaW9uLlxuICAgKiAtIEZsYWdzIHRoYXQgd2UndmUgaW50cm9kdWNlZCBhdCBzb21lIHBvaW50IGluIHRoZSBwYXN0LCBidXQgaGF2ZSBnb25lXG4gICAqICAgYmFjayBvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyTmVlZHNBdHRlbnRpb24oZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBGZWF0dXJlRmxhZ1tdIHtcbiAgICByZXR1cm4gZmxhZ3NcbiAgICAgIC5maWx0ZXIoZmxhZyA9PiAhT0JTT0xFVEVfRkxBR1MuaW5jbHVkZXMoZmxhZy5uYW1lKSlcbiAgICAgIC5maWx0ZXIoZmxhZyA9PiBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgLmZpbHRlcihmbGFnID0+IGRlZmF1bHRWYWx1ZShmbGFnKSAhPT0gZmxhZy5yZWNvbW1lbmRlZFZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwOiBzdHJpbmc7XG4gIHByaXZhdGUgYmFzZUNvbnRleHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHByaXZhdGUgYWxsU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3RbXTtcbiAgcHJpdmF0ZSBxdWV1ZTogUFF1ZXVlO1xuICBwcml2YXRlIGJhc2VsaW5lVGVtcERpcj86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZsYWdzOiBGZWF0dXJlRmxhZ1tdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9vbGtpdDogVG9vbGtpdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcixcbiAgKSB7XG4gICAgdGhpcy5hcHAgPSAnJztcbiAgICB0aGlzLmJhc2VDb250ZXh0VmFsdWVzID0ge307XG4gICAgdGhpcy5hbGxTdGFja3MgPSBbXTtcbiAgICB0aGlzLnF1ZXVlID0gbmV3IFBRdWV1ZSh7IGNvbmN1cnJlbmN5OiA0IH0pO1xuICB9XG5cbiAgLyoqIE1haW4gZW50cnkgcG9pbnQgdGhhdCByb3V0ZXMgdG8gZWl0aGVyIGZsYWcgc2V0dGluZyBvciBkaXNwbGF5IG9wZXJhdGlvbnMgKi9cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBhcmFtcy5zZXQpIHtcbiAgICAgIGlmIChwYXJhbXMuRkxBR05BTUUgJiYgcGFyYW1zLnZhbHVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0RmxhZyhwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRNdWx0aXBsZUZsYWdzKHBhcmFtcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdzKHBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgYSBzaW5nbGUgc3BlY2lmaWMgZmxhZyB3aXRoIHZhbGlkYXRpb24gYW5kIHVzZXIgY29uZmlybWF0aW9uICovXG4gIGFzeW5jIHNldEZsYWcocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZsYWdOYW1lID0gcGFyYW1zLkZMQUdOQU1FIVswXTtcbiAgICBjb25zdCBmbGFnID0gdGhpcy5mbGFncy5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG5cbiAgICBpZiAoIWZsYWcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0ZsYWcgbm90IGZvdW5kLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0Jvb2xlYW5GbGFnKGZsYWcpKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICcke2ZsYWdOYW1lfScgaXMgbm90IGEgYm9vbGVhbiBmbGFnLiBPbmx5IGJvb2xlYW4gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG90eXBlU3VjY2VzcyA9IGF3YWl0IHRoaXMucHJvdG90eXBlQ2hhbmdlcyhbZmxhZ05hbWVdLCBwYXJhbXMpO1xuICAgIGlmIChwcm90b3R5cGVTdWNjZXNzKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVVzZXJSZXNwb25zZShbZmxhZ05hbWVdLCBwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIG11bHRpcGxlIGZsYWdzIChhbGwgb3IgdW5jb25maWd1cmVkKSB3aXRoIHZhbGlkYXRpb24gYW5kIHVzZXIgY29uZmlybWF0aW9uICovXG4gIGFzeW5jIHNldE11bHRpcGxlRmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuZGVmYXVsdCAmJiAhdGhpcy5mbGFncy5zb21lKGYgPT4gZi51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ1RoZSAtLWRlZmF1bHQgb3B0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgQVdTIENESyBsaWJyYXJ5IHVzZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4gUGxlYXNlIHVwZ3JhZGUgdG8gMi4yMTIuMCBvciBhYm92ZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmbGFnc1RvU2V0ID0gdGhpcy5nZXRGbGFnc1RvU2V0KHBhcmFtcyk7XG4gICAgY29uc3QgcHJvdG90eXBlU3VjY2VzcyA9IGF3YWl0IHRoaXMucHJvdG90eXBlQ2hhbmdlcyhmbGFnc1RvU2V0LCBwYXJhbXMpO1xuXG4gICAgaWYgKHByb3RvdHlwZVN1Y2Nlc3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVXNlclJlc3BvbnNlKGZsYWdzVG9TZXQsIHBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERldGVybWluZXMgd2hpY2ggZmxhZ3Mgc2hvdWxkIGJlIHNldCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyAqL1xuICBwcml2YXRlIGdldEZsYWdzVG9TZXQocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBpZiAocGFyYW1zLmFsbCAmJiBwYXJhbXMuZGVmYXVsdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NcbiAgICAgICAgLmZpbHRlcihmbGFnID0+IHRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSlcbiAgICAgICAgLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuYWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbGFnc1xuICAgICAgICAuZmlsdGVyKGZsYWcgPT4gZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaXNFZmZlY3RpdmVWYWx1ZUVxdWFsVG9SZWNvbW1lbmRlZChmbGFnKSlcbiAgICAgICAgLmZpbHRlcihmbGFnID0+IHRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSlcbiAgICAgICAgLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmZsYWdzXG4gICAgICAgIC5maWx0ZXIoZmxhZyA9PiBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAuZmlsdGVyKGZsYWcgPT4gdGhpcy5pc0Jvb2xlYW5GbGFnKGZsYWcpKVxuICAgICAgICAubWFwKGZsYWcgPT4gZmxhZy5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0cyBmbGFncyB0aGF0IGRvbid0IGNhdXNlIHRlbXBsYXRlIGNoYW5nZXMgKi9cbiAgYXN5bmMgc2V0U2FmZUZsYWdzKHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjZGtKc29uID0gYXdhaXQgSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2Nkay5qc29uJyksICd1dGYtOCcpKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHAgfHwgY2RrSnNvbi5hcHA7XG5cbiAgICBjb25zdCBpc1VzaW5nVHNOb2RlID0gdGhpcy5hcHAuaW5jbHVkZXMoJ3RzLW5vZGUnKTtcbiAgICBpZiAoaXNVc2luZ1RzTm9kZSAmJiAhdGhpcy5hcHAuaW5jbHVkZXMoJy1UJykgJiYgIXRoaXMuYXBwLmluY2x1ZGVzKCctLXRyYW5zcGlsZU9ubHknKSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdSZXBlYXRlZCBzeW50aHMgd2l0aCB0cy1ub2RlIHdpbGwgdHlwZS1jaGVjayB0aGUgYXBwbGljYXRpb24gb24gZXZlcnkgc3ludGguIEFkZCAtLXRyYW5zcGlsZU9ubHkgdG8gY2RrLmpzb25cXCdzIFwiYXBwXCIgY29tbWFuZCB0byBtYWtlIHRoaXMgb3BlcmF0aW9uIGZhc3Rlci4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmNvbmZpZ3VyZWRGbGFncyA9IHRoaXMuZmxhZ3MuZmlsdGVyKGZsYWcgPT5cbiAgICAgIGZsYWcudXNlclZhbHVlID09PSB1bmRlZmluZWQgJiYgdGhpcy5pc0Jvb2xlYW5GbGFnKGZsYWcpKTtcblxuICAgIGlmICh1bmNvbmZpZ3VyZWRGbGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnQWxsIGZlYXR1cmUgZmxhZ3MgYXJlIGNvbmZpZ3VyZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplU2FmZXR5Q2hlY2soKTtcbiAgICBjb25zdCBzYWZlRmxhZ3MgPSBhd2FpdCB0aGlzLmJhdGNoVGVzdEZsYWdzKHVuY29uZmlndXJlZEZsYWdzKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBTYWZldHlDaGVjaygpO1xuXG4gICAgaWYgKHNhZmVGbGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0ZsYWdzIHRoYXQgY2FuIGJlIHNldCB3aXRob3V0IHRlbXBsYXRlIGNoYW5nZXM6Jyk7XG4gICAgICBmb3IgKGNvbnN0IGZsYWcgb2Ygc2FmZUZsYWdzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgLSAke2ZsYWcubmFtZX0gLT4gJHtmbGFnLnJlY29tbWVuZGVkVmFsdWV9YCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVVzZXJSZXNwb25zZShzYWZlRmxhZ3MubWFwKGZsYWcgPT4gZmxhZy5uYW1lKSwgeyAuLi5wYXJhbXMsIHJlY29tbWVuZGVkOiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ05vIG1vcmUgZmxhZ3MgY2FuIGJlIHNldCB3aXRob3V0IGNhdXNpbmcgdGVtcGxhdGUgY2hhbmdlcy4nKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZXMgdGhlIHNhZmV0eSBjaGVjayBieSByZWFkaW5nIGNvbnRleHQgYW5kIHN5bnRoZXNpemluZyBiYXNlbGluZSB0ZW1wbGF0ZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplU2FmZXR5Q2hlY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYmFzZUNvbnRleHQgPSBuZXcgQ2RrQXBwTXVsdGlDb250ZXh0KHByb2Nlc3MuY3dkKCkpO1xuICAgIHRoaXMuYmFzZUNvbnRleHRWYWx1ZXMgPSBhd2FpdCBiYXNlQ29udGV4dC5yZWFkKCk7XG5cbiAgICB0aGlzLmJhc2VsaW5lVGVtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nkay1iYXNlbGluZS0nKSk7XG4gICAgY29uc3QgYmFzZVNvdXJjZSA9IGF3YWl0IHRoaXMudG9vbGtpdC5mcm9tQ2RrQXBwKHRoaXMuYXBwLCB7XG4gICAgICBjb250ZXh0U3RvcmU6IGJhc2VDb250ZXh0LFxuICAgICAgb3V0ZGlyOiB0aGlzLmJhc2VsaW5lVGVtcERpcixcbiAgICB9KTtcblxuICAgIGNvbnN0IGJhc2VDeCA9IGF3YWl0IHRoaXMudG9vbGtpdC5zeW50aChiYXNlU291cmNlKTtcbiAgICBjb25zdCBiYXNlQXNzZW1ibHkgPSBiYXNlQ3guY2xvdWRBc3NlbWJseTtcbiAgICB0aGlzLmFsbFN0YWNrcyA9IGJhc2VBc3NlbWJseS5zdGFja3NSZWN1cnNpdmVseTtcbiAgICB0aGlzLnF1ZXVlID0gbmV3IFBRdWV1ZSh7IGNvbmN1cnJlbmN5OiA0IH0pO1xuICB9XG5cbiAgLyoqIENsZWFucyB1cCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgY3JlYXRlZCBkdXJpbmcgc2FmZXR5IGNoZWNrcyAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBTYWZldHlDaGVjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5iYXNlbGluZVRlbXBEaXIpIHtcbiAgICAgIGF3YWl0IGZzLnJlbW92ZSh0aGlzLmJhc2VsaW5lVGVtcERpcik7XG4gICAgICB0aGlzLmJhc2VsaW5lVGVtcERpciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKiogVGVzdHMgbXVsdGlwbGUgZmxhZ3MgdG9nZXRoZXIgYW5kIGlzb2xhdGVzIHVuc2FmZSBvbmVzIHVzaW5nIGJpbmFyeSBzZWFyY2ggKi9cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaFRlc3RGbGFncyhmbGFnczogRmVhdHVyZUZsYWdbXSk6IFByb21pc2U8RmVhdHVyZUZsYWdbXT4ge1xuICAgIGlmIChmbGFncy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IGFsbEZsYWdzQ29udGV4dCA9IHsgLi4udGhpcy5iYXNlQ29udGV4dFZhbHVlcyB9O1xuICAgIGZsYWdzLmZvckVhY2goZmxhZyA9PiB7XG4gICAgICBhbGxGbGFnc0NvbnRleHRbZmxhZy5uYW1lXSA9IGZsYWcucmVjb21tZW5kZWRWYWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFsbFNhZmUgPSBhd2FpdCB0aGlzLnRlc3RCYXRjaChhbGxGbGFnc0NvbnRleHQpO1xuICAgIGlmIChhbGxTYWZlKSByZXR1cm4gZmxhZ3M7XG5cbiAgICByZXR1cm4gdGhpcy5pc29sYXRlVW5zYWZlRmxhZ3MoZmxhZ3MpO1xuICB9XG5cbiAgLyoqIFRlc3RzIGlmIGEgc2V0IG9mIGNvbnRleHQgdmFsdWVzIGNhdXNlcyB0ZW1wbGF0ZSBjaGFuZ2VzIGJ5IHN5bnRoZXNpemluZyBhbmQgZGlmZmluZyAqL1xuICBwcml2YXRlIGFzeW5jIHRlc3RCYXRjaChjb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGVzdENvbnRleHQgPSBuZXcgTWVtb3J5Q29udGV4dChjb250ZXh0VmFsdWVzKTtcbiAgICBjb25zdCB0ZW1wRGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnY2RrLXRlc3QtJykpO1xuICAgIGNvbnN0IHRlc3RTb3VyY2UgPSBhd2FpdCB0aGlzLnRvb2xraXQuZnJvbUNka0FwcCh0aGlzLmFwcCwge1xuICAgICAgY29udGV4dFN0b3JlOiB0ZXN0Q29udGV4dCxcbiAgICAgIG91dGRpcjogdGVtcERpcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlc3RDeCA9IGF3YWl0IHRoaXMudG9vbGtpdC5zeW50aCh0ZXN0U291cmNlKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHRoaXMuYWxsU3RhY2tzKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHN0YWNrLnRlbXBsYXRlRnVsbFBhdGg7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBhd2FpdCB0aGlzLnRvb2xraXQuZGlmZih0ZXN0Q3gsIHtcbiAgICAgICAgICBtZXRob2Q6IERpZmZNZXRob2QuTG9jYWxGaWxlKHRlbXBsYXRlUGF0aCksXG4gICAgICAgICAgc3RhY2tzOiB7XG4gICAgICAgICAgICBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5QQVRURVJOX01VU1RfTUFUQ0hfU0lOR0xFLFxuICAgICAgICAgICAgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFja0RpZmYgb2YgT2JqZWN0LnZhbHVlcyhkaWZmKSkge1xuICAgICAgICAgIGlmIChzdGFja0RpZmYuZGlmZmVyZW5jZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJlbW92ZSh0ZW1wRGlyKTtcbiAgICB9XG4gIH1cblxuICAvKiogVXNlcyBiaW5hcnkgc2VhcmNoIHRvIGlzb2xhdGUgd2hpY2ggZmxhZ3MgYXJlIHNhZmUgdG8gc2V0IHdpdGhvdXQgdGVtcGxhdGUgY2hhbmdlcyAqL1xuICBwcml2YXRlIGFzeW5jIGlzb2xhdGVVbnNhZmVGbGFncyhmbGFnczogRmVhdHVyZUZsYWdbXSk6IFByb21pc2U8RmVhdHVyZUZsYWdbXT4ge1xuICAgIGNvbnN0IHNhZmVGbGFnczogRmVhdHVyZUZsYWdbXSA9IFtdO1xuXG4gICAgY29uc3QgcHJvY2Vzc0JhdGNoID0gYXN5bmMgKGJhdGNoOiBGZWF0dXJlRmxhZ1tdLCBjb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGlzU2FmZSA9IGF3YWl0IHRoaXMudGVzdEJhdGNoKFxuICAgICAgICAgIHsgLi4uY29udGV4dFZhbHVlcywgW2JhdGNoWzBdLm5hbWVdOiBiYXRjaFswXS5yZWNvbW1lbmRlZFZhbHVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc1NhZmUpIHNhZmVGbGFncy5wdXNoKGJhdGNoWzBdKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXRjaENvbnRleHQgPSB7IC4uLmNvbnRleHRWYWx1ZXMgfTtcbiAgICAgIGJhdGNoLmZvckVhY2goZmxhZyA9PiB7XG4gICAgICAgIGJhdGNoQ29udGV4dFtmbGFnLm5hbWVdID0gZmxhZy5yZWNvbW1lbmRlZFZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGlzU2FmZUJhdGNoID0gYXdhaXQgdGhpcy50ZXN0QmF0Y2goYmF0Y2hDb250ZXh0KTtcbiAgICAgIGlmIChpc1NhZmVCYXRjaCkge1xuICAgICAgICBzYWZlRmxhZ3MucHVzaCguLi5iYXRjaCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcihiYXRjaC5sZW5ndGggLyAyKTtcbiAgICAgIGNvbnN0IGxlZnQgPSBiYXRjaC5zbGljZSgwLCBtaWQpO1xuICAgICAgY29uc3QgcmlnaHQgPSBiYXRjaC5zbGljZShtaWQpO1xuXG4gICAgICB2b2lkIHRoaXMucXVldWUuYWRkKCgpID0+IHByb2Nlc3NCYXRjaChsZWZ0LCBjb250ZXh0VmFsdWVzKSk7XG4gICAgICB2b2lkIHRoaXMucXVldWUuYWRkKCgpID0+IHByb2Nlc3NCYXRjaChyaWdodCwgY29udGV4dFZhbHVlcykpO1xuICAgIH07XG5cbiAgICB2b2lkIHRoaXMucXVldWUuYWRkKCgpID0+IHByb2Nlc3NCYXRjaChmbGFncywgdGhpcy5iYXNlQ29udGV4dFZhbHVlcykpO1xuICAgIGF3YWl0IHRoaXMucXVldWUub25JZGxlKCk7XG4gICAgcmV0dXJuIHNhZmVGbGFncztcbiAgfVxuXG4gIC8qKiBQcm90b3R5cGVzIGZsYWcgY2hhbmdlcyBieSBzeW50aGVzaXppbmcgdGVtcGxhdGVzIGFuZCBzaG93aW5nIGRpZmZzIHRvIHRoZSB1c2VyICovXG4gIHByaXZhdGUgYXN5bmMgcHJvdG90eXBlQ2hhbmdlcyhmbGFnTmFtZXM6IHN0cmluZ1tdLCBwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYmFzZUNvbnRleHQgPSBuZXcgQ2RrQXBwTXVsdGlDb250ZXh0KHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGJhc2VDb250ZXh0VmFsdWVzID0gYXdhaXQgYmFzZUNvbnRleHQucmVhZCgpO1xuICAgIGNvbnN0IG1lbW9yeUNvbnRleHQgPSBuZXcgTWVtb3J5Q29udGV4dChiYXNlQ29udGV4dFZhbHVlcyk7XG5cbiAgICBjb25zdCBjZGtKc29uID0gYXdhaXQgSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2Nkay5qc29uJyksICd1dGYtOCcpKTtcbiAgICBjb25zdCBhcHAgPSBjZGtKc29uLmFwcDtcblxuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHRoaXMudG9vbGtpdC5mcm9tQ2RrQXBwKGFwcCwge1xuICAgICAgY29udGV4dFN0b3JlOiBiYXNlQ29udGV4dCxcbiAgICAgIG91dGRpcjogZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnY2RrLW9yaWdpbmFsLScpKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZU9iaiA9IGF3YWl0IHRoaXMuYnVpbGRVcGRhdGVPYmplY3QoZmxhZ05hbWVzLCBwYXJhbXMsIGJhc2VDb250ZXh0VmFsdWVzKTtcbiAgICBpZiAoIXVwZGF0ZU9iaikgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgbWVtb3J5Q29udGV4dC51cGRhdGUodXBkYXRlT2JqKTtcbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMudG9vbGtpdC5zeW50aChzb3VyY2UpO1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gY3guY2xvdWRBc3NlbWJseTtcblxuICAgIGNvbnN0IG1vZGlmaWVkU291cmNlID0gYXdhaXQgdGhpcy50b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgICBjb250ZXh0U3RvcmU6IG1lbW9yeUNvbnRleHQsXG4gICAgICBvdXRkaXI6IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nkay10ZW1wLScpKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ3ggPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgobW9kaWZpZWRTb3VyY2UpO1xuICAgIGNvbnN0IGFsbFN0YWNrcyA9IGFzc2VtYmx5LnN0YWNrc1JlY3Vyc2l2ZWx5O1xuXG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBhbGxTdGFja3MpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHN0YWNrLnRlbXBsYXRlRnVsbFBhdGg7XG4gICAgICBhd2FpdCB0aGlzLnRvb2xraXQuZGlmZihtb2RpZmllZEN4LCB7XG4gICAgICAgIG1ldGhvZDogRGlmZk1ldGhvZC5Mb2NhbEZpbGUodGVtcGxhdGVQYXRoKSxcbiAgICAgICAgc3RhY2tzOiB7XG4gICAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgICBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdDaGFuZ2VzKHVwZGF0ZU9iaiwgYmFzZUNvbnRleHRWYWx1ZXMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIERpc3BsYXlzIGEgc3VtbWFyeSBvZiBmbGFnIGNoYW5nZXMgc2hvd2luZyBvbGQgYW5kIG5ldyB2YWx1ZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwbGF5RmxhZ0NoYW5nZXModXBkYXRlT2JqOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgYmFzZUNvbnRleHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1xcbkZsYWcgY2hhbmdlczonKTtcbiAgICBmb3IgKGNvbnN0IFtmbGFnTmFtZSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZU9iaikpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGJhc2VDb250ZXh0VmFsdWVzW2ZsYWdOYW1lXTtcbiAgICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5ID0gY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgPyAnPHVuc2V0PicgOiBTdHJpbmcoY3VycmVudFZhbHVlKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgICAke2ZsYWdOYW1lfTogJHtjdXJyZW50RGlzcGxheX0g4oaSICR7bmV3VmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkcyB0aGUgdXBkYXRlIG9iamVjdCB3aXRoIG5ldyBmbGFnIHZhbHVlcyBiYXNlZCBvbiBwYXJhbWV0ZXJzIGFuZCBjdXJyZW50IGNvbnRleHQgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFVwZGF0ZU9iamVjdChmbGFnTmFtZXM6IHN0cmluZ1tdLCBwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zLCBiYXNlQ29udGV4dFZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PilcbiAgICA6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCBudWxsPiB7XG4gICAgY29uc3QgdXBkYXRlT2JqOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG4gICAgaWYgKGZsYWdOYW1lcy5sZW5ndGggPT09IDEgJiYgcGFyYW1zLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZsYWdOYW1lID0gZmxhZ05hbWVzWzBdO1xuICAgICAgY29uc3QgYm9vbFZhbHVlID0gcGFyYW1zLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICBpZiAoYmFzZUNvbnRleHRWYWx1ZXNbZmxhZ05hbWVdID09PSBib29sVmFsdWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIE5vIGNoYW5nZXMgbmVlZGVkLicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZU9ialtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZmxhZ05hbWUgb2YgZmxhZ05hbWVzKSB7XG4gICAgICAgIGNvbnN0IGZsYWcgPSB0aGlzLmZsYWdzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZsYWdOYW1lKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5lcnJvcihgRmxhZyAke2ZsYWdOYW1lfSBub3QgZm91bmQuYCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXJhbXMucmVjb21tZW5kZWRcbiAgICAgICAgICA/IGZsYWcucmVjb21tZW5kZWRWYWx1ZSBhcyBib29sZWFuXG4gICAgICAgICAgOiBTdHJpbmcoZGVmYXVsdFZhbHVlKGZsYWcpKSA9PT0gJ3RydWUnO1xuICAgICAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGVPYmo7XG4gIH1cblxuICAvKiogUHJvbXB0cyB1c2VyIGZvciBjb25maXJtYXRpb24gYW5kIGFwcGxpZXMgY2hhbmdlcyBpZiBhY2NlcHRlZCAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZVVzZXJSZXNwb25zZShmbGFnTmFtZXM6IHN0cmluZ1tdLCBwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXNlckFjY2VwdGVkID0gYXdhaXQgdGhpcy5pb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTkzMDAnLFxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSB3YW50IHRvIGFjY2VwdCB0aGVzZSBjaGFuZ2VzPycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZsYWdOYW1lcyxcbiAgICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0UmVzcG9uc2U6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZXJBY2NlcHRlZCkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RpZnlWYWx1ZXMoZmxhZ05hbWVzLCBwYXJhbXMpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIHZhbHVlKHMpIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNsZWFudXBUZW1wRGlyZWN0b3JpZXMoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBjcmVhdGVkIGR1cmluZyBmbGFnIG9wZXJhdGlvbnMgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwVGVtcERpcmVjdG9yaWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9yaWdpbmFsRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvcmlnaW5hbCcpO1xuICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKTtcbiAgICBhd2FpdCBmcy5yZW1vdmUob3JpZ2luYWxEaXIpO1xuICAgIGF3YWl0IGZzLnJlbW92ZSh0ZW1wRGlyKTtcbiAgfVxuXG4gIC8qKiBBY3R1YWxseSBtb2RpZmllcyB0aGUgY2RrLmpzb24gZmlsZSB3aXRoIHRoZSBuZXcgZmxhZyB2YWx1ZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb2RpZnlWYWx1ZXMoZmxhZ05hbWVzOiBzdHJpbmdbXSwgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICAgIGNvbnN0IGNka0pzb25Db250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoY2RrSnNvblBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGNka0pzb24gPSBKU09OLnBhcnNlKGNka0pzb25Db250ZW50KTtcblxuICAgIGlmIChmbGFnTmFtZXMubGVuZ3RoID09PSAxICYmICFwYXJhbXMuc2FmZSkge1xuICAgICAgY29uc3QgYm9vbFZhbHVlID0gcGFyYW1zLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICBjZGtKc29uLmNvbnRleHRbU3RyaW5nKGZsYWdOYW1lc1swXSldID0gYm9vbFZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBTZXR0aW5nIGZsYWcgJyR7ZmxhZ05hbWVzfScgdG86ICR7Ym9vbFZhbHVlfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGZsYWdOYW1lIG9mIGZsYWdOYW1lcykge1xuICAgICAgICBjb25zdCBmbGFnID0gdGhpcy5mbGFncy5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSkhO1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHBhcmFtcy5yZWNvbW1lbmRlZCB8fCBwYXJhbXMuc2FmZVxuICAgICAgICAgID8gZmxhZy5yZWNvbW1lbmRlZFZhbHVlIGFzIGJvb2xlYW5cbiAgICAgICAgICA6IFN0cmluZyhkZWZhdWx0VmFsdWUoZmxhZykpID09PSAndHJ1ZSc7XG4gICAgICAgIGNka0pzb24uY29udGV4dFtmbGFnTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGNka0pzb25QYXRoLCBKU09OLnN0cmluZ2lmeShjZGtKc29uLCBudWxsLCAyKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvKiogRGlzcGxheXMgZmxhZ3MgaW4gYSB0YWJsZSBmb3JtYXQsIGVpdGhlciBzcGVjaWZpYyBmbGFncyBvciBmaWx0ZXJlZCBieSBjcml0ZXJpYSAqL1xuICBhc3luYyBkaXNwbGF5RmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgRkxBR05BTUUsIGFsbCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKEZMQUdOQU1FICYmIEZMQUdOQU1FLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGxheVNwZWNpZmljRmxhZ3MoRkxBR05BTUUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IFtmbGFnc1RvRGlzcGxheSwgaGVhZGVyXSA9IGFsbFxuICAgICAgPyBbdGhpcy5mbGFncywgJ0FsbCBmZWF0dXJlIGZsYWdzJ11cbiAgICAgIDogW0ZsYWdPcGVyYXRpb25zLmZpbHRlck5lZWRzQXR0ZW50aW9uKHRoaXMuZmxhZ3MpLCAnVW5jb25maWd1cmVkIGZlYXR1cmUgZmxhZ3MnXTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhoZWFkZXIpO1xuICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdUYWJsZShmbGFnc1RvRGlzcGxheSk7XG5cbiAgICAvLyBBZGQgaGVscGZ1bCBtZXNzYWdlIGFmdGVyIGVtcHR5IHRhYmxlIHdoZW4gbm90IHVzaW5nIC0tYWxsXG4gICAgaWYgKCFhbGwgJiYgZmxhZ3NUb0Rpc3BsYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJycpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCfinIUgQWxsIGZlYXR1cmUgZmxhZ3MgYXJlIGFscmVhZHkgc2V0IHRvIHRoZWlyIHJlY29tbWVuZGVkIHZhbHVlcy4nKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnVXNlIFxcJ2NkayBmbGFncyAtLWFsbCAtLXVuc3RhYmxlPWZsYWdzXFwnIHRvIHNlZSBhbGwgZmxhZ3MgYW5kIHRoZWlyIGN1cnJlbnQgdmFsdWVzLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3Igc3BlY2lmaWMgZmxhZ3MgbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWVzICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGxheVNwZWNpZmljRmxhZ3MoZmxhZ05hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hdGNoaW5nRmxhZ3MgPSB0aGlzLmZsYWdzLmZpbHRlcihmID0+XG4gICAgICBmbGFnTmFtZXMuc29tZShzZWFyY2hUZXJtID0+IGYubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSkpKTtcblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5lcnJvcihgRmxhZyBtYXRjaGluZyBcIiR7ZmxhZ05hbWVzLmpvaW4oJywgJyl9XCIgbm90IGZvdW5kLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmxhZyA9IG1hdGNoaW5nRmxhZ3NbMF07XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYEZsYWcgbmFtZTogJHtmbGFnLm5hbWV9YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYERlc2NyaXB0aW9uOiAke2ZsYWcuZXhwbGFuYXRpb259YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFJlY29tbWVuZGVkIHZhbHVlOiAke2ZsYWcucmVjb21tZW5kZWRWYWx1ZX1gKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVmYXVsdCB2YWx1ZTogJHtkZWZhdWx0VmFsdWUoZmxhZyl9YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFVzZXIgdmFsdWU6ICR7ZmxhZy51c2VyVmFsdWV9YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYEVmZmVjdGl2ZSB2YWx1ZTogJHtlZmZlY3RpdmVWYWx1ZShmbGFnKX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYEZvdW5kICR7bWF0Y2hpbmdGbGFncy5sZW5ndGh9IGZsYWdzIG1hdGNoaW5nIFwiJHtmbGFnTmFtZXMuam9pbignLCAnKX1cImApO1xuICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdUYWJsZShtYXRjaGluZ0ZsYWdzKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHNvcnQgb3JkZXIgZm9yIGZsYWdzICovXG4gIHByaXZhdGUgZ2V0RmxhZ1NvcnRPcmRlcihmbGFnOiBGZWF0dXJlRmxhZyk6IG51bWJlciB7XG4gICAgaWYgKGZsYWcudXNlclZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAzO1xuICAgIGlmIChpc0VmZmVjdGl2ZVZhbHVlRXF1YWxUb1JlY29tbWVuZGVkKGZsYWcpKSByZXR1cm4gMTtcbiAgICByZXR1cm4gMjtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5cyBmbGFncyBpbiBhIGZvcm1hdHRlZCB0YWJsZSBncm91cGVkIGJ5IG1vZHVsZSBhbmQgc29ydGVkICovXG4gIGFzeW5jIGRpc3BsYXlGbGFnVGFibGUoZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3J0ZWRGbGFncyA9IFsuLi5mbGFnc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3Qgb3JkZXJBID0gdGhpcy5nZXRGbGFnU29ydE9yZGVyKGEpO1xuICAgICAgY29uc3Qgb3JkZXJCID0gdGhpcy5nZXRGbGFnU29ydE9yZGVyKGIpO1xuXG4gICAgICBpZiAob3JkZXJBICE9PSBvcmRlckIpIHJldHVybiBvcmRlckEgLSBvcmRlckI7XG4gICAgICBpZiAoYS5tb2R1bGUgIT09IGIubW9kdWxlKSByZXR1cm4gYS5tb2R1bGUubG9jYWxlQ29tcGFyZShiLm1vZHVsZSk7XG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvd3M6IHN0cmluZ1tdW10gPSBbWydGZWF0dXJlIEZsYWcnLCAnUmVjb21tZW5kZWQnLCAnVXNlcicsICdFZmZlY3RpdmUnXV07XG4gICAgbGV0IGN1cnJlbnRNb2R1bGUgPSAnJztcblxuICAgIHNvcnRlZEZsYWdzLmZvckVhY2goKGZsYWcpID0+IHtcbiAgICAgIGlmIChmbGFnLm1vZHVsZSAhPT0gY3VycmVudE1vZHVsZSkge1xuICAgICAgICByb3dzLnB1c2goW2NoYWxrLmJvbGQoYE1vZHVsZTogJHtmbGFnLm1vZHVsZX1gKSwgJycsICcnLCAnJ10pO1xuICAgICAgICBjdXJyZW50TW9kdWxlID0gZmxhZy5tb2R1bGU7XG4gICAgICB9XG4gICAgICByb3dzLnB1c2goW1xuICAgICAgICBgICAke2ZsYWcubmFtZX1gLFxuICAgICAgICBTdHJpbmcoZmxhZy5yZWNvbW1lbmRlZFZhbHVlKSxcbiAgICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCA/ICc8dW5zZXQ+JyA6IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSksXG4gICAgICAgIFN0cmluZyhlZmZlY3RpdmVWYWx1ZShmbGFnKSksXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvcm1hdHRlZFRhYmxlID0gZm9ybWF0VGFibGUocm93cywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oZm9ybWF0dGVkVGFibGUpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBhIGZsYWcgaGFzIGEgYm9vbGVhbiByZWNvbW1lbmRlZCB2YWx1ZSAqL1xuICBpc0Jvb2xlYW5GbGFnKGZsYWc6IEZlYXR1cmVGbGFnKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb21tZW5kZWQgPSBmbGFnLnJlY29tbWVuZGVkVmFsdWU7XG4gICAgcmV0dXJuIHR5cGVvZiByZWNvbW1lbmRlZCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICByZWNvbW1lbmRlZCA9PT0gJ3RydWUnIHx8XG4gICAgICByZWNvbW1lbmRlZCA9PT0gJ2ZhbHNlJztcbiAgfVxuXG4gIC8qKiBTaG93cyBoZWxwZnVsIHVzYWdlIGV4YW1wbGVzIGFuZCBhdmFpbGFibGUgY29tbWFuZCBvcHRpb25zICovXG4gIGFzeW5jIGRpc3BsYXlIZWxwTWVzc2FnZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1xcbicgKyBjaGFsay5ib2xkKCdBdmFpbGFibGUgb3B0aW9uczonKSk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLWludGVyYWN0aXZlICAgICAjIEludGVyYWN0aXZlIG1lbnUgdG8gbWFuYWdlIGZsYWdzJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLWFsbCAgICAgICAgICAgICAjIFNob3cgYWxsIGZsYWdzIChpbmNsdWRpbmcgY29uZmlndXJlZCBvbmVzKScpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICBjZGsgZmxhZ3MgLS1zZXQgLS1hbGwgLS1yZWNvbW1lbmRlZCAgICAjIFNldCBhbGwgZmxhZ3MgdG8gcmVjb21tZW5kZWQgdmFsdWVzJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLXNldCAtLWFsbCAtLWRlZmF1bHQgICAgICAgIyBTZXQgYWxsIGZsYWdzIHRvIGRlZmF1bHQgdmFsdWVzJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLXNldCAtLXVuY29uZmlndXJlZCAtLXJlY29tbWVuZGVkICAjIFNldCB1bmNvbmZpZ3VyZWQgZmxhZ3MgdG8gcmVjb21tZW5kZWQnKTtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJyAgY2RrIGZsYWdzIC0tc2V0IDxmbGFnLW5hbWU+IC0tdmFsdWUgPHRydWV8ZmFsc2U+ICAjIFNldCBzcGVjaWZpYyBmbGFnJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLXNhZmUgICAgICAgICAgICAjIFNhZmVseSBzZXQgZmxhZ3MgdGhhdCBkb25cXCd0IGNoYW5nZSB0ZW1wbGF0ZXMnKTtcbiAgfVxufVxuXG4vKiogQ2hlY2tzIGlmIHRoZSBmbGFncyBjdXJyZW50IGVmZmVjdGl2ZSB2YWx1ZSBtYXRjaGVzIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWZmZWN0aXZlVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZzogRmVhdHVyZUZsYWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFN0cmluZyhlZmZlY3RpdmVWYWx1ZShmbGFnKSkgPT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZWZmZWN0aXZlIHZhbHVlIG9mIGEgZmxhZyAodXNlciB2YWx1ZSBvciBkZWZhdWx0KVxuICovXG5mdW5jdGlvbiBlZmZlY3RpdmVWYWx1ZShmbGFnOiBGZWF0dXJlRmxhZykge1xuICByZXR1cm4gZmxhZy51c2VyVmFsdWUgPz8gZGVmYXVsdFZhbHVlKGZsYWcpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmbGFnLCBhc3N1bWUgaXQncyBgZmFsc2VgIGlmIG5vdCBnaXZlblxuICovXG5mdW5jdGlvbiBkZWZhdWx0VmFsdWUoZmxhZzogRmVhdHVyZUZsYWcpIHtcbiAgcmV0dXJuIGZsYWcudW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyID8/IGZhbHNlO1xufVxuIl19
@@ -1,4 +1,5 @@
1
1
  import type { IoHelper } from '../../api-private';
2
+ import type { JsPackageManager } from './package-manager';
2
3
  export interface CliInitOptions {
3
4
  /**
4
5
  * Template name to initialize
@@ -46,6 +47,11 @@ export interface CliInitOptions {
46
47
  * @default undefined
47
48
  */
48
49
  readonly templatePath?: string;
50
+ /**
51
+ * The package manager to use for installing dependencies. Only applicable for TypeScript and JavaScript projects.
52
+ * @default - If specified language is 'typescript' or 'javascript', 'npm' is selected. Otherwise, no package manager is used.
53
+ */
54
+ readonly packageManager?: JsPackageManager;
49
55
  readonly ioHelper: IoHelper;
50
56
  }
51
57
  /**