@cdktn/provider-schema 0.25.0-pre.3 → 0.25.0-pre.30

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.
@@ -15,15 +15,35 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.readModuleSchema = exports.sanitizeProviderSchema = exports.warnIfSchemaEmissionGaps = exports.readProviderSchema = exports.parseFQPN = exports.terraformInitWithRetry = exports.getFetchingCliVersion = void 0;
36
+ exports.parseFQPN = void 0;
37
+ exports.getFetchingCliVersion = getFetchingCliVersion;
38
+ exports.terraformInitWithRetry = terraformInitWithRetry;
39
+ exports.readProviderSchema = readProviderSchema;
40
+ exports.warnIfSchemaEmissionGaps = warnIfSchemaEmissionGaps;
41
+ exports.sanitizeProviderSchema = sanitizeProviderSchema;
42
+ exports.collectModuleProviderAliases = collectModuleProviderAliases;
43
+ exports.applyModuleProviderAliases = applyModuleProviderAliases;
44
+ exports.packageSubdir = packageSubdir;
45
+ exports.fetchedModuleDir = fetchedModuleDir;
46
+ exports.readModuleSchema = readModuleSchema;
27
47
  // Copyright (c) HashiCorp, Inc
28
48
  // SPDX-License-Identifier: MPL-2.0
29
49
  const fs = __importStar(require("fs-extra"));
@@ -51,7 +71,6 @@ function getFetchingCliVersion() {
51
71
  }
52
72
  return fetchingCliVersionPromise;
53
73
  }
54
- exports.getFetchingCliVersion = getFetchingCliVersion;
55
74
  // Provider binaries are downloaded from GitHub release CDNs during
56
75
  // `terraform init`, which intermittently returns 5xx. Retry on those
57
76
  // signatures only — real config/schema errors should still fail fast.
@@ -104,7 +123,6 @@ async function terraformInitWithRetry(options, maxAttempts = 5, baseDelayMs = 50
104
123
  }
105
124
  throw new Error("unreachable");
106
125
  }
107
- exports.terraformInitWithRetry = terraformInitWithRetry;
108
126
  const parseFQPN = (f) => {
109
127
  const [hostname, namespace, name] = f.split("/");
110
128
  if (!name) {
@@ -246,7 +264,6 @@ async function readProviderSchema(target) {
246
264
  }
247
265
  return sanitizeProviderSchema(providerSchema);
248
266
  }
249
- exports.readProviderSchema = readProviderSchema;
250
267
  /**
251
268
  * Warns when the CLI that produced a given provider schema predates one or
252
269
  * more schema-emission boundaries the project's declared `targetVersions`
@@ -291,7 +308,6 @@ async function warnIfSchemaEmissionGaps(schema, targetVersions) {
291
308
  commons_1.logger.warn(`provider schema fetched with ${cli.name} ${cli.version} — ${joinWithAnd(gapFamilies.map((family) => emission_check_1.SCHEMA_EMISSION_FAMILY_LABELS[family]))} will not be generated; run cdktn get with ${(0, emission_check_1.suggestedEmittingCliVersions)(gapFamilies)}`);
292
309
  }
293
310
  }
294
- exports.warnIfSchemaEmissionGaps = warnIfSchemaEmissionGaps;
295
311
  // The providers have some potential bugs that we want to pro-actively
296
312
  // fix here so that the rest of the code can assume a consistent schema.
297
313
  function sanitizeProviderSchema(schema) {
@@ -327,7 +343,162 @@ function sanitizeProviderSchema(schema) {
327
343
  });
328
344
  return schema;
329
345
  }
330
- exports.sanitizeProviderSchema = sanitizeProviderSchema;
346
+ const CONFIGURATION_ALIAS = /^([\w-]+)\.([\w-]+)$/;
347
+ // hcl2json hands HCL expressions back as interpolations, so a
348
+ // `configuration_aliases = [aws.global_region]` entry arrives as the string
349
+ // "${aws.global_region}". A .tf.json module writes the same reference as a
350
+ // plain string, which hcl2json passes through untouched.
351
+ const unwrapInterpolation = (value) => value.startsWith("${") && value.endsWith("}") ? value.slice(2, -1) : value;
352
+ const toArray = (item) => {
353
+ if (item === undefined || item === null)
354
+ return [];
355
+ return Array.isArray(item) ? item : [item];
356
+ };
357
+ /**
358
+ * Every occurrence of a block that hcl2json produced under one key.
359
+ *
360
+ * HCL blocks come back as an array with an entry per occurrence, a .tf.json
361
+ * block as a plain object. A module mixing both syntaxes gets a third shape:
362
+ * hcl2json merges the JSON file into the parsed HCL, and its deepMerge
363
+ * recurses into the HCL array instead of appending to it, leaving the JSON
364
+ * contribution hanging off the array as named properties. Those properties
365
+ * are an occurrence of their own - and one that neither iterating the array
366
+ * nor JSON.stringify would ever show.
367
+ */
368
+ const blockOccurrences = (block) => {
369
+ if (block === undefined || block === null)
370
+ return [];
371
+ if (!Array.isArray(block))
372
+ return [block];
373
+ const merged = Object.fromEntries(Object.entries(block).filter(([key]) => !/^\d+$/.test(key)));
374
+ return Object.keys(merged).length > 0 ? [...block, merged] : [...block];
375
+ };
376
+ /**
377
+ * Collects the provider configurations a module requires its caller to pass
378
+ * in, from the hcl2json representation of the module's directory.
379
+ *
380
+ * A module may declare `required_providers` in more than one `terraform`
381
+ * block, and may spread them across .tf and .tf.json files; every occurrence
382
+ * hcl2json reports is considered (see {@link blockOccurrences}).
383
+ *
384
+ * @internal exposed for testing
385
+ */
386
+ function collectModuleProviderAliases(parsedModule) {
387
+ const aliases = [];
388
+ const seen = new Set();
389
+ for (const terraformBlock of blockOccurrences(parsedModule === null || parsedModule === void 0 ? void 0 : parsedModule.terraform)) {
390
+ for (const requiredProviders of blockOccurrences(terraformBlock === null || terraformBlock === void 0 ? void 0 : terraformBlock.required_providers)) {
391
+ for (const declaration of Object.values(requiredProviders || {})) {
392
+ const provider = unwrapIfArray(declaration);
393
+ for (const entry of toArray(provider === null || provider === void 0 ? void 0 : provider.configuration_aliases)) {
394
+ const match = CONFIGURATION_ALIAS.exec(unwrapInterpolation(String(entry)));
395
+ if (!match)
396
+ continue;
397
+ const [, localName, alias] = match;
398
+ const key = `${localName}.${alias}`;
399
+ if (seen.has(key))
400
+ continue;
401
+ seen.add(key);
402
+ aliases.push({ localName, alias, source: provider === null || provider === void 0 ? void 0 : provider.source });
403
+ }
404
+ }
405
+ }
406
+ }
407
+ return aliases;
408
+ }
409
+ /**
410
+ * Declares the provider configurations that `aliases` names on the synthetic
411
+ * root config and passes them into the module call, which is what Terraform
412
+ * demands of anyone calling a module with `configuration_aliases`.
413
+ *
414
+ * The alias blocks stay empty: `terraform get` only builds the configuration
415
+ * tree, it never configures or installs a provider. Sources are mirrored from
416
+ * the module's own `required_providers` so a module referring to, say,
417
+ * hashicorp/aws under a non-default local name still resolves to the same
418
+ * provider in the root.
419
+ *
420
+ * @internal exposed for testing
421
+ */
422
+ function applyModuleProviderAliases(config, moduleKey, aliases) {
423
+ var _a;
424
+ const moduleCall = (_a = config.module) === null || _a === void 0 ? void 0 : _a[moduleKey];
425
+ if (!moduleCall || aliases.length === 0)
426
+ return config;
427
+ for (const { localName, alias, source } of aliases) {
428
+ if (source) {
429
+ config.terraform.required_providers = {
430
+ ...config.terraform.required_providers,
431
+ [localName]: { source },
432
+ };
433
+ }
434
+ config.provider = config.provider || {};
435
+ const blocks = toArray(config.provider[localName]);
436
+ if (!blocks.some((block) => block.alias === alias)) {
437
+ blocks.push({ alias });
438
+ }
439
+ config.provider[localName] = blocks;
440
+ moduleCall.providers = {
441
+ ...moduleCall.providers,
442
+ [`${localName}.${alias}`]: `${localName}.${alias}`,
443
+ };
444
+ }
445
+ return config;
446
+ }
447
+ /**
448
+ * The `//subdir` portion of a module source, if it has one, mirroring how
449
+ * Terraform unpacks a package into `.terraform/modules/<key>/<subdir>`.
450
+ *
451
+ * @internal exposed for testing
452
+ */
453
+ function packageSubdir(source) {
454
+ const [withoutQuery] = source.split("?");
455
+ const withoutGetterPrefix = withoutQuery.replace(/^[A-Za-z0-9]+::/, "");
456
+ const withoutScheme = withoutGetterPrefix.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\/+/, "");
457
+ const [, ...rest] = withoutScheme.split("//");
458
+ const subdir = rest.join("//").replace(/^\/+|\/+$/g, "");
459
+ return subdir || undefined;
460
+ }
461
+ /**
462
+ * Where the module Terraform just fetched ended up on disk.
463
+ *
464
+ * The manifest is the authority, but a `terraform get` that installed the
465
+ * module and then failed to validate the configuration around it leaves no
466
+ * manifest behind - so fall back to the locations Terraform installs into:
467
+ * local modules are read where they are, remote packages are unpacked into
468
+ * `.terraform/modules/<key>`.
469
+ *
470
+ * @internal exposed for testing
471
+ */
472
+ function fetchedModuleDir(workingDirectory, moduleKey, source, localSourceAbsolutePath) {
473
+ const manifestPath = path.join(workingDirectory, ".terraform", "modules", "modules.json");
474
+ if (fs.existsSync(manifestPath)) {
475
+ const moduleIndex = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
476
+ const record = moduleIndex.Modules.find((mod) => mod.Key === moduleKey);
477
+ if (record) {
478
+ return path.resolve(workingDirectory, record.Dir);
479
+ }
480
+ }
481
+ if (localSourceAbsolutePath) {
482
+ return localSourceAbsolutePath;
483
+ }
484
+ return path.join(workingDirectory, ".terraform", "modules", moduleKey, packageSubdir(source) || "");
485
+ }
486
+ /**
487
+ * Runs `terraform get` and hands the failure back instead of throwing it.
488
+ *
489
+ * Its diagnostics are not final (see {@link readModuleSchema}), so they go to
490
+ * the debug log rather than the terminal; the returned error still carries
491
+ * them on its `stderr` for callers that end up rethrowing it.
492
+ */
493
+ async function tryTerraformGet(outdir) {
494
+ try {
495
+ await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir, logStderrAsDebug: true }, undefined, undefined, false);
496
+ return undefined;
497
+ }
498
+ catch (error) {
499
+ return error;
500
+ }
501
+ }
331
502
  async function readModuleSchema(target) {
332
503
  let moduleSchema = {};
333
504
  await (0, commons_1.withTempDir)("fetchSchema", async () => {
@@ -350,12 +521,35 @@ async function readModuleSchema(target) {
350
521
  const outdir = process.cwd();
351
522
  const filePath = path.join(outdir, "main.tf.json");
352
523
  await fs.writeFile(filePath, JSON.stringify(config));
353
- await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir });
524
+ // `terraform get` is both our downloader and a full validation of the
525
+ // synthetic root config wrapped around the module. A module declaring
526
+ // `configuration_aliases` cannot validate until the root passes those
527
+ // configurations in, and their names are only knowable once the module is
528
+ // on disk - so this first run is a fetch we defer judgement on. Terraform
529
+ // installs the module either way; since 1.15 it just stops short of
530
+ // writing the module manifest when validation fails (terraform#38217
531
+ // dropped the error-to-warning downgrade that `terraform get` used to
532
+ // apply), which is what the second run below restores.
533
+ const fetchError = await tryTerraformGet(outdir);
534
+ const moduleDir = fetchedModuleDir(outdir, target.moduleKey, source, localSource);
535
+ const aliases = fs.existsSync(moduleDir)
536
+ ? collectModuleProviderAliases(await (0, hcl2json_1.convertFiles)(moduleDir))
537
+ : [];
538
+ if (aliases.length > 0) {
539
+ applyModuleProviderAliases(config, target.moduleKey, aliases);
540
+ await fs.writeFile(filePath, JSON.stringify(config));
541
+ await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir });
542
+ }
543
+ else if (fetchError) {
544
+ // nothing here was salvageable after all, so report the diagnostics that
545
+ // were held back while the fetch still had a second chance
546
+ commons_1.logger.error(fetchError.stderr || String(fetchError));
547
+ throw fetchError;
548
+ }
354
549
  if (config.module) {
355
550
  moduleSchema = await harvestModuleSchema(outdir, Object.keys(config.module));
356
551
  }
357
552
  });
358
553
  return moduleSchema;
359
554
  }
