projen-cdktf-hybrid-construct 0.1.42 → 0.1.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ - _Breaking Change_: `terraformExamplesFolder`, `terraformProvider`, `terraformProvider*Config` are now part of `terraformExamples` and differently structured.
6
+ - Add documentation hook (using docker if `terraform-docs` is not enabled)
7
+ - Add terraform and construct example folders
8
+ - Add tests to the generated code
9
+ - Remove `pre-commit` hooks
package/README.md CHANGED
@@ -35,7 +35,8 @@ project.synth();
35
35
  - [x] Add example folder
36
36
  - [x] Add `terraform` example folder
37
37
  - [x] [Auto-generate parts of the docs](https://github.com/terraform-aws-modules/terraform-aws-eks/blob/e90c877a741ab3cc4215376a70f7bcc360b6a3d2/.github/workflows/pre-commit.yml)
38
- - [ ] Add testing strategy
38
+ - [x] Add example folder to project using this
39
+ - [x] Add testing strategy
39
40
  - [ ] Add deployment scripts to Artifactory
40
41
  - [ ] Add deployment scripts to Github Packages
41
42
  - [ ] Add construct / option / docs to publish existing module as construct
@@ -12,7 +12,6 @@
12
12
  /.gitignore linguist-generated
13
13
  /.mergify.yml linguist-generated
14
14
  /.npmignore linguist-generated
15
- /.pre-commit-config.yaml linguist-generated
16
15
  /.prettierignore linguist-generated
17
16
  /.prettierrc.json linguist-generated
18
17
  /.projen/** linguist-generated
@@ -8,11 +8,31 @@ const project = new HybridModule({
8
8
  authorAddress: "danielmschmidt92@gmail.com",
9
9
  repositoryUrl: "github.com/DanielMSchmidt/my-module",
10
10
  outdir: ".",
11
- terraformExamplesFolder: "terraform",
12
- terraformProvider: "aws",
13
- terraformProviderAwsConfig: {
14
- region: "eu-central-1",
15
- requiredProviderVersion: "3.74",
11
+ terraformExamples: {
12
+ enabled: true,
13
+ folder: "terraform",
14
+ providerConfig: `
15
+ terraform {
16
+ # Limit provider version (some modules are not compatible with aws 4.x)
17
+ required_providers {
18
+ aws = {
19
+ source = "hashicorp/aws"
20
+ version = "~> 3.74"
21
+ }
22
+ }
23
+ # Terraform binary version constraint
24
+ required_version = "~> 1.1.0"
25
+ }
26
+
27
+
28
+ provider "aws" {
29
+ region = "eu-central-1"
30
+ }
31
+ `,
32
+ },
33
+ constructExamples: {
34
+ enabled: true,
35
+ folder: "construct-examples",
16
36
  },
17
37
  projectId: "my-project-id",
18
38
  });
@@ -0,0 +1,7 @@
1
+ # Construct Examples
2
+
3
+ Example use-cases for the Construct library.
4
+
5
+ - [Basic Usage](./basic.ts)
6
+
7
+ To ensure all examples are working, please make sure the [index.ts](./index.ts) file is importing all of them.
@@ -0,0 +1,14 @@
1
+ import { TerraformStack } from "cdktf";
2
+ import { Construct } from "constructs";
3
+
4
+ import { MyConstruct } from "../src/";
5
+
6
+ export class BasicExample extends TerraformStack {
7
+ constructor(scope: Construct, name: string) {
8
+ super(scope, name);
9
+
10
+ new MyConstruct(this, "my-construct", {
11
+ propertyA: "valueA",
12
+ });
13
+ }
14
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "language": "typescript",
3
+ "app": "npx ts-node index.ts",
4
+ "projectId": "my-project-id"
5
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "0.9.4",
3
+ "stacks": {
4
+ "basic-example": {
5
+ "name": "basic-example",
6
+ "constructPath": "basic-example",
7
+ "workingDirectory": "stacks/basic-example",
8
+ "synthesizedStackPath": "stacks/basic-example/cdk.tf.json",
9
+ "annotations": [],
10
+ "dependencies": []
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "//": {
3
+ "metadata": {
4
+ "backend": "local",
5
+ "stackName": "basic-example",
6
+ "version": "0.9.4"
7
+ },
8
+ "outputs": {
9
+ }
10
+ },
11
+ "terraform": {
12
+ "backend": {
13
+ "local": {
14
+ "path": "/home/runner/work/projen-cdktf-hybrid-construct/projen-cdktf-hybrid-construct/example/construct-examples/terraform.basic-example.tfstate"
15
+ }
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,11 @@
1
+ // This file will be synthesized to check if all examples are working
2
+
3
+ import { App } from "cdktf";
4
+ // All examples need to be imported here
5
+ import { BasicExample } from "./basic";
6
+
7
+ const app = new App();
8
+
9
+ // All examples need to be initialized here
10
+ new BasicExample(app, "basic-example");
11
+ app.synth();
@@ -0,0 +1 @@
1
+ import "cdktf/lib/testing/adapters/jest";
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cdktf_1 = require("cdktf");
4
+ require("cdktf/lib/testing/adapters/jest");
5
+ const __1 = require("../");
6
+ // To learn more about testing see cdk.tf/testing
7
+ describe("MyConstruct", () => {
8
+ it("should synthesize", () => {
9
+ expect(cdktf_1.Testing.synthScope((scope) => {
10
+ new __1.MyConstruct(scope, "my-construct", {
11
+ propertyA: "valueA",
12
+ });
13
+ })).toMatchSnapshot();
14
+ });
15
+ });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgtdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFnQztBQUNoQywyQ0FBeUM7QUFDekMsMkJBQWtDO0FBRWxDLGlEQUFpRDtBQUNqRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQzNCLE1BQU0sQ0FDSixlQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxlQUFXLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRTtnQkFDckMsU0FBUyxFQUFFLFFBQVE7YUFDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdGluZyB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IFwiY2RrdGYvbGliL3Rlc3RpbmcvYWRhcHRlcnMvamVzdFwiO1xuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiLi4vXCI7XG5cbi8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGVzdGluZyBzZWUgY2RrLnRmL3Rlc3RpbmdcbmRlc2NyaWJlKFwiTXlDb25zdHJ1Y3RcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBzeW50aGVzaXplXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBUZXN0aW5nLnN5bnRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgIG5ldyBNeUNvbnN0cnVjdChzY29wZSwgXCJteS1jb25zdHJ1Y3RcIiwge1xuICAgICAgICAgIHByb3BlcnR5QTogXCJ2YWx1ZUFcIixcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0pO1xufSk7Il19
@@ -7,4 +7,29 @@ module "eks_managed_node_group" {
7
7
  source = "DanielMSchmidt/my-module//modules/my-awesome-module"
8
8
 
9
9
  }
10
- ```
10
+ ```
11
+ <!-- BEGIN_TF_DOCS -->
12
+ ## Requirements
13
+
14
+ No requirements.
15
+
16
+ ## Providers
17
+
18
+ No providers.
19
+
20
+ ## Modules
21
+
22
+ No modules.
23
+
24
+ ## Resources
25
+
26
+ No resources.
27
+
28
+ ## Inputs
29
+
30
+ No inputs.
31
+
32
+ ## Outputs
33
+
34
+ No outputs.
35
+ <!-- END_TF_DOCS -->
@@ -20,7 +20,6 @@
20
20
  "post-compile": "npx projen post-compile",
21
21
  "post-upgrade": "npx projen post-upgrade",
22
22
  "pre-compile": "npx projen pre-compile",
23
- "precommit": "npx projen precommit",
24
23
  "release": "npx projen release",
25
24
  "test": "npx projen test",
26
25
  "test:update": "npx projen test:update",
@@ -38,4 +38,11 @@ for d in */ ; do
38
38
  mkdir -p "$TARGET_FOLDER/$dirname"
39
39
  cp "$MODULES_FOLDER/$dirname/cdk.tf.json" "$TARGET_FOLDER/$dirname/cdk.tf.json"
40
40
  cp "$SRC_FOLDER/$dirname.md" "$TARGET_FOLDER/$dirname/README.md"
41
+
42
+ # Add README hcl docs
43
+ if which terraform-docs >/dev/null; then
44
+ terraform-docs markdown table --output-file "$TARGET_FOLDER/$dirname/README.md" "$TARGET_FOLDER/$dirname"
45
+ else
46
+ docker run --rm --volume "$SCRIPTPATH/../modules:/terraform-docs" -u $(id -u) quay.io/terraform-docs/terraform-docs:0.16.0 markdown table --output-file "/terraform-docs/$dirname/README.md" /terraform-docs/$dirname
47
+ fi
41
48
  done
package/lib/index.d.ts CHANGED
@@ -1,29 +1,18 @@
1
1
  import { ConstructLibrary, ConstructLibraryOptions } from "projen/lib/cdk";
2
- declare type TerraformProviderAwsConfig = {
3
- region: string;
4
- requiredProviderVersion: string;
5
- };
6
- declare type TerraformProviderAzureConfig = {
7
- location: string;
8
- requiredProviderVersion: string;
9
- resourceGroupName: string;
10
- };
11
2
  declare type HybridModuleOptions = ConstructLibraryOptions & {
12
3
  cdktfVersion?: string;
13
4
  constructVersion?: string;
14
5
  repository: string;
15
6
  author: string;
16
- terraformExamplesFolder: string;
17
- terraformProvider: string;
18
- terraformProviderAwsConfig?: TerraformProviderAwsConfig;
19
- terraformProviderAzureConfig?: TerraformProviderAzureConfig;
20
- documentationPrecommitHook?: boolean;
21
- documentationPrecommitHookOptions?: {
22
- version?: string;
23
- disableFormatHook?: boolean;
24
- disableDocsHook?: boolean;
7
+ terraformExamples?: {
8
+ enabled: boolean;
9
+ folder?: string;
10
+ providerConfig?: string;
11
+ };
12
+ constructExamples?: {
13
+ enabled: boolean;
14
+ folder?: string;
25
15
  };
26
- additionalPrecommitHooks?: Record<string, any>[];
27
16
  projectId?: string;
28
17
  };
29
18
  export declare class HybridModule extends ConstructLibrary {
package/lib/index.js CHANGED
@@ -21,6 +21,25 @@ export class MyConstruct extends Construct {
21
21
  super(scope, id);
22
22
  }
23
23
  }
24
+ `;
25
+ const constructTestCode = `
26
+ import { Testing } from "cdktf";
27
+ import "cdktf/lib/testing/adapters/jest";
28
+ import { MyConstruct } from "../";
29
+
30
+ // To learn more about testing see cdk.tf/testing
31
+ describe("MyConstruct", () => {
32
+ it("should synthesize", () => {
33
+ expect(
34
+ Testing.synthScope((scope) => {
35
+ new MyConstruct(scope, "my-construct", {
36
+ propertyA: "valueA",
37
+ });
38
+ })
39
+ ).toMatchSnapshot();
40
+ });
41
+ });
42
+
24
43
  `;
25
44
  const moduleSrcCode = `
26
45
  import { App } from "cdktf";
@@ -45,54 +64,6 @@ const app = new App();
45
64
  new MyAwesomeModule(app, "my-awesome-module");
46
65
  app.synth();
47
66
  `;
48
- const terraformAwsMainSrcCode = `
49
- terraform {
50
- # Limit provider version (some modules are not compatible with aws 4.x)
51
- required_providers {
52
- aws = {
53
- source = "hashicorp/aws"
54
- version = "~> __requiredProviderVersion__"
55
- }
56
- }
57
- # Terraform binary version constraint
58
- required_version = "~> 1.1.0"
59
- }
60
-
61
-
62
- provider "aws" {
63
- region = "__region__"
64
- }
65
- `;
66
- const terraformAzureMainSrcCode = `
67
- # Configure the Azure provider
68
- terraform {
69
- required_providers {
70
- azurerm = {
71
- source = "hashicorp/azurerm"
72
- version = "~> __requiredProviderVersion__"
73
- }
74
- }
75
-
76
- required_version = ">= 1.1.0"
77
- }
78
-
79
- provider "azurerm" {
80
- features {}
81
- }
82
-
83
- resource "azurerm_resource_group" "rg" {
84
- name = "__resourceGroupName__"
85
- location = "__location__"
86
- }
87
- `;
88
- const terraformMainSrcCodeMap = {
89
- aws: {
90
- srcCode: terraformAwsMainSrcCode,
91
- },
92
- azure: {
93
- srcCode: terraformAzureMainSrcCode,
94
- },
95
- };
96
67
  const terraformReadmeDocs = `
97
68
  # Please add here some pure HCL tests for your modules in order to test HCL Interoperability
98
69
 
@@ -124,20 +95,7 @@ class HybridModule extends cdk_1.ConstructLibrary {
124
95
  eslintOptions: Object.assign({}, config.eslintOptions, {
125
96
  lintProjenRc: false,
126
97
  }),
127
- postBuildSteps: config.documentationPrecommitHook !== false
128
- ? [
129
- {
130
- id: "install-pre-commit",
131
- name: "Install pre-commit hook",
132
- run: "pip install pre-commit",
133
- },
134
- {
135
- id: "documentation-precommit-hook",
136
- name: "Documentation Pre-commit Hook",
137
- run: "pre-commit run --all-files",
138
- },
139
- ]
140
- : [],
98
+ postBuildSteps: [],
141
99
  });
142
100
  const constructVersion = config.constructVersion || "^10.0.25";
143
101
  const cdktfVersion = config.cdktfVersion || "^0.9.4";
@@ -172,35 +130,101 @@ module "eks_managed_node_group" {
172
130
  output: "modules",
173
131
  projectId: config.projectId || (0, uuid_1.v4)(),
174
132
  }, null, 2),
