projen-cdktf-hybrid-construct 0.1.63 → 0.1.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/.jsii +48 -32
  2. package/.projenrc.ts +1 -2
  3. package/API.md +13 -0
  4. package/CHANGELOG.md +2 -2
  5. package/lib/hybrid-module.d.ts +4 -0
  6. package/lib/hybrid-module.js +14 -14
  7. package/lib/publishing.d.ts +23 -4
  8. package/lib/publishing.js +13 -12
  9. package/lib/terraform-module.js +4 -4
  10. package/package.json +3 -6
  11. package/releasetag.txt +1 -1
  12. package/version.txt +1 -1
  13. package/node_modules/uuid/CHANGELOG.md +0 -229
  14. package/node_modules/uuid/CONTRIBUTING.md +0 -18
  15. package/node_modules/uuid/LICENSE.md +0 -9
  16. package/node_modules/uuid/README.md +0 -505
  17. package/node_modules/uuid/dist/bin/uuid +0 -2
  18. package/node_modules/uuid/dist/esm-browser/index.js +0 -9
  19. package/node_modules/uuid/dist/esm-browser/md5.js +0 -215
  20. package/node_modules/uuid/dist/esm-browser/nil.js +0 -1
  21. package/node_modules/uuid/dist/esm-browser/parse.js +0 -35
  22. package/node_modules/uuid/dist/esm-browser/regex.js +0 -1
  23. package/node_modules/uuid/dist/esm-browser/rng.js +0 -19
  24. package/node_modules/uuid/dist/esm-browser/sha1.js +0 -96
  25. package/node_modules/uuid/dist/esm-browser/stringify.js +0 -30
  26. package/node_modules/uuid/dist/esm-browser/v1.js +0 -95
  27. package/node_modules/uuid/dist/esm-browser/v3.js +0 -4
  28. package/node_modules/uuid/dist/esm-browser/v35.js +0 -64
  29. package/node_modules/uuid/dist/esm-browser/v4.js +0 -24
  30. package/node_modules/uuid/dist/esm-browser/v5.js +0 -4
  31. package/node_modules/uuid/dist/esm-browser/validate.js +0 -7
  32. package/node_modules/uuid/dist/esm-browser/version.js +0 -11
  33. package/node_modules/uuid/dist/esm-node/index.js +0 -9
  34. package/node_modules/uuid/dist/esm-node/md5.js +0 -13
  35. package/node_modules/uuid/dist/esm-node/nil.js +0 -1
  36. package/node_modules/uuid/dist/esm-node/parse.js +0 -35
  37. package/node_modules/uuid/dist/esm-node/regex.js +0 -1
  38. package/node_modules/uuid/dist/esm-node/rng.js +0 -12
  39. package/node_modules/uuid/dist/esm-node/sha1.js +0 -13
  40. package/node_modules/uuid/dist/esm-node/stringify.js +0 -29
  41. package/node_modules/uuid/dist/esm-node/v1.js +0 -95
  42. package/node_modules/uuid/dist/esm-node/v3.js +0 -4
  43. package/node_modules/uuid/dist/esm-node/v35.js +0 -64
  44. package/node_modules/uuid/dist/esm-node/v4.js +0 -24
  45. package/node_modules/uuid/dist/esm-node/v5.js +0 -4
  46. package/node_modules/uuid/dist/esm-node/validate.js +0 -7
  47. package/node_modules/uuid/dist/esm-node/version.js +0 -11
  48. package/node_modules/uuid/dist/index.js +0 -79
  49. package/node_modules/uuid/dist/md5-browser.js +0 -223
  50. package/node_modules/uuid/dist/md5.js +0 -23
  51. package/node_modules/uuid/dist/nil.js +0 -8
  52. package/node_modules/uuid/dist/parse.js +0 -45
  53. package/node_modules/uuid/dist/regex.js +0 -8
  54. package/node_modules/uuid/dist/rng-browser.js +0 -26
  55. package/node_modules/uuid/dist/rng.js +0 -24
  56. package/node_modules/uuid/dist/sha1-browser.js +0 -104
  57. package/node_modules/uuid/dist/sha1.js +0 -23
  58. package/node_modules/uuid/dist/stringify.js +0 -39
  59. package/node_modules/uuid/dist/umd/uuid.min.js +0 -1
  60. package/node_modules/uuid/dist/umd/uuidNIL.min.js +0 -1
  61. package/node_modules/uuid/dist/umd/uuidParse.min.js +0 -1
  62. package/node_modules/uuid/dist/umd/uuidStringify.min.js +0 -1
  63. package/node_modules/uuid/dist/umd/uuidValidate.min.js +0 -1
  64. package/node_modules/uuid/dist/umd/uuidVersion.min.js +0 -1
  65. package/node_modules/uuid/dist/umd/uuidv1.min.js +0 -1
  66. package/node_modules/uuid/dist/umd/uuidv3.min.js +0 -1
  67. package/node_modules/uuid/dist/umd/uuidv4.min.js +0 -1
  68. package/node_modules/uuid/dist/umd/uuidv5.min.js +0 -1
  69. package/node_modules/uuid/dist/uuid-bin.js +0 -85
  70. package/node_modules/uuid/dist/v1.js +0 -107
  71. package/node_modules/uuid/dist/v3.js +0 -16
  72. package/node_modules/uuid/dist/v35.js +0 -78
  73. package/node_modules/uuid/dist/v4.js +0 -37
  74. package/node_modules/uuid/dist/v5.js +0 -16
  75. package/node_modules/uuid/dist/validate.js +0 -17
  76. package/node_modules/uuid/dist/version.js +0 -21
  77. package/node_modules/uuid/package.json +0 -135
  78. package/node_modules/uuid/wrapper.mjs +0 -10
package/.jsii CHANGED
@@ -7,8 +7,7 @@
7
7
  ]
8
8
  },
9
9
  "bundled": {
10
- "change-case": "^4.1.2",
11
- "uuid": "^8.3.2"
10
+ "change-case": "^4.1.2"
12
11
  },