360
- exports.readModuleSchema = readModuleSchema;
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3Qiw4Q0FBK0M7QUFDL0MsNENBbUJ3QjtBQUN4QixxREFJMEI7QUFFMUIsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFdBQVcsQ0FBQztBQUU3RSxJQUFJLHlCQUFtRSxDQUFDO0FBRXhFOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHFCQUFxQjtJQUNuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMvQix5QkFBeUIsR0FBRyxJQUFBLGNBQUksRUFBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1NBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQXdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyx5QkFBeUIsQ0FBQztBQUNuQyxDQUFDO0FBUEQsc0RBT0M7QUFFRCxtRUFBbUU7QUFDbkUscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxNQUFNLDZCQUE2QixHQUFHO0lBQ3BDLGFBQWE7SUFDYixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7Q0FDbEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxPQUF3QixFQUN4QixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLGlCQUFpQixHQUFHLENBQUM7O0lBRXJCLEtBQUssSUFBSSxP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LENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBckNELDRDQXFDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgY29udmVydEZpbGVzIH0gZnJvbSBcIkBjZGt0bi9oY2wyanNvblwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVUeXBlLFxuICBCbG9jayxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgSW5wdXQsXG4gIE1vZHVsZUluZGV4LFxuICBNb2R1bGVTY2hlbWEsXG4gIFByb3ZpZGVyU2NoZW1hLFxuICBUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50LFxuICBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbiAgVmVyc2lvblNjaGVtYSxcbiAgZXhlYyxcbiAgaXNOZXN0ZWRUeXBlQXR0cmlidXRlLFxuICBsb2dnZXIsXG4gIHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgd2l0aFRlbXBEaXIsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHtcbiAgU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFMsXG4gIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyxcbiAgc3VnZ2VzdGVkRW1pdHRpbmdDbGlWZXJzaW9ucyxcbn0gZnJvbSBcIi4vZW1pc3Npb24tY2hlY2tcIjtcblxuY29uc3QgdGVycmFmb3JtQmluYXJ5TmFtZSA9IHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRSB8fCBcInRlcnJhZm9ybVwiO1xuXG5sZXQgZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZTogUHJvbWlzZTxUZXJyYWZvcm1DbGlWZXJzaW9uPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBmZXRjaGluZyBDTEkgKGB0ZXJyYWZvcm1gL2B0b2Z1YCBiaW5hcnlcbiAqIHJlc29sdmVkIHZpYSBgVEVSUkFGT1JNX0JJTkFSWV9OQU1FYCkgb25jZSBwZXIgcHJvY2VzcywgbWVtb2l6ZWQuXG4gKlxuICogVXNlZCBib3RoIHRvIHN0YW1wIGZldGNoZWQgcHJvdmlkZXIgc2NoZW1hcyAoYGNsaV9uYW1lYC9gY2xpX3ZlcnNpb25gKVxuICogYW5kIGFzIHRoZSBjYWNoZSBrZXkgc3VmZml4IGluIHJlYWQudHMsIHNpbmNlIHNjaGVtYSBlbWlzc2lvbiBpcyBmaXhlZFxuICogcGVyIENMSSBtaW5vciB2ZXJzaW9uLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nIGxpa2UgdGVycmFmb3JtSW5pdFdpdGhSZXRyeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk6IFByb21pc2U8VGVycmFmb3JtQ2xpVmVyc2lvbj4ge1xuICBpZiAoIWZldGNoaW5nQ2xpVmVyc2lvblByb21pc2UpIHtcbiAgICBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlID0gZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJ2ZXJzaW9uXCJdLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkudGhlbihwYXJzZVRlcnJhZm9ybUNsaVZlcnNpb24pO1xuICB9XG4gIHJldHVybiBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlO1xufVxuXG4vLyBQcm92aWRlciBiaW5hcmllcyBhcmUgZG93bmxvYWRlZCBmcm9tIEdpdEh1YiByZWxlYXNlIENETnMgZHVyaW5nXG4vLyBgdGVycmFmb3JtIGluaXRgLCB3aGljaCBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gUmV0cnkgb24gdGhvc2Vcbi8vIHNpZ25hdHVyZXMgb25seSDigJQgcmVhbCBjb25maWcvc2NoZW1hIGVycm9ycyBzaG91bGQgc3RpbGwgZmFpbCBmYXN0LlxuY29uc3QgVFJBTlNJRU5UX0lOSVRfRVJST1JfUEFUVEVSTlMgPSBbXG4gIC9cXGI1MFsyMzRdXFxiLyxcbiAgL0JhZCBHYXRld2F5L2ksXG4gIC9TZXJ2aWNlIFVuYXZhaWxhYmxlL2ksXG4gIC9HYXRld2F5IFRpbWVvdXQvaSxcbiAgL0VDT05OUkVTRVQvaSxcbiAgL0VUSU1FRE9VVC9pLFxuICAvRUFJX0FHQUlOL2ksXG4gIC91bmV4cGVjdGVkIEVPRi9pLFxuXTtcblxuLyoqXG4gKiBSdW5zIGB0ZXJyYWZvcm0gaW5pdGAgYW5kIHJldHJpZXMgb24gdHJhbnNpZW50IEhUVFAvbmV0d29yayBmYWlsdXJlcy5cbiAqXG4gKiBQcm92aWRlciBiaW5hcmllcyBhcmUgcHVsbGVkIGZyb20gR2l0SHViJ3MgcmVsZWFzZSBDRE4sIHdoaWNoXG4gKiBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gVGhlIHJldHJ5IG9ubHkgZmlyZXMgd2hlbiBzdGRlcnIgbWF0Y2hlcyBhXG4gKiBrbm93biB0cmFuc2llbnQgcGF0dGVybiDigJQgcmVhbCBlcnJvcnMgKGJhZCB2ZXJzaW9uLCBzY2hlbWEgcGFyc2UsIGV0Yy4pXG4gKiBzdGlsbCBmYWlsIG9uIHRoZSBmaXJzdCBhdHRlbXB0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gc3Bhd24gb3B0aW9ucyBmb3J3YXJkZWQgdG8gYGV4ZWNgIChgY3dkYCBpcyByZXF1aXJlZCBzb1xuICogICBgdGVycmFmb3JtIGluaXRgIHJ1bnMgaW5zaWRlIHRoZSB0ZW1wIGRpciBob2xkaW5nIGBtYWluLnRmLmpzb25gKVxuICogQHBhcmFtIG1heEF0dGVtcHRzIC0gdG90YWwgYXR0ZW1wdHMgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGNhbGw7IHRoZSBudW1iZXJcbiAqICAgb2YgcmV0cmllcyBpcyBgbWF4QXR0ZW1wdHMgLSAxYC4gRGVmYXVsdHMgdG8gNSAoMSBpbml0aWFsICsgNCByZXRyaWVzKVxuICogQHBhcmFtIGJhc2VEZWxheU1zIC0gZGVsYXkgYmVmb3JlIHRoZSBmaXJzdCByZXRyeS4gVGVzdHMgcGFzcyBgMGAgdG8gc2tpcFxuICogICB3YWl0cy4gRGVmYXVsdHMgdG8gNTAwMG1zXG4gKiBAcGFyYW0gYmFja29mZk11bHRpcGxpZXIgLSBmYWN0b3IgYXBwbGllZCB0byB0aGUgZGVsYXkgb24gZWFjaCBzdWJzZXF1ZW50XG4gKiAgIHJldHJ5IChzbyByZXRyaWVzIHdhaXQgYGJhc2VEZWxheU1zICogbXVsdGlwbGllcl4oYXR0ZW1wdC0xKWApLiBEZWZhdWx0c1xuICogICB0byAyICgxcyDihpIgMnMg4oaSIDRzIOKApilcbiAqIEByZXR1cm5zIHN0ZG91dCBmcm9tIHRoZSBzdWNjZXNzZnVsIGB0ZXJyYWZvcm0gaW5pdGAgaW52b2NhdGlvblxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmcgfSxcbiAgbWF4QXR0ZW1wdHMgPSA1LFxuICBiYXNlRGVsYXlNcyA9IDUwMDAsXG4gIGJhY2tvZmZNdWx0aXBsaWVyID0gMixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1wiaW5pdFwiXSwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3Qgc3RkZXJyOiBzdHJpbmcgPSBlcnJvcj8uc3RkZXJyID8/IFwiXCI7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSBUUkFOU0lFTlRfSU5JVF9FUlJPUl9QQVRURVJOUy5zb21lKChwKSA9PlxuICAgICAgICBwLnRlc3Qoc3RkZXJyKSxcbiAgICAgICk7XG4gICAgICBpZiAoIXRyYW5zaWVudCB8fCBhdHRlbXB0ID09PSBtYXhBdHRlbXB0cykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbGF5TXMgPSBiYXNlRGVsYXlNcyAqIGJhY2tvZmZNdWx0aXBsaWVyICoqIChhdHRlbXB0IC0gMSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYHRlcnJhZm9ybSBpbml0IGZhaWxlZCB3aXRoIGEgdHJhbnNpZW50IGVycm9yLCByZXRyeWluZyBpbiAke2RlbGF5TXN9bXMgKGF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzIC0gMX0pYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcInVucmVhY2hhYmxlXCIpO1xufVxuXG4vKipcbiAqIEZ1bGx5IFF1YWxpZmllZCBwcm92aWRlciBuYW1lIGluIHRoZSBmb3JtYXQ6XG4gKiBsaWtlIGUuZy4gcmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9hd3NcbiAqL1xuZXhwb3J0IHR5cGUgRlFQTiA9IHN0cmluZyAmIHsgX190eXBlOiBcIkZ1bGx5UXVhbGlmaWVkUHJvdmlkZXJOYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVySG9zdG5hbWUgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlckhvc3RuYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVyTmFtZXNwYWNlID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lc3BhY2VcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJOYW1lID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lXCIgfTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlRlFQTiA9IChmOiBGUVBOKSA9PiB7XG4gIGNvbnN0IFtob3N0bmFtZSwgbmFtZXNwYWNlLCBuYW1lXSA9IGYuc3BsaXQoXCIvXCIpO1xuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGhhbmRsZSAke2Z9YCk7XG4gIH1cbiAgcmV0dXJuIHsgaG9zdG5hbWUsIG5hbWVzcGFjZSwgbmFtZSB9IGFzIHtcbiAgICBob3N0bmFtZTogUHJvdmlkZXJIb3N0bmFtZTtcbiAgICBuYW1lc3BhY2U6IFByb3ZpZGVyTmFtZXNwYWNlO1xuICAgIG5hbWU6IFByb3ZpZGVyTmFtZTtcbiAgfTtcbn07XG5cbmNvbnN0IHVud3JhcElmQXJyYXkgPSA8VD4oaXRlbTogVCB8IFRbXSk6IFQgPT5cbiAgQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW1bMF0gOiBpdGVtO1xuXG5jb25zdCB0cmFuc2Zvcm1WYXJpYWJsZXMgPSAodmFyaWFibGVzOiBhbnkpID0+IHtcbiAgY29uc3QgcmVzdWx0OiBJbnB1dFtdID0gW107XG5cbiAgaWYgKCF2YXJpYWJsZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHZhcmlhYmxlcykpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHVud3JhcElmQXJyYXkodmFyaWFibGVzW25hbWVdKTtcbiAgICBsZXQgdmFyaWFibGVUeXBlOiBzdHJpbmc7XG5cbiAgICBpZiAoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcInR5cGVcIikgPT0gZmFsc2UgJiZcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFwiKSA9PSB0cnVlXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YXJpYWJsZVtcImRlZmF1bHRcIl0pIHtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImJvb2xcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwibnVtYmVyXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJhbnlcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VmFyaWFibGVUeXBlID0gdmFyaWFibGVbXCJ0eXBlXCJdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcmF3VmFyaWFibGVUeXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJhd1ZhcmlhYmxlVHlwZS5zdGFydHNXaXRoKFwiJHtcIikgJiZcbiAgICAgICAgcmF3VmFyaWFibGVUeXBlLmVuZHNXaXRoKFwifVwiKSAmJlxuICAgICAgICAhcmF3VmFyaWFibGVUeXBlLmluY2x1ZGVzKFwiXFxuXCIpXG4gICAgICApIHtcbiAgICAgICAgdmFyaWFibGVUeXBlID0gcmF3VmFyaWFibGVUeXBlLnNsaWNlKDIsIC0xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYW55XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbTogSW5wdXQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogdmFyaWFibGVUeXBlLFxuICAgICAgZGVzY3JpcHRpb246IHZhcmlhYmxlW1wiZGVzY3JpcHRpb25cIl0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXF1aXJlZDogdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0XCIpID09IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoIWl0ZW0ucmVxdWlyZWQpIHtcbiAgICAgIGl0ZW1bXCJkZWZhdWx0XCJdID0gdmFyaWFibGVbXCJkZWZhdWx0XCJdO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybU91dHB1dHMgPSAob3V0cHV0czogYW55KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGlmIChvdXRwdXRzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB1bndyYXBJZkFycmF5KG91dHB1dHNbbmFtZV0pO1xuXG4gICAgICBjb25zdCBpdGVtOiBhbnkgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvdXRwdXRbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBoYXJ2ZXN0TW9kdWxlU2NoZW1hID0gYXN5bmMgKFxuICB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcsXG4gIG1vZHVsZXM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9PiB7XG4gIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgXCJtb2R1bGVzLmpzb25cIixcbiAgKTtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IGZpbmQgJHtmaWxlTmFtZX1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtb2R1bGVJbmRleCA9IEpTT04ucGFyc2UoXG4gICAgZnMucmVhZEZpbGVTeW5jKGZpbGVOYW1lLCBcInV0Zi04XCIpLFxuICApIGFzIE1vZHVsZUluZGV4O1xuXG4gIGZvciAoY29uc3QgbW9kIG9mIG1vZHVsZXMpIHtcbiAgICBjb25zdCBtID0gbW9kdWxlSW5kZXguTW9kdWxlcy5maW5kKChvdGhlcikgPT4gbW9kID09PSBvdGhlci5LZXkpO1xuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgJHttfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IGNvbnZlcnRGaWxlcyhwYXRoLmpvaW4od29ya2luZ0RpcmVjdG9yeSwgbS5EaXIpKTtcblxuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IHBhcnNlICR7bS5EaXJ9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hOiBNb2R1bGVTY2hlbWEgPSB7XG4gICAgICBpbnB1dHM6IHRyYW5zZm9ybVZhcmlhYmxlcyhwYXJzZWQudmFyaWFibGUpLFxuICAgICAgb3V0cHV0czogdHJhbnNmb3JtT3V0cHV0cyhwYXJzZWQub3V0cHV0KSxcbiAgICAgIG5hbWU6IG1vZCxcbiAgICB9O1xuXG4gICAgcmVzdWx0W21vZF0gPSBzY2hlbWE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZnVuY3Rpb24gam9pbldpdGhBbmQoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA8PSAxKSByZXR1cm4gaXRlbXMuam9pbihcIlwiKTtcbiAgcmV0dXJuIGAke2l0ZW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiLCBcIil9IGFuZCAke2l0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdfWA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtQ29uZmlnIHtcbiAgcHJvdmlkZXI/OiB7IFtuYW1lOiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gIHRlcnJhZm9ybToge1xuICAgIHJlcXVpcmVkX3Byb3ZpZGVycz86IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB7IHNvdXJjZT86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG4gIG1vZHVsZT86IHsgW25hbWU6IHN0cmluZ106IHsgc291cmNlOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFByb3ZpZGVyU2NoZW1hKFxuICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuKSB7XG4gIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgIHByb3ZpZGVyOiB7fSxcbiAgICB0ZXJyYWZvcm06IHtcbiAgICAgIHJlcXVpcmVkX3Byb3ZpZGVyczoge30sXG4gICAgfSxcbiAgfTtcblxuICBjb25maWcucHJvdmlkZXIhW3RhcmdldC5uYW1lXSA9IHt9O1xuICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyFbdGFyZ2V0Lm5hbWVdID0ge1xuICAgIHZlcnNpb246IHRhcmdldC52ZXJzaW9uLFxuICAgIHNvdXJjZTogdGFyZ2V0LnNvdXJjZSxcbiAgfTtcblxuICBsZXQgcHJvdmlkZXJTY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0geyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hQcm92aWRlclNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgcHJvdmlkZXJTY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJwcm92aWRlcnNcIiwgXCJzY2hlbWFcIiwgXCItanNvblwiXSwge1xuICAgICAgICBjd2Q6IG91dGRpcixcbiAgICAgIH0pLFxuICAgICkgYXMgUHJvdmlkZXJTY2hlbWE7XG5cbiAgICBjb25zdCB2ZXJzaW9uU2NoZW1hID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBWZXJzaW9uU2NoZW1hO1xuXG4gICAgcHJvdmlkZXJTY2hlbWEucHJvdmlkZXJfdmVyc2lvbnMgPSB2ZXJzaW9uU2NoZW1hLnByb3ZpZGVyX3NlbGVjdGlvbnM7XG4gIH0pO1xuXG4gIC8vIFN0YW1wIHRoZSBmZXRjaGluZyBDTEkncyBpZGVudGl0eSBzbyBkb3duc3RyZWFtIGNvbnN1bWVycyBjYW4gcmVhc29uXG4gIC8vIGFib3V0IHdoaWNoIG5ld2VyLXByb3RvY29sIHNlY3Rpb25zIHRoaXMgZmV0Y2ggY291bGQgcG9zc2libHkgaGF2ZVxuICAvLyBlbWl0dGVkLiBOZXZlciBmYWlsIHRoZSBmZXRjaCBvdmVyIHRoaXMgLSBpdCdzIGJlc3QtZWZmb3J0IG1ldGFkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIHByb3ZpZGVyU2NoZW1hLmNsaV9uYW1lID0gY2xpLm5hbWU7XG4gICAgcHJvdmlkZXJTY2hlbWEuY2xpX3ZlcnNpb24gPSBjbGkudmVyc2lvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiB0byBzdGFtcCBwcm92aWRlciBzY2hlbWE6ICR7ZXJyb3J9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNhbml0aXplUHJvdmlkZXJTY2hlbWEocHJvdmlkZXJTY2hlbWEpO1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gdGhlIENMSSB0aGF0IHByb2R1Y2VkIGEgZ2l2ZW4gcHJvdmlkZXIgc2NoZW1hIHByZWRhdGVzIG9uZSBvclxuICogbW9yZSBzY2hlbWEtZW1pc3Npb24gYm91bmRhcmllcyB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGB0YXJnZXRWZXJzaW9uc2BcbiAqIGNhcmUgYWJvdXQgKHNlZSBlbWlzc2lvbi1jaGVjay50cykgLSBpLmUuIHNvbWUgbmV3ZXItcHJvdG9jb2wgc2VjdGlvbnNcbiAqIChmdW5jdGlvbnMsIGVwaGVtZXJhbCByZXNvdXJjZXMsIC4uLikgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgZ2VuZXJhdGVkXG4gKiBiaW5kaW5ncyBldmVuIHRob3VnaCB0aGUgc2NoZW1hIGZldGNoIGl0c2VsZiBzdWNjZWVkZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRlY291cGxlZCBmcm9tIHRoZSBmZXRjaCBwYXRoIChyZWFkUHJvdmlkZXJTY2hlbWEpIHNvIGl0XG4gKiBhbHNvIHJ1bnMgZm9yIHNjaGVtYXMgc2VydmVkIGZyb20gdGhlIG9uLWRpc2sgY2FjaGU6IGNhY2hlZCBKU09OIGNhcnJpZXNcbiAqIHRoZSBzYW1lIGBjbGlfbmFtZWAvYGNsaV92ZXJzaW9uYCBzdGFtcHMgYSBmcmVzaCBmZXRjaCB3b3VsZCBoYXZlXG4gKiB3cml0dGVuICh0aGUgY2FjaGUga2V5IGFscmVhZHkgc2VnbWVudHMgYnkgQ0xJIHByb2R1Y3QrbWlub3IpLCBzbyB0aGUgZ2FwXG4gKiBjaGVjayBpcyBqdXN0IGFzIG1lYW5pbmdmdWwgb24gYSBjYWNoZSBoaXQgYXMgb24gYSBtaXNzLlxuICpcbiAqIE5vLW9wIHdpdGhvdXQgYHRhcmdldFZlcnNpb25zYCAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB0aGUgQ0xJXG4gKiBhZ2FpbnN0LiBGYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MncyBmZXRjaGluZyBDTEkgdmVyc2lvbiB3aGVuXG4gKiB0aGUgc2NoZW1hIGl0c2VsZiBpc24ndCBzdGFtcGVkIChlLmcuIG9sZGVyIGNhY2hlIGVudHJpZXMgd3JpdHRlbiBiZWZvcmVcbiAqIHN0YW1waW5nIGV4aXN0ZWQpLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMoXG4gIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gIHRhcmdldFZlcnNpb25zPzogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF0YXJnZXRWZXJzaW9ucykgcmV0dXJuO1xuXG4gIGxldCBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb247XG4gIGlmIChzY2hlbWEuY2xpX25hbWUgJiYgc2NoZW1hLmNsaV92ZXJzaW9uKSB7XG4gICAgaWYgKHNjaGVtYS5jbGlfbmFtZSAhPT0gXCJ0ZXJyYWZvcm1cIiAmJiBzY2hlbWEuY2xpX25hbWUgIT09IFwib3BlbnRvZnVcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGkgPSB7IG5hbWU6IHNjaGVtYS5jbGlfbmFtZSwgdmVyc2lvbjogc2NoZW1hLmNsaV92ZXJzaW9uIH07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSB2ZXJzaW9uIHRvIGNoZWNrIGZvciBzY2hlbWEgZW1pc3Npb24gZ2FwczogJHtlcnJvcn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBnYXBGYW1pbGllcyA9IGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhjbGksIHRhcmdldFZlcnNpb25zKTtcbiAgaWYgKGdhcEZhbWlsaWVzLmxlbmd0aCA+IDAgJiYgY2xpLnZlcnNpb24pIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBwcm92aWRlciBzY2hlbWEgZmV0Y2hlZCB3aXRoICR7Y2xpLm5hbWV9ICR7Y2xpLnZlcnNpb259IOKAlCAke2pvaW5XaXRoQW5kKFxuICAgICAgICBnYXBGYW1pbGllcy5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFNbZmFtaWx5XSksXG4gICAgICApfSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQ7IHJ1biBjZGt0biBnZXQgd2l0aCAke3N1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMoXG4gICAgICAgIGdhcEZhbWlsaWVzLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gVGhlIHByb3ZpZGVycyBoYXZlIHNvbWUgcG90ZW50aWFsIGJ1Z3MgdGhhdCB3ZSB3YW50IHRvIHByby1hY3RpdmVseVxuLy8gZml4IGhlcmUgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBjYW4gYXNzdW1lIGEgY29uc2lzdGVudCBzY2hlbWEuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVQcm92aWRlclNjaGVtYShzY2hlbWE6IFByb3ZpZGVyU2NoZW1hKTogUHJvdmlkZXJTY2hlbWEge1xuICAvLyBNYWlubHkgc29tZSBhdHRyaWJ1dGVzIGFyZSBcImRvdWJsZWRcIiwgZS5nLiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXVxuICAvLyBpbnN0ZWFkIG9mIFtcImxpc3RcIiwgXCJzdHJpbmdcIl1cbiAgZnVuY3Rpb24gYXR0cmlidXRlRG91YmxpbmdGaXgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGUge1xuICAgIGlmIChpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0cmlidXRlKSB8fCAhQXJyYXkuaXNBcnJheShhdHRyaWJ1dGUudHlwZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBhdHRyaWJ1dGUudHlwZS5sZW5ndGggPT09IDJcbiAgICAgICAgPyBhdHRyaWJ1dGUudHlwZVxuICAgICAgICA6IChhdHRyaWJ1dGUudHlwZSBhcyBzdHJpbmdbXSkuc2xpY2UoMCwgMik7IC8vIFRoZSB0eXBlcyB0ZWxsIHVzIHRoaXMgY2FuJ3QgaGFwcGVuLCByZWFsaXR5IGJlZ3MgdG8gZGlmZmVyXG5cbiAgICBhdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgQXR0cmlidXRlVHlwZTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gTXV0YXRlcyBibG9jayB3aXRoIHRoZSBmaXhcbiAgZnVuY3Rpb24gc2FuaXRpemVCbG9jayhibG9jazogQmxvY2spIHtcbiAgICBPYmplY3QudmFsdWVzKGJsb2NrLmF0dHJpYnV0ZXMgfHwge30pLmZvckVhY2goYXR0cmlidXRlRG91YmxpbmdGaXgpO1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYmxvY2tfdHlwZXMgfHwge30pLmZvckVhY2goKGJsb2NrVHlwZSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhibG9ja1R5cGUuYmxvY2spO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LnZhbHVlcyhzY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICBjb25zdCBlbnRpdGllcyA9IFtcbiAgICAgIHByb3ZpZGVyLnByb3ZpZGVyLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZGF0YV9zb3VyY2Vfc2NoZW1hcyB8fCB7fSksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHByb3ZpZGVyLmVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICBdO1xuXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICBzYW5pdGl6ZUJsb2NrKGVudGl0eS5ibG9jayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kdWxlU2NoZW1hKHRhcmdldDogQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KSB7XG4gIGxldCBtb2R1bGVTY2hlbWE6IFJlY29yZDxzdHJpbmcsIE1vZHVsZVNjaGVtYT4gPSB7fTtcblxuICBhd2FpdCB3aXRoVGVtcERpcihcImZldGNoU2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWc6IFRlcnJhZm9ybUNvbmZpZyA9IHtcbiAgICAgIHRlcnJhZm9ybToge30sXG4gICAgfTtcblxuICAgIGlmICghY29uZmlnLm1vZHVsZSkgY29uZmlnLm1vZHVsZSA9IHt9O1xuICAgIGxldCBzb3VyY2U6IHN0cmluZyA9IHRhcmdldC5zb3VyY2U7XG5cbiAgICBjb25zdCBsb2NhbFNvdXJjZSA9ICh0YXJnZXQuY29uc3RyYWludCBhcyBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50KVxuICAgICAgLmxvY2FsU291cmNlQWJzb2x1dGVQYXRoO1xuICAgIGlmIChsb2NhbFNvdXJjZSkge1xuICAgICAgLy8gY3JlYXRlIHJlbGF0aXZlIHBhdGggdG8gbW9kdWxlIGluIHRoZSB1c2VyIHByb2plY3RcbiAgICAgIHNvdXJjZSA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbG9jYWxTb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbmZpZy5tb2R1bGVbdGFyZ2V0Lm1vZHVsZUtleV0gPSB7IHNvdXJjZTogc291cmNlIH07XG4gICAgaWYgKHRhcmdldC52ZXJzaW9uKSB7XG4gICAgICBjb25maWcubW9kdWxlW3RhcmdldC5tb2R1bGVLZXldW1widmVyc2lvblwiXSA9IHRhcmdldC52ZXJzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IG91dGRpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3V0ZGlyLCBcIm1haW4udGYuanNvblwiKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuXG4gICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJnZXRcIl0sIHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgaWYgKGNvbmZpZy5tb2R1bGUpIHtcbiAgICAgIG1vZHVsZVNjaGVtYSA9IGF3YWl0IGhhcnZlc3RNb2R1bGVTY2hlbWEoXG4gICAgICAgIG91dGRpcixcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnLm1vZHVsZSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1vZHVsZVNjaGVtYTtcbn1cbiJdfQ==
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4Q0Esc0RBT0M7QUFvQ0Qsd0RBeUJDO0FBOEtELGdEQXFEQztBQXNCRCw0REFpQ0M7QUFJRCx3REF1Q0M7QUE2REQsb0VBK0JDO0FBZUQsZ0VBOEJDO0FBUUQsc0NBV0M7QUFhRCw0Q0FtQ0M7QUF5QkQsNENBb0VDO0FBaHVCRCwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDZDQUErQjtBQUMvQiwyQ0FBNkI7QUFFN0IsOENBQStDO0FBQy9DLDRDQW1Cd0I7QUFDeEIscURBSTBCO0FBRTFCLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxXQUFXLENBQUM7QUFFN0UsSUFBSSx5QkFBbUUsQ0FBQztBQUV4RTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixxQkFBcUI7SUFDbkMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDL0IseUJBQXlCLEdBQUcsSUFBQSxjQUFJLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNqRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtTQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLGtDQUF3QixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8seUJBQXlCLENBQUM7QUFDbkMsQ0FBQztBQUVELG1FQUFtRTtBQUNuRSxxRUFBcUU7QUFDckUsc0VBQXNFO0FBQ3RFLE1BQU0sNkJBQTZCLEdBQUc7SUFDcEMsYUFBYTtJQUNiLGNBQWM7SUFDZCxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixZQUFZO0lBQ1osWUFBWTtJQUNaLGlCQUFpQjtDQUNsQixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7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c0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBjb252ZXJ0RmlsZXMgfSBmcm9tIFwiQGNka3RuL2hjbDJqc29uXCI7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGUsXG4gIEF0dHJpYnV0ZVR5cGUsXG4gIEJsb2NrLFxuICBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQsXG4gIENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuICBJbnB1dCxcbiAgTW9kdWxlSW5kZXgsXG4gIE1vZHVsZVNjaGVtYSxcbiAgUHJvdmlkZXJTY2hlbWEsXG4gIFRlcnJhZm9ybUNsaVZlcnNpb24sXG4gIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQsXG4gIFRlcnJhZm9ybVRhcmdldFZlcnNpb25zLFxuICBWZXJzaW9uU2NoZW1hLFxuICBleGVjLFxuICBpc05lc3RlZFR5cGVBdHRyaWJ1dGUsXG4gIGxvZ2dlcixcbiAgcGFyc2VUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICB3aXRoVGVtcERpcixcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQge1xuICBTQ0hFTUFfRU1JU1NJT05fRkFNSUxZX0xBQkVMUyxcbiAgY2hlY2tTY2hlbWFFbWlzc2lvbkdhcEZhbWlsaWVzLFxuICBzdWdnZXN0ZWRFbWl0dGluZ0NsaVZlcnNpb25zLFxufSBmcm9tIFwiLi9lbWlzc2lvbi1jaGVja1wiO1xuXG5jb25zdCB0ZXJyYWZvcm1CaW5hcnlOYW1lID0gcHJvY2Vzcy5lbnYuVEVSUkFGT1JNX0JJTkFSWV9OQU1FIHx8IFwidGVycmFmb3JtXCI7XG5cbmxldCBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlOiBQcm9taXNlPFRlcnJhZm9ybUNsaVZlcnNpb24+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHZlcnNpb24gb2YgdGhlIGZldGNoaW5nIENMSSAoYHRlcnJhZm9ybWAvYHRvZnVgIGJpbmFyeVxuICogcmVzb2x2ZWQgdmlhIGBURVJSQUZPUk1fQklOQVJZX05BTUVgKSBvbmNlIHBlciBwcm9jZXNzLCBtZW1vaXplZC5cbiAqXG4gKiBVc2VkIGJvdGggdG8gc3RhbXAgZmV0Y2hlZCBwcm92aWRlciBzY2hlbWFzIChgY2xpX25hbWVgL2BjbGlfdmVyc2lvbmApXG4gKiBhbmQgYXMgdGhlIGNhY2hlIGtleSBzdWZmaXggaW4gcmVhZC50cywgc2luY2Ugc2NoZW1hIGVtaXNzaW9uIGlzIGZpeGVkXG4gKiBwZXIgQ0xJIG1pbm9yIHZlcnNpb24uXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmcgbGlrZSB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGZXRjaGluZ0NsaVZlcnNpb24oKTogUHJvbWlzZTxUZXJyYWZvcm1DbGlWZXJzaW9uPiB7XG4gIGlmICghZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZSkge1xuICAgIGZldGNoaW5nQ2xpVmVyc2lvblByb21pc2UgPSBleGVjKHRlcnJhZm9ybUJpbmFyeU5hbWUsIFtcInZlcnNpb25cIl0sIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS50aGVuKHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbik7XG4gIH1cbiAgcmV0dXJuIGZldGNoaW5nQ2xpVmVyc2lvblByb21pc2U7XG59XG5cbi8vIFByb3ZpZGVyIGJpbmFyaWVzIGFyZSBkb3dubG9hZGVkIGZyb20gR2l0SHViIHJlbGVhc2UgQ0ROcyBkdXJpbmdcbi8vIGB0ZXJyYWZvcm0gaW5pdGAsIHdoaWNoIGludGVybWl0dGVudGx5IHJldHVybnMgNXh4LiBSZXRyeSBvbiB0aG9zZVxuLy8gc2lnbmF0dXJlcyBvbmx5IOKAlCByZWFsIGNvbmZpZy9zY2hlbWEgZXJyb3JzIHNob3VsZCBzdGlsbCBmYWlsIGZhc3QuXG5jb25zdCBUUkFOU0lFTlRfSU5JVF9FUlJPUl9QQVRURVJOUyA9IFtcbiAgL1xcYjUwWzIzNF1cXGIvLFxuICAvQmFkIEdhdGV3YXkvaSxcbiAgL1NlcnZpY2UgVW5hdmFpbGFibGUvaSxcbiAgL0dhdGV3YXkgVGltZW91dC9pLFxuICAvRUNPTk5SRVNFVC9pLFxuICAvRVRJTUVET1VUL2ksXG4gIC9FQUlfQUdBSU4vaSxcbiAgL3VuZXhwZWN0ZWQgRU9GL2ksXG5dO1xuXG4vKipcbiAqIFJ1bnMgYHRlcnJhZm9ybSBpbml0YCBhbmQgcmV0cmllcyBvbiB0cmFuc2llbnQgSFRUUC9uZXR3b3JrIGZhaWx1cmVzLlxuICpcbiAqIFByb3ZpZGVyIGJpbmFyaWVzIGFyZSBwdWxsZWQgZnJvbSBHaXRIdWIncyByZWxlYXNlIENETiwgd2hpY2hcbiAqIGludGVybWl0dGVudGx5IHJldHVybnMgNXh4LiBUaGUgcmV0cnkgb25seSBmaXJlcyB3aGVuIHN0ZGVyciBtYXRjaGVzIGFcbiAqIGtub3duIHRyYW5zaWVudCBwYXR0ZXJuIOKAlCByZWFsIGVycm9ycyAoYmFkIHZlcnNpb24sIHNjaGVtYSBwYXJzZSwgZXRjLilcbiAqIHN0aWxsIGZhaWwgb24gdGhlIGZpcnN0IGF0dGVtcHQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBzcGF3biBvcHRpb25zIGZvcndhcmRlZCB0byBgZXhlY2AgKGBjd2RgIGlzIHJlcXVpcmVkIHNvXG4gKiAgIGB0ZXJyYWZvcm0gaW5pdGAgcnVucyBpbnNpZGUgdGhlIHRlbXAgZGlyIGhvbGRpbmcgYG1haW4udGYuanNvbmApXG4gKiBAcGFyYW0gbWF4QXR0ZW1wdHMgLSB0b3RhbCBhdHRlbXB0cyBpbmNsdWRpbmcgdGhlIGluaXRpYWwgY2FsbDsgdGhlIG51bWJlclxuICogICBvZiByZXRyaWVzIGlzIGBtYXhBdHRlbXB0cyAtIDFgLiBEZWZhdWx0cyB0byA1ICgxIGluaXRpYWwgKyA0IHJldHJpZXMpXG4gKiBAcGFyYW0gYmFzZURlbGF5TXMgLSBkZWxheSBiZWZvcmUgdGhlIGZpcnN0IHJldHJ5LiBUZXN0cyBwYXNzIGAwYCB0byBza2lwXG4gKiAgIHdhaXRzLiBEZWZhdWx0cyB0byA1MDAwbXNcbiAqIEBwYXJhbSBiYWNrb2ZmTXVsdGlwbGllciAtIGZhY3RvciBhcHBsaWVkIHRvIHRoZSBkZWxheSBvbiBlYWNoIHN1YnNlcXVlbnRcbiAqICAgcmV0cnkgKHNvIHJldHJpZXMgd2FpdCBgYmFzZURlbGF5TXMgKiBtdWx0aXBsaWVyXihhdHRlbXB0LTEpYCkuIERlZmF1bHRzXG4gKiAgIHRvIDIgKDFzIOKGkiAycyDihpIgNHMg4oCmKVxuICogQHJldHVybnMgc3Rkb3V0IGZyb20gdGhlIHN1Y2Nlc3NmdWwgYHRlcnJhZm9ybSBpbml0YCBpbnZvY2F0aW9uXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVycmFmb3JtSW5pdFdpdGhSZXRyeShcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZyB9LFxuICBtYXhBdHRlbXB0cyA9IDUsXG4gIGJhc2VEZWxheU1zID0gNTAwMCxcbiAgYmFja29mZk11bHRpcGxpZXIgPSAyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJpbml0XCJdLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBzdGRlcnI6IHN0cmluZyA9IGVycm9yPy5zdGRlcnIgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHRyYW5zaWVudCA9IFRSQU5TSUVOVF9JTklUX0VSUk9SX1BBVFRFUk5TLnNvbWUoKHApID0+XG4gICAgICAgIHAudGVzdChzdGRlcnIpLFxuICAgICAgKTtcbiAgICAgIGlmICghdHJhbnNpZW50IHx8IGF0dGVtcHQgPT09IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVsYXlNcyA9IGJhc2VEZWxheU1zICogYmFja29mZk11bHRpcGxpZXIgKiogKGF0dGVtcHQgLSAxKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgdGVycmFmb3JtIGluaXQgZmFpbGVkIHdpdGggYSB0cmFuc2llbnQgZXJyb3IsIHJldHJ5aW5nIGluICR7ZGVsYXlNc31tcyAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4QXR0ZW1wdHMgLSAxfSlgLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7XG59XG5cbi8qKlxuICogRnVsbHkgUXVhbGlmaWVkIHByb3ZpZGVyIG5hbWUgaW4gdGhlIGZvcm1hdDpcbiAqIGxpa2UgZS5nLiByZWdpc3RyeS50ZXJyYWZvcm0uaW8vaGFzaGljb3JwL2F3c1xuICovXG5leHBvcnQgdHlwZSBGUVBOID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiRnVsbHlRdWFsaWZpZWRQcm92aWRlck5hbWVcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJIb3N0bmFtZSA9IHN0cmluZyAmIHsgX190eXBlOiBcIlByb3ZpZGVySG9zdG5hbWVcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJOYW1lc3BhY2UgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlck5hbWVzcGFjZVwiIH07XG5leHBvcnQgdHlwZSBQcm92aWRlck5hbWUgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlck5hbWVcIiB9O1xuXG5leHBvcnQgY29uc3QgcGFyc2VGUVBOID0gKGY6IEZRUE4pID0+IHtcbiAgY29uc3QgW2hvc3RuYW1lLCBuYW1lc3BhY2UsIG5hbWVdID0gZi5zcGxpdChcIi9cIik7XG4gIGlmICghbmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgaGFuZGxlICR7Zn1gKTtcbiAgfVxuICByZXR1cm4geyBob3N0bmFtZSwgbmFtZXNwYWNlLCBuYW1lIH0gYXMge1xuICAgIGhvc3RuYW1lOiBQcm92aWRlckhvc3RuYW1lO1xuICAgIG5hbWVzcGFjZTogUHJvdmlkZXJOYW1lc3BhY2U7XG4gICAgbmFtZTogUHJvdmlkZXJOYW1lO1xuICB9O1xufTtcblxuY29uc3QgdW53cmFwSWZBcnJheSA9IDxUPihpdGVtOiBUIHwgVFtdKTogVCA9PlxuICBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbVswXSA6IGl0ZW07XG5cbmNvbnN0IHRyYW5zZm9ybVZhcmlhYmxlcyA9ICh2YXJpYWJsZXM6IGFueSkgPT4ge1xuICBjb25zdCByZXN1bHQ6IElucHV0W10gPSBbXTtcblxuICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuIHJlc3VsdDtcblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXModmFyaWFibGVzKSkge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdW53cmFwSWZBcnJheSh2YXJpYWJsZXNbbmFtZV0pO1xuICAgIGxldCB2YXJpYWJsZVR5cGU6IHN0cmluZztcblxuICAgIGlmIChcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwidHlwZVwiKSA9PSBmYWxzZSAmJlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0XCIpID09IHRydWVcbiAgICApIHtcbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhcmlhYmxlW1wiZGVmYXVsdFwiXSkge1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYm9vbFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJudW1iZXJcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImFueVwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdWYXJpYWJsZVR5cGUgPSB2YXJpYWJsZVtcInR5cGVcIl07XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiByYXdWYXJpYWJsZVR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmF3VmFyaWFibGVUeXBlLnN0YXJ0c1dpdGgoXCIke1wiKSAmJlxuICAgICAgICByYXdWYXJpYWJsZVR5cGUuZW5kc1dpdGgoXCJ9XCIpICYmXG4gICAgICAgICFyYXdWYXJpYWJsZVR5cGUuaW5jbHVkZXMoXCJcXG5cIilcbiAgICAgICkge1xuICAgICAgICB2YXJpYWJsZVR5cGUgPSByYXdWYXJpYWJsZVR5cGUuc2xpY2UoMiwgLTEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyaWFibGVUeXBlID0gXCJhbnlcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpdGVtOiBJbnB1dCA9IHtcbiAgICAgIG5hbWUsXG4gICAgICB0eXBlOiB2YXJpYWJsZVR5cGUsXG4gICAgICBkZXNjcmlwdGlvbjogdmFyaWFibGVbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHJlcXVpcmVkOiB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRcIikgPT0gZmFsc2UsXG4gICAgfTtcblxuICAgIGlmICghaXRlbS5yZXF1aXJlZCkge1xuICAgICAgaXRlbVtcImRlZmF1bHRcIl0gPSB2YXJpYWJsZVtcImRlZmF1bHRcIl07XG4gICAgfVxuXG4gICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgdHJhbnNmb3JtT3V0cHV0cyA9IChvdXRwdXRzOiBhbnkpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKG91dHB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMob3V0cHV0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHVud3JhcElmQXJyYXkob3V0cHV0c1tuYW1lXSk7XG5cbiAgICAgIGNvbnN0IGl0ZW06IGFueSA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG91dHB1dFtcImRlc2NyaXB0aW9uXCJdLFxuICAgICAgfTtcblxuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IGhhcnZlc3RNb2R1bGVTY2hlbWEgPSBhc3luYyAoXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgbW9kdWxlczogc3RyaW5nW10sXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+ID0+IHtcbiAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4oXG4gICAgd29ya2luZ0RpcmVjdG9yeSxcbiAgICBcIi50ZXJyYWZvcm1cIixcbiAgICBcIm1vZHVsZXNcIixcbiAgICBcIm1vZHVsZXMuanNvblwiLFxuICApO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZU5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1vZHVsZXMgd2VyZSBub3QgZ2VuZXJhdGVkIHByb3Blcmx5IC0gY291bGRuJ3QgZmluZCAke2ZpbGVOYW1lfWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZUluZGV4ID0gSlNPTi5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoZmlsZU5hbWUsIFwidXRmLThcIiksXG4gICkgYXMgTW9kdWxlSW5kZXg7XG5cbiAgZm9yIChjb25zdCBtb2Qgb2YgbW9kdWxlcykge1xuICAgIGNvbnN0IG0gPSBtb2R1bGVJbmRleC5Nb2R1bGVzLmZpbmQoKG90aGVyKSA9PiBtb2QgPT09IG90aGVyLktleSk7XG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCAke219YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gYXdhaXQgY29udmVydEZpbGVzKHBhdGguam9pbih3b3JraW5nRGlyZWN0b3J5LCBtLkRpcikpO1xuXG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1vZHVsZXMgd2VyZSBub3QgZ2VuZXJhdGVkIHByb3Blcmx5IC0gY291bGRuJ3QgcGFyc2UgJHttLkRpcn1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWE6IE1vZHVsZVNjaGVtYSA9IHtcbiAgICAgIGlucHV0czogdHJhbnNmb3JtVmFyaWFibGVzKHBhcnNlZC52YXJpYWJsZSksXG4gICAgICBvdXRwdXRzOiB0cmFuc2Zvcm1PdXRwdXRzKHBhcnNlZC5vdXRwdXQpLFxuICAgICAgbmFtZTogbW9kLFxuICAgIH07XG5cbiAgICByZXN1bHRbbW9kXSA9IHNjaGVtYTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5mdW5jdGlvbiBqb2luV2l0aEFuZChpdGVtczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAoaXRlbXMubGVuZ3RoIDw9IDEpIHJldHVybiBpdGVtcy5qb2luKFwiXCIpO1xuICByZXR1cm4gYCR7aXRlbXMuc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKX0gYW5kICR7aXRlbXNbaXRlbXMubGVuZ3RoIC0gMV19YDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1Db25maWcge1xuICAvLyBhIGxpc3QgaG9sZHMgc2V2ZXJhbCBjb25maWd1cmF0aW9ucyBvZiB0aGUgc2FtZSBwcm92aWRlciwgd2hpY2ggaXMgaG93XG4gIC8vIGFsaWFzZWQgcHJvdmlkZXIgYmxvY2tzIGFyZSBleHByZXNzZWQgaW4gSlNPTiBzeW50YXhcbiAgcHJvdmlkZXI/OiB7IFtuYW1lOiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdIH07XG4gIHRlcnJhZm9ybToge1xuICAgIHJlcXVpcmVkX3Byb3ZpZGVycz86IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB7IHNvdXJjZT86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG4gIG1vZHVsZT86IHtcbiAgICBbbmFtZTogc3RyaW5nXToge1xuICAgICAgc291cmNlOiBzdHJpbmc7XG4gICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgcHJvdmlkZXJzPzogeyBbbG9jYWxOYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFByb3ZpZGVyU2NoZW1hKFxuICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuKSB7XG4gIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgIHByb3ZpZGVyOiB7fSxcbiAgICB0ZXJyYWZvcm06IHtcbiAgICAgIHJlcXVpcmVkX3Byb3ZpZGVyczoge30sXG4gICAgfSxcbiAgfTtcblxuICBjb25maWcucHJvdmlkZXIhW3RhcmdldC5uYW1lXSA9IHt9O1xuICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyFbdGFyZ2V0Lm5hbWVdID0ge1xuICAgIHZlcnNpb246IHRhcmdldC52ZXJzaW9uLFxuICAgIHNvdXJjZTogdGFyZ2V0LnNvdXJjZSxcbiAgfTtcblxuICBsZXQgcHJvdmlkZXJTY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0geyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hQcm92aWRlclNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgcHJvdmlkZXJTY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJwcm92aWRlcnNcIiwgXCJzY2hlbWFcIiwgXCItanNvblwiXSwge1xuICAgICAgICBjd2Q6IG91dGRpcixcbiAgICAgIH0pLFxuICAgICkgYXMgUHJvdmlkZXJTY2hlbWE7XG5cbiAgICBjb25zdCB2ZXJzaW9uU2NoZW1hID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBWZXJzaW9uU2NoZW1hO1xuXG4gICAgcHJvdmlkZXJTY2hlbWEucHJvdmlkZXJfdmVyc2lvbnMgPSB2ZXJzaW9uU2NoZW1hLnByb3ZpZGVyX3NlbGVjdGlvbnM7XG4gIH0pO1xuXG4gIC8vIFN0YW1wIHRoZSBmZXRjaGluZyBDTEkncyBpZGVudGl0eSBzbyBkb3duc3RyZWFtIGNvbnN1bWVycyBjYW4gcmVhc29uXG4gIC8vIGFib3V0IHdoaWNoIG5ld2VyLXByb3RvY29sIHNlY3Rpb25zIHRoaXMgZmV0Y2ggY291bGQgcG9zc2libHkgaGF2ZVxuICAvLyBlbWl0dGVkLiBOZXZlciBmYWlsIHRoZSBmZXRjaCBvdmVyIHRoaXMgLSBpdCdzIGJlc3QtZWZmb3J0IG1ldGFkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIHByb3ZpZGVyU2NoZW1hLmNsaV9uYW1lID0gY2xpLm5hbWU7XG4gICAgcHJvdmlkZXJTY2hlbWEuY2xpX3ZlcnNpb24gPSBjbGkudmVyc2lvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiB0byBzdGFtcCBwcm92aWRlciBzY2hlbWE6ICR7ZXJyb3J9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNhbml0aXplUHJvdmlkZXJTY2hlbWEocHJvdmlkZXJTY2hlbWEpO1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gdGhlIENMSSB0aGF0IHByb2R1Y2VkIGEgZ2l2ZW4gcHJvdmlkZXIgc2NoZW1hIHByZWRhdGVzIG9uZSBvclxuICogbW9yZSBzY2hlbWEtZW1pc3Npb24gYm91bmRhcmllcyB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGB0YXJnZXRWZXJzaW9uc2BcbiAqIGNhcmUgYWJvdXQgKHNlZSBlbWlzc2lvbi1jaGVjay50cykgLSBpLmUuIHNvbWUgbmV3ZXItcHJvdG9jb2wgc2VjdGlvbnNcbiAqIChmdW5jdGlvbnMsIGVwaGVtZXJhbCByZXNvdXJjZXMsIC4uLikgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgZ2VuZXJhdGVkXG4gKiBiaW5kaW5ncyBldmVuIHRob3VnaCB0aGUgc2NoZW1hIGZldGNoIGl0c2VsZiBzdWNjZWVkZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRlY291cGxlZCBmcm9tIHRoZSBmZXRjaCBwYXRoIChyZWFkUHJvdmlkZXJTY2hlbWEpIHNvIGl0XG4gKiBhbHNvIHJ1bnMgZm9yIHNjaGVtYXMgc2VydmVkIGZyb20gdGhlIG9uLWRpc2sgY2FjaGU6IGNhY2hlZCBKU09OIGNhcnJpZXNcbiAqIHRoZSBzYW1lIGBjbGlfbmFtZWAvYGNsaV92ZXJzaW9uYCBzdGFtcHMgYSBmcmVzaCBmZXRjaCB3b3VsZCBoYXZlXG4gKiB3cml0dGVuICh0aGUgY2FjaGUga2V5IGFscmVhZHkgc2VnbWVudHMgYnkgQ0xJIHByb2R1Y3QrbWlub3IpLCBzbyB0aGUgZ2FwXG4gKiBjaGVjayBpcyBqdXN0IGFzIG1lYW5pbmdmdWwgb24gYSBjYWNoZSBoaXQgYXMgb24gYSBtaXNzLlxuICpcbiAqIE5vLW9wIHdpdGhvdXQgYHRhcmdldFZlcnNpb25zYCAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB0aGUgQ0xJXG4gKiBhZ2FpbnN0LiBGYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MncyBmZXRjaGluZyBDTEkgdmVyc2lvbiB3aGVuXG4gKiB0aGUgc2NoZW1hIGl0c2VsZiBpc24ndCBzdGFtcGVkIChlLmcuIG9sZGVyIGNhY2hlIGVudHJpZXMgd3JpdHRlbiBiZWZvcmVcbiAqIHN0YW1waW5nIGV4aXN0ZWQpLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMoXG4gIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gIHRhcmdldFZlcnNpb25zPzogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF0YXJnZXRWZXJzaW9ucykgcmV0dXJuO1xuXG4gIGxldCBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb247XG4gIGlmIChzY2hlbWEuY2xpX25hbWUgJiYgc2NoZW1hLmNsaV92ZXJzaW9uKSB7XG4gICAgaWYgKHNjaGVtYS5jbGlfbmFtZSAhPT0gXCJ0ZXJyYWZvcm1cIiAmJiBzY2hlbWEuY2xpX25hbWUgIT09IFwib3BlbnRvZnVcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGkgPSB7IG5hbWU6IHNjaGVtYS5jbGlfbmFtZSwgdmVyc2lvbjogc2NoZW1hLmNsaV92ZXJzaW9uIH07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSB2ZXJzaW9uIHRvIGNoZWNrIGZvciBzY2hlbWEgZW1pc3Npb24gZ2FwczogJHtlcnJvcn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBnYXBGYW1pbGllcyA9IGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhjbGksIHRhcmdldFZlcnNpb25zKTtcbiAgaWYgKGdhcEZhbWlsaWVzLmxlbmd0aCA+IDAgJiYgY2xpLnZlcnNpb24pIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBwcm92aWRlciBzY2hlbWEgZmV0Y2hlZCB3aXRoICR7Y2xpLm5hbWV9ICR7Y2xpLnZlcnNpb259IOKAlCAke2pvaW5XaXRoQW5kKFxuICAgICAgICBnYXBGYW1pbGllcy5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFNbZmFtaWx5XSksXG4gICAgICApfSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQ7IHJ1biBjZGt0biBnZXQgd2l0aCAke3N1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMoXG4gICAgICAgIGdhcEZhbWlsaWVzLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gVGhlIHByb3ZpZGVycyBoYXZlIHNvbWUgcG90ZW50aWFsIGJ1Z3MgdGhhdCB3ZSB3YW50IHRvIHByby1hY3RpdmVseVxuLy8gZml4IGhlcmUgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBjYW4gYXNzdW1lIGEgY29uc2lzdGVudCBzY2hlbWEuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVQcm92aWRlclNjaGVtYShzY2hlbWE6IFByb3ZpZGVyU2NoZW1hKTogUHJvdmlkZXJTY2hlbWEge1xuICAvLyBNYWlubHkgc29tZSBhdHRyaWJ1dGVzIGFyZSBcImRvdWJsZWRcIiwgZS5nLiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXVxuICAvLyBpbnN0ZWFkIG9mIFtcImxpc3RcIiwgXCJzdHJpbmdcIl1cbiAgZnVuY3Rpb24gYXR0cmlidXRlRG91YmxpbmdGaXgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGUge1xuICAgIGlmIChpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0cmlidXRlKSB8fCAhQXJyYXkuaXNBcnJheShhdHRyaWJ1dGUudHlwZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBhdHRyaWJ1dGUudHlwZS5sZW5ndGggPT09IDJcbiAgICAgICAgPyBhdHRyaWJ1dGUudHlwZVxuICAgICAgICA6IChhdHRyaWJ1dGUudHlwZSBhcyBzdHJpbmdbXSkuc2xpY2UoMCwgMik7IC8vIFRoZSB0eXBlcyB0ZWxsIHVzIHRoaXMgY2FuJ3QgaGFwcGVuLCByZWFsaXR5IGJlZ3MgdG8gZGlmZmVyXG5cbiAgICBhdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgQXR0cmlidXRlVHlwZTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gTXV0YXRlcyBibG9jayB3aXRoIHRoZSBmaXhcbiAgZnVuY3Rpb24gc2FuaXRpemVCbG9jayhibG9jazogQmxvY2spIHtcbiAgICBPYmplY3QudmFsdWVzKGJsb2NrLmF0dHJpYnV0ZXMgfHwge30pLmZvckVhY2goYXR0cmlidXRlRG91YmxpbmdGaXgpO1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYmxvY2tfdHlwZXMgfHwge30pLmZvckVhY2goKGJsb2NrVHlwZSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhibG9ja1R5cGUuYmxvY2spO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LnZhbHVlcyhzY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICBjb25zdCBlbnRpdGllcyA9IFtcbiAgICAgIHByb3ZpZGVyLnByb3ZpZGVyLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZGF0YV9zb3VyY2Vfc2NoZW1hcyB8fCB7fSksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHByb3ZpZGVyLmVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICBdO1xuXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICBzYW5pdGl6ZUJsb2NrKGVudGl0eS5ibG9jayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbi8qKlxuICogQSBwcm92aWRlciBjb25maWd1cmF0aW9uIHRoYXQgYSBtb2R1bGUgZXhwZWN0cyB0byBiZSBoYW5kZWQgYnkgaXRzIGNhbGxlcixcbiAqIGRlY2xhcmVkIGFzIGBjb25maWd1cmF0aW9uX2FsaWFzZXNgIGluIHRoZSBtb2R1bGUncyBgcmVxdWlyZWRfcHJvdmlkZXJzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVQcm92aWRlckFsaWFzIHtcbiAgLyoqIGxvY2FsIG5hbWUgdGhlIG1vZHVsZSBrbm93cyB0aGUgcHJvdmlkZXIgYnksIGUuZy4gYGF3c2AgKi9cbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gIC8qKiBhbGlhcyBwYXJ0IG9mIHRoZSByZWZlcmVuY2UsIGUuZy4gYGdsb2JhbF9yZWdpb25gICovXG4gIGFsaWFzOiBzdHJpbmc7XG4gIC8qKiBwcm92aWRlciBzb3VyY2UgdGhlIG1vZHVsZSBkZWNsYXJlZCBmb3IgYGxvY2FsTmFtZWAsIGlmIGl0IGRlY2xhcmVkIG9uZSAqL1xuICBzb3VyY2U/OiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTkZJR1VSQVRJT05fQUxJQVMgPSAvXihbXFx3LV0rKVxcLihbXFx3LV0rKSQvO1xuXG4vLyBoY2wyanNvbiBoYW5kcyBIQ0wgZXhwcmVzc2lvbnMgYmFjayBhcyBpbnRlcnBvbGF0aW9ucywgc28gYVxuLy8gYGNvbmZpZ3VyYXRpb25fYWxpYXNlcyA9IFthd3MuZ2xvYmFsX3JlZ2lvbl1gIGVudHJ5IGFycml2ZXMgYXMgdGhlIHN0cmluZ1xuLy8gXCIke2F3cy5nbG9iYWxfcmVnaW9ufVwiLiBBIC50Zi5qc29uIG1vZHVsZSB3cml0ZXMgdGhlIHNhbWUgcmVmZXJlbmNlIGFzIGFcbi8vIHBsYWluIHN0cmluZywgd2hpY2ggaGNsMmpzb24gcGFzc2VzIHRocm91Z2ggdW50b3VjaGVkLlxuY29uc3QgdW53cmFwSW50ZXJwb2xhdGlvbiA9ICh2YWx1ZTogc3RyaW5nKSA9PlxuICB2YWx1ZS5zdGFydHNXaXRoKFwiJHtcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCJ9XCIpID8gdmFsdWUuc2xpY2UoMiwgLTEpIDogdmFsdWU7XG5cbmNvbnN0IHRvQXJyYXkgPSA8VD4oaXRlbTogVCB8IFRbXSB8IHVuZGVmaW5lZCB8IG51bGwpOiBUW10gPT4ge1xuICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0gPT09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xufTtcblxuLyoqXG4gKiBFdmVyeSBvY2N1cnJlbmNlIG9mIGEgYmxvY2sgdGhhdCBoY2wyanNvbiBwcm9kdWNlZCB1bmRlciBvbmUga2V5LlxuICpcbiAqIEhDTCBibG9ja3MgY29tZSBiYWNrIGFzIGFuIGFycmF5IHdpdGggYW4gZW50cnkgcGVyIG9jY3VycmVuY2UsIGEgLnRmLmpzb25cbiAqIGJsb2NrIGFzIGEgcGxhaW4gb2JqZWN0LiBBIG1vZHVsZSBtaXhpbmcgYm90aCBzeW50YXhlcyBnZXRzIGEgdGhpcmQgc2hhcGU6XG4gKiBoY2wyanNvbiBtZXJnZXMgdGhlIEpTT04gZmlsZSBpbnRvIHRoZSBwYXJzZWQgSENMLCBhbmQgaXRzIGRlZXBNZXJnZVxuICogcmVjdXJzZXMgaW50byB0aGUgSENMIGFycmF5IGluc3RlYWQgb2YgYXBwZW5kaW5nIHRvIGl0LCBsZWF2aW5nIHRoZSBKU09OXG4gKiBjb250cmlidXRpb24gaGFuZ2luZyBvZmYgdGhlIGFycmF5IGFzIG5hbWVkIHByb3BlcnRpZXMuIFRob3NlIHByb3BlcnRpZXNcbiAqIGFyZSBhbiBvY2N1cnJlbmNlIG9mIHRoZWlyIG93biAtIGFuZCBvbmUgdGhhdCBuZWl0aGVyIGl0ZXJhdGluZyB0aGUgYXJyYXlcbiAqIG5vciBKU09OLnN0cmluZ2lmeSB3b3VsZCBldmVyIHNob3cuXG4gKi9cbmNvbnN0IGJsb2NrT2NjdXJyZW5jZXMgPSAoYmxvY2s6IGFueSk6IGFueVtdID0+IHtcbiAgaWYgKGJsb2NrID09PSB1bmRlZmluZWQgfHwgYmxvY2sgPT09IG51bGwpIHJldHVybiBbXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGJsb2NrKSkgcmV0dXJuIFtibG9ja107XG5cbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGJsb2NrKS5maWx0ZXIoKFtrZXldKSA9PiAhL15cXGQrJC8udGVzdChrZXkpKSxcbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5sZW5ndGggPiAwID8gWy4uLmJsb2NrLCBtZXJnZWRdIDogWy4uLmJsb2NrXTtcbn07XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zIGEgbW9kdWxlIHJlcXVpcmVzIGl0cyBjYWxsZXIgdG8gcGFzc1xuICogaW4sIGZyb20gdGhlIGhjbDJqc29uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUncyBkaXJlY3RvcnkuXG4gKlxuICogQSBtb2R1bGUgbWF5IGRlY2xhcmUgYHJlcXVpcmVkX3Byb3ZpZGVyc2AgaW4gbW9yZSB0aGFuIG9uZSBgdGVycmFmb3JtYFxuICogYmxvY2ssIGFuZCBtYXkgc3ByZWFkIHRoZW0gYWNyb3NzIC50ZiBhbmQgLnRmLmpzb24gZmlsZXM7IGV2ZXJ5IG9jY3VycmVuY2VcbiAqIGhjbDJqc29uIHJlcG9ydHMgaXMgY29uc2lkZXJlZCAoc2VlIHtAbGluayBibG9ja09jY3VycmVuY2VzfSkuXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RNb2R1bGVQcm92aWRlckFsaWFzZXMoXG4gIHBhcnNlZE1vZHVsZTogYW55LFxuKTogTW9kdWxlUHJvdmlkZXJBbGlhc1tdIHtcbiAgY29uc3QgYWxpYXNlczogTW9kdWxlUHJvdmlkZXJBbGlhc1tdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHRlcnJhZm9ybUJsb2NrIG9mIGJsb2NrT2NjdXJyZW5jZXMocGFyc2VkTW9kdWxlPy50ZXJyYWZvcm0pKSB7XG4gICAgZm9yIChjb25zdCByZXF1aXJlZFByb3ZpZGVycyBvZiBibG9ja09jY3VycmVuY2VzKFxuICAgICAgdGVycmFmb3JtQmxvY2s/LnJlcXVpcmVkX3Byb3ZpZGVycyxcbiAgICApKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIE9iamVjdC52YWx1ZXMocmVxdWlyZWRQcm92aWRlcnMgfHwge30pKSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdW53cmFwSWZBcnJheShkZWNsYXJhdGlvbiBhcyBhbnkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdG9BcnJheShwcm92aWRlcj8uY29uZmlndXJhdGlvbl9hbGlhc2VzKSkge1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gQ09ORklHVVJBVElPTl9BTElBUy5leGVjKFxuICAgICAgICAgICAgdW53cmFwSW50ZXJwb2xhdGlvbihTdHJpbmcoZW50cnkpKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgWywgbG9jYWxOYW1lLCBhbGlhc10gPSBtYXRjaDtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgJHtsb2NhbE5hbWV9LiR7YWxpYXN9YDtcbiAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcblxuICAgICAgICAgIGFsaWFzZXMucHVzaCh7IGxvY2FsTmFtZSwgYWxpYXMsIHNvdXJjZTogcHJvdmlkZXI/LnNvdXJjZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGlhc2VzO1xufVxuXG4vKipcbiAqIERlY2xhcmVzIHRoZSBwcm92aWRlciBjb25maWd1cmF0aW9ucyB0aGF0IGBhbGlhc2VzYCBuYW1lcyBvbiB0aGUgc3ludGhldGljXG4gKiByb290IGNvbmZpZyBhbmQgcGFzc2VzIHRoZW0gaW50byB0aGUgbW9kdWxlIGNhbGwsIHdoaWNoIGlzIHdoYXQgVGVycmFmb3JtXG4gKiBkZW1hbmRzIG9mIGFueW9uZSBjYWxsaW5nIGEgbW9kdWxlIHdpdGggYGNvbmZpZ3VyYXRpb25fYWxpYXNlc2AuXG4gKlxuICogVGhlIGFsaWFzIGJsb2NrcyBzdGF5IGVtcHR5OiBgdGVycmFmb3JtIGdldGAgb25seSBidWlsZHMgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIHRyZWUsIGl0IG5ldmVyIGNvbmZpZ3VyZXMgb3IgaW5zdGFsbHMgYSBwcm92aWRlci4gU291cmNlcyBhcmUgbWlycm9yZWQgZnJvbVxuICogdGhlIG1vZHVsZSdzIG93biBgcmVxdWlyZWRfcHJvdmlkZXJzYCBzbyBhIG1vZHVsZSByZWZlcnJpbmcgdG8sIHNheSxcbiAqIGhhc2hpY29ycC9hd3MgdW5kZXIgYSBub24tZGVmYXVsdCBsb2NhbCBuYW1lIHN0aWxsIHJlc29sdmVzIHRvIHRoZSBzYW1lXG4gKiBwcm92aWRlciBpbiB0aGUgcm9vdC5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2R1bGVQcm92aWRlckFsaWFzZXMoXG4gIGNvbmZpZzogVGVycmFmb3JtQ29uZmlnLFxuICBtb2R1bGVLZXk6IHN0cmluZyxcbiAgYWxpYXNlczogTW9kdWxlUHJvdmlkZXJBbGlhc1tdLFxuKTogVGVycmFmb3JtQ29uZmlnIHtcbiAgY29uc3QgbW9kdWxlQ2FsbCA9IGNvbmZpZy5tb2R1bGU/Llttb2R1bGVLZXldO1xuICBpZiAoIW1vZHVsZUNhbGwgfHwgYWxpYXNlcy5sZW5ndGggPT09IDApIHJldHVybiBjb25maWc7XG5cbiAgZm9yIChjb25zdCB7IGxvY2FsTmFtZSwgYWxpYXMsIHNvdXJjZSB9IG9mIGFsaWFzZXMpIHtcbiAgICBpZiAoc291cmNlKSB7XG4gICAgICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyA9IHtcbiAgICAgICAgLi4uY29uZmlnLnRlcnJhZm9ybS5yZXF1aXJlZF9wcm92aWRlcnMsXG4gICAgICAgIFtsb2NhbE5hbWVdOiB7IHNvdXJjZSB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25maWcucHJvdmlkZXIgPSBjb25maWcucHJvdmlkZXIgfHwge307XG4gICAgY29uc3QgYmxvY2tzID0gdG9BcnJheShjb25maWcucHJvdmlkZXJbbG9jYWxOYW1lXSk7XG4gICAgaWYgKCFibG9ja3Muc29tZSgoYmxvY2spID0+IGJsb2NrLmFsaWFzID09PSBhbGlhcykpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKHsgYWxpYXMgfSk7XG4gICAgfVxuICAgIGNvbmZpZy5wcm92aWRlcltsb2NhbE5hbWVdID0gYmxvY2tzO1xuXG4gICAgbW9kdWxlQ2FsbC5wcm92aWRlcnMgPSB7XG4gICAgICAuLi5tb2R1bGVDYWxsLnByb3ZpZGVycyxcbiAgICAgIFtgJHtsb2NhbE5hbWV9LiR7YWxpYXN9YF06IGAke2xvY2FsTmFtZX0uJHthbGlhc31gLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKipcbiAqIFRoZSBgLy9zdWJkaXJgIHBvcnRpb24gb2YgYSBtb2R1bGUgc291cmNlLCBpZiBpdCBoYXMgb25lLCBtaXJyb3JpbmcgaG93XG4gKiBUZXJyYWZvcm0gdW5wYWNrcyBhIHBhY2thZ2UgaW50byBgLnRlcnJhZm9ybS9tb2R1bGVzLzxrZXk+LzxzdWJkaXI+YC5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFja2FnZVN1YmRpcihzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IFt3aXRob3V0UXVlcnldID0gc291cmNlLnNwbGl0KFwiP1wiKTtcbiAgY29uc3Qgd2l0aG91dEdldHRlclByZWZpeCA9IHdpdGhvdXRRdWVyeS5yZXBsYWNlKC9eW0EtWmEtejAtOV0rOjovLCBcIlwiKTtcbiAgY29uc3Qgd2l0aG91dFNjaGVtZSA9IHdpdGhvdXRHZXR0ZXJQcmVmaXgucmVwbGFjZShcbiAgICAvXltBLVphLXpdW0EtWmEtejAtOSsuLV0qOlxcL1xcLysvLFxuICAgIFwiXCIsXG4gICk7XG5cbiAgY29uc3QgWywgLi4ucmVzdF0gPSB3aXRob3V0U2NoZW1lLnNwbGl0KFwiLy9cIik7XG4gIGNvbnN0IHN1YmRpciA9IHJlc3Quam9pbihcIi8vXCIpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICByZXR1cm4gc3ViZGlyIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXaGVyZSB0aGUgbW9kdWxlIFRlcnJhZm9ybSBqdXN0IGZldGNoZWQgZW5kZWQgdXAgb24gZGlzay5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgaXMgdGhlIGF1dGhvcml0eSwgYnV0IGEgYHRlcnJhZm9ybSBnZXRgIHRoYXQgaW5zdGFsbGVkIHRoZVxuICogbW9kdWxlIGFuZCB0aGVuIGZhaWxlZCB0byB2YWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhcm91bmQgaXQgbGVhdmVzIG5vXG4gKiBtYW5pZmVzdCBiZWhpbmQgLSBzbyBmYWxsIGJhY2sgdG8gdGhlIGxvY2F0aW9ucyBUZXJyYWZvcm0gaW5zdGFsbHMgaW50bzpcbiAqIGxvY2FsIG1vZHVsZXMgYXJlIHJlYWQgd2hlcmUgdGhleSBhcmUsIHJlbW90ZSBwYWNrYWdlcyBhcmUgdW5wYWNrZWQgaW50b1xuICogYC50ZXJyYWZvcm0vbW9kdWxlcy88a2V5PmAuXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoZWRNb2R1bGVEaXIoXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgbW9kdWxlS2V5OiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuICBsb2NhbFNvdXJjZUFic29sdXRlUGF0aD86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihcbiAgICB3b3JraW5nRGlyZWN0b3J5LFxuICAgIFwiLnRlcnJhZm9ybVwiLFxuICAgIFwibW9kdWxlc1wiLFxuICAgIFwibW9kdWxlcy5qc29uXCIsXG4gICk7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgIGNvbnN0IG1vZHVsZUluZGV4ID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIFwidXRmLThcIiksXG4gICAgKSBhcyBNb2R1bGVJbmRleDtcbiAgICBjb25zdCByZWNvcmQgPSBtb2R1bGVJbmRleC5Nb2R1bGVzLmZpbmQoKG1vZCkgPT4gbW9kLktleSA9PT0gbW9kdWxlS2V5KTtcblxuICAgIGlmIChyZWNvcmQpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlc29sdmUod29ya2luZ0RpcmVjdG9yeSwgcmVjb3JkLkRpcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxvY2FsU291cmNlQWJzb2x1dGVQYXRoKSB7XG4gICAgcmV0dXJuIGxvY2FsU291cmNlQWJzb2x1dGVQYXRoO1xuICB9XG5cbiAgcmV0dXJuIHBhdGguam9pbihcbiAgICB3b3JraW5nRGlyZWN0b3J5LFxuICAgIFwiLnRlcnJhZm9ybVwiLFxuICAgIFwibW9kdWxlc1wiLFxuICAgIG1vZHVsZUtleSxcbiAgICBwYWNrYWdlU3ViZGlyKHNvdXJjZSkgfHwgXCJcIixcbiAgKTtcbn1cblxuLyoqXG4gKiBSdW5zIGB0ZXJyYWZvcm0gZ2V0YCBhbmQgaGFuZHMgdGhlIGZhaWx1cmUgYmFjayBpbnN0ZWFkIG9mIHRocm93aW5nIGl0LlxuICpcbiAqIEl0cyBkaWFnbm9zdGljcyBhcmUgbm90IGZpbmFsIChzZWUge0BsaW5rIHJlYWRNb2R1bGVTY2hlbWF9KSwgc28gdGhleSBnbyB0b1xuICogdGhlIGRlYnVnIGxvZyByYXRoZXIgdGhhbiB0aGUgdGVybWluYWw7IHRoZSByZXR1cm5lZCBlcnJvciBzdGlsbCBjYXJyaWVzXG4gKiB0aGVtIG9uIGl0cyBgc3RkZXJyYCBmb3IgY2FsbGVycyB0aGF0IGVuZCB1cCByZXRocm93aW5nIGl0LlxuICovXG5hc3luYyBmdW5jdGlvbiB0cnlUZXJyYWZvcm1HZXQob3V0ZGlyOiBzdHJpbmcpOiBQcm9taXNlPEVycm9yIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyhcbiAgICAgIHRlcnJhZm9ybUJpbmFyeU5hbWUsXG4gICAgICBbXCJnZXRcIl0sXG4gICAgICB7IGN3ZDogb3V0ZGlyLCBsb2dTdGRlcnJBc0RlYnVnOiB0cnVlIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNb2R1bGVTY2hlbWEodGFyZ2V0OiBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQpIHtcbiAgbGV0IG1vZHVsZVNjaGVtYTogUmVjb3JkPHN0cmluZywgTW9kdWxlU2NoZW1hPiA9IHt9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hTY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgICAgdGVycmFmb3JtOiB7fSxcbiAgICB9O1xuXG4gICAgaWYgKCFjb25maWcubW9kdWxlKSBjb25maWcubW9kdWxlID0ge307XG4gICAgbGV0IHNvdXJjZTogc3RyaW5nID0gdGFyZ2V0LnNvdXJjZTtcblxuICAgIGNvbnN0IGxvY2FsU291cmNlID0gKHRhcmdldC5jb25zdHJhaW50IGFzIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQpXG4gICAgICAubG9jYWxTb3VyY2VBYnNvbHV0ZVBhdGg7XG4gICAgaWYgKGxvY2FsU291cmNlKSB7XG4gICAgICAvLyBjcmVhdGUgcmVsYXRpdmUgcGF0aCB0byBtb2R1bGUgaW4gdGhlIHVzZXIgcHJvamVjdFxuICAgICAgc291cmNlID0gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBsb2NhbFNvdXJjZSk7XG4gICAgfVxuXG4gICAgY29uZmlnLm1vZHVsZVt0YXJnZXQubW9kdWxlS2V5XSA9IHsgc291cmNlOiBzb3VyY2UgfTtcbiAgICBpZiAodGFyZ2V0LnZlcnNpb24pIHtcbiAgICAgIGNvbmZpZy5tb2R1bGVbdGFyZ2V0Lm1vZHVsZUtleV1bXCJ2ZXJzaW9uXCJdID0gdGFyZ2V0LnZlcnNpb247XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICAvLyBgdGVycmFmb3JtIGdldGAgaXMgYm90aCBvdXIgZG93bmxvYWRlciBhbmQgYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlXG4gICAgLy8gc3ludGhldGljIHJvb3QgY29uZmlnIHdyYXBwZWQgYXJvdW5kIHRoZSBtb2R1bGUuIEEgbW9kdWxlIGRlY2xhcmluZ1xuICAgIC8vIGBjb25maWd1cmF0aW9uX2FsaWFzZXNgIGNhbm5vdCB2YWxpZGF0ZSB1bnRpbCB0aGUgcm9vdCBwYXNzZXMgdGhvc2VcbiAgICAvLyBjb25maWd1cmF0aW9ucyBpbiwgYW5kIHRoZWlyIG5hbWVzIGFyZSBvbmx5IGtub3dhYmxlIG9uY2UgdGhlIG1vZHVsZSBpc1xuICAgIC8vIG9uIGRpc2sgLSBzbyB0aGlzIGZpcnN0IHJ1biBpcyBhIGZldGNoIHdlIGRlZmVyIGp1ZGdlbWVudCBvbi4gVGVycmFmb3JtXG4gICAgLy8gaW5zdGFsbHMgdGhlIG1vZHVsZSBlaXRoZXIgd2F5OyBzaW5jZSAxLjE1IGl0IGp1c3Qgc3RvcHMgc2hvcnQgb2ZcbiAgICAvLyB3cml0aW5nIHRoZSBtb2R1bGUgbWFuaWZlc3Qgd2hlbiB2YWxpZGF0aW9uIGZhaWxzICh0ZXJyYWZvcm0jMzgyMTdcbiAgICAvLyBkcm9wcGVkIHRoZSBlcnJvci10by13YXJuaW5nIGRvd25ncmFkZSB0aGF0IGB0ZXJyYWZvcm0gZ2V0YCB1c2VkIHRvXG4gICAgLy8gYXBwbHkpLCB3aGljaCBpcyB3aGF0IHRoZSBzZWNvbmQgcnVuIGJlbG93IHJlc3RvcmVzLlxuICAgIGNvbnN0IGZldGNoRXJyb3IgPSBhd2FpdCB0cnlUZXJyYWZvcm1HZXQob3V0ZGlyKTtcblxuICAgIGNvbnN0IG1vZHVsZURpciA9IGZldGNoZWRNb2R1bGVEaXIoXG4gICAgICBvdXRkaXIsXG4gICAgICB0YXJnZXQubW9kdWxlS2V5LFxuICAgICAgc291cmNlLFxuICAgICAgbG9jYWxTb3VyY2UsXG4gICAgKTtcbiAgICBjb25zdCBhbGlhc2VzID0gZnMuZXhpc3RzU3luYyhtb2R1bGVEaXIpXG4gICAgICA/IGNvbGxlY3RNb2R1bGVQcm92aWRlckFsaWFzZXMoYXdhaXQgY29udmVydEZpbGVzKG1vZHVsZURpcikpXG4gICAgICA6IFtdO1xuXG4gICAgaWYgKGFsaWFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlNb2R1bGVQcm92aWRlckFsaWFzZXMoY29uZmlnLCB0YXJnZXQubW9kdWxlS2V5LCBhbGlhc2VzKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG4gICAgICBhd2FpdCBleGVjKHRlcnJhZm9ybUJpbmFyeU5hbWUsIFtcImdldFwiXSwgeyBjd2Q6IG91dGRpciB9KTtcbiAgICB9IGVsc2UgaWYgKGZldGNoRXJyb3IpIHtcbiAgICAgIC8vIG5vdGhpbmcgaGVyZSB3YXMgc2FsdmFnZWFibGUgYWZ0ZXIgYWxsLCBzbyByZXBvcnQgdGhlIGRpYWdub3N0aWNzIHRoYXRcbiAgICAgIC8vIHdlcmUgaGVsZCBiYWNrIHdoaWxlIHRoZSBmZXRjaCBzdGlsbCBoYWQgYSBzZWNvbmQgY2hhbmNlXG4gICAgICBsb2dnZXIuZXJyb3IoKGZldGNoRXJyb3IgYXMgYW55KS5zdGRlcnIgfHwgU3RyaW5nKGZldGNoRXJyb3IpKTtcbiAgICAgIHRocm93IGZldGNoRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5tb2R1bGUpIHtcbiAgICAgIG1vZHVsZVNjaGVtYSA9IGF3YWl0IGhhcnZlc3RNb2R1bGVTY2hlbWEoXG4gICAgICAgIG91dGRpcixcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnLm1vZHVsZSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1vZHVsZVNjaGVtYTtcbn1cbiJdfQ==
package/build/read.js CHANGED
@@ -7,7 +7,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.readSchema = exports.isLocalModule = exports.TerraformProviderConstraint = exports.TerraformModuleConstraint = exports.isRegistryModule = void 0;
10
+ exports.isLocalModule = exports.TerraformProviderConstraint = exports.TerraformModuleConstraint = exports.isRegistryModule = void 0;
11
+ exports.readSchema = readSchema;
11
12
  var commons_1 = require("@cdktn/commons");