133
+ "__tests__/index-test.ts": constructTestCode.trim(),
175
134
  },
176
135
  });
177
- // Retrieve correct TF main stuff
178
- let mainTfFile = terraformMainSrcCodeMap[config.terraformProvider].srcCode.trim();
179
- let configProperty = {};
180
- switch (config.terraformProvider) {
181
- case "aws": {
182
- configProperty = config.terraformProviderAwsConfig;
183
- break;
184
- }
185
- case "azure": {
186
- configProperty = config.terraformProviderAzureConfig;
187
- break;
188
- }
189
- default: {
190
- throw new Error("Need to define correctly a Provider, only [aws,azure,gcp] allowed");
191
- }
136
+ if (config.terraformExamples && config.terraformExamples.enabled) {
137
+ const providerConfig = config.terraformExamples.providerConfig ||
138
+ `
139
+ terraform {
140
+ # Terraform binary version constraint
141
+ required_version = "~> 1.1.0"
142
+
143
+ # Define all needed providers here, you can find all available providers here:
144
+ # https://registry.terraform.io/
145
+ required_providers {}
146
+ }
147
+
148
+ # Initialize your provider here
149
+
150
+ `.trim();
151
+ const examplesFolder = config.terraformExamples.folder || "terraform-examples";
152
+ new projen_1.SampleDir(this, examplesFolder, {
153
+ files: {
154
+ "main.tf": `
155
+ # Configure Terraform
156
+ ${providerConfig}
157
+
158
+ `.trimStart(),
159
+ "README.md": terraformReadmeDocs.trim(),
160
+ },
161
+ });
162
+ this.gitignore.addPatterns(`${examplesFolder}/.terraform`, `${examplesFolder}/.terraform.lock.hcl`);
163
+ }
164
+ if (config.constructExamples && config.constructExamples.enabled) {
165
+ const constructExampleFolder = config.constructExamples.folder || "construct-examples";
166
+ const levels = constructExampleFolder
167
+ .split("/")
168
+ .map(() => "..")
169
+ .join("/");
170
+ const constructReadmeDocs = `
171
+ # Construct Examples
172
+
173
+ Example use-cases for the Construct library.
174
+
175
+ - [Basic Usage](./basic.ts)
176
+
177
+ To ensure all examples are working, please make sure the [index.ts](./index.ts) file is importing all of them.
178
+ `;
179
+ const constructExampleCode = `
180
+ import { TerraformStack } from "cdktf";
181
+ import { Construct } from "constructs";
182
+
183
+ import { MyConstruct } from "${levels}/src/";
184
+
185
+ export class BasicExample extends TerraformStack {
186
+ constructor(scope: Construct, name: string) {
187
+ super(scope, name);
188
+
189
+ new MyConstruct(this, "my-construct", {
190
+ propertyA: "valueA",
191
+ });
192
+ }
193
+ }
194
+
195
+
196
+ `;
197
+ const exampleCollectionCode = `
198
+ // This file will be synthesized to check if all examples are working
199
+
200
+ import { App } from "cdktf";
201
+ // All examples need to be imported here
202
+ import { BasicExample } from "./basic";
203
+
204
+ const app = new App();
205
+
206
+ // All examples need to be initialized here
207
+ new BasicExample(app, "basic-example");
208
+ app.synth();
209
+ `;
210
+ new projen_1.SampleDir(this, constructExampleFolder, {
211
+ files: {
212
+ "index.ts": exampleCollectionCode.trim(),
213
+ "basic.ts": constructExampleCode.trim(),
214
+ "cdktf.json": JSON.stringify({
215
+ language: "typescript",
216
+ app: "npx ts-node index.ts",
217
+ projectId: config.projectId || (0, uuid_1.v4)(),
218
+ }, null, 2),
219
+ "README.md": constructReadmeDocs.trim(),
220
+ },
221
+ });
222
+ this.testTask.exec(`cdktf synth`, {
223
+ cwd: constructExampleFolder,
224
+ });
225
+ this.gitignore.addPatterns(`${constructExampleFolder}/cdktf.out`);
192
226
  }
193
- Object.keys(configProperty).forEach((key) => {
194
- mainTfFile = mainTfFile.replace(`__${key}__`, configProperty[key]);
195
- });
196
- new projen_1.SampleDir(this, config.terraformExamplesFolder, {
197
- files: {
198
- "main.tf": mainTfFile,
199
- "README.md": terraformReadmeDocs.trim(),
200
- },
201
- });
202
227
  this.gitignore.addPatterns("src/.gen", "src/cdktf.out", "src/modules");
203
- this.gitignore.addPatterns(`${config.terraformExamplesFolder}/.terraform`, `${config.terraformExamplesFolder}/.terraform.lock.hcl`);
204
228
  this.compileTask.prependExec("cdktf get", {
205
229
  cwd: this.srcdir,
206
230
  });
@@ -249,6 +273,13 @@ for d in */ ; do
249
273
  mkdir -p "$TARGET_FOLDER/$dirname"
250
274
  cp "$MODULES_FOLDER/$dirname/cdk.tf.json" "$TARGET_FOLDER/$dirname/cdk.tf.json"
251
275
  cp "$SRC_FOLDER/$dirname.md" "$TARGET_FOLDER/$dirname/README.md"
276
+
277
+ # Add README hcl docs
278
+ if which terraform-docs >/dev/null; then
279
+ terraform-docs markdown table --output-file "$TARGET_FOLDER/$dirname/README.md" "$TARGET_FOLDER/$dirname"
280
+ else
281
+ docker run --rm --volume "$SCRIPTPATH/../modules:/terraform-docs" -u $(id -u) quay.io/terraform-docs/terraform-docs:0.16.0 markdown table --output-file "/terraform-docs/$dirname/README.md" /terraform-docs/$dirname
282
+ fi
252
283
  done
253
284
  `.trim());
254
285
  this.compileTask.exec("./scripts/copy-modules.sh", {
@@ -268,32 +299,7 @@ terraform -chdir=terraform plan
268
299
  `);