13
12
  "dependencies": {
14
13
  "projen": ">= 0.53.6"
@@ -93,7 +92,7 @@
93
92
  "kind": "interface",
94
93
  "locationInModule": {
95
94
  "filename": "src/hybrid-module.ts",
96
- "line": 7
95
+ "line": 6
97
96
  },
98
97
  "name": "ConstructExamplesOption",
99
98
  "properties": [
@@ -105,7 +104,7 @@
105
104
  "immutable": true,
106
105
  "locationInModule": {
107
106
  "filename": "src/hybrid-module.ts",
108
- "line": 9
107
+ "line": 8
109
108
  },
110
109
  "name": "enabled",
111
110
  "type": {
@@ -120,7 +119,7 @@
120
119
  "immutable": true,
121
120
  "locationInModule": {
122
121
  "filename": "src/hybrid-module.ts",
123
- "line": 11
122
+ "line": 10
124
123
  },
125
124
  "name": "folder",
126
125
  "optional": true,
@@ -148,7 +147,7 @@
148
147
  },
149
148
  "locationInModule": {
150
149
  "filename": "src/hybrid-module.ts",
151
- "line": 162
150
+ "line": 166
152
151
  },
153
152
  "parameters": [
154
153
  {
@@ -162,7 +161,7 @@
162
161
  "kind": "class",
163
162
  "locationInModule": {
164
163
  "filename": "src/hybrid-module.ts",
165
- "line": 161
164
+ "line": 165
166
165
  },
167
166
  "name": "HybridModule",
168
167
  "symbolId": "src/hybrid-module:HybridModule"
@@ -180,7 +179,7 @@
180
179
  "kind": "interface",
181
180
  "locationInModule": {
182
181
  "filename": "src/hybrid-module.ts",
183
- "line": 25
182
+ "line": 24
184
183
  },
185
184
  "name": "HybridModuleOptions",
186
185
  "properties": [
@@ -197,7 +196,7 @@
197
196
  "immutable": true,
198
197
  "locationInModule": {
199
198
  "filename": "src/hybrid-module.ts",
200
- "line": 31
199
+ "line": 30
201
200
  },
202
201
  "name": "cdktfVersion",
203
202
  "optional": true,
@@ -218,7 +217,7 @@
218
217
  "immutable": true,
219
218
  "locationInModule": {
220
219
  "filename": "src/hybrid-module.ts",
221
- "line": 51
220
+ "line": 50
222
221
  },
223
222
  "name": "constructExamples",
224
223
  "optional": true,
@@ -236,7 +235,7 @@
236
235
  "immutable": true,
237
236
  "locationInModule": {
238
237
  "filename": "src/hybrid-module.ts",
239
- "line": 37
238
+ "line": 36
240
239
  },
241
240
  "name": "constructVersion",
242
241
  "optional": true,
@@ -253,7 +252,7 @@
253
252
  "immutable": true,
254
253
  "locationInModule": {
255
254
  "filename": "src/hybrid-module.ts",
256
- "line": 58
255
+ "line": 57
257
256
  },
258
257
  "name": "projectId",
259
258
  "optional": true,
@@ -261,6 +260,23 @@
261
260
  "primitive": "string"
262
261
  }
263
262
  },
263
+ {
264
+ "abstract": true,
265
+ "docs": {
266
+ "stability": "stable",
267
+ "summary": "If set a terraform plan is being run as part of the tests."
268
+ },
269
+ "immutable": true,
270
+ "locationInModule": {
271
+ "filename": "src/hybrid-module.ts",
272
+ "line": 62
273
+ },
274
+ "name": "runPlan",
275
+ "optional": true,
276
+ "type": {
277
+ "primitive": "boolean"
278
+ }
279
+ },
264
280
  {
265
281
  "abstract": true,
266
282
  "docs": {
@@ -274,7 +290,7 @@
274
290
  "immutable": true,
275
291
  "locationInModule": {
276
292
  "filename": "src/hybrid-module.ts",
277
- "line": 44
293
+ "line": 43
278
294
  },
279
295
  "name": "terraformExamples",
280
296
  "optional": true,
@@ -295,7 +311,7 @@
295
311
  "kind": "interface",
296
312
  "locationInModule": {
297
313
  "filename": "src/hybrid-module.ts",
298
- "line": 14
314
+ "line": 13
299
315
  },
300
316
  "name": "TerraformExamplesOption",
301
317
  "properties": [
@@ -307,7 +323,7 @@
307
323
  "immutable": true,
308
324
  "locationInModule": {
309
325
  "filename": "src/hybrid-module.ts",
310
- "line": 16
326
+ "line": 15
311
327
  },
312
328
  "name": "enabled",
313
329
  "type": {
@@ -322,7 +338,7 @@
322
338
  "immutable": true,
323
339
  "locationInModule": {
324
340
  "filename": "src/hybrid-module.ts",
325
- "line": 22
341
+ "line": 21
326
342
  },
327
343
  "name": "exampleCode",
328
344
  "optional": true,
@@ -338,7 +354,7 @@
338
354
  "immutable": true,
339
355
  "locationInModule": {
340
356
  "filename": "src/hybrid-module.ts",
341
- "line": 18
357
+ "line": 17
342
358
  },
343
359
  "name": "folder",
344
360
  "optional": true,
@@ -354,7 +370,7 @@
354
370
  "immutable": true,
355
371
  "locationInModule": {
356
372
  "filename": "src/hybrid-module.ts",
357
- "line": 20
373
+ "line": 19
358
374
  },
359
375
  "name": "providerConfig",
360
376
  "optional": true,
@@ -382,7 +398,7 @@
382
398
  },
383
399
  "locationInModule": {
384
400
  "filename": "src/terraform-module.ts",
385
- "line": 51
401
+ "line": 50
386
402
  },
387
403
  "parameters": [
388
404
  {
@@ -396,7 +412,7 @@
396
412
  "kind": "class",
397
413
  "locationInModule": {
398
414
  "filename": "src/terraform-module.ts",
399
- "line": 50
415
+ "line": 49
400
416
  },
401
417
  "name": "TerraformModule",
402
418
  "symbolId": "src/terraform-module:TerraformModule"
@@ -414,7 +430,7 @@
414
430
  "kind": "interface",
415
431
  "locationInModule": {
416
432
  "filename": "src/terraform-module.ts",
417
- "line": 16
433
+ "line": 15
418
434
  },
419
435
  "name": "TerraformModuleOptions",
420
436
  "properties": [
@@ -430,7 +446,7 @@
430
446
  "immutable": true,
431
447
  "locationInModule": {
432
448
  "filename": "src/terraform-module.ts",
433
- "line": 39
449
+ "line": 38
434
450
  },
435
451
  "name": "terraformModules",
436
452
  "type": {
@@ -455,7 +471,7 @@
455
471
  "immutable": true,
456
472
  "locationInModule": {
457
473
  "filename": "src/terraform-module.ts",
458
- "line": 22
474
+ "line": 21
459
475
  },
460
476
  "name": "cdktfVersion",
461
477
  "optional": true,
@@ -473,7 +489,7 @@
473
489
  "immutable": true,
474
490
  "locationInModule": {
475
491
  "filename": "src/terraform-module.ts",
476
- "line": 28
492
+ "line": 27
477
493
  },
478
494
  "name": "constructVersion",
479
495
  "optional": true,
@@ -489,7 +505,7 @@
489
505
  "immutable": true,
490
506
  "locationInModule": {
491
507
  "filename": "src/terraform-module.ts",
492
- "line": 42
508
+ "line": 41
493
509
  },
494
510
  "name": "projectId",
495
511
  "optional": true,
@@ -506,7 +522,7 @@
506
522
  "immutable": true,
507
523
  "locationInModule": {
508
524
  "filename": "src/terraform-module.ts",
509
- "line": 33
525
+ "line": 32
510
526
  },
511
527
  "name": "terraformProviders",
512
528
  "optional": true,
@@ -532,7 +548,7 @@
532
548
  "kind": "interface",
533
549
  "locationInModule": {
534
550
  "filename": "src/terraform-module.ts",
535
- "line": 7
551
+ "line": 6
536
552
  },
537
553
  "name": "TerraformVersionConstraint",
538
554
  "properties": [
@@ -544,7 +560,7 @@
544
560
  "immutable": true,
545
561
  "locationInModule": {
546
562
  "filename": "src/terraform-module.ts",
547
- "line": 9
563
+ "line": 8
548
564
  },
549
565
  "name": "name",
550
566
  "type": {
@@ -559,7 +575,7 @@
559
575
  "immutable": true,
560
576
  "locationInModule": {
561
577
  "filename": "src/terraform-module.ts",
562
- "line": 11
578
+ "line": 10
563
579
  },
564
580
  "name": "source",
565
581
  "type": {
@@ -574,7 +590,7 @@
574
590
  "immutable": true,
575
591
  "locationInModule": {
576
592
  "filename": "src/terraform-module.ts",
577
- "line": 13
593
+ "line": 12
578
594
  },
579
595
  "name": "version",
580
596
  "type": {
@@ -585,6 +601,6 @@
585
601
  "symbolId": "src/terraform-module:TerraformVersionConstraint"
586
602
  }
587
603
  },
588
- "version": "0.1.63",
589
- "fingerprint": "E58pif/EiQhE5JBaAkMimekYPRuhOmMUzTcN4a3aUJk="
604
+ "version": "0.1.66",
605
+ "fingerprint": "d21YBvDFGEQ7Qc23NlA8Qye2tMA7CS5kOiyPZQyxXlA="
590
606
  }
package/.projenrc.ts CHANGED
@@ -35,14 +35,13 @@ project.addTask("buildExample", {
35
35
  });
36
36
 
37
37
  project.addPeerDeps("projen@>= 0.53.6");
38
- project.addBundledDeps("uuid", "change-case");
38
+ project.addBundledDeps("change-case");
39
39
  project.addDevDeps(
40
40
  "fs-extra",
41
41
  "glob",
42
42
  "projen@0.53.6",
43
43
  "@types/fs-extra",
44
44
  "@types/glob",
45
- "@types/uuid",
46
45
  "@types/change-case"
47
46
  );
48
47
 
package/API.md CHANGED
@@ -204,6 +204,7 @@ const hybridModuleOptions: HybridModuleOptions = { ... }
204
204
  | <code><a href="#projen-cdktf-hybrid-construct.HybridModuleOptions.property.constructExamples">constructExamples</a></code> | <code><a href="#projen-cdktf-hybrid-construct.ConstructExamplesOption">ConstructExamplesOption</a></code> | If set a construct examples folder will be created. |
205
205
  | <code><a href="#projen-cdktf-hybrid-construct.HybridModuleOptions.property.constructVersion">constructVersion</a></code> | <code>string</code> | Construct version to use. |
206
206
  | <code><a href="#projen-cdktf-hybrid-construct.HybridModuleOptions.property.projectId">projectId</a></code> | <code>string</code> | If set a terraform examples folder will be created Defaults to a uuid string as cdktf would Mostly used for testing to have a predictable result. |
207
+ | <code><a href="#projen-cdktf-hybrid-construct.HybridModuleOptions.property.runPlan">runPlan</a></code> | <code>boolean</code> | If set a terraform plan is being run as part of the tests. |
207
208
  | <code><a href="#projen-cdktf-hybrid-construct.HybridModuleOptions.property.terraformExamples">terraformExamples</a></code> | <code><a href="#projen-cdktf-hybrid-construct.TerraformExamplesOption">TerraformExamplesOption</a></code> | If set a terraform examples folder will be created. |
208
209
 
209
210
  ---
@@ -2311,6 +2312,18 @@ If set a terraform examples folder will be created Defaults to a uuid string as
2311
2312
 
2312
2313
  ---
2313
2314
 
2315
+ ##### `runPlan`<sup>Optional</sup> <a name="runPlan" id="projen-cdktf-hybrid-construct.HybridModuleOptions.property.runPlan"></a>
2316
+
2317
+ ```typescript
2318
+ public readonly runPlan: boolean;
2319
+ ```
2320
+
2321
+ - *Type:* boolean
2322
+
2323
+ If set a terraform plan is being run as part of the tests.
2324
+
2325
+ ---
2326
+
2314
2327
  ##### `terraformExamples`<sup>Optional</sup> <a name="terraformExamples" id="projen-cdktf-hybrid-construct.HybridModuleOptions.property.terraformExamples"></a>
2315
2328
 
2316
2329
  ```typescript
package/CHANGELOG.md CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
- ### [0.1.63](https://github.com/DanielMSchmidt/projen-cdktf-hybrid-construct/compare/v0.1.62...v0.1.63) (2022-05-09)
2
+ ### [0.1.66](https://github.com/DanielMSchmidt/projen-cdktf-hybrid-construct/compare/v0.1.65...v0.1.66) (2022-05-09)
3
3
 
4
4
 
5
5
  ### Bug Fixes
6
6
 
7
- * configure provider in different file ([#62](https://github.com/DanielMSchmidt/projen-cdktf-hybrid-construct/issues/62)) ([899356c](https://github.com/DanielMSchmidt/projen-cdktf-hybrid-construct/commit/899356c97e5d85483baae6d4615b8d061aedec4d))
7
+ * fix publishing to github ([92ef352](https://github.com/DanielMSchmidt/projen-cdktf-hybrid-construct/commit/92ef352256ad10e4022848ae1273ebe76d0bbe16))
@@ -39,6 +39,10 @@ export interface HybridModuleOptions extends ConstructLibraryOptions {
39
39
  * Mostly used for testing to have a predictable result
40
40
  */
41
41
  readonly projectId?: string;
42
+ /**
43
+ * If set a terraform plan is being run as part of the tests
44
+ */
45
+ readonly runPlan?: boolean;
42
46
  }
43
47
  /**
44
48
  * Hybrid CDKTF Construct / Terraform Module
@@ -6,7 +6,6 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const path = require("path");
7
7
  const projen_1 = require("projen");
8
8
  const cdk_1 = require("projen/lib/cdk");
9
- const uuid_1 = require("uuid");
10
9
  const defaults_1 = require("./defaults");
11
10
  const constructSrcCode = `
12
11
  import { Construct } from "constructs";
@@ -144,7 +143,8 @@ module "eks_managed_node_group" {
144
143
  terraformProviders: ["hashicorp/null@3.1.1"],
145
144
  terraformModules: [],
146
145
  output: "modules",
147
- projectId: options.projectId || uuid_1.v4(),
146
+ projectId: options.projectId ||
147
+ "hybrid-module-fb734dba-eac9-466c-96bb-7eb9c406c28a",
148
148
  }, null, 2),
149
149
  "__tests__/index-test.ts": constructTestCode.trim(),
150
150
  },
@@ -174,15 +174,14 @@ terraform {
174
174
  });
175
175
  new HCLFile(this, path.join(examplesFolder, "provider.tf"), providerConfig);
176
176
  this.gitignore.addPatterns(`${examplesFolder}/.terraform`, `${examplesFolder}/.terraform.lock.hcl`);
177
- new ScriptFile(this, "./scripts/tf-module-test.sh", `
178
- #!/bin/bash
179
- # This script is created by projen, do not edit it directly.
180
- set -e
181
-
182
- terraform -chdir=${examplesFolder} init --upgrade
183
- terraform -chdir=${examplesFolder} fmt
184
- terraform -chdir=${examplesFolder} validate
185
- terraform -chdir=${examplesFolder} plan
177
+ new ScriptFile(this, "./scripts/tf-module-test.sh", `#!/bin/bash
178
+ # This script is created by projen, do not edit it directly.
179
+ set -e
180
+
181
+ terraform -chdir=${examplesFolder} init --upgrade
182
+ terraform -chdir=${examplesFolder} fmt
183
+ terraform -chdir=${examplesFolder} validate
184
+ ${options.runPlan ? `terraform -chdir=${examplesFolder} plan` : ""}
186
185
  `);
187
186
  this.testTask.exec("./scripts/tf-module-test.sh");
188
187
  (_c = this.jest) === null || _c === void 0 ? void 0 : _c.addIgnorePattern(examplesFolder);
@@ -241,7 +240,8 @@ app.synth();
241
240
  "cdktf.json": JSON.stringify({
242
241
  language: "typescript",
243
242
  app: `npx ts-node --project ${levels}/tsconfig.dev.json index.ts`,
244
- projectId: options.projectId || uuid_1.v4(),
243
+ projectId: options.projectId ||
244
+ "hybrid-module-fb734dba-eac9-466c-96bb-7eb9c406c28a",
245
245
  }, null, 2),
246
246
  "README.md": constructReadmeDocs.trim(),
247
247
  },
@@ -318,5 +318,5 @@ done
318
318
  }
319
319
  exports.HybridModule = HybridModule;
320
320
  _a = JSII_RTTI_SYMBOL_1;
321
- HybridModule[_a] = { fqn: "projen-cdktf-hybrid-construct.HybridModule", version: "0.1.63" };
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlicmlkLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oeWJyaWQtbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLG1DQUFpRTtBQUNqRSx3Q0FBc0U7QUFDdEUsK0JBQWtDO0FBQ2xDLHlDQUFzQztBQXdEdEMsTUFBTSxnQkFBZ0IsR0FBRzs7Ozs7Ozs7Ozs7O0NBWXhCLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7OztDQWlCekIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JyQixDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRzs7Ozs7Ozs7O0tBU3ZCLENBQUM7QUFFTixNQUFNLFVBQVcsU0FBUSxpQkFBUTtJQUMvQixZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBVSxPQUFlO1FBQ3JFLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFO1lBQ3ZCLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUhtRCxZQUFPLEdBQVAsT0FBTyxDQUFRO0lBSXZFLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxDQUFZO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQVEsU0FBUSxpQkFBUTtJQUM1QixZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBVSxPQUFlO1FBQ3JFLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFO1lBQ3ZCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBTG1ELFlBQU8sR0FBUCxPQUFPLENBQVE7SUFNdkUsQ0FBQztJQUVTLGlCQUFpQixDQUFDLENBQVk7UUFDdEMsT0FBTztFQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNm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LENBQUMsSUFBSSwwQ0FBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7SUFDdEMsQ0FBQzs7QUF0UUgsb0NBdVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgRmlsZUJhc2UsIElSZXNvbHZlciwgUHJvamVjdCwgU2FtcGxlRGlyIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgSnNpaVByb2plY3QsIENvbnN0cnVjdExpYnJhcnlPcHRpb25zIH0gZnJvbSBcInByb2plbi9saWIvY2RrXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IGRlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3RFeGFtcGxlc09wdGlvbiB7XG4gIC8vIElmIHNldCBjb25zdHJ1Y3QgZXhhbXBsZXMgd2lsbCBiZSByZW5kZXJlZFxuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICAvLyBQYXRoIGZvciB0aGUgY29uc3RydWN0IGV4YW1wbGVzXG4gIHJlYWRvbmx5IGZvbGRlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1FeGFtcGxlc09wdGlvbiB7XG4gIC8vIElmIHNldCB0ZXJyYWZvcm0gZXhhbXBsZXMgd2lsbCBiZSByZW5kZXJlZFxuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICAvLyBQYXRoIGZvciB0aGUgdGVycmFmb3JtIGV4YW1wbGVzXG4gIHJlYWRvbmx5IGZvbGRlcj86IHN0cmluZztcbiAgLy8gVGhlIEhDTCBjb25maWcgZmlsZSB0byB1c2UgZm9yIHRoZSB0ZXJyYWZvcm0gcHJvdmlkZXJcbiAgcmVhZG9ubHkgcHJvdmlkZXJDb25maWc/OiBzdHJpbmc7XG4gIC8vIEhDTCBleGFtcGxlIGNvbmZpZ1xuICByZWFkb25seSBleGFtcGxlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIeWJyaWRNb2R1bGVPcHRpb25zIGV4dGVuZHMgQ29uc3RydWN0TGlicmFyeU9wdGlvbnMge1xuICAvKipcbiAgICogTWluaW11bSB0YXJnZXQgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuXG4gICAqIEBkZWZhdWx0IFwiXjAuMTAuMVwiXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2RrdGZWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdmVyc2lvbiB0byB1c2VcbiAgICogQGRlZmF1bHQgXCJeMTAuMC4xMlwiXG4gICAqL1xuICByZWFkb25seSBjb25zdHJ1Y3RWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgYSB0ZXJyYWZvcm0gZXhhbXBsZXMgZm9sZGVyIHdpbGwgYmUgY3JlYXRlZFxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSB0ZXJyYWZvcm1FeGFtcGxlcz86IFRlcnJhZm9ybUV4YW1wbGVzT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgYSBjb25zdHJ1Y3QgZXhhbXBsZXMgZm9sZGVyIHdpbGwgYmUgY3JlYXRlZFxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBjb25zdHJ1Y3RFeGFtcGxlcz86IENvbnN0cnVjdEV4YW1wbGVzT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgYSB0ZXJyYWZvcm0gZXhhbXBsZXMgZm9sZGVyIHdpbGwgYmUgY3JlYXRlZFxuICAgKkRlZmF1bHRzIHRvIGEgdXVpZCBzdHJpbmcgYXMgY2RrdGYgd291bGRcbiAgICogTW9zdGx5IHVzZWQgZm9yIHRlc3RpbmcgdG8gaGF2ZSBhIHByZWRpY3RhYmxlIHJlc3VsdFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdElkPzogc3RyaW5nO1xufVxuXG5jb25zdCBjb25zdHJ1Y3RTcmNDb2RlID0gYFxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNeUNvbnN0cnVjdE9wdGlvbnMge1xuICByZWFkb25seSBwcm9wZXJ0eUE6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE15Q29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHVibGljIGNvbmZpZzogTXlDb25zdHJ1Y3RPcHRpb25zKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxufVxuYDtcblxuY29uc3QgY29uc3RydWN0VGVzdENvZGUgPSBgXG5pbXBvcnQgeyBUZXN0aW5nIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgXCJjZGt0Zi9saWIvdGVzdGluZy9hZGFwdGVycy9qZXN0XCI7XG5pbXBvcnQgeyBNeUNvbnN0cnVjdCB9IGZyb20gXCIuLi9cIjtcblxuLy8gVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIHNlZSBjZGsudGYvdGVzdGluZ1xuZGVzY3JpYmUoXCJNeUNvbnN0cnVjdFwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHN5bnRoZXNpemVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIFRlc3Rpbmcuc3ludGhTY29wZSgoc2NvcGUpID0+IHtcbiAgICAgICAgbmV3IE15Q29uc3RydWN0KHNjb3BlLCBcIm15LWNvbnN0cnVjdFwiLCB7XG4gICAgICAgICAgcHJvcGVydHlBOiBcInZhbHVlQVwiLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSk7XG59KTtcbmA7XG5cbmNvbnN0IG1vZHVsZVNyY0NvZGUgPSBgXG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBURk1vZHVsZVN0YWNrIH0gZnJvbSBcImNka3RmLXRmLW1vZHVsZS1zdGFja1wiO1xuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5jbGFzcyBNeUF3ZXNvbWVNb2R1bGUgZXh0ZW5kcyBURk1vZHVsZVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBuZXcgTXlDb25zdHJ1Y3QodGhpcywgXCJteS1jb25zdHJ1Y3RcIiwge1xuICAgICAgcHJvcGVydHlBOiBcInZhbHVlQVwiLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbi8vIFRoaXMgaXMgdGhlIG5hbWUgdGhlIG1vZHVsZSBjYW4gYmUgZm91bmQgdW5kZXIuIFxuLy8gV2UgZXhwZWN0IGEgXCJteS1hd2Vzb21lLW1vZHVsZS5tZFwiIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuXG4vLyBUaGUgUkVBRE1FLm1kIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGZpbGUuXG5uZXcgTXlBd2Vzb21lTW9kdWxlKGFwcCwgXCJteS1hd2Vzb21lLW1vZHVsZVwiKTtcbmFwcC5zeW50aCgpO1xuYDtcblxuY29uc3QgdGVycmFmb3JtUmVhZG1lRG9jcyA9IGBcbiMgUGxlYXNlIGFkZCBoZXJlIHNvbWUgcHVyZSBIQ0wgdGVzdHMgZm9yIHlvdXIgbW9kdWxlcyBpbiBvcmRlciB0byB0ZXN0IEhDTCBJbnRlcm9wZXJhYmlsaXR5XG5cbkV4YW1wbGVzOlxuXG5tb2R1bGUgXCJteV9hd2Vzb21lX3Rlc3RcIiB7XG4gIHNvdXJjZSA9IFwiLi4vbW9kdWxlcy9teS1hd2Vzb21lLW1vZHVsZXNcIlxuICAuLi52YXJpYWJsZXMuLi5cbn1cbiAgICBgO1xuXG5jbGFzcyBTY3JpcHRGaWxlIGV4dGVuZHMgRmlsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBwcml2YXRlIGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHN1cGVyKHByb2plY3QsIGZpbGVQYXRoLCB7XG4gICAgICBleGVjdXRhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVDb250ZW50KF86IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudDtcbiAgfVxufVxuXG5jbGFzcyBIQ0xGaWxlIGV4dGVuZHMgRmlsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBwcml2YXRlIGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHN1cGVyKHByb2plY3QsIGZpbGVQYXRoLCB7XG4gICAgICBleGVjdXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbW1pdHRlZDogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSwgLy8gdGVycmFmb3JtIGZtdCBtaWdodCB3YW50IHRvIG92ZXJ3cml0ZSBpdFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVDb250ZW50KF86IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGAjIFRoaXMgZmlsZSBpcyBtYW5hZ2VkIGJ5IHByb2plbi4gRG8gbm90IGVkaXQsIGNoYW5nZSB0aGUgLnByb2plbnJjIGZpbGUgaW5zdGVhZC5cbiR7dGhpcy5jb250ZW50fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBIeWJyaWQgQ0RLVEYgQ29uc3RydWN0IC8gVGVycmFmb3JtIE1vZHVsZVxuICpcbiAqIEBwamlkIGh5YnJpZC1tb2R1bGVcbiAqL1xuZXhwb3J0IGNsYXNzIEh5YnJpZE1vZHVsZSBleHRlbmRzIEpzaWlQcm9qZWN0IHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSHlicmlkTW9kdWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmRlZmF1bHRzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGVzbGludE9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuZXNsaW50T3B0aW9ucywge1xuICAgICAgICBsaW50UHJvamVuUmM6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICBwb3N0QnVpbGRTdGVwczogW10sXG4gICAgfSk7XG4gICAgY29uc3QgY29uc3RydWN0VmVyc2lvbiA9IG9wdGlvbnMuY29uc3RydWN0VmVyc2lvbiB8fCBcIl4xMC4wLjEwN1wiO1xuICAgIGNvbnN0IGNka3RmVmVyc2lvbiA9IG9wdGlvbnMuY2RrdGZWZXJzaW9uIHx8IFwiXjAuMTAuMVwiO1xuXG4gICAgdGhpcy5hZGRQZWVyRGVwcyhgY29uc3RydWN0c0Ake2NvbnN0cnVjdFZlcnNpb259YCwgYGNka3RmQCR7Y2RrdGZWZXJzaW9ufWApO1xuICAgIHRoaXMuYWRkRGV2RGVwcyhgY2RrdGYtY2xpQCR7Y2RrdGZWZXJzaW9ufWAsIFwidHMtbm9kZVwiKTtcbiAgICB0aGlzLmFkZEtleXdvcmRzKFwiY2RrXCIsIFwiY2RrdGZcIiwgXCJjZGt0Zi1oeWJyaWRcIiwgXCJ0ZXJyYWZvcm1cIik7XG4gICAgdGhpcy5zZXRTY3JpcHQoXCJ0ZXJyYWZvcm06dGVzdFwiLCBcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiKTtcblxuICAgIC8vIE1vZHVsZSBFbnRyeXBvaW50XG4gICAgdGhpcy5hZGREZXBzKFwiY2RrdGYtdGYtbW9kdWxlLXN0YWNrXCIpO1xuICAgIGNvbnN0IG1vZHVsZURvY3MgPSBgXG4jIE15IEF3ZXNvbWUgTW9kdWxlXG5cbiMjIFVzYWdlXG5cblxcYFxcYFxcYGhjbFxubW9kdWxlIFwiZWtzX21hbmFnZWRfbm9kZV9ncm91cFwiIHtcbiAgc291cmNlID0gXCIke1xuICAgIG9wdGlvbnMucmVwb3NpdG9yeVVybFxuICAgICAgPy5yZXBsYWNlKFwiaHR0cHM6Ly9naXRodWIuY29tL1wiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCJodHRwOi8vZ2l0aHViLmNvbS9cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFwiZ2l0aHViLmNvbS9cIiwgXCJcIikgfHwgXCJteS1naXRodWItcmVwb1wiXG4gIH0vL21vZHVsZXMvbXktYXdlc29tZS1tb2R1bGVcIlxuXG59XG5cXGBcXGBcXGBcbiAgICBgO1xuXG4gICAgbmV3IFNhbXBsZURpcih0aGlzLCB0aGlzLnNyY2Rpciwge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgXCJpbmRleC50c1wiOiBjb25zdHJ1Y3RTcmNDb2RlLnRyaW0oKSxcbiAgICAgICAgXCJ0Zk1vZHVsZXMudHNcIjogbW9kdWxlU3JjQ29kZS50cmltKCksXG4gICAgICAgIFwibXktYXdlc29tZS1tb2R1bGUubWRcIjogbW9kdWxlRG9jcy50cmltKCksXG4gICAgICAgIFwiY2RrdGYuanNvblwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYW5ndWFnZTogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgICAgICBhcHA6IFwibnB4IHRzLW5vZGUgdGZNb2R1bGVzLnRzXCIsXG4gICAgICAgICAgICB0ZXJyYWZvcm1Qcm92aWRlcnM6IFtcImhhc2hpY29ycC9udWxsQDMuMS4xXCJdLCAvLyBXZSBuZWVkIGF0IGxlYXN0IGEgcHJvdmlkZXIgZm9yIGdldCB0byBzdWNjZWVkXG4gICAgICAgICAgICB0ZXJyYWZvcm1Nb2R1bGVzOiBbXSxcbiAgICAgICAgICAgIG91dHB1dDogXCJtb2R1bGVzXCIsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbnMucHJvamVjdElkIHx8IHV1aWQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApLFxuICAgICAgICBcIl9fdGVzdHNfXy9pbmRleC10ZXN0LnRzXCI6IGNvbnN0cnVjdFRlc3RDb2RlLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucy50ZXJyYWZvcm1FeGFtcGxlcyAmJiBvcHRpb25zLnRlcnJhZm9ybUV4YW1wbGVzLmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyQ29uZmlnID1cbiAgICAgICAgb3B0aW9ucy50ZXJyYWZvcm1FeGFtcGxlcy5wcm92aWRlckNvbmZpZyB8fFxuICAgICAgICBgXG50ZXJyYWZvcm0ge1xuICAjIFRlcnJhZm9ybSBiaW5hcnkgdmVyc2lvbiBjb25zdHJhaW50XG4gIHJlcXVpcmVkX3ZlcnNpb24gPSBcIn4+IDEuMS4wXCJcblxuICAjIERlZmluZSBhbGwgbmVlZGVkIHByb3ZpZGVycyBoZXJlLCB5b3UgY2FuIGZpbmQgYWxsIGF2YWlsYWJsZSBwcm92aWRlcnMgaGVyZTpcbiAgIyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9cbiAgcmVxdWlyZWRfcHJvdmlkZXJzIHt9XG59XG5cbiMgSW5pdGlhbGl6ZSB5b3VyIHByb3ZpZGVyIGhlcmVcblxuYC50cmltKCk7XG4gICAgICBjb25zdCBleGFtcGxlc0ZvbGRlciA9XG4gICAgICAgIG9wdGlvbnMudGVycmFmb3JtRXhhbXBsZXMuZm9sZGVyIHx8IFwidGVycmFmb3JtLWV4YW1wbGVzXCI7XG5cbiAgICAgIG5ldyBTYW1wbGVEaXIodGhpcywgZXhhbXBsZXNGb2xkZXIsIHtcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBcIm1haW4udGZcIjpcbiAgICAgICAgICAgIG9wdGlvbnMudGVycmFmb3JtRXhhbXBsZXMuZXhhbXBsZUNvZGUgfHxcbiAgICAgICAgICAgIGAjIENvbmZpZ3VyZSB5b3UgbW9kdWxlIGhlcmVgLFxuICAgICAgICAgIFwiUkVBRE1FLm1kXCI6IHRlcnJhZm9ybVJlYWRtZURvY3MudHJpbSgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBIQ0xGaWxlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBwYXRoLmpvaW4oZXhhbXBsZXNGb2xkZXIsIFwicHJvdmlkZXIudGZcIiksXG4gICAgICAgIHByb3ZpZGVyQ29uZmlnXG4gICAgICApO1xuXG4gICAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucyhcbiAgICAgICAgYCR7ZXhhbXBsZXNGb2xkZXJ9Ly50ZXJyYWZvcm1gLFxuICAgICAgICBgJHtleGFtcGxlc0ZvbGRlcn0vLnRlcnJhZm9ybS5sb2NrLmhjbGBcbiAgICAgICk7XG5cbiAgICAgIG5ldyBTY3JpcHRGaWxlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiLFxuICAgICAgICBgXG4gICMhL2Jpbi9iYXNoXG4gICMgVGhpcyBzY3JpcHQgaXMgY3JlYXRlZCBieSBwcm9qZW4sIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LlxuICBzZXQgLWVcbiAgXG4gIHRlcnJhZm9ybSAtY2hkaXI9JHtleGFtcGxlc0ZvbGRlcn0gaW5pdCAtLXVwZ3JhZGVcbiAgdGVycmFmb3JtIC1jaGRpcj0ke2V4YW1wbGVzRm9sZGVyfSBmbXRcbiAgdGVycmFmb3JtIC1jaGRpcj0ke2V4YW1wbGVzRm9sZGVyfSB2YWxpZGF0ZVxuICB0ZXJyYWZvcm0gLWNoZGlyPSR7ZXhhbXBsZXNGb2xkZXJ9IHBsYW4gICAgIFxuICAgICAgICAgIGBcbiAgICAgICk7XG5cbiAgICAgIHRoaXMudGVzdFRhc2suZXhlYyhcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiKTtcbiAgICAgIHRoaXMuamVzdD8uYWRkSWdub3JlUGF0dGVybihleGFtcGxlc0ZvbGRlcik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuY29uc3RydWN0RXhhbXBsZXMgJiYgb3B0aW9ucy5jb25zdHJ1Y3RFeGFtcGxlcy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyID1cbiAgICAgICAgb3B0aW9ucy5jb25zdHJ1Y3RFeGFtcGxlcy5mb2xkZXIgfHwgXCJjb25zdHJ1Y3QtZXhhbXBsZXNcIjtcblxuICAgICAgY29uc3QgbGV2ZWxzID0gY29uc3RydWN0RXhhbXBsZUZvbGRlclxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5zcGxpY2UoMCwgMSlcbiAgICAgICAgLm1hcCgoKSA9PiBcIi4uXCIpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgY29uc3RydWN0UmVhZG1lRG9jcyA9IGBcbiMgQ29uc3RydWN0IEV4YW1wbGVzXG5cbkV4YW1wbGUgdXNlLWNhc2VzIGZvciB0aGUgQ29uc3RydWN0IGxpYnJhcnkuXG5cbi0gW0Jhc2ljIFVzYWdlXSguL2Jhc2ljLnRzKVxuXG5UbyBlbnN1cmUgYWxsIGV4YW1wbGVzIGFyZSB3b3JraW5nLCBwbGVhc2UgbWFrZSBzdXJlIHRoZSBbaW5kZXgudHNdKC4vaW5kZXgudHMpIGZpbGUgaXMgaW1wb3J0aW5nIGFsbCBvZiB0aGVtLlxuYDtcblxuICAgICAgY29uc3QgY29uc3RydWN0RXhhbXBsZUNvZGUgPSBgXG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiJHtsZXZlbHN9L3NyYy9cIjtcblxuZXhwb3J0IGNsYXNzIEJhc2ljRXhhbXBsZSBleHRlbmRzIFRlcnJhZm9ybVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIG5hbWUpO1xuXG4gICAgbmV3IE15Q29uc3RydWN0KHRoaXMsIFwibXktY29uc3RydWN0XCIsIHtcbiAgICAgIHByb3BlcnR5QTogXCJ2YWx1ZUFcIixcbiAgICB9KTtcbiAgfVxufVxuXG5cbmA7XG5cbiAgICAgIGNvbnN0IGV4YW1wbGVDb2xsZWN0aW9uQ29kZSA9IGBcbi8vIFRoaXMgZmlsZSB3aWxsIGJlIHN5bnRoZXNpemVkIHRvIGNoZWNrIGlmIGFsbCBleGFtcGxlcyBhcmUgd29ya2luZ1xuXG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiY2RrdGZcIjtcbi8vIEFsbCBleGFtcGxlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGhlcmVcbmltcG9ydCB7IEJhc2ljRXhhbXBsZSB9IGZyb20gXCIuL2Jhc2ljXCI7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxuLy8gQWxsIGV4YW1wbGVzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgaGVyZVxubmV3IEJhc2ljRXhhbXBsZShhcHAsIFwiYmFzaWMtZXhhbXBsZVwiKTtcbmFwcC5zeW50aCgpO1xuYDtcblxuICAgICAgbmV3IFNhbXBsZURpcih0aGlzLCBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyLCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgXCJpbmRleC50c1wiOiBleGFtcGxlQ29sbGVjdGlvbkNvZGUudHJpbSgpLFxuICAgICAgICAgIFwiYmFzaWMudHNcIjogY29uc3RydWN0RXhhbXBsZUNvZGUudHJpbSgpLFxuICAgICAgICAgIFwiY2RrdGYuanNvblwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgICAgICAgICBhcHA6IGBucHggdHMtbm9kZSAtLXByb2plY3QgJHtsZXZlbHN9L3RzY29uZmlnLmRldi5qc29uIGluZGV4LnRzYCxcbiAgICAgICAgICAgICAgcHJvamVjdElkOiBvcHRpb25zLnByb2plY3RJZCB8fCB1dWlkKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApLFxuICAgICAgICAgIFwiUkVBRE1FLm1kXCI6IGNvbnN0cnVjdFJlYWRtZURvY3MudHJpbSgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudGVzdFRhc2suZXhlYyhgY2RrdGYgc3ludGhgLCB7XG4gICAgICAgIGN3ZDogY29uc3RydWN0RXhhbXBsZUZvbGRlcixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5naXRpZ25vcmUuYWRkUGF0dGVybnMoYCR7Y29uc3RydWN0RXhhbXBsZUZvbGRlcn0vY2RrdGYub3V0YCk7XG4gICAgfVxuXG4gICAgdGhpcy5naXRpZ25vcmUuYWRkUGF0dGVybnMoXCJzcmMvLmdlblwiLCBcInNyYy9jZGt0Zi5vdXRcIiwgXCJzcmMvbW9kdWxlc1wiKTtcbiAgICB0aGlzLmNvbXBpbGVUYXNrLnByZXBlbmRFeGVjKFwiY2RrdGYgZ2V0XCIsIHtcbiAgICAgIGN3ZDogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFwiY2RrdGYgc3ludGhcIiwge1xuICAgICAgY3dkOiB0aGlzLnNyY2RpcixcbiAgICAgIG5hbWU6IFwiU3ludGhlc2l6ZSBtb2R1bGUgSENMXCIsXG4gICAgfSk7XG5cbiAgICBuZXcgU2NyaXB0RmlsZShcbiAgICAgIHRoaXMsXG4gICAgICBcInNjcmlwdHMvY29weS1tb2R1bGVzLnNoXCIsXG4gICAgICBgXG4jIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxuU0NSSVBUUEFUSD1cIiQoIGNkIC0tIFwiJChkaXJuYW1lIFwiJDBcIilcIiA+L2Rldi9udWxsIDI+JjEgOyBwd2QgLVAgKVwiXG5cbiMgY2hlY2sgaWYgdGhlIG1vZHVsZSBmb2xkZXIgaGFzIGJlZW4gZ2VuZXJhdGVkIGFzIGV4cGVjdGVkXG5NT0RVTEVTX0ZPTERFUj0kKCBjZCAtLSBcIiRTQ1JJUFRQQVRILy4uL3NyYy9tb2R1bGVzL3N0YWNrc1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5TUkNfRk9MREVSPSQoIGNkIC0tIFwiJFNDUklQVFBBVEgvLi4vc3JjL1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5UQVJHRVRfRk9MREVSPVwiJFNDUklQVFBBVEgvLi4vbW9kdWxlc1wiXG5cbmlmIFsgISAtZCBcIiRNT0RVTEVTX0ZPTERFUlwiIF07IHRoZW5cbiAgZWNobyBcIkV4cGVjdGVkIG1vZHVsZSBmb2xkZXIgdG8gZXhpc3QgYXQgJE1PRFVMRVNfRk9MREVSXCJcbiAgZXhpdCAxXG5maVxuXG5jZCBcIiRNT0RVTEVTX0ZPTERFUlwiXG5mb3IgZCBpbiAqLyA7IGRvXG4gICAgWyAtTCBcIlxcJHtkJS99XCIgXSAmJiBjb250aW51ZVxuXG4gICAgZGlybmFtZT1cIlxcJHtkJS99XCJcblxuXG4gICAgIyBDaGVjayBpZiBldmVyeXRoaW5nIGlzIGluIHBsYWNlXG4gICAgaWYgWyAhIC1mIFwiJE1PRFVMRVNfRk9MREVSLyRkaXJuYW1lL2Nkay50Zi5qc29uXCIgXTsgdGhlblxuICAgICAgZWNobyBcIkV4cGVjdGVkIGNvZGUgZm9yICRkaXJuYW1lIGF0IGNkay50Zi5qc29uIHRvIGV4aXN0IGF0ICRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZVwiXG4gICAgICBleGl0IDFcbiAgICBmaVxuXG4gICAgaWYgWyAhIC1mIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBdOyB0aGVuXG4gICAgICBlY2hvIFwiRXhwZWN0ZWQgRG9jdW1lbnRhdGlvbiBmb3IgJGRpcm5hbWUgYXQgJGRpcm5hbWUubWQgdG8gZXhpc3QgYXQgJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIlxuICAgICAgZXhpdCAxXG4gICAgZmlcblxuICAgICMgQ29weSBtb2R1bGUgYW5kIHJlYWRtZSB0b2dldGhlclxuICAgIGVjaG8gXCJDb3B5aW5nIENvZGUgYW5kIFJFQURNRSBmb3IgbW9kdWxlICRkaXJuYW1lXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lXCJcbiAgICBjcCBcIiRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZS9jZGsudGYuanNvblwiIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWUvY2RrLnRmLmpzb25cIlxuICAgIGNwIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lL1JFQURNRS5tZFwiXG5cbiAgICAjIEFkZCBSRUFETUUgaGNsIGRvY3NcbiAgICBpZiB3aGljaCB0ZXJyYWZvcm0tZG9jcyA+L2Rldi9udWxsOyB0aGVuXG4gICAgICB0ZXJyYWZvcm0tZG9jcyBtYXJrZG93biB0YWJsZSAtLW91dHB1dC1maWxlIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWUvUkVBRE1FLm1kXCIgXCIkVEFSR0VUX0ZPTERFUi8kZGlybmFtZVwiIFxuICAgIGVsc2VcbiAgICAgIGRvY2tlciBydW4gLS1ybSAtLXZvbHVtZSBcIiRTQ1JJUFRQQVRILy4uL21vZHVsZXM6L3RlcnJhZm9ybS1kb2NzXCIgLXUgJChpZCAtdSkgcXVheS5pby90ZXJyYWZvcm0tZG9jcy90ZXJyYWZvcm0tZG9jczowLjE2LjAgbWFya2Rvd24gdGFibGUgLS1vdXRwdXQtZmlsZSBcIi90ZXJyYWZvcm0tZG9jcy8kZGlybmFtZS9SRUFETUUubWRcIiAvdGVycmFmb3JtLWRvY3MvJGRpcm5hbWVcbiAgICBmaVxuZG9uZVxuYC50cmltKClcbiAgICApO1xuICAgIHRoaXMuY29tcGlsZVRhc2suZXhlYyhcIi4vc2NyaXB0cy9jb3B5LW1vZHVsZXMuc2hcIiwge1xuICAgICAgbmFtZTogXCJDb3B5IEhDTCBNb2R1bGVzXCIsXG4gICAgfSk7XG5cbiAgICAvLyBpZ25vcmUgZGlzdCBpbiB0ZXN0c1xuICAgIHRoaXMuamVzdD8uYWRkSWdub3JlUGF0dGVybihcImRpc3RcIik7XG4gIH1cbn1cbiJdfQ==
321
+ HybridModule[_a] = { fqn: "projen-cdktf-hybrid-construct.HybridModule", version: "0.1.66" };
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlicmlkLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oeWJyaWQtbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLG1DQUFpRTtBQUNqRSx3Q0FBc0U7QUFDdEUseUNBQXNDO0FBNkR0QyxNQUFNLGdCQUFnQixHQUFHOzs7Ozs7Ozs7Ozs7Q0FZeEIsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUJ6QixDQUFDO0FBRUYsTUFBTSxhQUFhLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzQnJCLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFHOzs7Ozs7Ozs7S0FTdkIsQ0FBQztBQUVOLE1BQU0sVUFBVyxTQUFRLGlCQUFRO0lBQy9CLFlBQVksT0FBZ0IsRUFBRSxRQUFnQixFQUFVLE9BQWU7UUFDckUsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUU7WUFDdkIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBSG1ELFlBQU8sR0FBUCxPQUFPLENBQVE7SUFJdkUsQ0FBQztJQUVTLGlCQUFpQixDQUFDLENBQVk7UUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBUSxTQUFRLGlCQUFRO0lBQzVCLFlBQVksT0FBZ0IsRUFBRSxRQUFnQixFQUFVLE9BQWU7UUFDckUsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUU7WUFDdkIsVUFBVSxFQUFFLEtBQUs7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7UUFMbUQsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQU12RSxDQUFDO0lBRVMsaUJBQWlCLENBQUMsQ0FBWTtRQUN0QyxPQUFPO0VBQ1QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FB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a0I7U0FDekIsQ0FBQyxDQUFDO1FBRUgsdUJBQXVCO1FBQ3ZCLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0lBQ3RDLENBQUM7O0FBelFILG9DQTBRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IEZpbGVCYXNlLCBJUmVzb2x2ZXIsIFByb2plY3QsIFNhbXBsZURpciB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IEpzaWlQcm9qZWN0LCBDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucyB9IGZyb20gXCJwcm9qZW4vbGliL2Nka1wiO1xuaW1wb3J0IHsgZGVmYXVsdHMgfSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cnVjdEV4YW1wbGVzT3B0aW9uIHtcbiAgLy8gSWYgc2V0IGNvbnN0cnVjdCBleGFtcGxlcyB3aWxsIGJlIHJlbmRlcmVkXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8vIFBhdGggZm9yIHRoZSBjb25zdHJ1Y3QgZXhhbXBsZXNcbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybUV4YW1wbGVzT3B0aW9uIHtcbiAgLy8gSWYgc2V0IHRlcnJhZm9ybSBleGFtcGxlcyB3aWxsIGJlIHJlbmRlcmVkXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8vIFBhdGggZm9yIHRoZSB0ZXJyYWZvcm0gZXhhbXBsZXNcbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvLyBUaGUgSENMIGNvbmZpZyBmaWxlIHRvIHVzZSBmb3IgdGhlIHRlcnJhZm9ybSBwcm92aWRlclxuICByZWFkb25seSBwcm92aWRlckNvbmZpZz86IHN0cmluZztcbiAgLy8gSENMIGV4YW1wbGUgY29uZmlnXG4gIHJlYWRvbmx5IGV4YW1wbGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh5YnJpZE1vZHVsZU9wdGlvbnMgZXh0ZW5kcyBDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIHRhcmdldCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeS5cbiAgICogQGRlZmF1bHQgXCJeMC4xMC4xXCJcbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBjZGt0ZlZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCB2ZXJzaW9uIHRvIHVzZVxuICAgKiBAZGVmYXVsdCBcIl4xMC4wLjEyXCJcbiAgICovXG4gIHJlYWRvbmx5IGNvbnN0cnVjdFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHNldCBhIHRlcnJhZm9ybSBleGFtcGxlcyBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IHRlcnJhZm9ybUV4YW1wbGVzPzogVGVycmFmb3JtRXhhbXBsZXNPcHRpb247XG5cbiAgLyoqXG4gICAqIElmIHNldCBhIGNvbnN0cnVjdCBleGFtcGxlcyBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGNvbnN0cnVjdEV4YW1wbGVzPzogQ29uc3RydWN0RXhhbXBsZXNPcHRpb247XG5cbiAgLyoqXG4gICAqIElmIHNldCBhIHRlcnJhZm9ybSBleGFtcGxlcyBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkXG4gICAqRGVmYXVsdHMgdG8gYSB1dWlkIHN0cmluZyBhcyBjZGt0ZiB3b3VsZFxuICAgKiBNb3N0bHkgdXNlZCBmb3IgdGVzdGluZyB0byBoYXZlIGEgcHJlZGljdGFibGUgcmVzdWx0XG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHNldCBhIHRlcnJhZm9ybSBwbGFuIGlzIGJlaW5nIHJ1biBhcyBwYXJ0IG9mIHRoZSB0ZXN0c1xuICAgKi9cbiAgcmVhZG9ubHkgcnVuUGxhbj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGNvbnN0cnVjdFNyY0NvZGUgPSBgXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE15Q29uc3RydWN0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb3BlcnR5QTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTXlDb25zdHJ1Y3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwdWJsaWMgY29uZmlnOiBNeUNvbnN0cnVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICB9XG59XG5gO1xuXG5jb25zdCBjb25zdHJ1Y3RUZXN0Q29kZSA9IGBcbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCBcImNka3RmL2xpYi90ZXN0aW5nL2FkYXB0ZXJzL2plc3RcIjtcbmltcG9ydCB7IE15Q29uc3RydWN0IH0gZnJvbSBcIi4uL1wiO1xuXG4vLyBUbyBsZWFybiBtb3JlIGFib3V0IHRlc3Rpbmcgc2VlIGNkay50Zi90ZXN0aW5nXG5kZXNjcmliZShcIk15Q29uc3RydWN0XCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc3ludGhlc2l6ZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgVGVzdGluZy5zeW50aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICBuZXcgTXlDb25zdHJ1Y3Qoc2NvcGUsIFwibXktY29uc3RydWN0XCIsIHtcbiAgICAgICAgICBwcm9wZXJ0eUE6IFwidmFsdWVBXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICB9KTtcbn0pO1xuYDtcblxuY29uc3QgbW9kdWxlU3JjQ29kZSA9IGBcbmltcG9ydCB7IEFwcCB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFRGTW9kdWxlU3RhY2sgfSBmcm9tIFwiY2RrdGYtdGYtbW9kdWxlLXN0YWNrXCI7XG5pbXBvcnQgeyBNeUNvbnN0cnVjdCB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmNsYXNzIE15QXdlc29tZU1vZHVsZSBleHRlbmRzIFRGTW9kdWxlU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBNeUNvbnN0cnVjdCh0aGlzLCBcIm15LWNvbnN0cnVjdFwiLCB7XG4gICAgICBwcm9wZXJ0eUE6IFwidmFsdWVBXCIsXG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuLy8gVGhpcyBpcyB0aGUgbmFtZSB0aGUgbW9kdWxlIGNhbiBiZSBmb3VuZCB1bmRlci4gXG4vLyBXZSBleHBlY3QgYSBcIm15LWF3ZXNvbWUtbW9kdWxlLm1kXCIgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS5cbi8vIFRoZSBSRUFETUUubWQgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoaXMgZmlsZS5cbm5ldyBNeUF3ZXNvbWVNb2R1bGUoYXBwLCBcIm15LWF3ZXNvbWUtbW9kdWxlXCIpO1xuYXBwLnN5bnRoKCk7XG5gO1xuXG5jb25zdCB0ZXJyYWZvcm1SZWFkbWVEb2NzID0gYFxuIyBQbGVhc2UgYWRkIGhlcmUgc29tZSBwdXJlIEhDTCB0ZXN0cyBmb3IgeW91ciBtb2R1bGVzIGluIG9yZGVyIHRvIHRlc3QgSENMIEludGVyb3BlcmFiaWxpdHlcblxuRXhhbXBsZXM6XG5cbm1vZHVsZSBcIm15X2F3ZXNvbWVfdGVzdFwiIHtcbiAgc291cmNlID0gXCIuLi9tb2R1bGVzL215LWF3ZXNvbWUtbW9kdWxlc1wiXG4gIC4uLnZhcmlhYmxlcy4uLlxufVxuICAgIGA7XG5cbmNsYXNzIFNjcmlwdEZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcsIHByaXZhdGUgY29udGVudDogc3RyaW5nKSB7XG4gICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIHtcbiAgICAgIGV4ZWN1dGFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUNvbnRlbnQoXzogSVJlc29sdmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50O1xuICB9XG59XG5cbmNsYXNzIEhDTEZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcsIHByaXZhdGUgY29udGVudDogc3RyaW5nKSB7XG4gICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIHtcbiAgICAgIGV4ZWN1dGFibGU6IGZhbHNlLFxuICAgICAgY29tbWl0dGVkOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLCAvLyB0ZXJyYWZvcm0gZm10IG1pZ2h0IHdhbnQgdG8gb3ZlcndyaXRlIGl0XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUNvbnRlbnQoXzogSVJlc29sdmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYCMgVGhpcyBmaWxlIGlzIG1hbmFnZWQgYnkgcHJvamVuLiBEbyBub3QgZWRpdCwgY2hhbmdlIHRoZSAucHJvamVucmMgZmlsZSBpbnN0ZWFkLlxuJHt0aGlzLmNvbnRlbnR9YDtcbiAgfVxufVxuXG4vKipcbiAqIEh5YnJpZCBDREtURiBDb25zdHJ1Y3QgLyBUZXJyYWZvcm0gTW9kdWxlXG4gKlxuICogQHBqaWQgaHlicmlkLW1vZHVsZVxuICovXG5leHBvcnQgY2xhc3MgSHlicmlkTW9kdWxlIGV4dGVuZHMgSnNpaVByb2plY3Qge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBIeWJyaWRNb2R1bGVPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uZGVmYXVsdHMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZXNsaW50T3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5lc2xpbnRPcHRpb25zLCB7XG4gICAgICAgIGxpbnRQcm9qZW5SYzogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHBvc3RCdWlsZFN0ZXBzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBjb25zdHJ1Y3RWZXJzaW9uID0gb3B0aW9ucy5jb25zdHJ1Y3RWZXJzaW9uIHx8IFwiXjEwLjAuMTA3XCI7XG4gICAgY29uc3QgY2RrdGZWZXJzaW9uID0gb3B0aW9ucy5jZGt0ZlZlcnNpb24gfHwgXCJeMC4xMC4xXCI7XG5cbiAgICB0aGlzLmFkZFBlZXJEZXBzKGBjb25zdHJ1Y3RzQCR7Y29uc3RydWN0VmVyc2lvbn1gLCBgY2RrdGZAJHtjZGt0ZlZlcnNpb259YCk7XG4gICAgdGhpcy5hZGREZXZEZXBzKGBjZGt0Zi1jbGlAJHtjZGt0ZlZlcnNpb259YCwgXCJ0cy1ub2RlXCIpO1xuICAgIHRoaXMuYWRkS2V5d29yZHMoXCJjZGtcIiwgXCJjZGt0ZlwiLCBcImNka3RmLWh5YnJpZFwiLCBcInRlcnJhZm9ybVwiKTtcbiAgICB0aGlzLnNldFNjcmlwdChcInRlcnJhZm9ybTp0ZXN0XCIsIFwiLi9zY3JpcHRzL3RmLW1vZHVsZS10ZXN0LnNoXCIpO1xuXG4gICAgLy8gTW9kdWxlIEVudHJ5cG9pbnRcbiAgICB0aGlzLmFkZERlcHMoXCJjZGt0Zi10Zi1tb2R1bGUtc3RhY2tcIik7XG4gICAgY29uc3QgbW9kdWxlRG9jcyA9IGBcbiMgTXkgQXdlc29tZSBNb2R1bGVcblxuIyMgVXNhZ2VcblxuXFxgXFxgXFxgaGNsXG5tb2R1bGUgXCJla3NfbWFuYWdlZF9ub2RlX2dyb3VwXCIge1xuICBzb3VyY2UgPSBcIiR7XG4gICAgb3B0aW9ucy5yZXBvc2l0b3J5VXJsXG4gICAgICA/LnJlcGxhY2UoXCJodHRwczovL2dpdGh1Yi5jb20vXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZShcImh0dHA6Ly9naXRodWIuY29tL1wiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCJnaXRodWIuY29tL1wiLCBcIlwiKSB8fCBcIm15LWdpdGh1Yi1yZXBvXCJcbiAgfS8vbW9kdWxlcy9teS1hd2Vzb21lLW1vZHVsZVwiXG5cbn1cblxcYFxcYFxcYFxuICAgIGA7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHRoaXMsIHRoaXMuc3JjZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcImluZGV4LnRzXCI6IGNvbnN0cnVjdFNyY0NvZGUudHJpbSgpLFxuICAgICAgICBcInRmTW9kdWxlcy50c1wiOiBtb2R1bGVTcmNDb2RlLnRyaW0oKSxcbiAgICAgICAgXCJteS1hd2Vzb21lLW1vZHVsZS5tZFwiOiBtb2R1bGVEb2NzLnRyaW0oKSxcbiAgICAgICAgXCJjZGt0Zi5qc29uXCI6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgICAgIGFwcDogXCJucHggdHMtbm9kZSB0Zk1vZHVsZXMudHNcIixcbiAgICAgICAgICAgIHRlcnJhZm9ybVByb3ZpZGVyczogW1wiaGFzaGljb3JwL251bGxAMy4xLjFcIl0sIC8vIFdlIG5lZWQgYXQgbGVhc3QgYSBwcm92aWRlciBmb3IgZ2V0IHRvIHN1Y2NlZWRcbiAgICAgICAgICAgIHRlcnJhZm9ybU1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgb3V0cHV0OiBcIm1vZHVsZXNcIixcbiAgICAgICAgICAgIHByb2plY3RJZDpcbiAgICAgICAgICAgICAgb3B0aW9ucy5wcm9qZWN0SWQgfHxcbiAgICAgICAgICAgICAgXCJoeWJyaWQtbW9kdWxlLWZiNzM0ZGJhLWVhYzktNDY2Yy05NmJiLTdlYjljNDA2YzI4YVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgICksXG4gICAgICAgIFwiX190ZXN0c19fL2luZGV4LXRlc3QudHNcIjogY29uc3RydWN0VGVzdENvZGUudHJpbSgpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLnRlcnJhZm9ybUV4YW1wbGVzICYmIG9wdGlvbnMudGVycmFmb3JtRXhhbXBsZXMuZW5hYmxlZCkge1xuICAgICAgY29uc3QgcHJvdmlkZXJDb25maWcgPVxuICAgICAgICBvcHRpb25zLnRlcnJhZm9ybUV4YW1wbGVzLnByb3ZpZGVyQ29uZmlnIHx8XG4gICAgICAgIGBcbnRlcnJhZm9ybSB7XG4gICMgVGVycmFmb3JtIGJpbmFyeSB2ZXJzaW9uIGNvbnN0cmFpbnRcbiAgcmVxdWlyZWRfdmVyc2lvbiA9IFwifj4gMS4xLjBcIlxuXG4gICMgRGVmaW5lIGFsbCBuZWVkZWQgcHJvdmlkZXJzIGhlcmUsIHlvdSBjYW4gZmluZCBhbGwgYXZhaWxhYmxlIHByb3ZpZGVycyBoZXJlOlxuICAjIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL1xuICByZXF1aXJlZF9wcm92aWRlcnMge31cbn1cblxuIyBJbml0aWFsaXplIHlvdXIgcHJvdmlkZXIgaGVyZVxuXG5gLnRyaW0oKTtcbiAgICAgIGNvbnN0IGV4YW1wbGVzRm9sZGVyID1cbiAgICAgICAgb3B0aW9ucy50ZXJyYWZvcm1FeGFtcGxlcy5mb2xkZXIgfHwgXCJ0ZXJyYWZvcm0tZXhhbXBsZXNcIjtcblxuICAgICAgbmV3IFNhbXBsZURpcih0aGlzLCBleGFtcGxlc0ZvbGRlciwge1xuICAgICAgICBmaWxlczoge1xuICAgICAgICAgIFwibWFpbi50ZlwiOlxuICAgICAgICAgICAgb3B0aW9ucy50ZXJyYWZvcm1FeGFtcGxlcy5leGFtcGxlQ29kZSB8fFxuICAgICAgICAgICAgYCMgQ29uZmlndXJlIHlvdSBtb2R1bGUgaGVyZWAsXG4gICAgICAgICAgXCJSRUFETUUubWRcIjogdGVycmFmb3JtUmVhZG1lRG9jcy50cmltKCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbmV3IEhDTEZpbGUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHBhdGguam9pbihleGFtcGxlc0ZvbGRlciwgXCJwcm92aWRlci50ZlwiKSxcbiAgICAgICAgcHJvdmlkZXJDb25maWdcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKFxuICAgICAgICBgJHtleGFtcGxlc0ZvbGRlcn0vLnRlcnJhZm9ybWAsXG4gICAgICAgIGAke2V4YW1wbGVzRm9sZGVyfS8udGVycmFmb3JtLmxvY2suaGNsYFxuICAgICAgKTtcblxuICAgICAgbmV3IFNjcmlwdEZpbGUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiLi9zY3JpcHRzL3RmLW1vZHVsZS10ZXN0LnNoXCIsXG4gICAgICAgIGAjIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxudGVycmFmb3JtIC1jaGRpcj0ke2V4YW1wbGVzRm9sZGVyfSBpbml0IC0tdXBncmFkZVxudGVycmFmb3JtIC1jaGRpcj0ke2V4YW1wbGVzRm9sZGVyfSBmbXRcbnRlcnJhZm9ybSAtY2hkaXI9JHtleGFtcGxlc0ZvbGRlcn0gdmFsaWRhdGVcbiR7b3B0aW9ucy5ydW5QbGFuID8gYHRlcnJhZm9ybSAtY2hkaXI9JHtleGFtcGxlc0ZvbGRlcn0gcGxhbmAgOiBcIlwifVxuICAgICAgICAgIGBcbiAgICAgICk7XG5cbiAgICAgIHRoaXMudGVzdFRhc2suZXhlYyhcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiKTtcbiAgICAgIHRoaXMuamVzdD8uYWRkSWdub3JlUGF0dGVybihleGFtcGxlc0ZvbGRlcik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuY29uc3RydWN0RXhhbXBsZXMgJiYgb3B0aW9ucy5jb25zdHJ1Y3RFeGFtcGxlcy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyID1cbiAgICAgICAgb3B0aW9ucy5jb25zdHJ1Y3RFeGFtcGxlcy5mb2xkZXIgfHwgXCJjb25zdHJ1Y3QtZXhhbXBsZXNcIjtcblxuICAgICAgY29uc3QgbGV2ZWxzID0gY29uc3RydWN0RXhhbXBsZUZvbGRlclxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5zcGxpY2UoMCwgMSlcbiAgICAgICAgLm1hcCgoKSA9PiBcIi4uXCIpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgY29uc3RydWN0UmVhZG1lRG9jcyA9IGBcbiMgQ29uc3RydWN0IEV4YW1wbGVzXG5cbkV4YW1wbGUgdXNlLWNhc2VzIGZvciB0aGUgQ29uc3RydWN0IGxpYnJhcnkuXG5cbi0gW0Jhc2ljIFVzYWdlXSguL2Jhc2ljLnRzKVxuXG5UbyBlbnN1cmUgYWxsIGV4YW1wbGVzIGFyZSB3b3JraW5nLCBwbGVhc2UgbWFrZSBzdXJlIHRoZSBbaW5kZXgudHNdKC4vaW5kZXgudHMpIGZpbGUgaXMgaW1wb3J0aW5nIGFsbCBvZiB0aGVtLlxuYDtcblxuICAgICAgY29uc3QgY29uc3RydWN0RXhhbXBsZUNvZGUgPSBgXG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiJHtsZXZlbHN9L3NyYy9cIjtcblxuZXhwb3J0IGNsYXNzIEJhc2ljRXhhbXBsZSBleHRlbmRzIFRlcnJhZm9ybVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIG5hbWUpO1xuXG4gICAgbmV3IE15Q29uc3RydWN0KHRoaXMsIFwibXktY29uc3RydWN0XCIsIHtcbiAgICAgIHByb3BlcnR5QTogXCJ2YWx1ZUFcIixcbiAgICB9KTtcbiAgfVxufVxuXG5cbmA7XG5cbiAgICAgIGNvbnN0IGV4YW1wbGVDb2xsZWN0aW9uQ29kZSA9IGBcbi8vIFRoaXMgZmlsZSB3aWxsIGJlIHN5bnRoZXNpemVkIHRvIGNoZWNrIGlmIGFsbCBleGFtcGxlcyBhcmUgd29ya2luZ1xuXG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiY2RrdGZcIjtcbi8vIEFsbCBleGFtcGxlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGhlcmVcbmltcG9ydCB7IEJhc2ljRXhhbXBsZSB9IGZyb20gXCIuL2Jhc2ljXCI7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxuLy8gQWxsIGV4YW1wbGVzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgaGVyZVxubmV3IEJhc2ljRXhhbXBsZShhcHAsIFwiYmFzaWMtZXhhbXBsZVwiKTtcbmFwcC5zeW50aCgpO1xuYDtcblxuICAgICAgbmV3IFNhbXBsZURpcih0aGlzLCBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyLCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgXCJpbmRleC50c1wiOiBleGFtcGxlQ29sbGVjdGlvbkNvZGUudHJpbSgpLFxuICAgICAgICAgIFwiYmFzaWMudHNcIjogY29uc3RydWN0RXhhbXBsZUNvZGUudHJpbSgpLFxuICAgICAgICAgIFwiY2RrdGYuanNvblwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgICAgICAgICBhcHA6IGBucHggdHMtbm9kZSAtLXByb2plY3QgJHtsZXZlbHN9L3RzY29uZmlnLmRldi5qc29uIGluZGV4LnRzYCxcbiAgICAgICAgICAgICAgcHJvamVjdElkOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvamVjdElkIHx8XG4gICAgICAgICAgICAgICAgXCJoeWJyaWQtbW9kdWxlLWZiNzM0ZGJhLWVhYzktNDY2Yy05NmJiLTdlYjljNDA2YzI4YVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKSxcbiAgICAgICAgICBcIlJFQURNRS5tZFwiOiBjb25zdHJ1Y3RSZWFkbWVEb2NzLnRyaW0oKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRlc3RUYXNrLmV4ZWMoYGNka3RmIHN5bnRoYCwge1xuICAgICAgICBjd2Q6IGNvbnN0cnVjdEV4YW1wbGVGb2xkZXIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKGAke2NvbnN0cnVjdEV4YW1wbGVGb2xkZXJ9L2Nka3RmLm91dGApO1xuICAgIH1cblxuICAgIHRoaXMuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKFwic3JjLy5nZW5cIiwgXCJzcmMvY2RrdGYub3V0XCIsIFwic3JjL21vZHVsZXNcIik7XG4gICAgdGhpcy5jb21waWxlVGFzay5wcmVwZW5kRXhlYyhcImNka3RmIGdldFwiLCB7XG4gICAgICBjd2Q6IHRoaXMuc3JjZGlyLFxuICAgIH0pO1xuICAgIHRoaXMuY29tcGlsZVRhc2suZXhlYyhcImNka3RmIHN5bnRoXCIsIHtcbiAgICAgIGN3ZDogdGhpcy5zcmNkaXIsXG4gICAgICBuYW1lOiBcIlN5bnRoZXNpemUgbW9kdWxlIEhDTFwiLFxuICAgIH0pO1xuXG4gICAgbmV3IFNjcmlwdEZpbGUoXG4gICAgICB0aGlzLFxuICAgICAgXCJzY3JpcHRzL2NvcHktbW9kdWxlcy5zaFwiLFxuICAgICAgYFxuIyEvYmluL2Jhc2hcbiMgVGhpcyBzY3JpcHQgaXMgY3JlYXRlZCBieSBwcm9qZW4sIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5Llxuc2V0IC1lXG5cblNDUklQVFBBVEg9XCIkKCBjZCAtLSBcIiQoZGlybmFtZSBcIiQwXCIpXCIgPi9kZXYvbnVsbCAyPiYxIDsgcHdkIC1QIClcIlxuXG4jIGNoZWNrIGlmIHRoZSBtb2R1bGUgZm9sZGVyIGhhcyBiZWVuIGdlbmVyYXRlZCBhcyBleHBlY3RlZFxuTU9EVUxFU19GT0xERVI9JCggY2QgLS0gXCIkU0NSSVBUUEFUSC8uLi9zcmMvbW9kdWxlcy9zdGFja3NcIiA+L2Rldi9udWxsIDI+JjEgOyBwd2QgLVAgKVxuU1JDX0ZPTERFUj0kKCBjZCAtLSBcIiRTQ1JJUFRQQVRILy4uL3NyYy9cIiA+L2Rldi9udWxsIDI+JjEgOyBwd2QgLVAgKVxuVEFSR0VUX0ZPTERFUj1cIiRTQ1JJUFRQQVRILy4uL21vZHVsZXNcIlxuXG5pZiBbICEgLWQgXCIkTU9EVUxFU19GT0xERVJcIiBdOyB0aGVuXG4gIGVjaG8gXCJFeHBlY3RlZCBtb2R1bGUgZm9sZGVyIHRvIGV4aXN0IGF0ICRNT0RVTEVTX0ZPTERFUlwiXG4gIGV4aXQgMVxuZmlcblxuY2QgXCIkTU9EVUxFU19GT0xERVJcIlxuZm9yIGQgaW4gKi8gOyBkb1xuICAgIFsgLUwgXCJcXCR7ZCUvfVwiIF0gJiYgY29udGludWVcblxuICAgIGRpcm5hbWU9XCJcXCR7ZCUvfVwiXG5cblxuICAgICMgQ2hlY2sgaWYgZXZlcnl0aGluZyBpcyBpbiBwbGFjZVxuICAgIGlmIFsgISAtZiBcIiRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZS9jZGsudGYuanNvblwiIF07IHRoZW5cbiAgICAgIGVjaG8gXCJFeHBlY3RlZCBjb2RlIGZvciAkZGlybmFtZSBhdCBjZGsudGYuanNvbiB0byBleGlzdCBhdCAkTU9EVUxFU19GT0xERVIvJGRpcm5hbWVcIlxuICAgICAgZXhpdCAxXG4gICAgZmlcblxuICAgIGlmIFsgISAtZiBcIiRTUkNfRk9MREVSLyRkaXJuYW1lLm1kXCIgXTsgdGhlblxuICAgICAgZWNobyBcIkV4cGVjdGVkIERvY3VtZW50YXRpb24gZm9yICRkaXJuYW1lIGF0ICRkaXJuYW1lLm1kIHRvIGV4aXN0IGF0ICRTUkNfRk9MREVSLyRkaXJuYW1lLm1kXCJcbiAgICAgIGV4aXQgMVxuICAgIGZpXG5cbiAgICAjIENvcHkgbW9kdWxlIGFuZCByZWFkbWUgdG9nZXRoZXJcbiAgICBlY2hvIFwiQ29weWluZyBDb2RlIGFuZCBSRUFETUUgZm9yIG1vZHVsZSAkZGlybmFtZVwiXG4gICAgbWtkaXIgLXAgXCIkVEFSR0VUX0ZPTERFUlwiXG4gICAgbWtkaXIgLXAgXCIkVEFSR0VUX0ZPTERFUi8kZGlybmFtZVwiXG4gICAgY3AgXCIkTU9EVUxFU19GT0xERVIvJGRpcm5hbWUvY2RrLnRmLmpzb25cIiBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lL2Nkay50Zi5qc29uXCJcbiAgICBjcCBcIiRTUkNfRk9MREVSLyRkaXJuYW1lLm1kXCIgXCIkVEFSR0VUX0ZPTERFUi8kZGlybmFtZS9SRUFETUUubWRcIlxuXG4gICAgIyBBZGQgUkVBRE1FIGhjbCBkb2NzXG4gICAgaWYgd2hpY2ggdGVycmFmb3JtLWRvY3MgPi9kZXYvbnVsbDsgdGhlblxuICAgICAgdGVycmFmb3JtLWRvY3MgbWFya2Rvd24gdGFibGUgLS1vdXRwdXQtZmlsZSBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lL1JFQURNRS5tZFwiIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWVcIiBcbiAgICBlbHNlXG4gICAgICBkb2NrZXIgcnVuIC0tcm0gLS12b2x1bWUgXCIkU0NSSVBUUEFUSC8uLi9tb2R1bGVzOi90ZXJyYWZvcm0tZG9jc1wiIC11ICQoaWQgLXUpIHF1YXkuaW8vdGVycmFmb3JtLWRvY3MvdGVycmFmb3JtLWRvY3M6MC4xNi4wIG1hcmtkb3duIHRhYmxlIC0tb3V0cHV0LWZpbGUgXCIvdGVycmFmb3JtLWRvY3MvJGRpcm5hbWUvUkVBRE1FLm1kXCIgL3RlcnJhZm9ybS1kb2NzLyRkaXJuYW1lXG4gICAgZmlcbmRvbmVcbmAudHJpbSgpXG4gICAgKTtcbiAgICB0aGlzLmNvbXBpbGVUYXNrLmV4ZWMoXCIuL3NjcmlwdHMvY29weS1tb2R1bGVzLnNoXCIsIHtcbiAgICAgIG5hbWU6IFwiQ29weSBIQ0wgTW9kdWxlc1wiLFxuICAgIH0pO1xuXG4gICAgLy8gaWdub3JlIGRpc3QgaW4gdGVzdHNcbiAgICB0aGlzLmplc3Q/LmFkZElnbm9yZVBhdHRlcm4oXCJkaXN0XCIpO1xuICB9XG59XG4iXX0=
@@ -9,12 +9,31 @@ declare type AtomicObject = Function | Promise<any> | Date | RegExp | Boolean |
9
9
  declare type Mutable<T> = T extends AtomicObject ? T : T extends ReadonlyMap<infer K, infer V> ? Map<Mutable<K>, Mutable<V>> : T extends ReadonlySet<infer V> ? Set<Mutable<V>> : T extends object ? {
10
10
  -readonly [K in keyof T]: Mutable<T[K]>;
11
11
  } : T;
12
- declare type Config = Mutable<Pick<ConstructLibraryOptions, "publishToPypi" | "publishToMaven" | "publishToNuget" | "releaseToNpm" | "npmRegistryUrl">>;
13
- export declare function publishToRegistries(options: PublishOptions): Config;
14
- export declare function publishToGithubPackages(options: PublishOptions): Config;
12
+ declare type PublishingConfig = Mutable<Pick<ConstructLibraryOptions, "publishToPypi" | "publishToMaven" | "publishToNuget" | "releaseToNpm" | "npmRegistryUrl">>;
13
+ export declare function publishToRegistries(options: PublishOptions): PublishingConfig;
14
+ export declare type GithubRegistry = "npm" | "maven";
15
+ declare type GitHubPublishOptions = {
16
+ /**
17
+ * The GitHub repository of this project.
18
+ */
19
+ repositoryName: string;
20
+ /**
21
+ * The GitHub owner of this project.
22
+ */
23
+ repositoryOwner: string;
24
+ /**
25
+ * Registries to publish to
26
+ */
27
+ registries: GithubRegistry[];
28
+ };
29
+ export declare type GitHubPublishConfig = {
30
+ name: string;
31
+ repositoryUrl: string;
32
+ } & PublishingConfig;
33
+ export declare function publishToGithubPackages(options: GitHubPublishOptions): GitHubPublishConfig;
15
34
  export declare type ArtifactoryPublishOptions = PublishOptions & {
16
35
  artifactoryApiUrl: string;
17
36
  artifactoryRepository?: string;
18
37
  };
19
- export declare function publishToArtifactory(options: ArtifactoryPublishOptions): Config;
38
+ export declare function publishToArtifactory(options: ArtifactoryPublishOptions): PublishingConfig;
20
39
  export {};
package/lib/publishing.js CHANGED
@@ -33,22 +33,23 @@ function publishToRegistries(options) {
33
33
  }
34
34
  exports.publishToRegistries = publishToRegistries;
35
35
  function publishToGithubPackages(options) {
36
- const { registries } = options;
37
- const config = publishToRegistries(options);
38
- if (registries.includes("pypi")) {
39
- throw new Error("Github Packages does not support python packages");
40
- }
41
- if (registries.includes("nuget")) {
42
- // Seems like projen does not support github packages on nuget yet: https://github.dev/projen/projen/blob/14f37ec704afdc5143e6a2954c1250b1f0ccaddf/src/release/publisher.ts#L343
43
- throw new Error("Github Packages does support nuget packages, but this library does not yet support it");
44
- }
36
+ const { registries, repositoryName, repositoryOwner } = options;
37
+ const config = publishToRegistries({
38
+ name: repositoryName,
39
+ namespace: repositoryOwner,
40
+ registries,
41
+ });
45
42
  if (registries.includes("npm")) {
46
43
  config.npmRegistryUrl = "https://npm.pkg.github.com";
47
44
  }
48
45
  if (registries.includes("maven")) {
49
- config.publishToMaven.mavenRepositoryUrl = "https://maven.pkg.github.com";
46
+ config.publishToMaven.mavenRepositoryUrl = `https://maven.pkg.github.com/${repositoryOwner}/${repositoryName}`;
50
47
  }
51
- return config;
48
+ return {
49
+ ...config,
50
+ repositoryUrl: `https://github.com/${repositoryOwner}/${repositoryName}.git`,
51
+ name: `@${repositoryOwner}/${repositoryName}`,
52
+ };
52
53
  }
53
54
  exports.publishToGithubPackages = publishToGithubPackages;
54
55
  function publishToArtifactory(options) {
@@ -73,4 +74,4 @@ function publishToArtifactory(options) {
73
74
  return config;
74
75
  }
75
76
  exports.publishToArtifactory = publishToArtifactory;
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wdWJsaXNoaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF5QztBQXlDekMsU0FBZ0IsbUJBQW1CLENBQUMsT0FBdUI7SUFDekQsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2hELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQVc7UUFDckIsWUFBWSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0tBQ3pDLENBQUM7SUFFRixJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxDQUFDLGFBQWEsR0FBRztZQUNyQixRQUFRLEVBQUUsR0FBRyxrQkFBa0IsSUFBSSxhQUFhLEVBQUU7WUFDbEQsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLElBQUksYUFBYSxFQUFFO1NBQ2pELENBQUM7S0FDSDtJQUVELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNoQyxNQUFNLENBQUMsY0FBYyxHQUFHO1lBQ3RCLFdBQVcsRUFBRSxPQUFPLGtCQUFrQixJQUFJLGFBQWEsRUFBRTtZQUN6RCxZQUFZLEVBQUUsT0FBTyxrQkFBa0IsRUFBRTtZQUN6QyxlQUFlLEVBQUUsYUFBYTtTQUMvQixDQUFDO0tBQ0g7SUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDaEMsTUFBTSxTQUFTLEdBQUcsR0FBRyx3QkFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLHdCQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLENBQUMsY0FBYyxHQUFHO1lBQ3RCLGVBQWUsRUFBRSxTQUFTO1lBQzFCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7S0FDSDtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUEvQkQsa0RBK0JDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQUMsT0FBdUI7SUFDN0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUMvQixNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0tBQ3JFO0lBQ0QsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2hDLGdMQUFnTDtRQUNoTCxNQUFNLElBQUksS0FBSyxDQUNiLHVGQUF1RixDQUN4RixDQUFDO0tBQ0g7SUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxDQUFDLGNBQWMsR0FBRyw0QkFBNEIsQ0FBQztLQUN0RDtJQUVELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNoQyxNQUFNLENBQUMsY0FBZSxDQUFDLGtCQUFrQixHQUFHLDhCQUE4QixDQUFDO0tBQzVFO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQXRCRCwwREFzQkM7QUFVRCxTQUFnQixvQkFBb0IsQ0FDbEMsT0FBa0M7SUFFbEMsTUFBTSxFQUNKLFVBQVUsRUFDVixpQkFBaUIsRUFDakIscUJBQXFCLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FDMUMsR0FBRyxPQUFPLENBQUM7SUFDWixNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU1QyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxDQUFDLGNBQWMsR0FBRyxHQUFHLGlCQUFpQixRQUFRLHFCQUFxQixHQUFHLENBQUM7S0FDOUU7SUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxDQUFDLGFBQWMsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLGlCQUFpQixTQUFTLHFCQUFxQixHQUFHLENBQUM7S0FDaEc7SUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYixtRkFBbUYsQ0FDcEYsQ0FBQztRQUNGLHlFQUF5RTtRQUN6RSx1SEFBdUg7UUFDdkgsdUVBQXVFO0tBQ3hFO0lBRUQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2hDLDRLQUE0SztRQUM1SyxNQUFNLElBQUksS0FBSyxDQUNiLG1GQUFtRixDQUNwRixDQUFDO0tBQ0g7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBbkNELG9EQW1DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBhc2NhbENhc2UgfSBmcm9tIFwiY2hhbmdlLWNhc2VcIjtcbmltcG9ydCB7IENvbnN0cnVjdExpYnJhcnlPcHRpb25zIH0gZnJvbSBcInByb2plbi9saWIvY2RrXCI7XG5cbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5ID0gXCJucG1cIiB8IFwibWF2ZW5cIiB8IFwibnVnZXRcIiB8IFwicHlwaVwiO1xuXG5leHBvcnQgdHlwZSBQdWJsaXNoT3B0aW9ucyA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgcmVnaXN0cmllczogUmVnaXN0cnlbXTtcbn07XG5cbnR5cGUgQXRvbWljT2JqZWN0ID1cbiAgfCBGdW5jdGlvblxuICB8IFByb21pc2U8YW55PlxuICB8IERhdGVcbiAgfCBSZWdFeHBcbiAgfCBCb29sZWFuXG4gIHwgTnVtYmVyXG4gIHwgU3RyaW5nO1xuXG50eXBlIE11dGFibGU8VD4gPSBUIGV4dGVuZHMgQXRvbWljT2JqZWN0XG4gID8gVFxuICA6IFQgZXh0ZW5kcyBSZWFkb25seU1hcDxpbmZlciBLLCBpbmZlciBWPiAvLyBNYXAgZXh0ZW5kcyBSZWFkb25seU1hcFxuICA/IE1hcDxNdXRhYmxlPEs+LCBNdXRhYmxlPFY+PlxuICA6IFQgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWPiAvLyBTZXQgZXh0ZW5kcyBSZWFkb25seVNldFxuICA/IFNldDxNdXRhYmxlPFY+PlxuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgPyB7IC1yZWFkb25seSBbSyBpbiBrZXlvZiBUXTogTXV0YWJsZTxUW0tdPiB9XG4gIDogVDtcblxudHlwZSBDb25maWcgPSBNdXRhYmxlPFxuICBQaWNrPFxuICAgIENvbnN0cnVjdExpYnJhcnlPcHRpb25zLFxuICAgIHwgXCJwdWJsaXNoVG9QeXBpXCJcbiAgICB8IFwicHVibGlzaFRvTWF2ZW5cIlxuICAgIHwgXCJwdWJsaXNoVG9OdWdldFwiXG4gICAgfCBcInJlbGVhc2VUb05wbVwiXG4gICAgfCBcIm5wbVJlZ2lzdHJ5VXJsXCJcbiAgPlxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hUb1JlZ2lzdHJpZXMob3B0aW9uczogUHVibGlzaE9wdGlvbnMpOiBDb25maWcge1xuICBjb25zdCB7IG5hbWUsIG5hbWVzcGFjZSwgcmVnaXN0cmllcyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc2FuaXRpemVkTmFtZXNwYWNlID0gbmFtZXNwYWNlLnJlcGxhY2UoLy0vZ2ksIFwiX1wiKTtcbiAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IG5hbWUucmVwbGFjZSgvLS9naSwgXCJfXCIpO1xuICBjb25zdCBjb25maWc6IENvbmZpZyA9IHtcbiAgICByZWxlYXNlVG9OcG06IHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJucG1cIiksXG4gIH07XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJweXBpXCIpKSB7XG4gICAgY29uZmlnLnB1Ymxpc2hUb1B5cGkgPSB7XG4gICAgICBkaXN0TmFtZTogYCR7c2FuaXRpemVkTmFtZXNwYWNlfS0ke3Nhbml0aXplZE5hbWV9YCxcbiAgICAgIG1vZHVsZTogYCR7c2FuaXRpemVkTmFtZXNwYWNlfV8ke3Nhbml0aXplZE5hbWV9YCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJtYXZlblwiKSkge1xuICAgIGNvbmZpZy5wdWJsaXNoVG9NYXZlbiA9IHtcbiAgICAgIGphdmFQYWNrYWdlOiBgY29tLiR7c2FuaXRpemVkTmFtZXNwYWNlfS4ke3Nhbml0aXplZE5hbWV9YCxcbiAgICAgIG1hdmVuR3JvdXBJZDogYGNvbS4ke3Nhbml0aXplZE5hbWVzcGFjZX1gLFxuICAgICAgbWF2ZW5BcnRpZmFjdElkOiBzYW5pdGl6ZWROYW1lLFxuICAgIH07XG4gIH1cblxuICBpZiAocmVnaXN0cmllcy5pbmNsdWRlcyhcIm51Z2V0XCIpKSB7XG4gICAgY29uc3QgbnVnZXROYW1lID0gYCR7cGFzY2FsQ2FzZShuYW1lc3BhY2UpfS4ke3Bhc2NhbENhc2UobmFtZSl9YDtcbiAgICBjb25maWcucHVibGlzaFRvTnVnZXQgPSB7XG4gICAgICBkb3ROZXROYW1lc3BhY2U6IG51Z2V0TmFtZSxcbiAgICAgIHBhY2thZ2VJZDogbnVnZXROYW1lLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hUb0dpdGh1YlBhY2thZ2VzKG9wdGlvbnM6IFB1Ymxpc2hPcHRpb25zKTogQ29uZmlnIHtcbiAgY29uc3QgeyByZWdpc3RyaWVzIH0gPSBvcHRpb25zO1xuICBjb25zdCBjb25maWcgPSBwdWJsaXNoVG9SZWdpc3RyaWVzKG9wdGlvbnMpO1xuICBpZiAocmVnaXN0cmllcy5pbmNsdWRlcyhcInB5cGlcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHaXRodWIgUGFja2FnZXMgZG9lcyBub3Qgc3VwcG9ydCBweXRob24gcGFja2FnZXNcIik7XG4gIH1cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJudWdldFwiKSkge1xuICAgIC8vIFNlZW1zIGxpa2UgcHJvamVuIGRvZXMgbm90IHN1cHBvcnQgZ2l0aHViIHBhY2thZ2VzIG9uIG51Z2V0IHlldDogaHR0cHM6Ly9naXRodWIuZGV2L3Byb2plbi9wcm9qZW4vYmxvYi8xNGYzN2VjNzA0YWZkYzUxNDNlNmEyOTU0YzEyNTBiMWYwY2NhZGRmL3NyYy9yZWxlYXNlL3B1Ymxpc2hlci50cyNMMzQzXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJHaXRodWIgUGFja2FnZXMgZG9lcyBzdXBwb3J0IG51Z2V0IHBhY2thZ2VzLCBidXQgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IHlldCBzdXBwb3J0IGl0XCJcbiAgICApO1xuICB9XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJucG1cIikpIHtcbiAgICBjb25maWcubnBtUmVnaXN0cnlVcmwgPSBcImh0dHBzOi8vbnBtLnBrZy5naXRodWIuY29tXCI7XG4gIH1cblxuICBpZiAocmVnaXN0cmllcy5pbmNsdWRlcyhcIm1hdmVuXCIpKSB7XG4gICAgY29uZmlnLnB1Ymxpc2hUb01hdmVuIS5tYXZlblJlcG9zaXRvcnlVcmwgPSBcImh0dHBzOi8vbWF2ZW4ucGtnLmdpdGh1Yi5jb21cIjtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIEFydGlmYWN0b3J5UHVibGlzaE9wdGlvbnMgPSBQdWJsaXNoT3B0aW9ucyAmIHtcbiAgLy8gVGhlIGFydGlmYWN0b3J5IHVybCB0byBwdWJsaXNoIHRvLCBlLmcuIFwiaHR0cHM6Ly9hcnRpZmFjdG9yeS5leGFtcGxlLmNvbS9hcnRpZmFjdG9yeS9hcGlcIlxuICBhcnRpZmFjdG9yeUFwaVVybDogc3RyaW5nO1xuXG4gIC8vIE5hbWUgb2YgdGhlIGFydGlmYWN0b3J5IHJlcG9zaXRvcnkgdG8gcHVibGlzaCB0bywgZGVmYXVsdHMgdG8gdGhlIG5hbWVzcGFjZVxuICBhcnRpZmFjdG9yeVJlcG9zaXRvcnk/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFRvQXJ0aWZhY3RvcnkoXG4gIG9wdGlvbnM6IEFydGlmYWN0b3J5UHVibGlzaE9wdGlvbnNcbik6IENvbmZpZyB7XG4gIGNvbnN0IHtcbiAgICByZWdpc3RyaWVzLFxuICAgIGFydGlmYWN0b3J5QXBpVXJsLFxuICAgIGFydGlmYWN0b3J5UmVwb3NpdG9yeSA9IG9wdGlvbnMubmFtZXNwYWNlLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY29uZmlnID0gcHVibGlzaFRvUmVnaXN0cmllcyhvcHRpb25zKTtcblxuICBpZiAocmVnaXN0cmllcy5pbmNsdWRlcyhcIm5wbVwiKSkge1xuICAgIGNvbmZpZy5ucG1SZWdpc3RyeVVybCA9IGAke2FydGlmYWN0b3J5QXBpVXJsfS9ucG0vJHthcnRpZmFjdG9yeVJlcG9zaXRvcnl9L2A7XG4gIH1cblxuICBpZiAocmVnaXN0cmllcy5pbmNsdWRlcyhcInB5cGlcIikpIHtcbiAgICBjb25maWcucHVibGlzaFRvUHlwaSEudHdpbmVSZWdpc3RyeVVybCA9IGAke2FydGlmYWN0b3J5QXBpVXJsfS9weXBpLyR7YXJ0aWZhY3RvcnlSZXBvc2l0b3J5fS9gO1xuICB9XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJtYXZlblwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQXJ0aWZhY3RvcnkgZG9lcyBzdXBwb3J0IG1hdmVuIHBhY2thZ2VzLCBidXQgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IHlldCBzdXBwb3J0IGl0XCJcbiAgICApO1xuICAgIC8vIFdpdGggbm8gY2hhbmNlIHRvIHRlc3QgaXQgdGhlIGRvY3MgZG9udCB0ZWxsIG1lIGVub3VnaCB0byBpbXBsZW1lbnQgaXRcbiAgICAvLyBodHRwczovL3d3dy5qZnJvZy5jb20vY29uZmx1ZW5jZS9kaXNwbGF5L0pGUk9HL01hdmVuK1JlcG9zaXRvcnkjTWF2ZW5SZXBvc2l0b3J5LVJlc29sdmluZ0FydGlmYWN0c1Rocm91Z2hBcnRpZmFjdG9yeVxuICAgIC8vIGNvbmZpZy5wdWJsaXNoVG9NYXZlbiEubWF2ZW5SZXBvc2l0b3J5VXJsID0gYCR7YXJ0aWZhY3RvcnlBcGlVcmx9L2A7XG4gIH1cblxuICBpZiAocmVnaXN0cmllcy5pbmNsdWRlcyhcIm51Z2V0XCIpKSB7XG4gICAgLy8gU2VlbXMgbGlrZSBwcm9qZW4gZG9lcyBub3Qgc3VwcG9ydCBhcnRpZmFjdG9yeSBvbiBudWdldCB5ZXQ6IGh0dHBzOi8vZ2l0aHViLmRldi9wcm9qZW4vcHJvamVuL2Jsb2IvMTRmMzdlYzcwNGFmZGM1MTQzZTZhMjk1NGMxMjUwYjFmMGNjYWRkZi9zcmMvcmVsZWFzZS9wdWJsaXNoZXIudHMjTDM0M1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQXJ0aWZhY3RvcnkgZG9lcyBzdXBwb3J0IG51Z2V0IHBhY2thZ2VzLCBidXQgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IHlldCBzdXBwb3J0IGl0XCJcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cbiJdfQ==
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wdWJsaXNoaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF5QztBQXlDekMsU0FBZ0IsbUJBQW1CLENBQUMsT0FBdUI7SUFDekQsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2hELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQXFCO1FBQy9CLFlBQVksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztLQUN6QyxDQUFDO0lBRUYsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQy9CLE1BQU0sQ0FBQyxhQUFhLEdBQUc7WUFDckIsUUFBUSxFQUFFLEdBQUcsa0JBQWtCLElBQUksYUFBYSxFQUFFO1lBQ2xELE1BQU0sRUFBRSxHQUFHLGtCQUFrQixJQUFJLGFBQWEsRUFBRTtTQUNqRCxDQUFDO0tBQ0g7SUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDaEMsTUFBTSxDQUFDLGNBQWMsR0FBRztZQUN0QixXQUFXLEVBQUUsT0FBTyxrQkFBa0IsSUFBSSxhQUFhLEVBQUU7WUFDekQsWUFBWSxFQUFFLE9BQU8sa0JBQWtCLEVBQUU7WUFDekMsZUFBZSxFQUFFLGFBQWE7U0FDL0IsQ0FBQztLQUNIO0lBRUQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLEdBQUcsd0JBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSx3QkFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDakUsTUFBTSxDQUFDLGNBQWMsR0FBRztZQUN0QixlQUFlLEVBQUUsU0FBUztZQUMxQixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDO0tBQ0g7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBL0JELGtEQStCQztBQXlCRCxTQUFnQix1QkFBdUIsQ0FDckMsT0FBNkI7SUFFN0IsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDO1FBQ2pDLElBQUksRUFBRSxjQUFjO1FBQ3BCLFNBQVMsRUFBRSxlQUFlO1FBQzFCLFVBQVU7S0FDWCxDQUFDLENBQUM7SUFFSCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxDQUFDLGNBQWMsR0FBRyw0QkFBNEIsQ0FBQztLQUN0RDtJQUVELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNoQyxNQUFNLENBQUMsY0FBZSxDQUFDLGtCQUFrQixHQUFHLGdDQUFnQyxlQUFlLElBQUksY0FBYyxFQUFFLENBQUM7S0FDakg7SUFFRCxPQUFPO1FBQ0wsR0FBRyxNQUFNO1FBQ1QsYUFBYSxFQUFFLHNCQUFzQixlQUFlLElBQUksY0FBYyxNQUFNO1FBQzVFLElBQUksRUFBRSxJQUFJLGVBQWUsSUFBSSxjQUFjLEVBQUU7S0FDOUMsQ0FBQztBQUNKLENBQUM7QUF2QkQsMERBdUJDO0FBVUQsU0FBZ0Isb0JBQW9CLENBQ2xDLE9BQWtDO0lBRWxDLE1BQU0sRUFDSixVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQzFDLEdBQUcsT0FBTyxDQUFDO0lBQ1osTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFNUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzlCLE1BQU0sQ0FBQyxjQUFjLEdBQUcsR0FBRyxpQkFBaUIsUUFBUSxxQkFBcUIsR0FBRyxDQUFDO0tBQzlFO0lBRUQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQy9CLE1BQU0sQ0FBQyxhQUFjLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxpQkFBaUIsU0FBUyxxQkFBcUIsR0FBRyxDQUFDO0tBQ2hHO0lBRUQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUZBQW1GLENBQ3BGLENBQUM7UUFDRix5RUFBeUU7UUFDekUsdUhBQXVIO1FBQ3ZILHVFQUF1RTtLQUN4RTtJQUVELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNoQyw0S0FBNEs7UUFDNUssTUFBTSxJQUFJLEtBQUssQ0FDYixtRkFBbUYsQ0FDcEYsQ0FBQztLQUNIO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQW5DRCxvREFtQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXNjYWxDYXNlIH0gZnJvbSBcImNoYW5nZS1jYXNlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucyB9IGZyb20gXCJwcm9qZW4vbGliL2Nka1wiO1xuXG5leHBvcnQgdHlwZSBSZWdpc3RyeSA9IFwibnBtXCIgfCBcIm1hdmVuXCIgfCBcIm51Z2V0XCIgfCBcInB5cGlcIjtcblxuZXhwb3J0IHR5cGUgUHVibGlzaE9wdGlvbnMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIHJlZ2lzdHJpZXM6IFJlZ2lzdHJ5W107XG59O1xuXG50eXBlIEF0b21pY09iamVjdCA9XG4gIHwgRnVuY3Rpb25cbiAgfCBQcm9taXNlPGFueT5cbiAgfCBEYXRlXG4gIHwgUmVnRXhwXG4gIHwgQm9vbGVhblxuICB8IE51bWJlclxuICB8IFN0cmluZztcblxudHlwZSBNdXRhYmxlPFQ+ID0gVCBleHRlbmRzIEF0b21pY09iamVjdFxuICA/IFRcbiAgOiBUIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgSywgaW5mZXIgVj4gLy8gTWFwIGV4dGVuZHMgUmVhZG9ubHlNYXBcbiAgPyBNYXA8TXV0YWJsZTxLPiwgTXV0YWJsZTxWPj5cbiAgOiBUIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVj4gLy8gU2V0IGV4dGVuZHMgUmVhZG9ubHlTZXRcbiAgPyBTZXQ8TXV0YWJsZTxWPj5cbiAgOiBUIGV4dGVuZHMgb2JqZWN0XG4gID8geyAtcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IE11dGFibGU8VFtLXT4gfVxuICA6IFQ7XG5cbnR5cGUgUHVibGlzaGluZ0NvbmZpZyA9IE11dGFibGU8XG4gIFBpY2s8XG4gICAgQ29uc3RydWN0TGlicmFyeU9wdGlvbnMsXG4gICAgfCBcInB1Ymxpc2hUb1B5cGlcIlxuICAgIHwgXCJwdWJsaXNoVG9NYXZlblwiXG4gICAgfCBcInB1Ymxpc2hUb051Z2V0XCJcbiAgICB8IFwicmVsZWFzZVRvTnBtXCJcbiAgICB8IFwibnBtUmVnaXN0cnlVcmxcIlxuICA+XG4+O1xuXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFRvUmVnaXN0cmllcyhvcHRpb25zOiBQdWJsaXNoT3B0aW9ucyk6IFB1Ymxpc2hpbmdDb25maWcge1xuICBjb25zdCB7IG5hbWUsIG5hbWVzcGFjZSwgcmVnaXN0cmllcyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc2FuaXRpemVkTmFtZXNwYWNlID0gbmFtZXNwYWNlLnJlcGxhY2UoLy0vZ2ksIFwiX1wiKTtcbiAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IG5hbWUucmVwbGFjZSgvLS9naSwgXCJfXCIpO1xuICBjb25zdCBjb25maWc6IFB1Ymxpc2hpbmdDb25maWcgPSB7XG4gICAgcmVsZWFzZVRvTnBtOiByZWdpc3RyaWVzLmluY2x1ZGVzKFwibnBtXCIpLFxuICB9O1xuXG4gIGlmIChyZWdpc3RyaWVzLmluY2x1ZGVzKFwicHlwaVwiKSkge1xuICAgIGNvbmZpZy5wdWJsaXNoVG9QeXBpID0ge1xuICAgICAgZGlzdE5hbWU6IGAke3Nhbml0aXplZE5hbWVzcGFjZX0tJHtzYW5pdGl6ZWROYW1lfWAsXG4gICAgICBtb2R1bGU6IGAke3Nhbml0aXplZE5hbWVzcGFjZX1fJHtzYW5pdGl6ZWROYW1lfWAsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZWdpc3RyaWVzLmluY2x1ZGVzKFwibWF2ZW5cIikpIHtcbiAgICBjb25maWcucHVibGlzaFRvTWF2ZW4gPSB7XG4gICAgICBqYXZhUGFja2FnZTogYGNvbS4ke3Nhbml0aXplZE5hbWVzcGFjZX0uJHtzYW5pdGl6ZWROYW1lfWAsXG4gICAgICBtYXZlbkdyb3VwSWQ6IGBjb20uJHtzYW5pdGl6ZWROYW1lc3BhY2V9YCxcbiAgICAgIG1hdmVuQXJ0aWZhY3RJZDogc2FuaXRpemVkTmFtZSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJudWdldFwiKSkge1xuICAgIGNvbnN0IG51Z2V0TmFtZSA9IGAke3Bhc2NhbENhc2UobmFtZXNwYWNlKX0uJHtwYXNjYWxDYXNlKG5hbWUpfWA7XG4gICAgY29uZmlnLnB1Ymxpc2hUb051Z2V0ID0ge1xuICAgICAgZG90TmV0TmFtZXNwYWNlOiBudWdldE5hbWUsXG4gICAgICBwYWNrYWdlSWQ6IG51Z2V0TmFtZSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIEdpdGh1YlJlZ2lzdHJ5ID0gXCJucG1cIiB8IFwibWF2ZW5cIjtcbnR5cGUgR2l0SHViUHVibGlzaE9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBUaGUgR2l0SHViIHJlcG9zaXRvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICAgKi9cbiAgcmVwb3NpdG9yeU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiBvd25lciBvZiB0aGlzIHByb2plY3QuXG4gICAqL1xuICByZXBvc2l0b3J5T3duZXI6IHN0cmluZztcblxuICAvKipcbiAgICogUmVnaXN0cmllcyB0byBwdWJsaXNoIHRvXG4gICAqL1xuICByZWdpc3RyaWVzOiBHaXRodWJSZWdpc3RyeVtdO1xufTtcblxuZXhwb3J0IHR5cGUgR2l0SHViUHVibGlzaENvbmZpZyA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICByZXBvc2l0b3J5VXJsOiBzdHJpbmc7XG59ICYgUHVibGlzaGluZ0NvbmZpZztcblxuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hUb0dpdGh1YlBhY2thZ2VzKFxuICBvcHRpb25zOiBHaXRIdWJQdWJsaXNoT3B0aW9uc1xuKTogR2l0SHViUHVibGlzaENvbmZpZyB7XG4gIGNvbnN0IHsgcmVnaXN0cmllcywgcmVwb3NpdG9yeU5hbWUsIHJlcG9zaXRvcnlPd25lciB9ID0gb3B0aW9ucztcbiAgY29uc3QgY29uZmlnID0gcHVibGlzaFRvUmVnaXN0cmllcyh7XG4gICAgbmFtZTogcmVwb3NpdG9yeU5hbWUsXG4gICAgbmFtZXNwYWNlOiByZXBvc2l0b3J5T3duZXIsXG4gICAgcmVnaXN0cmllcyxcbiAgfSk7XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJucG1cIikpIHtcbiAgICBjb25maWcubnBtUmVnaXN0cnlVcmwgPSBcImh0dHBzOi8vbnBtLnBrZy5naXRodWIuY29tXCI7XG4gIH1cblxuICBpZiAocmVnaXN0cmllcy5pbmNsdWRlcyhcIm1hdmVuXCIpKSB7XG4gICAgY29uZmlnLnB1Ymxpc2hUb01hdmVuIS5tYXZlblJlcG9zaXRvcnlVcmwgPSBgaHR0cHM6Ly9tYXZlbi5wa2cuZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlPd25lcn0vJHtyZXBvc2l0b3J5TmFtZX1gO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWcsXG4gICAgcmVwb3NpdG9yeVVybDogYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlPd25lcn0vJHtyZXBvc2l0b3J5TmFtZX0uZ2l0YCxcbiAgICBuYW1lOiBgQCR7cmVwb3NpdG9yeU93bmVyfS8ke3JlcG9zaXRvcnlOYW1lfWAsXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIEFydGlmYWN0b3J5UHVibGlzaE9wdGlvbnMgPSBQdWJsaXNoT3B0aW9ucyAmIHtcbiAgLy8gVGhlIGFydGlmYWN0b3J5IHVybCB0byBwdWJsaXNoIHRvLCBlLmcuIFwiaHR0cHM6Ly9hcnRpZmFjdG9yeS5leGFtcGxlLmNvbS9hcnRpZmFjdG9yeS9hcGlcIlxuICBhcnRpZmFjdG9yeUFwaVVybDogc3RyaW5nO1xuXG4gIC8vIE5hbWUgb2YgdGhlIGFydGlmYWN0b3J5IHJlcG9zaXRvcnkgdG8gcHVibGlzaCB0bywgZGVmYXVsdHMgdG8gdGhlIG5hbWVzcGFjZVxuICBhcnRpZmFjdG9yeVJlcG9zaXRvcnk/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFRvQXJ0aWZhY3RvcnkoXG4gIG9wdGlvbnM6IEFydGlmYWN0b3J5UHVibGlzaE9wdGlvbnNcbik6IFB1Ymxpc2hpbmdDb25maWcge1xuICBjb25zdCB7XG4gICAgcmVnaXN0cmllcyxcbiAgICBhcnRpZmFjdG9yeUFwaVVybCxcbiAgICBhcnRpZmFjdG9yeVJlcG9zaXRvcnkgPSBvcHRpb25zLm5hbWVzcGFjZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbmZpZyA9IHB1Ymxpc2hUb1JlZ2lzdHJpZXMob3B0aW9ucyk7XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJucG1cIikpIHtcbiAgICBjb25maWcubnBtUmVnaXN0cnlVcmwgPSBgJHthcnRpZmFjdG9yeUFwaVVybH0vbnBtLyR7YXJ0aWZhY3RvcnlSZXBvc2l0b3J5fS9gO1xuICB9XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJweXBpXCIpKSB7XG4gICAgY29uZmlnLnB1Ymxpc2hUb1B5cGkhLnR3aW5lUmVnaXN0cnlVcmwgPSBgJHthcnRpZmFjdG9yeUFwaVVybH0vcHlwaS8ke2FydGlmYWN0b3J5UmVwb3NpdG9yeX0vYDtcbiAgfVxuXG4gIGlmIChyZWdpc3RyaWVzLmluY2x1ZGVzKFwibWF2ZW5cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkFydGlmYWN0b3J5IGRvZXMgc3VwcG9ydCBtYXZlbiBwYWNrYWdlcywgYnV0IHRoaXMgbGlicmFyeSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBpdFwiXG4gICAgKTtcbiAgICAvLyBXaXRoIG5vIGNoYW5jZSB0byB0ZXN0IGl0IHRoZSBkb2NzIGRvbnQgdGVsbCBtZSBlbm91Z2ggdG8gaW1wbGVtZW50IGl0XG4gICAgLy8gaHR0cHM6Ly93d3cuamZyb2cuY29tL2NvbmZsdWVuY2UvZGlzcGxheS9KRlJPRy9NYXZlbitSZXBvc2l0b3J5I01hdmVuUmVwb3NpdG9yeS1SZXNvbHZpbmdBcnRpZmFjdHNUaHJvdWdoQXJ0aWZhY3RvcnlcbiAgICAvLyBjb25maWcucHVibGlzaFRvTWF2ZW4hLm1hdmVuUmVwb3NpdG9yeVVybCA9IGAke2FydGlmYWN0b3J5QXBpVXJsfS9gO1xuICB9XG5cbiAgaWYgKHJlZ2lzdHJpZXMuaW5jbHVkZXMoXCJudWdldFwiKSkge1xuICAgIC8vIFNlZW1zIGxpa2UgcHJvamVuIGRvZXMgbm90IHN1cHBvcnQgYXJ0aWZhY3Rvcnkgb24gbnVnZXQgeWV0OiBodHRwczovL2dpdGh1Yi5kZXYvcHJvamVuL3Byb2plbi9ibG9iLzE0ZjM3ZWM3MDRhZmRjNTE0M2U2YTI5NTRjMTI1MGIxZjBjY2FkZGYvc3JjL3JlbGVhc2UvcHVibGlzaGVyLnRzI0wzNDNcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkFydGlmYWN0b3J5IGRvZXMgc3VwcG9ydCBudWdldCBwYWNrYWdlcywgYnV0IHRoaXMgbGlicmFyeSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBpdFwiXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG4iXX0=