12
13
  Object.defineProperty(exports, "isRegistryModule", { enumerable: true, get: function () { return commons_1.isRegistryModule; } });
13
14
  Object.defineProperty(exports, "TerraformModuleConstraint", { enumerable: true, get: function () { return commons_1.TerraformModuleConstraint; } });
@@ -60,7 +61,6 @@ async function readSchema(constraints, cacheDir, targetVersions) {
60
61
  });
61
62
  return deepmerge_1.default.all(schemas);
62
63
  }
63
- exports.readSchema = readSchema;
64
64
  function throwIfTargetsConflict(targets) {
65
65
  const modules = targets.filter((t) => t.isModule);
66
66
  modules.forEach((moduleA) => {
@@ -71,4 +71,4 @@ function throwIfTargetsConflict(targets) {
71
71
  });
72
72
  });
73
73
  }
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQUVILDBDQUt3QjtBQUp0QiwyR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixvSEFBQSx5QkFBeUIsT0FBQTtBQUN6QixzSEFBQSwyQkFBMkIsT0FBQTtBQUMzQix3R0FBQSxhQUFhLE9BQUE7QUFFZiw0Q0FRd0I7QUFDeEIsMERBQWtDO0FBQ2xDLHVEQUsyQjtBQUMzQixtQ0FBdUM7QUFPdkMsMkVBQTJFO0FBQzNFLHNFQUFzRTtBQUN0RSxLQUFLLFVBQVUscUJBQXFCLENBQ2xDLFFBQWlCO0lBRWpCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFaEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFBLHVDQUFxQixHQUFFLENBQUM7UUFDMUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FDVix1R0FBdUcsQ0FDeEcsQ0FBQztZQUNGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGdCQUFNLENBQUMsS0FBSyxDQUNWLHNFQUFzRSxLQUFLLEVBQUUsQ0FDOUUsQ0FBQztRQUNGLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDO0FBRU0sS0FBSyxVQUFVLFVBQVUsQ0FDOUIsV0FBNEMsRUFDNUMsUUFBaUIsRUFDakIsY0FBd0M7SUFFeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxNQUFNLHdCQUF3QixHQUFHLElBQUEsb0JBQVksRUFDM0Msb0NBQWtCLEVBQ2xCLFFBQVEsRUFDUixTQUFTLENBQ1YsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUM3Qyx1Q0FBNkIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLG1CQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRWhDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hCLENBQUMsQ0FBQyxRQUFRO1FBQ1IsQ0FBQyxDQUFDLElBQUEsa0NBQWdCLEVBQUMsQ0FBUSxDQUFDLENBQUMsSUFBSSxDQUM3QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBVyxDQUN2QztRQUNILENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELCtEQUErRDtZQUMvRCw0REFBNEQ7WUFDNUQsOERBQThEO1lBQzlELHNCQUFzQjtZQUN0QixNQUFNLElBQUEsMENBQXdCLEVBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFZLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQ1AsQ0FDRixDQUFDO0lBRUYsK0NBQStDO0lBQy9DLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDZCxjQUFjLEVBQUU7WUFDZCxjQUFjLEVBQUUsS0FBSztTQUN0QjtRQUNELFlBQVksRUFBRSxFQUFFO0tBQ2pCLENBQUMsQ0FBQztJQUVILE9BQU8sbUJBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQTNDRCxnQ0EyQ0M7QUFFRCxTQUFTLHNCQUFzQixDQUM3QixPQUF3RTtJQUV4RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUM1QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FDZSxDQUFDO0lBRW5DLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUMxQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6RCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUNoQix5Q0FBeUMsT0FBTyxDQUFDLElBQUksNE1BQTRNLENBQ2xRLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbmV4cG9ydCB7XG4gIGlzUmVnaXN0cnlNb2R1bGUsXG4gIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQsXG4gIFRlcnJhZm9ybVByb3ZpZGVyQ29uc3RyYWludCxcbiAgaXNMb2NhbE1vZHVsZSxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQge1xuICBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludCxcbiAgTEFOR1VBR0VTLFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbiAgRXJyb3JzLFxuICBsb2dnZXIsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IGRlZXBtZXJnZSBmcm9tIFwiZGVlcG1lcmdlXCI7XG5pbXBvcnQge1xuICBnZXRGZXRjaGluZ0NsaVZlcnNpb24sXG4gIHJlYWRNb2R1bGVTY2hlbWEsXG4gIHJlYWRQcm92aWRlclNjaGVtYSxcbiAgd2FybklmU2NoZW1hRW1pc3Npb25HYXBzLFxufSBmcm9tIFwiLi9wcm92aWRlci1zY2hlbWFcIjtcbmltcG9ydCB7IGNhY2hlZEFjY2VzcyB9IGZyb20gXCIuL2NhY2hlXCI7XG5cbmV4cG9ydCB0eXBlIFNjaGVtYSA9IHtcbiAgcHJvdmlkZXJTY2hlbWE/OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHJlYWRQcm92aWRlclNjaGVtYT4+O1xuICBtb2R1bGVTY2hlbWE/OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHJlYWRNb2R1bGVTY2hlbWE+Pjtcbn07XG5cbi8vIFNjaGVtYSBlbWlzc2lvbiBpcyBmaXhlZCBwZXIgQ0xJIHByb2R1Y3QrbWlub3IgdmVyc2lvbiwgc28gdGhhdCdzIGVub3VnaFxuLy8gZ3JhbnVsYXJpdHkgZm9yIHRoZSBjYWNoZSBrZXkgLSBubyBuZWVkIGZvciB0aGUgZnVsbCBwYXRjaCB2ZXJzaW9uLlxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhY2hlS2V5U3VmZml4KFxuICBjYWNoZURpcj86IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghY2FjaGVEaXIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjbGkgPSBhd2FpdCBnZXRGZXRjaGluZ0NsaVZlcnNpb24oKTtcbiAgICBpZiAoY2xpLm5hbWUgPT09IFwidW5rbm93blwiIHx8ICFjbGkudmVyc2lvbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBcIkNvdWxkIG5vdCBkZXRlcm1pbmUgZmV0Y2hpbmcgQ0xJIG5hbWUvdmVyc2lvbiBmb3IgdGhlIHNjaGVtYSBjYWNoZSBrZXksIGZhbGxpbmcgYmFjayB0byAndW5rbm93bi1jbGknXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIFwidW5rbm93bi1jbGlcIjtcbiAgICB9XG5cbiAgICBjb25zdCBbbWFqb3IsIG1pbm9yXSA9IGNsaS52ZXJzaW9uLnNwbGl0KFwiLlwiKTtcbiAgICByZXR1cm4gYCR7Y2xpLm5hbWV9LSR7bWFqb3J9LiR7bWlub3J9YDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiBmb3IgdGhlIHNjaGVtYSBjYWNoZSBrZXk6ICR7ZXJyb3J9YCxcbiAgICApO1xuICAgIHJldHVybiBcInVua25vd24tY2xpXCI7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTY2hlbWEoXG4gIGNvbnN0cmFpbnRzOiBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludFtdLFxuICBjYWNoZURpcj86IHN0cmluZyxcbiAgdGFyZ2V0VmVyc2lvbnM/OiBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbik6IFByb21pc2U8U2NoZW1hPiB7XG4gIGNvbnN0IGtleVN1ZmZpeCA9IGF3YWl0IHJlc29sdmVDYWNoZUtleVN1ZmZpeChjYWNoZURpcik7XG4gIGNvbnN0IGNhY2hlZFJlYWRQcm92aWRlclNjaGVtYSA9IGNhY2hlZEFjY2VzcyhcbiAgICByZWFkUHJvdmlkZXJTY2hlbWEsXG4gICAgY2FjaGVEaXIsXG4gICAga2V5U3VmZml4LFxuICApO1xuICBjb25zdCB0YXJnZXRzID0gY29uc3RyYWludHMubWFwKChjb25zdHJhaW50KSA9PlxuICAgIENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LmZyb20oY29uc3RyYWludCwgTEFOR1VBR0VTWzBdKSxcbiAgKTtcblxuICB0aHJvd0lmVGFyZ2V0c0NvbmZsaWN0KHRhcmdldHMpO1xuXG4gIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB0YXJnZXRzLm1hcCgodCkgPT5cbiAgICAgIHQuaXNNb2R1bGVcbiAgICAgICAgPyByZWFkTW9kdWxlU2NoZW1hKHQgYXMgYW55KS50aGVuKFxuICAgICAgICAgICAgKHMpID0+ICh7IG1vZHVsZVNjaGVtYTogcyB9KSBhcyBTY2hlbWEsXG4gICAgICAgICAgKVxuICAgICAgICA6IGNhY2hlZFJlYWRQcm92aWRlclNjaGVtYSh0IGFzIGFueSkudGhlbihhc3luYyAocykgPT4ge1xuICAgICAgICAgICAgLy8gUnVucyBvbiBib3RoIGNhY2hlIGhpdHMgYW5kIG1pc3NlczogY2FjaGVkIHNjaGVtYXMgY2FycnkgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGNsaV9uYW1lL2NsaV92ZXJzaW9uIHN0YW1wcyBhIGZyZXNoIGZldGNoIHdvdWxkIGhhdmVcbiAgICAgICAgICAgIC8vIHdyaXR0ZW4sIHNvIHRoZSBlbWlzc2lvbi1nYXAgd2FybmluZyBpcyBqdXN0IGFzIHJlbGV2YW50IG9uXG4gICAgICAgICAgICAvLyBhIGhpdCBhcyBvbiBhIG1pc3MuXG4gICAgICAgICAgICBhd2FpdCB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMocywgdGFyZ2V0VmVyc2lvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJvdmlkZXJTY2hlbWE6IHMgfSBhcyBTY2hlbWE7XG4gICAgICAgICAgfSksXG4gICAgKSxcbiAgKTtcblxuICAvLyBlbnN1cmUgd2UgaGF2ZSBhIHNjaGVtYSBmb3IgZWFjaCB0YXJnZXQgdHlwZVxuICBzY2hlbWFzLnVuc2hpZnQoe1xuICAgIHByb3ZpZGVyU2NoZW1hOiB7XG4gICAgICBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIixcbiAgICB9LFxuICAgIG1vZHVsZVNjaGVtYToge30sXG4gIH0pO1xuXG4gIHJldHVybiBkZWVwbWVyZ2UuYWxsKHNjaGVtYXMpO1xufVxuXG5mdW5jdGlvbiB0aHJvd0lmVGFyZ2V0c0NvbmZsaWN0KFxuICB0YXJnZXRzOiAoQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQgfCBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQpW10sXG4pIHtcbiAgY29uc3QgbW9kdWxlcyA9IHRhcmdldHMuZmlsdGVyKFxuICAgICh0KSA9PiB0LmlzTW9kdWxlLFxuICApIGFzIENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldFtdO1xuXG4gIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlQSkgPT4ge1xuICAgIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlQikgPT4ge1xuICAgICAgaWYgKG1vZHVsZUEgIT09IG1vZHVsZUIgJiYgbW9kdWxlQS5uYW1lID09PSBtb2R1bGVCLm5hbWUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICAgIGBGb3VuZCB0d28gbW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgXCIke21vZHVsZUEubmFtZX1cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgcmVuYW1lIG9uZSBvZiB0aGUgbW9kdWxlcyBpbiB5b3VyIGNka3RmLmpzb24gY29uZmlnLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gc2V0IHRoZSBuYW1lIHJlZmVyIHRvIGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9tb2R1bGVzI2FkZC1tb2R1bGUtdG8tY2RrdGYtanNvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQXlESCxnQ0EyQ0M7QUFsR0QsMENBS3dCO0FBSnRCLDJHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLG9IQUFBLHlCQUF5QixPQUFBO0FBQ3pCLHNIQUFBLDJCQUEyQixPQUFBO0FBQzNCLHdHQUFBLGFBQWEsT0FBQTtBQUVmLDRDQVF3QjtBQUN4QiwwREFBa0M7QUFDbEMsdURBSzJCO0FBQzNCLG1DQUF1QztBQU92QywyRUFBMkU7QUFDM0Usc0VBQXNFO0FBQ3RFLEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsUUFBaUI7SUFFakIsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsdUNBQXFCLEdBQUUsQ0FBQztRQUMxQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUNWLHVHQUF1RyxDQUN4RyxDQUFDO1lBQ0YsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1Ysc0VBQXNFLEtBQUssRUFBRSxDQUM5RSxDQUFDO1FBQ0YsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUsVUFBVSxDQUM5QixXQUE0QyxFQUM1QyxRQUFpQixFQUNqQixjQUF3QztJQUV4QyxNQUFNLFNBQVMsR0FBRyxNQUFNLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sd0JBQXdCLEdBQUcsSUFBQSxvQkFBWSxFQUMzQyxvQ0FBa0IsRUFDbEIsUUFBUSxFQUNSLFNBQVMsQ0FDVixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQzdDLHVDQUE2QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsbUJBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM3RCxDQUFDO0lBRUYsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDaEIsQ0FBQyxDQUFDLFFBQVE7UUFDUixDQUFDLENBQUMsSUFBQSxrQ0FBZ0IsRUFBQyxDQUFRLENBQUMsQ0FBQyxJQUFJLENBQzdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFXLENBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEQsK0RBQStEO1lBQy9ELDREQUE0RDtZQUM1RCw4REFBOEQ7WUFDOUQsc0JBQXNCO1lBQ3RCLE1BQU0sSUFBQSwwQ0FBd0IsRUFBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQVksQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FDUCxDQUNGLENBQUM7SUFFRiwrQ0FBK0M7SUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNkLGNBQWMsRUFBRTtZQUNkLGNBQWMsRUFBRSxLQUFLO1NBQ3RCO1FBQ0QsWUFBWSxFQUFFLEVBQUU7S0FDakIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxtQkFBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsT0FBd0U7SUFFeEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQ2UsQ0FBQztJQUVuQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDMUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzFCLElBQUksT0FBTyxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FDaEIseUNBQXlDLE9BQU8sQ0FBQyxJQUFJLDRNQUE0TSxDQUNsUSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG5leHBvcnQge1xuICBpc1JlZ2lzdHJ5TW9kdWxlLFxuICBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50LFxuICBUZXJyYWZvcm1Qcm92aWRlckNvbnN0cmFpbnQsXG4gIGlzTG9jYWxNb2R1bGUsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHtcbiAgVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnQsXG4gIExBTkdVQUdFUyxcbiAgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4gIENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldCxcbiAgVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4gIEVycm9ycyxcbiAgbG9nZ2VyLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSBcImRlZXBtZXJnZVwiO1xuaW1wb3J0IHtcbiAgZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uLFxuICByZWFkTW9kdWxlU2NoZW1hLFxuICByZWFkUHJvdmlkZXJTY2hlbWEsXG4gIHdhcm5JZlNjaGVtYUVtaXNzaW9uR2Fwcyxcbn0gZnJvbSBcIi4vcHJvdmlkZXItc2NoZW1hXCI7XG5pbXBvcnQgeyBjYWNoZWRBY2Nlc3MgfSBmcm9tIFwiLi9jYWNoZVwiO1xuXG5leHBvcnQgdHlwZSBTY2hlbWEgPSB7XG4gIHByb3ZpZGVyU2NoZW1hPzogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiByZWFkUHJvdmlkZXJTY2hlbWE+PjtcbiAgbW9kdWxlU2NoZW1hPzogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiByZWFkTW9kdWxlU2NoZW1hPj47XG59O1xuXG4vLyBTY2hlbWEgZW1pc3Npb24gaXMgZml4ZWQgcGVyIENMSSBwcm9kdWN0K21pbm9yIHZlcnNpb24sIHNvIHRoYXQncyBlbm91Z2hcbi8vIGdyYW51bGFyaXR5IGZvciB0aGUgY2FjaGUga2V5IC0gbm8gbmVlZCBmb3IgdGhlIGZ1bGwgcGF0Y2ggdmVyc2lvbi5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDYWNoZUtleVN1ZmZpeChcbiAgY2FjaGVEaXI/OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIWNhY2hlRGlyKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY2xpID0gYXdhaXQgZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk7XG4gICAgaWYgKGNsaS5uYW1lID09PSBcInVua25vd25cIiB8fCAhY2xpLnZlcnNpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgXCJDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSBuYW1lL3ZlcnNpb24gZm9yIHRoZSBzY2hlbWEgY2FjaGUga2V5LCBmYWxsaW5nIGJhY2sgdG8gJ3Vua25vd24tY2xpJ1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBcInVua25vd24tY2xpXCI7XG4gICAgfVxuXG4gICAgY29uc3QgW21ham9yLCBtaW5vcl0gPSBjbGkudmVyc2lvbi5zcGxpdChcIi5cIik7XG4gICAgcmV0dXJuIGAke2NsaS5uYW1lfS0ke21ham9yfS4ke21pbm9yfWA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgZmV0Y2hpbmcgQ0xJIHZlcnNpb24gZm9yIHRoZSBzY2hlbWEgY2FjaGUga2V5OiAke2Vycm9yfWAsXG4gICAgKTtcbiAgICByZXR1cm4gXCJ1bmtub3duLWNsaVwiO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU2NoZW1hKFxuICBjb25zdHJhaW50czogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnRbXSxcbiAgY2FjaGVEaXI/OiBzdHJpbmcsXG4gIHRhcmdldFZlcnNpb25zPzogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBQcm9taXNlPFNjaGVtYT4ge1xuICBjb25zdCBrZXlTdWZmaXggPSBhd2FpdCByZXNvbHZlQ2FjaGVLZXlTdWZmaXgoY2FjaGVEaXIpO1xuICBjb25zdCBjYWNoZWRSZWFkUHJvdmlkZXJTY2hlbWEgPSBjYWNoZWRBY2Nlc3MoXG4gICAgcmVhZFByb3ZpZGVyU2NoZW1hLFxuICAgIGNhY2hlRGlyLFxuICAgIGtleVN1ZmZpeCxcbiAgKTtcbiAgY29uc3QgdGFyZ2V0cyA9IGNvbnN0cmFpbnRzLm1hcCgoY29uc3RyYWludCkgPT5cbiAgICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldC5mcm9tKGNvbnN0cmFpbnQsIExBTkdVQUdFU1swXSksXG4gICk7XG5cbiAgdGhyb3dJZlRhcmdldHNDb25mbGljdCh0YXJnZXRzKTtcblxuICBjb25zdCBzY2hlbWFzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgdGFyZ2V0cy5tYXAoKHQpID0+XG4gICAgICB0LmlzTW9kdWxlXG4gICAgICAgID8gcmVhZE1vZHVsZVNjaGVtYSh0IGFzIGFueSkudGhlbihcbiAgICAgICAgICAgIChzKSA9PiAoeyBtb2R1bGVTY2hlbWE6IHMgfSkgYXMgU2NoZW1hLFxuICAgICAgICAgIClcbiAgICAgICAgOiBjYWNoZWRSZWFkUHJvdmlkZXJTY2hlbWEodCBhcyBhbnkpLnRoZW4oYXN5bmMgKHMpID0+IHtcbiAgICAgICAgICAgIC8vIFJ1bnMgb24gYm90aCBjYWNoZSBoaXRzIGFuZCBtaXNzZXM6IGNhY2hlZCBzY2hlbWFzIGNhcnJ5IHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjbGlfbmFtZS9jbGlfdmVyc2lvbiBzdGFtcHMgYSBmcmVzaCBmZXRjaCB3b3VsZCBoYXZlXG4gICAgICAgICAgICAvLyB3cml0dGVuLCBzbyB0aGUgZW1pc3Npb24tZ2FwIHdhcm5pbmcgaXMganVzdCBhcyByZWxldmFudCBvblxuICAgICAgICAgICAgLy8gYSBoaXQgYXMgb24gYSBtaXNzLlxuICAgICAgICAgICAgYXdhaXQgd2FybklmU2NoZW1hRW1pc3Npb25HYXBzKHMsIHRhcmdldFZlcnNpb25zKTtcbiAgICAgICAgICAgIHJldHVybiB7IHByb3ZpZGVyU2NoZW1hOiBzIH0gYXMgU2NoZW1hO1xuICAgICAgICAgIH0pLFxuICAgICksXG4gICk7XG5cbiAgLy8gZW5zdXJlIHdlIGhhdmUgYSBzY2hlbWEgZm9yIGVhY2ggdGFyZ2V0IHR5cGVcbiAgc2NoZW1hcy51bnNoaWZ0KHtcbiAgICBwcm92aWRlclNjaGVtYToge1xuICAgICAgZm9ybWF0X3ZlcnNpb246IFwiMC4xXCIsXG4gICAgfSxcbiAgICBtb2R1bGVTY2hlbWE6IHt9LFxuICB9KTtcblxuICByZXR1cm4gZGVlcG1lcmdlLmFsbChzY2hlbWFzKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dJZlRhcmdldHNDb25mbGljdChcbiAgdGFyZ2V0czogKENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0IHwgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KVtdLFxuKSB7XG4gIGNvbnN0IG1vZHVsZXMgPSB0YXJnZXRzLmZpbHRlcihcbiAgICAodCkgPT4gdC5pc01vZHVsZSxcbiAgKSBhcyBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXRbXTtcblxuICBtb2R1bGVzLmZvckVhY2goKG1vZHVsZUEpID0+IHtcbiAgICBtb2R1bGVzLmZvckVhY2goKG1vZHVsZUIpID0+IHtcbiAgICAgIGlmIChtb2R1bGVBICE9PSBtb2R1bGVCICYmIG1vZHVsZUEubmFtZSA9PT0gbW9kdWxlQi5uYW1lKSB7XG4gICAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgICBgRm91bmQgdHdvIG1vZHVsZXMgd2l0aCB0aGUgc2FtZSBuYW1lIFwiJHttb2R1bGVBLm5hbWV9XCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHJlbmFtZSBvbmUgb2YgdGhlIG1vZHVsZXMgaW4geW91ciBjZGt0Zi5qc29uIGNvbmZpZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHNldCB0aGUgbmFtZSByZWZlciB0byBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvbW9kdWxlcyNhZGQtbW9kdWxlLXRvLWNka3RmLWpzb25gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
package/build/util.d.ts CHANGED
@@ -2,9 +2,6 @@
2
2
  * Copyright (c) HashiCorp, Inc.
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
- /// <reference types="ambient" />
6
- /// <reference types=".pnpm/@types+node@22.20.1/node_modules/@types/node/child_process" />
7
- /// <reference types=".pnpm/@types+node@18.19.130/node_modules/@types/node/child_process" />
8
5
  import { SpawnOptions } from "child_process";