269
300
  this.testTask.exec("./scripts/tf-module-test.sh");
270
301
  (_c = this.jest) === null || _c === void 0 ? void 0 : _c.addIgnorePattern("terraform");
271
- // Pre-commit hooks
272
- if (config.documentationPrecommitHook !== false) {
273
- const { additionalPrecommitHooks, documentationPrecommitHookOptions } = config;
274
- const { version = "v1.70.1", disableDocsHook = false, disableFormatHook = false, } = documentationPrecommitHookOptions || {};
275
- new projen_1.YamlFile(this, ".pre-commit-config.yaml", {
276
- committed: true,
277
- obj: {
278
- repos: [
279
- {
280
- repo: "git://github.com/antonbabenko/pre-commit-terraform",
281
- rev: version,
282
- hooks: [
283
- disableFormatHook ? null : { id: "terraform_fmt" },
284
- disableDocsHook ? null : { id: "terraform_docs" },
285
- ].filter((item) => item !== null),
286
- },
287
- ...(additionalPrecommitHooks !== null && additionalPrecommitHooks !== void 0 ? additionalPrecommitHooks : []),
288
- ],
289
- },
290
- });
291
- this.tasks.addTask("precommit", {
292
- description: "Runs precommit hooks",
293
- exec: "pre-commit install",
294
- });
295
- }
296
302
  }
297
303
  }