9
6
  export declare function withTempDir(dirname: string, closure: () => Promise<void>): Promise<void>;
10
7
  export declare const exec: (command: string, args: string[], options: SpawnOptions, stdout?: (chunk: Buffer) => any, stderr?: (chunk: string | Uint8Array) => any) => Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;GAGG;;;;AAEH,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AAKpD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,iBAa7B;AAED,eAAO,MAAM,IAAI,YACN,MAAM,QACT,MAAM,EAAE,WACL,YAAY,WACZ,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,WACtB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,GAAG,KAC3C,QAAQ,MAAM,CAkChB,CAAC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AAKpD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,iBAa7B;AAED,eAAO,MAAM,IAAI,GACf,SAAS,MAAM,EACf,MAAM,MAAM,EAAE,EACd,SAAS,YAAY,EACrB,SAAS,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,EAC/B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,GAAG,KAC3C,OAAO,CAAC,MAAM,CAkChB,CAAC"}
package/build/util.js CHANGED
@@ -19,15 +19,26 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
19
19
  }) : function(o, v) {
20
20
  o["default"] = v;
21
21
  });
22
- var __importStar = (this && this.__importStar) || function (mod) {
23
- if (mod && mod.__esModule) return mod;
24
- var result = {};
25
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
- __setModuleDefault(result, mod);
27
- return result;
28
- };
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
29
39
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.exec = exports.withTempDir = void 0;
40
+ exports.exec = void 0;
41
+ exports.withTempDir = withTempDir;
31
42
  const child_process_1 = require("child_process");