298
304
  exports.HybridModule = HybridModule;
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTJFO0FBQzNFLHdDQUEyRTtBQUMzRSwrQkFBa0M7QUFrQ2xDLE1BQU0sUUFBUSxHQUFHO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsSUFBSTtJQUNoQixvQkFBb0IsRUFBRSxNQUFNO0NBQzdCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHOzs7Ozs7Ozs7Ozs7Q0FZeEIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JyQixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpQi9CLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxQmpDLENBQUM7QUFFRixNQUFNLHVCQUF1QixHQUEyQztJQUN0RSxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsdUJBQXVCO0tBQ2pDO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLHlCQUF5QjtLQUNuQztDQUNGLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFHOzs7Ozs7Ozs7S0FTdkIsQ0FBQztBQUVOLE1BQU0sVUFBVyxTQUFRLGlCQUFRO0lBQy9CLFlBQVksT0FBZ0IsRUFBRSxJQUFZLEVBQVUsT0FBZTtRQUNqRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtZQUNuQixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7UUFIK0MsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUluRSxDQUFDO0lBRVMsaUJBQWlCLENBQUMsQ0FBWTtRQUN0QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBRUQsTUFBYSxZQUFhLFNBQVEsc0JBQWdCO0lBQ2hELFlBQVksTUFBMkI7O1FBQ3JDLEtBQUssQ0FB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QUFLLElBQUksQ0FBQzt5QkFDbEM7d0JBQ0QsR0FBRyxDQUFDLHdCQUF3QixhQUF4Qix3QkFBd0IsY0FBeEIsd0JBQXdCLEdBQUksRUFBRSxDQUFDO3FCQUNwQztpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtnQkFDOUIsV0FBVyxFQUFFLHNCQUFzQjtnQkFDbkMsSUFBSSxFQUFFLG9CQUFvQjthQUMzQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Q0FDRjtBQS9ORCxvQ0ErTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWxlQmFzZSwgSVJlc29sdmVyLCBQcm9qZWN0LCBTYW1wbGVEaXIsIFlhbWxGaWxlIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0TGlicmFyeSwgQ29uc3RydWN0TGlicmFyeU9wdGlvbnMgfSBmcm9tIFwicHJvamVuL2xpYi9jZGtcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG50eXBlIFRlcnJhZm9ybVByb3ZpZGVyQXdzQ29uZmlnID0ge1xuICByZWdpb246IHN0cmluZztcbiAgcmVxdWlyZWRQcm92aWRlclZlcnNpb246IHN0cmluZztcbn07XG5cbnR5cGUgVGVycmFmb3JtUHJvdmlkZXJBenVyZUNvbmZpZyA9IHtcbiAgbG9jYXRpb246IHN0cmluZztcbiAgcmVxdWlyZWRQcm92aWRlclZlcnNpb246IHN0cmluZztcbiAgcmVzb3VyY2VHcm91cE5hbWU6IHN0cmluZztcbn07XG5cbnR5cGUgSHlicmlkTW9kdWxlT3B0aW9ucyA9IENvbnN0cnVjdExpYnJhcnlPcHRpb25zICYge1xuICBjZGt0ZlZlcnNpb24/OiBzdHJpbmc7XG4gIGNvbnN0cnVjdFZlcnNpb24/OiBzdHJpbmc7XG4gIHJlcG9zaXRvcnk6IHN0cmluZztcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIHRlcnJhZm9ybUV4YW1wbGVzRm9sZGVyOiBzdHJpbmc7XG4gIHRlcnJhZm9ybVByb3ZpZGVyOiBzdHJpbmc7XG4gIHRlcnJhZm9ybVByb3ZpZGVyQXdzQ29uZmlnPzogVGVycmFmb3JtUHJvdmlkZXJBd3NDb25maWc7XG4gIHRlcnJhZm9ybVByb3ZpZGVyQXp1cmVDb25maWc/OiBUZXJyYWZvcm1Qcm92aWRlckF6dXJlQ29uZmlnO1xuICAvLyBSdW4gcHJlLWNvbW1pdCBob29rcyB1c2luZyBsb2NhbCBiaW5hcmllcyAvIG5vdCBhdCBhbGxcbiAgZG9jdW1lbnRhdGlvblByZWNvbW1pdEhvb2s/OiBib29sZWFuO1xuICBkb2N1bWVudGF0aW9uUHJlY29tbWl0SG9va09wdGlvbnM/OiB7XG4gICAgdmVyc2lvbj86IHN0cmluZzsgLy8gR2V0IHRoZSBsYXRlc3QgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2FudG9uYmFiZW5rby9wcmUtY29tbWl0LXRlcnJhZm9ybS9yZWxlYXNlc1xuICAgIGRpc2FibGVGb3JtYXRIb29rPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRG9jc0hvb2s/OiBib29sZWFuO1xuICB9O1xuICBhZGRpdGlvbmFsUHJlY29tbWl0SG9va3M/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gIC8vIERlZmF1bHRlZCB0byBhIHV1aWQgc3RyaW5nIGFzIGNka3RmIHdvdWxkXG4gIHByb2plY3RJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBwcmV0dGllcjogdHJ1ZSxcbiAgcHJvamVucmNUczogdHJ1ZSxcbiAgZGVmYXVsdFJlbGVhc2VCcmFuY2g6IFwibWFpblwiLFxufTtcblxuY29uc3QgY29uc3RydWN0U3JjQ29kZSA9IGBcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXlDb25zdHJ1Y3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvcGVydHlBOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNeUNvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHB1YmxpYyBjb25maWc6IE15Q29uc3RydWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIH1cbn1cbmA7XG5cbmNvbnN0IG1vZHVsZVNyY0NvZGUgPSBgXG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBURk1vZHVsZVN0YWNrIH0gZnJvbSBcImNka3RmLXRmLW1vZHVsZS1zdGFja1wiO1xuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5jbGFzcyBNeUF3ZXNvbWVNb2R1bGUgZXh0ZW5kcyBURk1vZHVsZVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBuZXcgTXlDb25zdHJ1Y3QodGhpcywgXCJteS1jb25zdHJ1Y3RcIiwge1xuICAgICAgcHJvcGVydHlBOiBcInZhbHVlQVwiLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbi8vIFRoaXMgaXMgdGhlIG5hbWUgdGhlIG1vZHVsZSBjYW4gYmUgZm91bmQgdW5kZXIuIFxuLy8gV2UgZXhwZWN0IGEgXCJteS1hd2Vzb21lLW1vZHVsZS5tZFwiIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuXG4vLyBUaGUgUkVBRE1FLm1kIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGZpbGUuXG5uZXcgTXlBd2Vzb21lTW9kdWxlKGFwcCwgXCJteS1hd2Vzb21lLW1vZHVsZVwiKTtcbmFwcC5zeW50aCgpO1xuYDtcblxuY29uc3QgdGVycmFmb3JtQXdzTWFpblNyY0NvZGUgPSBgXG50ZXJyYWZvcm0ge1xuICAjIExpbWl0IHByb3ZpZGVyIHZlcnNpb24gKHNvbWUgbW9kdWxlcyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBhd3MgNC54KVxuICByZXF1aXJlZF9wcm92aWRlcnMge1xuICAgIGF3cyA9IHtcbiAgICAgIHNvdXJjZSAgPSBcImhhc2hpY29ycC9hd3NcIlxuICAgICAgdmVyc2lvbiA9IFwifj4gX19yZXF1aXJlZFByb3ZpZGVyVmVyc2lvbl9fXCJcbiAgICB9XG4gIH1cbiAgIyBUZXJyYWZvcm0gYmluYXJ5IHZlcnNpb24gY29uc3RyYWludFxuICByZXF1aXJlZF92ZXJzaW9uID0gXCJ+PiAxLjEuMFwiXG59XG5cblxucHJvdmlkZXIgXCJhd3NcIiB7XG4gIHJlZ2lvbiA9IFwiX19yZWdpb25fX1wiXG59XG5gO1xuXG5jb25zdCB0ZXJyYWZvcm1BenVyZU1haW5TcmNDb2RlID0gYFxuIyBDb25maWd1cmUgdGhlIEF6dXJlIHByb3ZpZGVyXG50ZXJyYWZvcm0ge1xuICByZXF1aXJlZF9wcm92aWRlcnMge1xuICAgIGF6dXJlcm0gPSB7XG4gICAgICBzb3VyY2UgID0gXCJoYXNoaWNvcnAvYXp1cmVybVwiXG4gICAgICB2ZXJzaW9uID0gXCJ+PiBfX3JlcXVpcmVkUHJvdmlkZXJWZXJzaW9uX19cIlxuICAgIH1cbiAgfVxuXG4gIHJlcXVpcmVkX3ZlcnNpb24gPSBcIj49IDEuMS4wXCJcbn1cblxucHJvdmlkZXIgXCJhenVyZXJtXCIge1xuICBmZWF0dXJlcyB7fVxufVxuXG5yZXNvdXJjZSBcImF6dXJlcm1fcmVzb3VyY2VfZ3JvdXBcIiBcInJnXCIge1xuICBuYW1lICAgICA9IFwiX19yZXNvdXJjZUdyb3VwTmFtZV9fXCJcbiAgbG9jYXRpb24gPSBcIl9fbG9jYXRpb25fX1wiXG59XG5gO1xuXG5jb25zdCB0ZXJyYWZvcm1NYWluU3JjQ29kZU1hcDogeyBba2V5OiBzdHJpbmddOiB7IHNyY0NvZGU6IHN0cmluZyB9IH0gPSB7XG4gIGF3czoge1xuICAgIHNyY0NvZGU6IHRlcnJhZm9ybUF3c01haW5TcmNDb2RlLFxuICB9LFxuICBhenVyZToge1xuICAgIHNyY0NvZGU6IHRlcnJhZm9ybUF6dXJlTWFpblNyY0NvZGUsXG4gIH0sXG59O1xuXG5jb25zdCB0ZXJyYWZvcm1SZWFkbWVEb2NzID0gYFxuIyBQbGVhc2UgYWRkIGhlcmUgc29tZSBwdXJlIEhDTCB0ZXN0cyBmb3IgeW91ciBtb2R1bGVzIGluIG9yZGVyIHRvIHRlc3QgSENMIEludGVyb3BlcmFiaWxpdHlcblxuRXhhbXBsZXM6XG5cbm1vZHVsZSBcIm15X2F3ZXNvbWVfdGVzdFwiIHtcbiAgc291cmNlID0gXCIuLi9tb2R1bGVzL215LWF3ZXNvbWUtbW9kdWxlc1wiXG4gIC4uLnZhcmlhYmxlcy4uLlxufVxuICAgIGA7XG5cbmNsYXNzIFNjcmlwdEZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIHBhdGg6IHN0cmluZywgcHJpdmF0ZSBjb250ZW50OiBzdHJpbmcpIHtcbiAgICBzdXBlcihwcm9qZWN0LCBwYXRoLCB7XG4gICAgICBleGVjdXRhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVDb250ZW50KF86IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSHlicmlkTW9kdWxlIGV4dGVuZHMgQ29uc3RydWN0TGlicmFyeSB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogSHlicmlkTW9kdWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmRlZmF1bHRzLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgc2FtcGxlQ29kZTogZmFsc2UsXG4gICAgICBlc2xpbnRPcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBjb25maWcuZXNsaW50T3B0aW9ucywge1xuICAgICAgICBsaW50UHJvamVuUmM6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICBwb3N0QnVpbGRTdGVwczpcbiAgICAgICAgY29uZmlnLmRvY3VtZW50YXRpb25QcmVjb21taXRIb29rICE9PSBmYWxzZVxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IFwiaW5zdGFsbC1wcmUtY29tbWl0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsIHByZS1jb21taXQgaG9va1wiLFxuICAgICAgICAgICAgICAgIHJ1bjogXCJwaXAgaW5zdGFsbCBwcmUtY29tbWl0XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogXCJkb2N1bWVudGF0aW9uLXByZWNvbW1pdC1ob29rXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJEb2N1bWVudGF0aW9uIFByZS1jb21taXQgSG9va1wiLFxuICAgICAgICAgICAgICAgIHJ1bjogXCJwcmUtY29tbWl0IHJ1biAtLWFsbC1maWxlc1wiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10sXG4gICAgfSk7XG4gICAgY29uc3QgY29uc3RydWN0VmVyc2lvbiA9IGNvbmZpZy5jb25zdHJ1Y3RWZXJzaW9uIHx8IFwiXjEwLjAuMjVcIjtcbiAgICBjb25zdCBjZGt0ZlZlcnNpb24gPSBjb25maWcuY2RrdGZWZXJzaW9uIHx8IFwiXjAuOS40XCI7XG5cbiAgICB0aGlzLmFkZFBlZXJEZXBzKGBjb25zdHJ1Y3RzQCR7Y29uc3RydWN0VmVyc2lvbn1gLCBgY2RrdGZAJHtjZGt0ZlZlcnNpb259YCk7XG4gICAgdGhpcy5hZGREZXZEZXBzKGBjZGt0Zi1jbGlAJHtjZGt0ZlZlcnNpb259YCwgXCJ0cy1ub2RlXCIpO1xuICAgIHRoaXMuYWRkS2V5d29yZHMoXCJjZGt0ZlwiLCBcImNka3RmLWh5YnJpZFwiKTtcbiAgICB0aGlzLnNldFNjcmlwdChcInRlcnJhZm9ybTp0ZXN0XCIsIFwiLi9zY3JpcHRzL3RmLW1vZHVsZS10ZXN0LnNoXCIpO1xuXG4gICAgLy8gTW9kdWxlIEVudHJ5cG9pbnRcbiAgICB0aGlzLmFkZERlcHMoXCJjZGt0Zi10Zi1tb2R1bGUtc3RhY2tcIik7XG4gICAgY29uc3QgbW9kdWxlRG9jcyA9IGBcbiMgTXkgQXdlc29tZSBNb2R1bGVcblxuIyMgVXNhZ2VcblxuXFxgXFxgXFxgaGNsXG5tb2R1bGUgXCJla3NfbWFuYWdlZF9ub2RlX2dyb3VwXCIge1xuICBzb3VyY2UgPSBcIiR7XG4gICAgY29uZmlnLnJlcG9zaXRvcnlcbiAgICAgID8ucmVwbGFjZShcImh0dHBzOi8vZ2l0aHViLmNvbS9cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFwiaHR0cDovL2dpdGh1Yi5jb20vXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZShcImdpdGh1Yi5jb20vXCIsIFwiXCIpIHx8IFwibXktZ2l0aHViLXJlcG9cIlxuICB9Ly9tb2R1bGVzL215LWF3ZXNvbWUtbW9kdWxlXCJcblxufVxuXFxgXFxgXFxgXG4gICAgYDtcblxuICAgIG5ldyBTYW1wbGVEaXIodGhpcywgdGhpcy5zcmNkaXIsIHtcbiAgICAgIGZpbGVzOiB7XG4gICAgICAgIFwiaW5kZXgudHNcIjogY29uc3RydWN0U3JjQ29kZS50cmltKCksXG4gICAgICAgIFwidGZNb2R1bGVzLnRzXCI6IG1vZHVsZVNyY0NvZGUudHJpbSgpLFxuICAgICAgICBcIm15LWF3ZXNvbWUtbW9kdWxlLm1kXCI6IG1vZHVsZURvY3MudHJpbSgpLFxuICAgICAgICBcImNka3RmLmpzb25cIjogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgICAgICAgYXBwOiBcIm5weCB0cy1ub2RlIHRmTW9kdWxlcy50c1wiLFxuICAgICAgICAgICAgdGVycmFmb3JtUHJvdmlkZXJzOiBbXCJoYXNoaWNvcnAvbnVsbEAzLjEuMVwiXSwgLy8gV2UgbmVlZCBhdCBsZWFzdCBhIHByb3ZpZGVyIGZvciBnZXQgdG8gc3VjY2VlZFxuICAgICAgICAgICAgdGVycmFmb3JtTW9kdWxlczogW10sXG4gICAgICAgICAgICBvdXRwdXQ6IFwibW9kdWxlc1wiLFxuICAgICAgICAgICAgcHJvamVjdElkOiBjb25maWcucHJvamVjdElkIHx8IHV1aWQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFJldHJpZXZlIGNvcnJlY3QgVEYgbWFpbiBzdHVmZlxuICAgIGxldCBtYWluVGZGaWxlID1cbiAgICAgIHRlcnJhZm9ybU1haW5TcmNDb2RlTWFwW2NvbmZpZy50ZXJyYWZvcm1Qcm92aWRlcl0uc3JjQ29kZS50cmltKCk7XG5cbiAgICBsZXQgY29uZmlnUHJvcGVydHk6IGFueSA9IHt9O1xuICAgIHN3aXRjaCAoY29uZmlnLnRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICBjYXNlIFwiYXdzXCI6IHtcbiAgICAgICAgY29uZmlnUHJvcGVydHkgPSBjb25maWcudGVycmFmb3JtUHJvdmlkZXJBd3NDb25maWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImF6dXJlXCI6IHtcbiAgICAgICAgY29uZmlnUHJvcGVydHkgPSBjb25maWcudGVycmFmb3JtUHJvdmlkZXJBenVyZUNvbmZpZztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIk5lZWQgdG8gZGVmaW5lIGNvcnJlY3RseSBhIFByb3ZpZGVyLCBvbmx5IFthd3MsYXp1cmUsZ2NwXSBhbGxvd2VkXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhjb25maWdQcm9wZXJ0eSkuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIG1haW5UZkZpbGUgPSBtYWluVGZGaWxlLnJlcGxhY2UoYF9fJHtrZXl9X19gLCBjb25maWdQcm9wZXJ0eVtrZXldKTtcbiAgICB9KTtcblxuICAgIG5ldyBTYW1wbGVEaXIodGhpcywgY29uZmlnLnRlcnJhZm9ybUV4YW1wbGVzRm9sZGVyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcIm1haW4udGZcIjogbWFpblRmRmlsZSxcbiAgICAgICAgXCJSRUFETUUubWRcIjogdGVycmFmb3JtUmVhZG1lRG9jcy50cmltKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5naXRpZ25vcmUuYWRkUGF0dGVybnMoXCJzcmMvLmdlblwiLCBcInNyYy9jZGt0Zi5vdXRcIiwgXCJzcmMvbW9kdWxlc1wiKTtcbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucyhcbiAgICAgIGAke2NvbmZpZy50ZXJyYWZvcm1FeGFtcGxlc0ZvbGRlcn0vLnRlcnJhZm9ybWAsXG4gICAgICBgJHtjb25maWcudGVycmFmb3JtRXhhbXBsZXNGb2xkZXJ9Ly50ZXJyYWZvcm0ubG9jay5oY2xgXG4gICAgKTtcbiAgICB0aGlzLmNvbXBpbGVUYXNrLnByZXBlbmRFeGVjKFwiY2RrdGYgZ2V0XCIsIHtcbiAgICAgIGN3ZDogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFwiY2RrdGYgc3ludGhcIiwge1xuICAgICAgY3dkOiB0aGlzLnNyY2RpcixcbiAgICAgIG5hbWU6IFwiU3ludGhlc2l6ZSBtb2R1bGUgSENMXCIsXG4gICAgfSk7XG5cbiAgICBuZXcgU2NyaXB0RmlsZShcbiAgICAgIHRoaXMsXG4gICAgICBcInNjcmlwdHMvY29weS1tb2R1bGVzLnNoXCIsXG4gICAgICBgXG4jIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxuU0NSSVBUUEFUSD1cIiQoIGNkIC0tIFwiJChkaXJuYW1lIFwiJDBcIilcIiA+L2Rldi9udWxsIDI+JjEgOyBwd2QgLVAgKVwiXG5cbiMgY2hlY2sgaWYgdGhlIG1vZHVsZSBmb2xkZXIgaGFzIGJlZW4gZ2VuZXJhdGVkIGFzIGV4cGVjdGVkXG5NT0RVTEVTX0ZPTERFUj0kKCBjZCAtLSBcIiRTQ1JJUFRQQVRILy4uL3NyYy9tb2R1bGVzL3N0YWNrc1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5TUkNfRk9MREVSPSQoIGNkIC0tIFwiJFNDUklQVFBBVEgvLi4vc3JjL1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5UQVJHRVRfRk9MREVSPVwiJFNDUklQVFBBVEgvLi4vbW9kdWxlc1wiXG5cbmlmIFsgISAtZCBcIiRNT0RVTEVTX0ZPTERFUlwiIF07IHRoZW5cbiAgZWNobyBcIkV4cGVjdGVkIG1vZHVsZSBmb2xkZXIgdG8gZXhpc3QgYXQgJE1PRFVMRVNfRk9MREVSXCJcbiAgZXhpdCAxXG5maVxuXG5jZCBcIiRNT0RVTEVTX0ZPTERFUlwiXG5mb3IgZCBpbiAqLyA7IGRvXG4gICAgWyAtTCBcIlxcJHtkJS99XCIgXSAmJiBjb250aW51ZVxuXG4gICAgZGlybmFtZT1cIlxcJHtkJS99XCJcblxuXG4gICAgIyBDaGVjayBpZiBldmVyeXRoaW5nIGlzIGluIHBsYWNlXG4gICAgaWYgWyAhIC1mIFwiJE1PRFVMRVNfRk9MREVSLyRkaXJuYW1lL2Nkay50Zi5qc29uXCIgXTsgdGhlblxuICAgICAgZWNobyBcIkV4cGVjdGVkIGNvZGUgZm9yICRkaXJuYW1lIGF0IGNkay50Zi5qc29uIHRvIGV4aXN0IGF0ICRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZVwiXG4gICAgICBleGl0IDFcbiAgICBmaVxuXG4gICAgaWYgWyAhIC1mIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBdOyB0aGVuXG4gICAgICBlY2hvIFwiRXhwZWN0ZWQgRG9jdW1lbnRhdGlvbiBmb3IgJGRpcm5hbWUgYXQgJGRpcm5hbWUubWQgdG8gZXhpc3QgYXQgJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIlxuICAgICAgZXhpdCAxXG4gICAgZmlcblxuICAgICMgQ29weSBtb2R1bGUgYW5kIHJlYWRtZSB0b2dldGhlclxuICAgIGVjaG8gXCJDb3B5aW5nIENvZGUgYW5kIFJFQURNRSBmb3IgbW9kdWxlICRkaXJuYW1lXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lXCJcbiAgICBjcCBcIiRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZS9jZGsudGYuanNvblwiIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWUvY2RrLnRmLmpzb25cIlxuICAgIGNwIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lL1JFQURNRS5tZFwiXG5kb25lXG5gLnRyaW0oKVxuICAgICk7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFwiLi9zY3JpcHRzL2NvcHktbW9kdWxlcy5zaFwiLCB7XG4gICAgICBuYW1lOiBcIkNvcHkgSENMIE1vZHVsZXNcIixcbiAgICB9KTtcblxuICAgIC8vIGlnbm9yZSBkaXN0IGluIHRlc3RzXG4gICAgdGhpcy5qZXN0Py5hZGRJZ25vcmVQYXR0ZXJuKFwiZGlzdFwiKTtcblxuICAgIG5ldyBTY3JpcHRGaWxlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiLi9zY3JpcHRzL3RmLW1vZHVsZS10ZXN0LnNoXCIsXG4gICAgICBgXG4jIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxudGVycmFmb3JtIC1jaGRpcj10ZXJyYWZvcm0gaW5pdCAtLXVwZ3JhZGVcbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIGZtdFxudGVycmFmb3JtIC1jaGRpcj10ZXJyYWZvcm0gdmFsaWRhdGVcbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIHBsYW4gICAgIFxuICAgICAgICBgXG4gICAgKTtcblxuICAgIHRoaXMudGVzdFRhc2suZXhlYyhcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiKTtcbiAgICB0aGlzLmplc3Q/LmFkZElnbm9yZVBhdHRlcm4oXCJ0ZXJyYWZvcm1cIik7XG5cbiAgICAvLyBQcmUtY29tbWl0IGhvb2tzXG4gICAgaWYgKGNvbmZpZy5kb2N1bWVudGF0aW9uUHJlY29tbWl0SG9vayAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHsgYWRkaXRpb25hbFByZWNvbW1pdEhvb2tzLCBkb2N1bWVudGF0aW9uUHJlY29tbWl0SG9va09wdGlvbnMgfSA9XG4gICAgICAgIGNvbmZpZztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmVyc2lvbiA9IFwidjEuNzAuMVwiLFxuICAgICAgICBkaXNhYmxlRG9jc0hvb2sgPSBmYWxzZSxcbiAgICAgICAgZGlzYWJsZUZvcm1hdEhvb2sgPSBmYWxzZSxcbiAgICAgIH0gPSBkb2N1bWVudGF0aW9uUHJlY29tbWl0SG9va09wdGlvbnMgfHwge307XG5cbiAgICAgIG5ldyBZYW1sRmlsZSh0aGlzLCBcIi5wcmUtY29tbWl0LWNvbmZpZy55YW1sXCIsIHtcbiAgICAgICAgY29tbWl0dGVkOiB0cnVlLFxuICAgICAgICBvYmo6IHtcbiAgICAgICAgICByZXBvczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZXBvOiBcImdpdDovL2dpdGh1Yi5jb20vYW50b25iYWJlbmtvL3ByZS1jb21taXQtdGVycmFmb3JtXCIsXG4gICAgICAgICAgICAgIHJldjogdmVyc2lvbixcbiAgICAgICAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICAgICAgICBkaXNhYmxlRm9ybWF0SG9vayA/IG51bGwgOiB7IGlkOiBcInRlcnJhZm9ybV9mbXRcIiB9LFxuICAgICAgICAgICAgICAgIGRpc2FibGVEb2NzSG9vayA/IG51bGwgOiB7IGlkOiBcInRlcnJhZm9ybV9kb2NzXCIgfSxcbiAgICAgICAgICAgICAgXS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IG51bGwpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihhZGRpdGlvbmFsUHJlY29tbWl0SG9va3MgPz8gW10pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy50YXNrcy5hZGRUYXNrKFwicHJlY29tbWl0XCIsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVucyBwcmVjb21taXQgaG9va3NcIixcbiAgICAgICAgZXhlYzogXCJwcmUtY29tbWl0IGluc3RhbGxcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWlFO0FBQ2pFLHdDQUEyRTtBQUMzRSwrQkFBa0M7QUE0QmxDLE1BQU0sUUFBUSxHQUFHO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsSUFBSTtJQUNoQixvQkFBb0IsRUFBRSxNQUFNO0NBQzdCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHOzs7Ozs7Ozs7Ozs7Q0FZeEIsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCekIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JyQixDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRzs7Ozs7Ozs7O0tBU3ZCLENBQUM7QUFFTixNQUFNLFVBQVcsU0FBUSxpQkFBUTtJQUMvQixZQUFZLE9BQWdCLEVBQUUsSUFBWSxFQUFVLE9BQWU7UUFDakUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDbkIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBSCtDLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFJbkUsQ0FBQztJQUVTLGlCQUFpQixDQUFDLENBQVk7UUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQUVELE1BQWEsWUFBYSxTQUFRLHNCQUFnQjtJQUNoRCxZQUFZLE1BQTJCOztRQUNyQyxLQUFLLENBQUM7WUFDSixHQUFHLFFBQVE7WUFDWCxHQUFHLE1BQU07WUFDVCxVQUFVLEVBQUUsS0FBSztZQUNqQixhQUFhLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRTtnQkFDckQsWUFBWSxFQUFFLEtBQUs7YUFDcEIsQ0FBQztZQUNGLGNBQWMsRUFBRSxFQUFFO1NB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bkMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ2hCLElBQUksRUFBRSx1QkFBdUI7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLENBQ1osSUFBSSxFQUNKLHlCQUF5QixFQUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWlETCxDQUFDLElBQUksRUFBRSxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtZQUNqRCxJQUFJLEVBQUUsa0JBQWtCO1NBQ3pCLENBQUMsQ0FBQztRQUVILHVCQUF1QjtRQUN2QixNQUFBLElBQUksQ0FBQyxJQUFJLDBDQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBDLElBQUksVUFBVSxDQUNaLElBQUksRUFDSiw2QkFBNkIsRUFDN0I7Ozs7Ozs7OztTQVNHLENBQ0osQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDbEQsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUFuUUQsb0NBbVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmlsZUJhc2UsIElSZXNvbHZlciwgUHJvamVjdCwgU2FtcGxlRGlyIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0TGlicmFyeSwgQ29uc3RydWN0TGlicmFyeU9wdGlvbnMgfSBmcm9tIFwicHJvamVuL2xpYi9jZGtcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG50eXBlIEh5YnJpZE1vZHVsZU9wdGlvbnMgPSBDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucyAmIHtcbiAgY2RrdGZWZXJzaW9uPzogc3RyaW5nO1xuICBjb25zdHJ1Y3RWZXJzaW9uPzogc3RyaW5nO1xuICAvLyBVUkwgb2YgdGhlIHJlcG9zaXRvcnlcbiAgcmVwb3NpdG9yeTogc3RyaW5nO1xuICAvLyBOYW1lIG9mIHRoZSBhdXRob3JcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8vIElmIHNldCBhIHRlcnJhZm9ybSBleGFtcGxlcyBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkXG4gIHRlcnJhZm9ybUV4YW1wbGVzPzoge1xuICAgIC8vIElmIHNldCB0ZXJyYWZvcm0gZXhhbXBsZXMgd2lsbCBiZSByZW5kZXJlZFxuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgLy8gUGF0aCBmb3IgdGhlIHRlcnJhZm9ybSBleGFtcGxlc1xuICAgIGZvbGRlcj86IHN0cmluZztcbiAgICAvLyBUaGUgSENMIGNvbmZpZyBmaWxlIHRvIHVzZSBmb3IgdGhlIHRlcnJhZm9ybSBwcm92aWRlclxuICAgIHByb3ZpZGVyQ29uZmlnPzogc3RyaW5nO1xuICB9O1xuICBjb25zdHJ1Y3RFeGFtcGxlcz86IHtcbiAgICAvLyBJZiBzZXQgY29uc3RydWN0IGV4YW1wbGVzIHdpbGwgYmUgcmVuZGVyZWRcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIC8vIFBhdGggZm9yIHRoZSBjb25zdHJ1Y3QgZXhhbXBsZXNcbiAgICBmb2xkZXI/OiBzdHJpbmc7XG4gIH07XG4gIC8vIERlZmF1bHRlZCB0byBhIHV1aWQgc3RyaW5nIGFzIGNka3RmIHdvdWxkXG4gIHByb2plY3RJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBwcmV0dGllcjogdHJ1ZSxcbiAgcHJvamVucmNUczogdHJ1ZSxcbiAgZGVmYXVsdFJlbGVhc2VCcmFuY2g6IFwibWFpblwiLFxufTtcblxuY29uc3QgY29uc3RydWN0U3JjQ29kZSA9IGBcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXlDb25zdHJ1Y3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvcGVydHlBOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNeUNvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHB1YmxpYyBjb25maWc6IE15Q29uc3RydWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIH1cbn1cbmA7XG5cbmNvbnN0IGNvbnN0cnVjdFRlc3RDb2RlID0gYFxuaW1wb3J0IHsgVGVzdGluZyB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IFwiY2RrdGYvbGliL3Rlc3RpbmcvYWRhcHRlcnMvamVzdFwiO1xuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiLi4vXCI7XG5cbi8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGVzdGluZyBzZWUgY2RrLnRmL3Rlc3RpbmdcbmRlc2NyaWJlKFwiTXlDb25zdHJ1Y3RcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBzeW50aGVzaXplXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBUZXN0aW5nLnN5bnRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgIG5ldyBNeUNvbnN0cnVjdChzY29wZSwgXCJteS1jb25zdHJ1Y3RcIiwge1xuICAgICAgICAgIHByb3BlcnR5QTogXCJ2YWx1ZUFcIixcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0pO1xufSk7XG5cbmA7XG5cbmNvbnN0IG1vZHVsZVNyY0NvZGUgPSBgXG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBURk1vZHVsZVN0YWNrIH0gZnJvbSBcImNka3RmLXRmLW1vZHVsZS1zdGFja1wiO1xuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5jbGFzcyBNeUF3ZXNvbWVNb2R1bGUgZXh0ZW5kcyBURk1vZHVsZVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBuZXcgTXlDb25zdHJ1Y3QodGhpcywgXCJteS1jb25zdHJ1Y3RcIiwge1xuICAgICAgcHJvcGVydHlBOiBcInZhbHVlQVwiLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbi8vIFRoaXMgaXMgdGhlIG5hbWUgdGhlIG1vZHVsZSBjYW4gYmUgZm91bmQgdW5kZXIuIFxuLy8gV2UgZXhwZWN0IGEgXCJteS1hd2Vzb21lLW1vZHVsZS5tZFwiIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuXG4vLyBUaGUgUkVBRE1FLm1kIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGZpbGUuXG5uZXcgTXlBd2Vzb21lTW9kdWxlKGFwcCwgXCJteS1hd2Vzb21lLW1vZHVsZVwiKTtcbmFwcC5zeW50aCgpO1xuYDtcblxuY29uc3QgdGVycmFmb3JtUmVhZG1lRG9jcyA9IGBcbiMgUGxlYXNlIGFkZCBoZXJlIHNvbWUgcHVyZSBIQ0wgdGVzdHMgZm9yIHlvdXIgbW9kdWxlcyBpbiBvcmRlciB0byB0ZXN0IEhDTCBJbnRlcm9wZXJhYmlsaXR5XG5cbkV4YW1wbGVzOlxuXG5tb2R1bGUgXCJteV9hd2Vzb21lX3Rlc3RcIiB7XG4gIHNvdXJjZSA9IFwiLi4vbW9kdWxlcy9teS1hd2Vzb21lLW1vZHVsZXNcIlxuICAuLi52YXJpYWJsZXMuLi5cbn1cbiAgICBgO1xuXG5jbGFzcyBTY3JpcHRGaWxlIGV4dGVuZHMgRmlsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBwYXRoOiBzdHJpbmcsIHByaXZhdGUgY29udGVudDogc3RyaW5nKSB7XG4gICAgc3VwZXIocHJvamVjdCwgcGF0aCwge1xuICAgICAgZXhlY3V0YWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQ29udGVudChfOiBJUmVzb2x2ZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEh5YnJpZE1vZHVsZSBleHRlbmRzIENvbnN0cnVjdExpYnJhcnkge1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IEh5YnJpZE1vZHVsZU9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5kZWZhdWx0cyxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIHNhbXBsZUNvZGU6IGZhbHNlLFxuICAgICAgZXNsaW50T3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLmVzbGludE9wdGlvbnMsIHtcbiAgICAgICAgbGludFByb2plblJjOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgICAgcG9zdEJ1aWxkU3RlcHM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnN0cnVjdFZlcnNpb24gPSBjb25maWcuY29uc3RydWN0VmVyc2lvbiB8fCBcIl4xMC4wLjI1XCI7XG4gICAgY29uc3QgY2RrdGZWZXJzaW9uID0gY29uZmlnLmNka3RmVmVyc2lvbiB8fCBcIl4wLjkuNFwiO1xuXG4gICAgdGhpcy5hZGRQZWVyRGVwcyhgY29uc3RydWN0c0Ake2NvbnN0cnVjdFZlcnNpb259YCwgYGNka3RmQCR7Y2RrdGZWZXJzaW9ufWApO1xuICAgIHRoaXMuYWRkRGV2RGVwcyhgY2RrdGYtY2xpQCR7Y2RrdGZWZXJzaW9ufWAsIFwidHMtbm9kZVwiKTtcbiAgICB0aGlzLmFkZEtleXdvcmRzKFwiY2RrdGZcIiwgXCJjZGt0Zi1oeWJyaWRcIik7XG4gICAgdGhpcy5zZXRTY3JpcHQoXCJ0ZXJyYWZvcm06dGVzdFwiLCBcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiKTtcblxuICAgIC8vIE1vZHVsZSBFbnRyeXBvaW50XG4gICAgdGhpcy5hZGREZXBzKFwiY2RrdGYtdGYtbW9kdWxlLXN0YWNrXCIpO1xuICAgIGNvbnN0IG1vZHVsZURvY3MgPSBgXG4jIE15IEF3ZXNvbWUgTW9kdWxlXG5cbiMjIFVzYWdlXG5cblxcYFxcYFxcYGhjbFxubW9kdWxlIFwiZWtzX21hbmFnZWRfbm9kZV9ncm91cFwiIHtcbiAgc291cmNlID0gXCIke1xuICAgIGNvbmZpZy5yZXBvc2l0b3J5XG4gICAgICA/LnJlcGxhY2UoXCJodHRwczovL2dpdGh1Yi5jb20vXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZShcImh0dHA6Ly9naXRodWIuY29tL1wiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCJnaXRodWIuY29tL1wiLCBcIlwiKSB8fCBcIm15LWdpdGh1Yi1yZXBvXCJcbiAgfS8vbW9kdWxlcy9teS1hd2Vzb21lLW1vZHVsZVwiXG5cbn1cblxcYFxcYFxcYFxuICAgIGA7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHRoaXMsIHRoaXMuc3JjZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcImluZGV4LnRzXCI6IGNvbnN0cnVjdFNyY0NvZGUudHJpbSgpLFxuICAgICAgICBcInRmTW9kdWxlcy50c1wiOiBtb2R1bGVTcmNDb2RlLnRyaW0oKSxcbiAgICAgICAgXCJteS1hd2Vzb21lLW1vZHVsZS5tZFwiOiBtb2R1bGVEb2NzLnRyaW0oKSxcbiAgICAgICAgXCJjZGt0Zi5qc29uXCI6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgICAgIGFwcDogXCJucHggdHMtbm9kZSB0Zk1vZHVsZXMudHNcIixcbiAgICAgICAgICAgIHRlcnJhZm9ybVByb3ZpZGVyczogW1wiaGFzaGljb3JwL251bGxAMy4xLjFcIl0sIC8vIFdlIG5lZWQgYXQgbGVhc3QgYSBwcm92aWRlciBmb3IgZ2V0IHRvIHN1Y2NlZWRcbiAgICAgICAgICAgIHRlcnJhZm9ybU1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgb3V0cHV0OiBcIm1vZHVsZXNcIixcbiAgICAgICAgICAgIHByb2plY3RJZDogY29uZmlnLnByb2plY3RJZCB8fCB1dWlkKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDJcbiAgICAgICAgKSxcbiAgICAgICAgXCJfX3Rlc3RzX18vaW5kZXgtdGVzdC50c1wiOiBjb25zdHJ1Y3RUZXN0Q29kZS50cmltKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy50ZXJyYWZvcm1FeGFtcGxlcyAmJiBjb25maWcudGVycmFmb3JtRXhhbXBsZXMuZW5hYmxlZCkge1xuICAgICAgY29uc3QgcHJvdmlkZXJDb25maWcgPVxuICAgICAgICBjb25maWcudGVycmFmb3JtRXhhbXBsZXMucHJvdmlkZXJDb25maWcgfHxcbiAgICAgICAgYFxudGVycmFmb3JtIHtcbiAgIyBUZXJyYWZvcm0gYmluYXJ5IHZlcnNpb24gY29uc3RyYWludFxuICByZXF1aXJlZF92ZXJzaW9uID0gXCJ+PiAxLjEuMFwiXG5cbiAgIyBEZWZpbmUgYWxsIG5lZWRlZCBwcm92aWRlcnMgaGVyZSwgeW91IGNhbiBmaW5kIGFsbCBhdmFpbGFibGUgcHJvdmlkZXJzIGhlcmU6XG4gICMgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vXG4gIHJlcXVpcmVkX3Byb3ZpZGVycyB7fVxufVxuXG4jIEluaXRpYWxpemUgeW91ciBwcm92aWRlciBoZXJlXG5cbmAudHJpbSgpO1xuICAgICAgY29uc3QgZXhhbXBsZXNGb2xkZXIgPVxuICAgICAgICBjb25maWcudGVycmFmb3JtRXhhbXBsZXMuZm9sZGVyIHx8IFwidGVycmFmb3JtLWV4YW1wbGVzXCI7XG5cbiAgICAgIG5ldyBTYW1wbGVEaXIodGhpcywgZXhhbXBsZXNGb2xkZXIsIHtcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBcIm1haW4udGZcIjogYFxuIyBDb25maWd1cmUgVGVycmFmb3JtXG4ke3Byb3ZpZGVyQ29uZmlnfVxuXG4gICAgICAgICAgICBgLnRyaW1TdGFydCgpLFxuICAgICAgICAgIFwiUkVBRE1FLm1kXCI6IHRlcnJhZm9ybVJlYWRtZURvY3MudHJpbSgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKFxuICAgICAgICBgJHtleGFtcGxlc0ZvbGRlcn0vLnRlcnJhZm9ybWAsXG4gICAgICAgIGAke2V4YW1wbGVzRm9sZGVyfS8udGVycmFmb3JtLmxvY2suaGNsYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNvbnN0cnVjdEV4YW1wbGVzICYmIGNvbmZpZy5jb25zdHJ1Y3RFeGFtcGxlcy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyID1cbiAgICAgICAgY29uZmlnLmNvbnN0cnVjdEV4YW1wbGVzLmZvbGRlciB8fCBcImNvbnN0cnVjdC1leGFtcGxlc1wiO1xuXG4gICAgICBjb25zdCBsZXZlbHMgPSBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyXG4gICAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgICAgLm1hcCgoKSA9PiBcIi4uXCIpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgY29uc3RydWN0UmVhZG1lRG9jcyA9IGBcbiMgQ29uc3RydWN0IEV4YW1wbGVzXG5cbkV4YW1wbGUgdXNlLWNhc2VzIGZvciB0aGUgQ29uc3RydWN0IGxpYnJhcnkuXG5cbi0gW0Jhc2ljIFVzYWdlXSguL2Jhc2ljLnRzKVxuXG5UbyBlbnN1cmUgYWxsIGV4YW1wbGVzIGFyZSB3b3JraW5nLCBwbGVhc2UgbWFrZSBzdXJlIHRoZSBbaW5kZXgudHNdKC4vaW5kZXgudHMpIGZpbGUgaXMgaW1wb3J0aW5nIGFsbCBvZiB0aGVtLlxuYDtcblxuICAgICAgY29uc3QgY29uc3RydWN0RXhhbXBsZUNvZGUgPSBgXG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiJHtsZXZlbHN9L3NyYy9cIjtcblxuZXhwb3J0IGNsYXNzIEJhc2ljRXhhbXBsZSBleHRlbmRzIFRlcnJhZm9ybVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIG5hbWUpO1xuXG4gICAgbmV3IE15Q29uc3RydWN0KHRoaXMsIFwibXktY29uc3RydWN0XCIsIHtcbiAgICAgIHByb3BlcnR5QTogXCJ2YWx1ZUFcIixcbiAgICB9KTtcbiAgfVxufVxuXG5cbmA7XG5cbiAgICAgIGNvbnN0IGV4YW1wbGVDb2xsZWN0aW9uQ29kZSA9IGBcbi8vIFRoaXMgZmlsZSB3aWxsIGJlIHN5bnRoZXNpemVkIHRvIGNoZWNrIGlmIGFsbCBleGFtcGxlcyBhcmUgd29ya2luZ1xuXG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiY2RrdGZcIjtcbi8vIEFsbCBleGFtcGxlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGhlcmVcbmltcG9ydCB7IEJhc2ljRXhhbXBsZSB9IGZyb20gXCIuL2Jhc2ljXCI7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxuLy8gQWxsIGV4YW1wbGVzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgaGVyZVxubmV3IEJhc2ljRXhhbXBsZShhcHAsIFwiYmFzaWMtZXhhbXBsZVwiKTtcbmFwcC5zeW50aCgpO1xuYDtcblxuICAgICAgbmV3IFNhbXBsZURpcih0aGlzLCBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyLCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgXCJpbmRleC50c1wiOiBleGFtcGxlQ29sbGVjdGlvbkNvZGUudHJpbSgpLFxuICAgICAgICAgIFwiYmFzaWMudHNcIjogY29uc3RydWN0RXhhbXBsZUNvZGUudHJpbSgpLFxuICAgICAgICAgIFwiY2RrdGYuanNvblwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgICAgICAgICBhcHA6IFwibnB4IHRzLW5vZGUgaW5kZXgudHNcIixcbiAgICAgICAgICAgICAgcHJvamVjdElkOiBjb25maWcucHJvamVjdElkIHx8IHV1aWQoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMlxuICAgICAgICAgICksXG4gICAgICAgICAgXCJSRUFETUUubWRcIjogY29uc3RydWN0UmVhZG1lRG9jcy50cmltKCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy50ZXN0VGFzay5leGVjKGBjZGt0ZiBzeW50aGAsIHtcbiAgICAgICAgY3dkOiBjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucyhgJHtjb25zdHJ1Y3RFeGFtcGxlRm9sZGVyfS9jZGt0Zi5vdXRgKTtcbiAgICB9XG5cbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucyhcInNyYy8uZ2VuXCIsIFwic3JjL2Nka3RmLm91dFwiLCBcInNyYy9tb2R1bGVzXCIpO1xuICAgIHRoaXMuY29tcGlsZVRhc2sucHJlcGVuZEV4ZWMoXCJjZGt0ZiBnZXRcIiwge1xuICAgICAgY3dkOiB0aGlzLnNyY2RpcixcbiAgICB9KTtcbiAgICB0aGlzLmNvbXBpbGVUYXNrLmV4ZWMoXCJjZGt0ZiBzeW50aFwiLCB7XG4gICAgICBjd2Q6IHRoaXMuc3JjZGlyLFxuICAgICAgbmFtZTogXCJTeW50aGVzaXplIG1vZHVsZSBIQ0xcIixcbiAgICB9KTtcblxuICAgIG5ldyBTY3JpcHRGaWxlKFxuICAgICAgdGhpcyxcbiAgICAgIFwic2NyaXB0cy9jb3B5LW1vZHVsZXMuc2hcIixcbiAgICAgIGBcbiMhL2Jpbi9iYXNoXG4jIFRoaXMgc2NyaXB0IGlzIGNyZWF0ZWQgYnkgcHJvamVuLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS5cbnNldCAtZVxuXG5TQ1JJUFRQQVRIPVwiJCggY2QgLS0gXCIkKGRpcm5hbWUgXCIkMFwiKVwiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXCJcblxuIyBjaGVjayBpZiB0aGUgbW9kdWxlIGZvbGRlciBoYXMgYmVlbiBnZW5lcmF0ZWQgYXMgZXhwZWN0ZWRcbk1PRFVMRVNfRk9MREVSPSQoIGNkIC0tIFwiJFNDUklQVFBBVEgvLi4vc3JjL21vZHVsZXMvc3RhY2tzXCIgPi9kZXYvbnVsbCAyPiYxIDsgcHdkIC1QIClcblNSQ19GT0xERVI9JCggY2QgLS0gXCIkU0NSSVBUUEFUSC8uLi9zcmMvXCIgPi9kZXYvbnVsbCAyPiYxIDsgcHdkIC1QIClcblRBUkdFVF9GT0xERVI9XCIkU0NSSVBUUEFUSC8uLi9tb2R1bGVzXCJcblxuaWYgWyAhIC1kIFwiJE1PRFVMRVNfRk9MREVSXCIgXTsgdGhlblxuICBlY2hvIFwiRXhwZWN0ZWQgbW9kdWxlIGZvbGRlciB0byBleGlzdCBhdCAkTU9EVUxFU19GT0xERVJcIlxuICBleGl0IDFcbmZpXG5cbmNkIFwiJE1PRFVMRVNfRk9MREVSXCJcbmZvciBkIGluICovIDsgZG9cbiAgICBbIC1MIFwiXFwke2QlL31cIiBdICYmIGNvbnRpbnVlXG5cbiAgICBkaXJuYW1lPVwiXFwke2QlL31cIlxuXG5cbiAgICAjIENoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2VcbiAgICBpZiBbICEgLWYgXCIkTU9EVUxFU19GT0xERVIvJGRpcm5hbWUvY2RrLnRmLmpzb25cIiBdOyB0aGVuXG4gICAgICBlY2hvIFwiRXhwZWN0ZWQgY29kZSBmb3IgJGRpcm5hbWUgYXQgY2RrLnRmLmpzb24gdG8gZXhpc3QgYXQgJE1PRFVMRVNfRk9MREVSLyRkaXJuYW1lXCJcbiAgICAgIGV4aXQgMVxuICAgIGZpXG5cbiAgICBpZiBbICEgLWYgXCIkU1JDX0ZPTERFUi8kZGlybmFtZS5tZFwiIF07IHRoZW5cbiAgICAgIGVjaG8gXCJFeHBlY3RlZCBEb2N1bWVudGF0aW9uIGZvciAkZGlybmFtZSBhdCAkZGlybmFtZS5tZCB0byBleGlzdCBhdCAkU1JDX0ZPTERFUi8kZGlybmFtZS5tZFwiXG4gICAgICBleGl0IDFcbiAgICBmaVxuXG4gICAgIyBDb3B5IG1vZHVsZSBhbmQgcmVhZG1lIHRvZ2V0aGVyXG4gICAgZWNobyBcIkNvcHlpbmcgQ29kZSBhbmQgUkVBRE1FIGZvciBtb2R1bGUgJGRpcm5hbWVcIlxuICAgIG1rZGlyIC1wIFwiJFRBUkdFVF9GT0xERVJcIlxuICAgIG1rZGlyIC1wIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWVcIlxuICAgIGNwIFwiJE1PRFVMRVNfRk9MREVSLyRkaXJuYW1lL2Nkay50Zi5qc29uXCIgXCIkVEFSR0VUX0ZPTERFUi8kZGlybmFtZS9jZGsudGYuanNvblwiXG4gICAgY3AgXCIkU1JDX0ZPTERFUi8kZGlybmFtZS5tZFwiIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWUvUkVBRE1FLm1kXCJcblxuICAgICMgQWRkIFJFQURNRSBoY2wgZG9jc1xuICAgIGlmIHdoaWNoIHRlcnJhZm9ybS1kb2NzID4vZGV2L251bGw7IHRoZW5cbiAgICAgIHRlcnJhZm9ybS1kb2NzIG1hcmtkb3duIHRhYmxlIC0tb3V0cHV0LWZpbGUgXCIkVEFSR0VUX0ZPTERFUi8kZGlybmFtZS9SRUFETUUubWRcIiBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lXCIgXG4gICAgZWxzZVxuICAgICAgZG9ja2VyIHJ1biAtLXJtIC0tdm9sdW1lIFwiJFNDUklQVFBBVEgvLi4vbW9kdWxlczovdGVycmFmb3JtLWRvY3NcIiAtdSAkKGlkIC11KSBxdWF5LmlvL3RlcnJhZm9ybS1kb2NzL3RlcnJhZm9ybS1kb2NzOjAuMTYuMCBtYXJrZG93biB0YWJsZSAtLW91dHB1dC1maWxlIFwiL3RlcnJhZm9ybS1kb2NzLyRkaXJuYW1lL1JFQURNRS5tZFwiIC90ZXJyYWZvcm0tZG9jcy8kZGlybmFtZVxuICAgIGZpXG5kb25lXG5gLnRyaW0oKVxuICAgICk7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFwiLi9zY3JpcHRzL2NvcHktbW9kdWxlcy5zaFwiLCB7XG4gICAgICBuYW1lOiBcIkNvcHkgSENMIE1vZHVsZXNcIixcbiAgICB9KTtcblxuICAgIC8vIGlnbm9yZSBkaXN0IGluIHRlc3RzXG4gICAgdGhpcy5qZXN0Py5hZGRJZ25vcmVQYXR0ZXJuKFwiZGlzdFwiKTtcblxuICAgIG5ldyBTY3JpcHRGaWxlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiLi9zY3JpcHRzL3RmLW1vZHVsZS10ZXN0LnNoXCIsXG4gICAgICBgXG4jIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxudGVycmFmb3JtIC1jaGRpcj10ZXJyYWZvcm0gaW5pdCAtLXVwZ3JhZGVcbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIGZtdFxudGVycmFmb3JtIC1jaGRpcj10ZXJyYWZvcm0gdmFsaWRhdGVcbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIHBsYW4gICAgIFxuICAgICAgICBgXG4gICAgKTtcblxuICAgIHRoaXMudGVzdFRhc2suZXhlYyhcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiKTtcbiAgICB0aGlzLmplc3Q/LmFkZElnbm9yZVBhdHRlcm4oXCJ0ZXJyYWZvcm1cIik7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -27,7 +27,7 @@
27
27
  "devDependencies": {
28
28
  "@types/fs-extra": "^9.0.13",
29
29
  "@types/glob": "^7.2.0",
30
- "@types/jest": "^27.4.1",
30
+ "@types/jest": "^27.5.0",
31
31
  "@types/node": "^12",
32
32
  "@typescript-eslint/eslint-plugin": "^5",
33
33
  "@typescript-eslint/parser": "^5",
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "main": "lib/index.js",
59
59
  "license": "MIT",
60
- "version": "0.1.42",
60
+ "version": "0.1.45",
61
61
  "jest": {
62
62
  "testMatch": [
63
63
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",
@@ -1,8 +0,0 @@
1
- # ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
2
-
3
- repos:
4
- - repo: git://github.com/antonbabenko/pre-commit-terraform
5
- rev: v1.70.1
6
- hooks:
7
- - id: terraform_fmt
8
- - id: terraform_docs