32
43
  const fs = __importStar(require("fs-extra"));
33
44
  const os = __importStar(require("os"));
@@ -46,7 +57,6 @@ async function withTempDir(dirname, closure) {
46
57
  await fs.remove(parent);
47
58
  }
48
59
  }
49
- exports.withTempDir = withTempDir;
50
60
  const exec = async (command, args, options, stdout, stderr) => {
51
61
  return new Promise((ok, ko) => {
52
62
  var _a, _b, _c, _d;
@@ -86,4 +96,4 @@ const exec = async (command, args, options, stdout, stderr) => {
86
96
  });
87
97
  };
88
98
  exports.exec = exec;
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsaURBQW9EO0FBQ3BELDZDQUErQjtBQUMvQix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBRXRCLEtBQUssVUFBVSxXQUFXLENBQy9CLE9BQWUsRUFDZixPQUE0QjtJQUU1QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsTUFBTSxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDO1lBQVMsQ0FBQztRQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7QUFDSCxDQUFDO0FBZkQsa0NBZUM7QUFFTSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLE9BQWUsRUFDZixJQUFjLEVBQ2QsT0FBcUIsRUFDckIsTUFBK0IsRUFDL0IsTUFBNEMsRUFDM0IsRUFBRTtJQUNuQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFOztRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFLLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUF1QixDQUFDO1FBQzdDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO2dCQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO2dCQUN6QyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQTBCLEVBQUUsRUFBRTtnQkFDdEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUEwQixFQUFFLEVBQUU7Z0JBQ3RELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ25DLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNmLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRCxLQUFhLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQXhDVyxRQUFBLElBQUksUUF3Q2YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbmltcG9ydCB7IHNwYXduLCBTcGF3bk9wdGlvbnMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhUZW1wRGlyKFxuICBkaXJuYW1lOiBzdHJpbmcsXG4gIGNsb3N1cmU6ICgpID0+IFByb21pc2U8dm9pZD4sXG4pIHtcbiAgY29uc3QgcHJldmRpciA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHBhcmVudCA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcImNka3RmLlwiKSk7XG4gIGNvbnN0IHdvcmtkaXIgPSBwYXRoLmpvaW4ocGFyZW50LCBkaXJuYW1lKTtcbiAgYXdhaXQgZnMubWtkaXJwKHdvcmtkaXIpO1xuICB0cnkge1xuICAgIHByb2Nlc3MuY2hkaXIod29ya2Rpcik7XG4gICAgYXdhaXQgY2xvc3VyZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MuY2hkaXIocHJldmRpcik7XG4gICAgYXdhaXQgZnMucmVtb3ZlKHBhcmVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IFNwYXduT3B0aW9ucyxcbiAgc3Rkb3V0PzogKGNodW5rOiBCdWZmZXIpID0+IGFueSxcbiAgc3RkZXJyPzogKGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5KSA9PiBhbnksXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZCwgYXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PEJ1ZmZlcj4oKTtcbiAgICBjb25zdCBlcnIgPSBuZXcgQXJyYXk8c3RyaW5nIHwgVWludDhBcnJheT4oKTtcbiAgICBpZiAoc3Rkb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChjaHVuazogQnVmZmVyKSA9PiB7XG4gICAgICAgIHN0ZG91dChjaHVuayk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGNodW5rOiBCdWZmZXIpID0+IHtcbiAgICAgICAgb3V0LnB1c2goY2h1bmspO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzdGRlcnIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgKGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5KSA9PiB7XG4gICAgICAgIHN0ZGVycihjaHVuayk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgKGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5KSA9PiB7XG4gICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNodW5rKTtcbiAgICAgICAgZXJyLnB1c2goY2h1bmspO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyOiBhbnkpID0+IGtvKGVycikpO1xuICAgIGNoaWxkLm9uY2UoXCJjbG9zZVwiLCAoY29kZTogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgbm9uLXplcm8gZXhpdCBjb2RlICR7Y29kZX1gKTtcbiAgICAgICAgKGVycm9yIGFzIGFueSkuc3RkZXJyID0gZXJyLm1hcCgoY2h1bmspID0+IGNodW5rLnRvU3RyaW5nKCkpLmpvaW4oXCJcIik7XG4gICAgICAgIHJldHVybiBrbyhlcnJvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2soQnVmZmVyLmNvbmNhdChvdXQpLnRvU3RyaW5nKFwidXRmLThcIikpO1xuICAgIH0pO1xuICB9KTtcbn07XG4iXX0=
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9ILGtDQWVDO0FBcEJELGlEQUFvRDtBQUNwRCw2Q0FBK0I7QUFDL0IsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUV0QixLQUFLLFVBQVUsV0FBVyxDQUMvQixPQUFlLEVBQ2YsT0FBNEI7SUFFNUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxFQUFFLENBQUM7SUFDbEIsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQUVNLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsT0FBZSxFQUNmLElBQWMsRUFDZCxPQUFxQixFQUNyQixNQUErQixFQUMvQixNQUE0QyxFQUMzQixFQUFFO0lBQ25CLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7O1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQUssRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQXVCLENBQUM7UUFDN0MsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsTUFBQSxLQUFLLENBQUMsTUFBTSwwQ0FBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBQSxLQUFLLENBQUMsTUFBTSwwQ0FBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsTUFBQSxLQUFLLENBQUMsTUFBTSwwQ0FBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBMEIsRUFBRSxFQUFFO2dCQUN0RCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQTBCLEVBQUUsRUFBRTtnQkFDdEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3JELEtBQWEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBeENXLFFBQUEsSUFBSSxRQXdDZiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0IHsgc3Bhd24sIFNwYXduT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFRlbXBEaXIoXG4gIGRpcm5hbWU6IHN0cmluZyxcbiAgY2xvc3VyZTogKCkgPT4gUHJvbWlzZTx2b2lkPixcbikge1xuICBjb25zdCBwcmV2ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcGFyZW50ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwiY2RrdGYuXCIpKTtcbiAgY29uc3Qgd29ya2RpciA9IHBhdGguam9pbihwYXJlbnQsIGRpcm5hbWUpO1xuICBhd2FpdCBmcy5ta2RpcnAod29ya2Rpcik7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5jaGRpcih3b3JrZGlyKTtcbiAgICBhd2FpdCBjbG9zdXJlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5jaGRpcihwcmV2ZGlyKTtcbiAgICBhd2FpdCBmcy5yZW1vdmUocGFyZW50KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogU3Bhd25PcHRpb25zLFxuICBzdGRvdXQ/OiAoY2h1bms6IEJ1ZmZlcikgPT4gYW55LFxuICBzdGRlcnI/OiAoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpID0+IGFueSxcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgob2ssIGtvKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8QnVmZmVyPigpO1xuICAgIGNvbnN0IGVyciA9IG5ldyBBcnJheTxzdHJpbmcgfCBVaW50OEFycmF5PigpO1xuICAgIGlmIChzdGRvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGNodW5rOiBCdWZmZXIpID0+IHtcbiAgICAgICAgc3Rkb3V0KGNodW5rKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZC5zdGRvdXQ/Lm9uKFwiZGF0YVwiLCAoY2h1bms6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBvdXQucHVzaChjaHVuayk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0ZGVyciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaGlsZC5zdGRlcnI/Lm9uKFwiZGF0YVwiLCAoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpID0+IHtcbiAgICAgICAgc3RkZXJyKGNodW5rKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZC5zdGRlcnI/Lm9uKFwiZGF0YVwiLCAoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoY2h1bmspO1xuICAgICAgICBlcnIucHVzaChjaHVuayk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hpbGQub25jZShcImVycm9yXCIsIChlcnI6IGFueSkgPT4ga28oZXJyKSk7XG4gICAgY2hpbGQub25jZShcImNsb3NlXCIsIChjb2RlOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBub24temVybyBleGl0IGNvZGUgJHtjb2RlfWApO1xuICAgICAgICAoZXJyb3IgYXMgYW55KS5zdGRlcnIgPSBlcnIubWFwKChjaHVuaykgPT4gY2h1bmsudG9TdHJpbmcoKSkuam9pbihcIlwiKTtcbiAgICAgICAgcmV0dXJuIGtvKGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvayhCdWZmZXIuY29uY2F0KG91dCkudG9TdHJpbmcoXCJ1dGYtOFwiKSk7XG4gICAgfSk7XG4gIH0pO1xufTtcbiJdfQ==