@cdktn/provider-generator 0.24.0-pre.9 → 0.24.0-pre.91
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/.spec.swcrc +22 -0
- package/LICENSE +355 -0
- package/README.md +1 -1
- package/build/__tests__/edge-provider-schema/builder.d.ts +9 -3
- package/build/__tests__/edge-provider-schema/builder.js +6 -3
- package/build/__tests__/edge-provider-schema/cli.js +8 -3
- package/build/__tests__/edge-provider-schema/index.js +119 -1
- package/build/__tests__/provider.test.js +4 -1
- package/build/get/__tests__/generator/ephemeral-resources.test.d.ts +2 -0
- package/build/get/__tests__/generator/ephemeral-resources.test.js +49 -0
- package/build/get/__tests__/generator/module-generator.test.js +12 -12
- package/build/get/__tests__/generator/provider-functions.test.d.ts +2 -0
- package/build/get/__tests__/generator/provider-functions.test.js +176 -0
- package/build/get/__tests__/generator/provider-source-matching.test.d.ts +2 -0
- package/build/get/__tests__/generator/provider-source-matching.test.js +45 -0
- package/build/get/__tests__/generator/provider.test.js +9 -1
- package/build/get/__tests__/generator/supported-stored-classes.test.d.ts +2 -0
- package/build/get/__tests__/generator/supported-stored-classes.test.js +137 -0
- package/build/get/__tests__/generator/types.test.js +44 -1
- package/build/get/__tests__/generator/write-only.test.d.ts +2 -0
- package/build/get/__tests__/generator/write-only.test.js +65 -0
- package/build/get/__tests__/target-versions.test.d.ts +2 -0
- package/build/get/__tests__/target-versions.test.js +171 -0
- package/build/get/constructs-maker.d.ts +8 -1
- package/build/get/constructs-maker.js +46 -10
- package/build/get/generator/emitter/attributes-emitter.d.ts +13 -2
- package/build/get/generator/emitter/attributes-emitter.js +71 -5
- package/build/get/generator/emitter/index.d.ts +1 -0
- package/build/get/generator/emitter/index.js +2 -1
- package/build/get/generator/emitter/provider-functions-emitter.d.ts +11 -0
- package/build/get/generator/emitter/provider-functions-emitter.js +94 -0
- package/build/get/generator/emitter/resource-emitter.d.ts +5 -1
- package/build/get/generator/emitter/resource-emitter.js +83 -7
- package/build/get/generator/emitter/struct-emitter.js +10 -10
- package/build/get/generator/models/attribute-model.d.ts +4 -0
- package/build/get/generator/models/attribute-model.js +50 -4
- package/build/get/generator/models/attribute-type-model.d.ts +24 -0
- package/build/get/generator/models/attribute-type-model.js +91 -5
- package/build/get/generator/models/index.d.ts +1 -0
- package/build/get/generator/models/index.js +2 -1
- package/build/get/generator/models/provider-function-model.d.ts +102 -0
- package/build/get/generator/models/provider-function-model.js +667 -0
- package/build/get/generator/models/resource-model.d.ts +3 -0
- package/build/get/generator/models/resource-model.js +13 -4
- package/build/get/generator/models/struct.d.ts +2 -0
- package/build/get/generator/models/struct.js +6 -2
- package/build/get/generator/models/supported-stored-classes.d.ts +5 -0
- package/build/get/generator/models/supported-stored-classes.js +86 -0
- package/build/get/generator/module-generator.js +3 -3
- package/build/get/generator/provider-generator.d.ts +2 -0
- package/build/get/generator/provider-generator.js +41 -6
- package/build/get/generator/resource-parser.js +3 -1
- package/jest.config.js +16 -9
- package/package.json +28 -27
- package/package.sh +1 -1
- package/src/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +4 -0
- package/src/__tests__/__snapshots__/provider.test.ts.snap +2828 -2828
- package/src/__tests__/edge-provider-schema/builder.ts +201 -0
- package/src/__tests__/edge-provider-schema/cli.ts +51 -0
- package/src/__tests__/edge-provider-schema/index.ts +284 -0
- package/src/__tests__/edge-provider-schema.test.ts +24 -0
- package/src/__tests__/provider.test.ts +183 -0
- package/src/get/__tests__/constructs-maker.test.ts +118 -0
- package/src/get/__tests__/generator/__snapshots__/complex-computed-types.test.ts.snap +5 -5
- package/src/get/__tests__/generator/__snapshots__/ephemeral-resources.test.ts.snap +524 -0
- package/src/get/__tests__/generator/__snapshots__/export-sharding.test.ts.snap +3310 -3310
- package/src/get/__tests__/generator/__snapshots__/module-generator.test.ts.snap +355 -355
- package/src/get/__tests__/generator/__snapshots__/nested-types.test.ts.snap +8 -8
- package/src/get/__tests__/generator/__snapshots__/provider-functions.test.ts.snap +444 -0
- package/src/get/__tests__/generator/__snapshots__/provider.test.ts.snap +8 -8
- package/src/get/__tests__/generator/__snapshots__/resource-types.test.ts.snap +126 -126
- package/src/get/__tests__/generator/__snapshots__/skipped-attributes.test.ts.snap +17 -17
- package/src/get/__tests__/generator/__snapshots__/types.test.ts.snap +201 -52
- package/src/get/__tests__/generator/__snapshots__/write-only.test.ts.snap +262 -0
- package/src/get/__tests__/generator/complex-computed-types.test.ts +28 -0
- package/src/get/__tests__/generator/deep-nested-attributes.test.ts +56 -0
- package/src/get/__tests__/generator/description-escaping.test.ts +84 -0
- package/src/get/__tests__/generator/empty-provider-resources.test.ts +26 -0
- package/src/get/__tests__/generator/ephemeral-resources.test.ts +46 -0
- package/src/get/__tests__/generator/export-sharding.test.ts +169 -0
- package/src/get/__tests__/generator/fixtures/deeply-nested-collections.test.fixture.json +129 -0
- package/src/get/__tests__/generator/fixtures/ephemeral-resources.test.fixture.json +160 -0
- package/src/get/__tests__/generator/fixtures/provider-functions-collision.test.fixture.json +31 -0
- package/src/get/__tests__/generator/fixtures/provider-functions-synthetic.test.fixture.json +192 -0
- package/src/get/__tests__/generator/fixtures/provider-functions.test.fixture.json +170 -0
- package/src/get/__tests__/generator/fixtures/write-only.test.fixture.json +58 -0
- package/src/get/__tests__/generator/import-style.test.ts +129 -0
- package/src/get/__tests__/generator/module-generator.test.ts +528 -0
- package/src/get/__tests__/generator/nested-types.test.ts +54 -0
- package/src/get/__tests__/generator/provider-functions.test.ts +262 -0
- package/src/get/__tests__/generator/provider-source-matching.test.ts +84 -0
- package/src/get/__tests__/generator/provider.test.ts +59 -0
- package/src/get/__tests__/generator/resource-types.test.ts +118 -0
- package/src/get/__tests__/generator/skipped-attributes.test.ts +72 -0
- package/src/get/__tests__/generator/supported-stored-classes.test.ts +147 -0
- package/src/get/__tests__/generator/types.test.ts +686 -0
- package/src/get/__tests__/generator/versions-file.test.ts +72 -0
- package/src/get/__tests__/generator/write-only.test.ts +71 -0
- package/src/get/__tests__/target-versions.test.ts +206 -0
- package/src/get/__tests__/util.ts +75 -0
- package/src/get/constructs-maker.ts +885 -0
- package/src/get/generator/custom-defaults.ts +493 -0
- package/src/get/generator/emitter/attributes-emitter.ts +316 -0
- package/src/get/generator/emitter/index.ts +6 -0
- package/src/get/generator/emitter/provider-functions-emitter.ts +117 -0
- package/src/get/generator/emitter/resource-emitter.ts +330 -0
- package/src/get/generator/emitter/struct-emitter.ts +683 -0
- package/src/get/generator/loop-detection.ts +81 -0
- package/src/get/generator/models/attribute-model.ts +273 -0
- package/src/get/generator/models/attribute-type-model.ts +560 -0
- package/src/get/generator/models/index.ts +8 -0
- package/src/get/generator/models/provider-function-model.ts +872 -0
- package/src/get/generator/models/resource-model.ts +183 -0
- package/src/get/generator/models/scope.ts +54 -0
- package/src/get/generator/models/struct.ts +124 -0
- package/src/get/generator/models/supported-stored-classes.ts +88 -0
- package/src/get/generator/module-generator.ts +234 -0
- package/src/get/generator/provider-generator.ts +428 -0
- package/src/get/generator/resource-parser.ts +764 -0
- package/src/get/generator/sanitized-comments.ts +49 -0
- package/src/get/generator/skipped-attributes.ts +27 -0
- package/src/index.ts +40 -0
- package/src/util.ts +26 -0
- package/tsconfig.json +1 -2
|
@@ -4,30 +4,68 @@ exports.ResourceEmitter = void 0;
|
|
|
4
4
|
const attributes_emitter_1 = require("./attributes-emitter");
|
|
5
5
|
const sanitized_comments_1 = require("../sanitized-comments");
|
|
6
6
|
class ResourceEmitter {
|
|
7
|
-
constructor(code) {
|
|
7
|
+
constructor(code, importExtension) {
|
|
8
8
|
this.code = code;
|
|
9
|
+
this.importExtension = importExtension;
|
|
9
10
|
this.attributesEmitter = new attributes_emitter_1.AttributesEmitter(this.code);
|
|
10
11
|
}
|
|
11
12
|
emit(resource) {
|
|
12
13
|
this.code.line();
|
|
14
|
+
if (resource.isProvider && resource.providerFunctionsModel) {
|
|
15
|
+
// Sibling-directory import: providers/<provider>/provider/index.ts
|
|
16
|
+
// (the emitted file) and providers/<provider>/provider-functions/
|
|
17
|
+
// index.ts are siblings under providers/<provider>/, so unlike the
|
|
18
|
+
// child-folder struct imports this one has to step up a level.
|
|
19
|
+
this.code.line(`import { ${resource.providerFunctionsModel.className} } from '../provider-functions/index${this.importExtension}';`);
|
|
20
|
+
}
|
|
13
21
|
const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
|
|
14
22
|
comment.line(`Represents a {@link ${resource.linkToDocs} ${resource.terraformResourceType}}`);
|
|
15
23
|
comment.end();
|
|
16
24
|
this.code.openBlock(`export class ${resource.className} extends cdktn.${resource.parentClassName}`);
|
|
17
25
|
this.emitHeader("STATIC PROPERTIES");
|
|
18
26
|
this.emitStaticProperties(resource);
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
if (!resource.isEphemeralResource) {
|
|
28
|
+
this.emitHeader("STATIC Methods");
|
|
29
|
+
this.emitStaticMethods(resource);
|
|
30
|
+
}
|
|
21
31
|
this.emitHeader("INITIALIZER");
|
|
22
32
|
this.emitInitializer(resource);
|
|
23
33
|
this.emitHeader("ATTRIBUTES");
|
|
24
34
|
this.emitResourceAttributes(resource);
|
|
35
|
+
if (resource.isProvider && resource.providerFunctionsModel) {
|
|
36
|
+
this.emitHeader("PROVIDER-DEFINED FUNCTIONS");
|
|
37
|
+
this.emitFunctionsGetter(resource.providerFunctionsModel);
|
|
38
|
+
}
|
|
25
39
|
// synthesis
|
|
26
40
|
this.emitHeader("SYNTHESIS");
|
|
27
41
|
this.emitResourceSynthesis(resource);
|
|
28
42
|
this.emitHclResourceSynthesis(resource);
|
|
29
43
|
this.code.closeBlock(); // construct
|
|
30
44
|
}
|
|
45
|
+
// Emits a memoized `functions` getter on a provider class that declares
|
|
46
|
+
// provider-defined functions. The local name to invoke functions under is
|
|
47
|
+
// derived from `this.terraformResourceType`, not baked in as the schema
|
|
48
|
+
// name constant: terraform-provider.ts keys both `required_providers` and
|
|
49
|
+
// the `provider` block directly off `terraformResourceType`, so whatever
|
|
50
|
+
// this instance's `terraformResourceType` is IS its correct
|
|
51
|
+
// required_providers local name (it already accounts for a `name`
|
|
52
|
+
// override in the cdktf.json provider constraint, see
|
|
53
|
+
// ConstructsMakerProviderTarget/TerraformProviderConstraint) - the
|
|
54
|
+
// instance always knows its own correct local name, so there is no need
|
|
55
|
+
// for a providerLocalName override parameter here.
|
|
56
|
+
emitFunctionsGetter(model) {
|
|
57
|
+
this.code.line(`private _functions?: ${model.className};`);
|
|
58
|
+
this.code.line();
|
|
59
|
+
const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
|
|
60
|
+
comment.line(`Provider-defined functions of the ${model.providerName} provider.`);
|
|
61
|
+
comment.end();
|
|
62
|
+
this.code.openBlock(`public get functions(): ${model.className}`);
|
|
63
|
+
this.code.openBlock(`if (!this._functions)`);
|
|
64
|
+
this.code.line(`this._functions = new ${model.className}(this.terraformResourceType);`);
|
|
65
|
+
this.code.closeBlock();
|
|
66
|
+
this.code.line(`return this._functions;`);
|
|
67
|
+
this.code.closeBlock();
|
|
68
|
+
}
|
|
31
69
|
emitHeader(title) {
|
|
32
70
|
this.code.line();
|
|
33
71
|
this.code.line("// " + "=".repeat(title.length));
|
|
@@ -53,8 +91,9 @@ class ResourceEmitter {
|
|
|
53
91
|
this.code.line();
|
|
54
92
|
this.code.openBlock(`protected synthesizeHclAttributes(): { [name: string]: any }`);
|
|
55
93
|
this.code.open(`const attrs = {`);
|
|
94
|
+
const registerWriteOnlyUsage = this.supportsWriteOnlyRegistration(resource);
|
|
56
95
|
for (const att of resource.synthesizableAttributes) {
|
|
57
|
-
this.attributesEmitter.emitToHclTerraform(att, false);
|
|
96
|
+
this.attributesEmitter.emitToHclTerraform(att, false, registerWriteOnlyUsage);
|
|
58
97
|
}
|
|
59
98
|
this.code.close(`};`);
|
|
60
99
|
if (resource.synthesizableAttributes.length > 0) {
|
|
@@ -71,12 +110,31 @@ class ResourceEmitter {
|
|
|
71
110
|
this.code.line();
|
|
72
111
|
this.code.openBlock(`protected synthesizeAttributes(): { [name: string]: any }`);
|
|
73
112
|
this.code.open(`return {`);
|
|
113
|
+
const registerWriteOnlyUsage = this.supportsWriteOnlyRegistration(resource);
|
|
74
114
|
for (const att of resource.synthesizableAttributes) {
|
|
75
|
-
this.attributesEmitter.emitToTerraform(att, false);
|
|
115
|
+
this.attributesEmitter.emitToTerraform(att, false, registerWriteOnlyUsage);
|
|
76
116
|
}
|
|
77
117
|
this.code.close(`};`);
|
|
78
118
|
this.code.closeBlock();
|
|
79
119
|
}
|
|
120
|
+
// `markWriteOnlyAttribute` (called from generated `synthesizeAttributes()`/
|
|
121
|
+
// `synthesizeHclAttributes()` for write-only attributes, see
|
|
122
|
+
// AttributesEmitter#emitToTerraform/#emitToHclTerraform) lives on
|
|
123
|
+
// TerraformResource - so only managed resources can register write-only
|
|
124
|
+
// usage; data sources, providers, and ephemeral resources only get the
|
|
125
|
+
// deprecated getter.
|
|
126
|
+
//
|
|
127
|
+
// write-only is fundamentally a state concept - the value is passed to
|
|
128
|
+
// the provider but never persisted to state - so gating this on
|
|
129
|
+
// TerraformResource is a semantic choice, not a capability one: ephemeral
|
|
130
|
+
// resources have no state at all, and, consistent with that, no provider
|
|
131
|
+
// schema in the RFC-04 sweep (including vault's 16 ephemeral resources)
|
|
132
|
+
// marks an ephemeral attribute write_only. So ephemeral classes
|
|
133
|
+
// deliberately land in the same "getter only" bucket as data sources and
|
|
134
|
+
// providers.
|
|
135
|
+
supportsWriteOnlyRegistration(resource) {
|
|
136
|
+
return resource.parentClassName === "TerraformResource";
|
|
137
|
+
}
|
|
80
138
|
emitResourceAttributes(resource) {
|
|
81
139
|
for (const att of resource.attributes) {
|
|
82
140
|
this.attributesEmitter.emit(att, this.attributesEmitter.needsResetEscape(att, resource.attributes), this.attributesEmitter.needsInputEscape(att, resource.attributes));
|
|
@@ -85,7 +143,11 @@ class ResourceEmitter {
|
|
|
85
143
|
emitInitializer(resource) {
|
|
86
144
|
this.code.line();
|
|
87
145
|
const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
|
|
88
|
-
comment.line(`Create a new {@link ${resource.linkToDocs} ${resource.terraformResourceType}} ${resource.isDataSource
|
|
146
|
+
comment.line(`Create a new {@link ${resource.linkToDocs} ${resource.terraformResourceType}} ${resource.isDataSource
|
|
147
|
+
? "Data Source"
|
|
148
|
+
: resource.isEphemeralResource
|
|
149
|
+
? "Ephemeral Resource"
|
|
150
|
+
: "Resource"}`);
|
|
89
151
|
comment.line(``);
|
|
90
152
|
comment.line(`@param scope The scope in which to define this construct`);
|
|
91
153
|
comment.line(`@param id The scoped construct ID. Must be unique amongst siblings in the same scope`);
|
|
@@ -95,6 +157,9 @@ class ResourceEmitter {
|
|
|
95
157
|
if (resource.isProvider) {
|
|
96
158
|
this.emitProviderSuper(resource);
|
|
97
159
|
}
|
|
160
|
+
else if (resource.isEphemeralResource) {
|
|
161
|
+
this.emitEphemeralResourceSuper(resource);
|
|
162
|
+
}
|
|
98
163
|
else {
|
|
99
164
|
this.emitResourceSuper(resource);
|
|
100
165
|
}
|
|
@@ -122,6 +187,17 @@ class ResourceEmitter {
|
|
|
122
187
|
this.code.line(`forEach: config.forEach`);
|
|
123
188
|
this.code.close(`});`);
|
|
124
189
|
}
|
|
190
|
+
emitEphemeralResourceSuper(resource) {
|
|
191
|
+
this.code.open(`super(scope, id, {`);
|
|
192
|
+
this.code.line(`terraformResourceType: '${resource.terraformResourceType}',`);
|
|
193
|
+
this.emitTerraformGeneratorMetadata(resource);
|
|
194
|
+
this.code.line(`provider: config.provider,`);
|
|
195
|
+
this.code.line(`dependsOn: config.dependsOn,`);
|
|
196
|
+
this.code.line(`count: config.count,`);
|
|
197
|
+
this.code.line(`lifecycle: config.lifecycle,`);
|
|
198
|
+
this.code.line(`forEach: config.forEach`);
|
|
199
|
+
this.code.close(`});`);
|
|
200
|
+
}
|
|
125
201
|
emitProviderSuper(resource) {
|
|
126
202
|
this.code.open(`super(scope, id, {`);
|
|
127
203
|
this.code.line(`terraformResourceType: '${resource.terraformResourceType}',`);
|
|
@@ -144,4 +220,4 @@ class ResourceEmitter {
|
|
|
144
220
|
}
|
|
145
221
|
}
|
|
146
222
|
exports.ResourceEmitter = ResourceEmitter;
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9nZXQvZ2VuZXJhdG9yL2VtaXR0ZXIvcmVzb3VyY2UtZW1pdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSw2REFBeUQ7QUFDekQsOERBQXlEO0FBRXpELE1BQWEsZUFBZTtJQUcxQixZQUE2QixJQUFlO1FBQWYsU0FBSSxHQUFKLElBQUksQ0FBVztRQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLElBQUksQ0FBQyxRQUF1QjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWdCLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsdUJBQXVCLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLHFCQUFxQixHQUFHLENBQ2hGLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsZ0JBQWdCLFFBQVEsQ0FBQyxTQUFTLGtCQUFrQixRQUFRLENBQUMsZUFBZSxFQUFFLENBQy9FLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEs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bi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tIFwiY29kZW1ha2VyXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuaW1wb3J0IHsgQXR0cmlidXRlc0VtaXR0ZXIgfSBmcm9tIFwiLi9hdHRyaWJ1dGVzLWVtaXR0ZXJcIjtcbmltcG9ydCB7IHNhbml0aXplZENvbW1lbnQgfSBmcm9tIFwiLi4vc2FuaXRpemVkLWNvbW1lbnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUVtaXR0ZXIge1xuICBhdHRyaWJ1dGVzRW1pdHRlcjogQXR0cmlidXRlc0VtaXR0ZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyID0gbmV3IEF0dHJpYnV0ZXNFbWl0dGVyKHRoaXMuY29kZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgY29uc3QgY29tbWVudCA9IHNhbml0aXplZENvbW1lbnQodGhpcy5jb2RlKTtcbiAgICBjb21tZW50LmxpbmUoXG4gICAgICBgUmVwcmVzZW50cyBhIHtAbGluayAke3Jlc291cmNlLmxpbmtUb0RvY3N9ICR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfX1gLFxuICAgICk7XG4gICAgY29tbWVudC5lbmQoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYGV4cG9ydCBjbGFzcyAke3Jlc291cmNlLmNsYXNzTmFtZX0gZXh0ZW5kcyBjZGt0bi4ke3Jlc291cmNlLnBhcmVudENsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICB0aGlzLmVtaXRIZWFkZXIoXCJTVEFUSUMgUFJPUEVSVElFU1wiKTtcbiAgICB0aGlzLmVtaXRTdGF0aWNQcm9wZXJ0aWVzKHJlc291cmNlKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIlNUQVRJQyBNZXRob2RzXCIpO1xuICAgIHRoaXMuZW1pdFN0YXRpY01ldGhvZHMocmVzb3VyY2UpO1xuXG4gICAgdGhpcy5lbWl0SGVhZGVyKFwiSU5JVElBTElaRVJcIik7XG4gICAgdGhpcy5lbWl0SW5pdGlhbGl6ZXIocmVzb3VyY2UpO1xuXG4gICAgdGhpcy5lbWl0SGVhZGVyKFwiQVRUUklCVVRFU1wiKTtcbiAgICB0aGlzLmVtaXRSZXNvdXJjZUF0dHJpYnV0ZXMocmVzb3VyY2UpO1xuXG4gICAgLy8gc3ludGhlc2lzXG4gICAgdGhpcy5lbWl0SGVhZGVyKFwiU1lOVEhFU0lTXCIpO1xuICAgIHRoaXMuZW1pdFJlc291cmNlU3ludGhlc2lzKHJlc291cmNlKTtcbiAgICB0aGlzLmVtaXRIY2xSZXNvdXJjZVN5bnRoZXNpcyhyZXNvdXJjZSk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpOyAvLyBjb25zdHJ1Y3RcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEhlYWRlcih0aXRsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZShcIi8vIFwiICsgXCI9XCIucmVwZWF0KHRpdGxlLmxlbmd0aCkpO1xuICAgIHRoaXMuY29kZS5saW5lKGAvLyAke3RpdGxlfWApO1xuICAgIHRoaXMuY29kZS5saW5lKFwiLy8gXCIgKyBcIj1cIi5yZXBlYXQodGl0bGUubGVuZ3RoKSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0aWNQcm9wZXJ0aWVzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwiJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9XCI7YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGljTWV0aG9kcyhyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIGNvbnN0IGNvbW1lbnQgPSBzYW5pdGl6ZWRDb21tZW50KHRoaXMuY29kZSk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEdlbmVyYXRlcyBDREtUTiBjb2RlIGZvciBpbXBvcnRpbmcgYSAke3Jlc291cmNlLmNsYXNzTmFtZX0gcmVzb3VyY2UgdXBvbiBydW5uaW5nIFwiY2RrdG4gcGxhbiA8c3RhY2stbmFtZT5cImAsXG4gICAgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0YCk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlICR7cmVzb3VyY2UuY2xhc3NOYW1lfSB0byBpbXBvcnRgLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBpbXBvcnRGcm9tSWQgVGhlIGlkIG9mIHRoZSBleGlzdGluZyAke3Jlc291cmNlLmNsYXNzTmFtZX0gdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgJHtyZXNvdXJjZS5saW5rVG9Eb2NzfSNpbXBvcnQgaW1wb3J0IHNlY3Rpb259IGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcmVzb3VyY2UgZm9yIHRoZSBpZCB0byB1c2VgLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBwcm92aWRlcj8gT3B0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdoZXJlIHRoZSAke3Jlc291cmNlLmNsYXNzTmFtZX0gdG8gaW1wb3J0IGlzIGZvdW5kYCxcbiAgICApO1xuICAgIGNvbW1lbnQuZW5kKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RuLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdG4uSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCIke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX1cIiwgaW1wb3J0SWQ6IGltcG9ydEZyb21JZCwgcHJvdmlkZXIgfSk7XG4gICAgICB9YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SGNsUmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuKGBjb25zdCBhdHRycyA9IHtgKTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIHJlc291cmNlLnN5bnRoZXNpemFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLmVtaXRUb0hjbFRlcnJhZm9ybShhdHQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2UoYH07YCk7XG5cbiAgICBpZiAocmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlgLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiBhdHRycztgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuKGByZXR1cm4ge2ApO1xuXG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIuZW1pdFRvVGVycmFmb3JtKGF0dCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZShgfTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VBdHRyaWJ1dGVzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2UuYXR0cmlidXRlcykge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzRW1pdHRlci5lbWl0KFxuICAgICAgICBhdHQsXG4gICAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIubmVlZHNSZXNldEVzY2FwZShhdHQsIHJlc291cmNlLmF0dHJpYnV0ZXMpLFxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLm5lZWRzSW5wdXRFc2NhcGUoYXR0LCByZXNvdXJjZS5hdHRyaWJ1dGVzKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SW5pdGlhbGl6ZXIocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGNvbnN0IGNvbW1lbnQgPSBzYW5pdGl6ZWRDb21tZW50KHRoaXMuY29kZSk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYENyZWF0ZSBhIG5ldyB7QGxpbmsgJHtyZXNvdXJjZS5saW5rVG9Eb2NzfSAke1xuICAgICAgICByZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGVcbiAgICAgIH19ICR7cmVzb3VyY2UuaXNEYXRhU291cmNlID8gXCJEYXRhIFNvdXJjZVwiIDogXCJSZXNvdXJjZVwifWAsXG4gICAgKTtcbiAgICBjb21tZW50LmxpbmUoYGApO1xuICAgIGNvbW1lbnQubGluZShgQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RgKTtcbiAgICBjb21tZW50LmxpbmUoXG4gICAgICBgQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlYCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShgQHBhcmFtIG9wdGlvbnMgJHtyZXNvdXJjZS5jb25maWdTdHJ1Y3QuYXR0cmlidXRlVHlwZX1gKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogJHtyZXNvdXJjZS5jb25maWdTdHJ1Y3QuYXR0cmlidXRlVHlwZX0pYCxcbiAgICApO1xuXG4gICAgaWYgKHJlc291cmNlLmlzUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuZW1pdFByb3ZpZGVyU3VwZXIocmVzb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRSZXNvdXJjZVN1cGVyKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGNvbmZpZyBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2UuY29uZmlnU3RydWN0LmFzc2lnbmFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoYXR0LnNldHRlclR5cGUuX3R5cGUgPT09IFwic3RvcmVkX2NsYXNzXCIpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9LmludGVybmFsVmFsdWUgPSBjb25maWcuJHthdHQubmFtZX07YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7YXR0LnN0b3JhZ2VOYW1lfSA9IGNvbmZpZy4ke2F0dC5uYW1lfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTdXBlcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5vcGVuKGBzdXBlcihzY29wZSwgaWQsIHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICcke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX0nLGAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRUZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YShyZXNvdXJjZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixgKTtcbiAgICB0aGlzLmNvZGUubGluZShgY291bnQ6IGNvbmZpZy5jb3VudCxgKTtcbiAgICB0aGlzLmNvZGUubGluZShgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBmb3JFYWNoOiBjb25maWcuZm9yRWFjaGApO1xuICAgIHRoaXMuY29kZS5jbG9zZShgfSk7YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm92aWRlclN1cGVyKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLm9wZW4oYHN1cGVyKHNjb3BlLCBpZCwge2ApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRlcnJhZm9ybVJlc291cmNlVHlwZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfScsYCxcbiAgICApO1xuICAgIHRoaXMuZW1pdFRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhKHJlc291cmNlKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1Qcm92aWRlclNvdXJjZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUHJvdmlkZXJTb3VyY2V9J2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2UoYH0pO2ApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGEocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUub3BlbihgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBwcm92aWRlck5hbWU6ICcke3Jlc291cmNlLnByb3ZpZGVyfScke1xuICAgICAgICByZXNvdXJjZS5wcm92aWRlclZlcnNpb24gfHwgcmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludFxuICAgICAgICAgID8gXCIsXCJcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1gLFxuICAgICk7XG5cbiAgICBpZiAocmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHByb3ZpZGVyVmVyc2lvbjogJyR7cmVzb3VyY2UucHJvdmlkZXJWZXJzaW9ufScke1xuICAgICAgICAgIHJlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQgPyBcIixcIiA6IFwiXCJcbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZXNvdXJjZS5wcm92aWRlclZlcnNpb25Db25zdHJhaW50KSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICcke3Jlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZShgfSxgKTtcbiAgfVxufVxuIl19
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9nZXQvZ2VuZXJhdG9yL2VtaXR0ZXIvcmVzb3VyY2UtZW1pdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSw2REFBeUQ7QUFDekQsOERBQXlEO0FBRXpELE1BQWEsZUFBZTtJQUcxQixZQUNtQixJQUFlLEVBQ2YsZUFBdUI7UUFEdkIsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLG9CQUFlLEdBQWYsZUFBZSxDQUFRO1FBRXhDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLHNDQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sSUFBSSxDQUFDLFFBQXVCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFakIsSUFBSSxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzNELG1FQUFtRTtZQUNuRSxrRUFBa0U7WUFDbEUsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixZQUFZLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLHVDQUF1QyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQ3JILENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBZ0IsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLElBQUksQ0FDVix1QkFBdUIsUUFBUSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMscUJBQXFCLEdBQUcsQ0FDaEYsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQixnQkFBZ0IsUUFBUSxDQUFDLFNBQVMsa0JBQWtCLFFBQVEsQ0FBQyxl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QVEsQ0FBQyxRQUFRLElBQ2pDLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLHlCQUF5QjtZQUM1RCxDQUFDLENBQUMsR0FBRztZQUNMLENBQUMsQ0FBQyxFQUNOLEVBQUUsQ0FDSCxDQUFDO1FBRUYsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1oscUJBQXFCLFFBQVEsQ0FBQyxlQUFlLElBQzNDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUM3QyxFQUFFLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLCtCQUErQixRQUFRLENBQUMseUJBQXlCLEdBQUcsQ0FDckUsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUFsVUQsMENBa1VDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IENvZGVNYWtlciB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7IFJlc291cmNlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzRW1pdHRlciB9IGZyb20gXCIuL2F0dHJpYnV0ZXMtZW1pdHRlclwiO1xuaW1wb3J0IHsgc2FuaXRpemVkQ29tbWVudCB9IGZyb20gXCIuLi9zYW5pdGl6ZWQtY29tbWVudHNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlRW1pdHRlciB7XG4gIGF0dHJpYnV0ZXNFbWl0dGVyOiBBdHRyaWJ1dGVzRW1pdHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvZGU6IENvZGVNYWtlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEV4dGVuc2lvbjogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyID0gbmV3IEF0dHJpYnV0ZXNFbWl0dGVyKHRoaXMuY29kZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICBpZiAocmVzb3VyY2UuaXNQcm92aWRlciAmJiByZXNvdXJjZS5wcm92aWRlckZ1bmN0aW9uc01vZGVsKSB7XG4gICAgICAvLyBTaWJsaW5nLWRpcmVjdG9yeSBpbXBvcnQ6IHByb3ZpZGVycy88cHJvdmlkZXI+L3Byb3ZpZGVyL2luZGV4LnRzXG4gICAgICAvLyAodGhlIGVtaXR0ZWQgZmlsZSkgYW5kIHByb3ZpZGVycy88cHJvdmlkZXI+L3Byb3ZpZGVyLWZ1bmN0aW9ucy9cbiAgICAgIC8vIGluZGV4LnRzIGFyZSBzaWJsaW5ncyB1bmRlciBwcm92aWRlcnMvPHByb3ZpZGVyPi8sIHNvIHVubGlrZSB0aGVcbiAgICAgIC8vIGNoaWxkLWZvbGRlciBzdHJ1Y3QgaW1wb3J0cyB0aGlzIG9uZSBoYXMgdG8gc3RlcCB1cCBhIGxldmVsLlxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBpbXBvcnQgeyAke3Jlc291cmNlLnByb3ZpZGVyRnVuY3Rpb25zTW9kZWwuY2xhc3NOYW1lfSB9IGZyb20gJy4uL3Byb3ZpZGVyLWZ1bmN0aW9ucy9pbmRleCR7dGhpcy5pbXBvcnRFeHRlbnNpb259JztgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBSZXByZXNlbnRzIGEge0BsaW5rICR7cmVzb3VyY2UubGlua1RvRG9jc30gJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9fWAsXG4gICAgKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgZXhwb3J0IGNsYXNzICR7cmVzb3VyY2UuY2xhc3NOYW1lfSBleHRlbmRzIGNka3RuLiR7cmVzb3VyY2UucGFyZW50Q2xhc3NOYW1lfWAsXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIlNUQVRJQyBQUk9QRVJUSUVTXCIpO1xuICAgIHRoaXMuZW1pdFN0YXRpY1Byb3BlcnRpZXMocmVzb3VyY2UpO1xuXG4gICAgaWYgKCFyZXNvdXJjZS5pc0VwaGVtZXJhbFJlc291cmNlKSB7XG4gICAgICB0aGlzLmVtaXRIZWFkZXIoXCJTVEFUSUMgTWV0aG9kc1wiKTtcbiAgICAgIHRoaXMuZW1pdFN0YXRpY01ldGhvZHMocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIklOSVRJQUxJWkVSXCIpO1xuICAgIHRoaXMuZW1pdEluaXRpYWxpemVyKHJlc291cmNlKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIkFUVFJJQlVURVNcIik7XG4gICAgdGhpcy5lbWl0UmVzb3VyY2VBdHRyaWJ1dGVzKHJlc291cmNlKTtcblxuICAgIGlmIChyZXNvdXJjZS5pc1Byb3ZpZGVyICYmIHJlc291cmNlLnByb3ZpZGVyRnVuY3Rpb25zTW9kZWwpIHtcbiAgICAgIHRoaXMuZW1pdEhlYWRlcihcIlBST1ZJREVSLURFRklORUQgRlVOQ1RJT05TXCIpO1xuICAgICAgdGhpcy5lbWl0RnVuY3Rpb25zR2V0dGVyKHJlc291cmNlLnByb3ZpZGVyRnVuY3Rpb25zTW9kZWwpO1xuICAgIH1cblxuICAgIC8vIHN5bnRoZXNpc1xuICAgIHRoaXMuZW1pdEhlYWRlcihcIlNZTlRIRVNJU1wiKTtcbiAgICB0aGlzLmVtaXRSZXNvdXJjZVN5bnRoZXNpcyhyZXNvdXJjZSk7XG4gICAgdGhpcy5lbWl0SGNsUmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2UpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTsgLy8gY29uc3RydWN0XG4gIH1cblxuICAvLyBFbWl0cyBhIG1lbW9pemVkIGBmdW5jdGlvbnNgIGdldHRlciBvbiBhIHByb3ZpZGVyIGNsYXNzIHRoYXQgZGVjbGFyZXNcbiAgLy8gcHJvdmlkZXItZGVmaW5lZCBmdW5jdGlvbnMuIFRoZSBsb2NhbCBuYW1lIHRvIGludm9rZSBmdW5jdGlvbnMgdW5kZXIgaXNcbiAgLy8gZGVyaXZlZCBmcm9tIGB0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZWAsIG5vdCBiYWtlZCBpbiBhcyB0aGUgc2NoZW1hXG4gIC8vIG5hbWUgY29uc3RhbnQ6IHRlcnJhZm9ybS1wcm92aWRlci50cyBrZXlzIGJvdGggYHJlcXVpcmVkX3Byb3ZpZGVyc2AgYW5kXG4gIC8vIHRoZSBgcHJvdmlkZXJgIGJsb2NrIGRpcmVjdGx5IG9mZiBgdGVycmFmb3JtUmVzb3VyY2VUeXBlYCwgc28gd2hhdGV2ZXJcbiAgLy8gdGhpcyBpbnN0YW5jZSdzIGB0ZXJyYWZvcm1SZXNvdXJjZVR5cGVgIGlzIElTIGl0cyBjb3JyZWN0XG4gIC8vIHJlcXVpcmVkX3Byb3ZpZGVycyBsb2NhbCBuYW1lIChpdCBhbHJlYWR5IGFjY291bnRzIGZvciBhIGBuYW1lYFxuICAvLyBvdmVycmlkZSBpbiB0aGUgY2RrdGYuanNvbiBwcm92aWRlciBjb25zdHJhaW50LCBzZWVcbiAgLy8gQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQvVGVycmFmb3JtUHJvdmlkZXJDb25zdHJhaW50KSAtIHRoZVxuICAvLyBpbnN0YW5jZSBhbHdheXMga25vd3MgaXRzIG93biBjb3JyZWN0IGxvY2FsIG5hbWUsIHNvIHRoZXJlIGlzIG5vIG5lZWRcbiAgLy8gZm9yIGEgcHJvdmlkZXJMb2NhbE5hbWUgb3ZlcnJpZGUgcGFyYW1ldGVyIGhlcmUuXG4gIHByaXZhdGUgZW1pdEZ1bmN0aW9uc0dldHRlcihcbiAgICBtb2RlbDogTm9uTnVsbGFibGU8UmVzb3VyY2VNb2RlbFtcInByb3ZpZGVyRnVuY3Rpb25zTW9kZWxcIl0+LFxuICApIHtcbiAgICB0aGlzLmNvZGUubGluZShgcHJpdmF0ZSBfZnVuY3Rpb25zPzogJHttb2RlbC5jbGFzc05hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBQcm92aWRlci1kZWZpbmVkIGZ1bmN0aW9ucyBvZiB0aGUgJHttb2RlbC5wcm92aWRlck5hbWV9IHByb3ZpZGVyLmAsXG4gICAgKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBnZXQgZnVuY3Rpb25zKCk6ICR7bW9kZWwuY2xhc3NOYW1lfWApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICghdGhpcy5fZnVuY3Rpb25zKWApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRoaXMuX2Z1bmN0aW9ucyA9IG5ldyAke21vZGVsLmNsYXNzTmFtZX0odGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy5fZnVuY3Rpb25zO2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRIZWFkZXIodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXCIvLyBcIiArIFwiPVwiLnJlcGVhdCh0aXRsZS5sZW5ndGgpKTtcbiAgICB0aGlzLmNvZGUubGluZShgLy8gJHt0aXRsZX1gKTtcbiAgICB0aGlzLmNvZGUubGluZShcIi8vIFwiICsgXCI9XCIucmVwZWF0KHRpdGxlLmxlbmd0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGljUHJvcGVydGllcyhyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGZSZXNvdXJjZVR5cGUgPSBcIiR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfVwiO2AsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YXRpY01ldGhvZHMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBHZW5lcmF0ZXMgQ0RLVE4gY29kZSBmb3IgaW1wb3J0aW5nIGEgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJgLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKGBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdGApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSAke3Jlc291cmNlLmNsYXNzTmFtZX0gdG8gaW1wb3J0YCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rICR7cmVzb3VyY2UubGlua1RvRG9jc30jaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlYCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gcHJvdmlkZXI/IE9wdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aGVyZSB0aGUgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHRvIGltcG9ydCBpcyBmb3VuZGAsXG4gICAgKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0bi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RuLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9XCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEhjbFJlc291cmNlU3ludGhlc2lzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUub3BlbihgY29uc3QgYXR0cnMgPSB7YCk7XG5cbiAgICBjb25zdCByZWdpc3RlcldyaXRlT25seVVzYWdlID0gdGhpcy5zdXBwb3J0c1dyaXRlT25seVJlZ2lzdHJhdGlvbihyZXNvdXJjZSk7XG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIuZW1pdFRvSGNsVGVycmFmb3JtKFxuICAgICAgICBhdHQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICByZWdpc3RlcldyaXRlT25seVVzYWdlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2UoYH07YCk7XG5cbiAgICBpZiAocmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlgLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiBhdHRycztgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuKGByZXR1cm4ge2ApO1xuXG4gICAgY29uc3QgcmVnaXN0ZXJXcml0ZU9ubHlVc2FnZSA9IHRoaXMuc3VwcG9ydHNXcml0ZU9ubHlSZWdpc3RyYXRpb24ocmVzb3VyY2UpO1xuICAgIGZvciAoY29uc3QgYXR0IG9mIHJlc291cmNlLnN5bnRoZXNpemFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLmVtaXRUb1RlcnJhZm9ybShcbiAgICAgICAgYXR0LFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgcmVnaXN0ZXJXcml0ZU9ubHlVc2FnZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlKGB9O2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICAvLyBgbWFya1dyaXRlT25seUF0dHJpYnV0ZWAgKGNhbGxlZCBmcm9tIGdlbmVyYXRlZCBgc3ludGhlc2l6ZUF0dHJpYnV0ZXMoKWAvXG4gIC8vIGBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpYCBmb3Igd3JpdGUtb25seSBhdHRyaWJ1dGVzLCBzZWVcbiAgLy8gQXR0cmlidXRlc0VtaXR0ZXIjZW1pdFRvVGVycmFmb3JtLyNlbWl0VG9IY2xUZXJyYWZvcm0pIGxpdmVzIG9uXG4gIC8vIFRlcnJhZm9ybVJlc291cmNlIC0gc28gb25seSBtYW5hZ2VkIHJlc291cmNlcyBjYW4gcmVnaXN0ZXIgd3JpdGUtb25seVxuICAvLyB1c2FnZTsgZGF0YSBzb3VyY2VzLCBwcm92aWRlcnMsIGFuZCBlcGhlbWVyYWwgcmVzb3VyY2VzIG9ubHkgZ2V0IHRoZVxuICAvLyBkZXByZWNhdGVkIGdldHRlci5cbiAgLy9cbiAgLy8gd3JpdGUtb25seSBpcyBmdW5kYW1lbnRhbGx5IGEgc3RhdGUgY29uY2VwdCAtIHRoZSB2YWx1ZSBpcyBwYXNzZWQgdG9cbiAgLy8gdGhlIHByb3ZpZGVyIGJ1dCBuZXZlciBwZXJzaXN0ZWQgdG8gc3RhdGUgLSBzbyBnYXRpbmcgdGhpcyBvblxuICAvLyBUZXJyYWZvcm1SZXNvdXJjZSBpcyBhIHNlbWFudGljIGNob2ljZSwgbm90IGEgY2FwYWJpbGl0eSBvbmU6IGVwaGVtZXJhbFxuICAvLyByZXNvdXJjZXMgaGF2ZSBubyBzdGF0ZSBhdCBhbGwsIGFuZCwgY29uc2lzdGVudCB3aXRoIHRoYXQsIG5vIHByb3ZpZGVyXG4gIC8vIHNjaGVtYSBpbiB0aGUgUkZDLTA0IHN3ZWVwIChpbmNsdWRpbmcgdmF1bHQncyAxNiBlcGhlbWVyYWwgcmVzb3VyY2VzKVxuICAvLyBtYXJrcyBhbiBlcGhlbWVyYWwgYXR0cmlidXRlIHdyaXRlX29ubHkuIFNvIGVwaGVtZXJhbCBjbGFzc2VzXG4gIC8vIGRlbGliZXJhdGVseSBsYW5kIGluIHRoZSBzYW1lIFwiZ2V0dGVyIG9ubHlcIiBidWNrZXQgYXMgZGF0YSBzb3VyY2VzIGFuZFxuICAvLyBwcm92aWRlcnMuXG4gIHByaXZhdGUgc3VwcG9ydHNXcml0ZU9ubHlSZWdpc3RyYXRpb24ocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2UucGFyZW50Q2xhc3NOYW1lID09PSBcIlRlcnJhZm9ybVJlc291cmNlXCI7XG4gIH1cblxuICBwcml2YXRlIGVtaXRSZXNvdXJjZUF0dHJpYnV0ZXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICBmb3IgKGNvbnN0IGF0dCBvZiByZXNvdXJjZS5hdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLmVtaXQoXG4gICAgICAgIGF0dCxcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzRW1pdHRlci5uZWVkc1Jlc2V0RXNjYXBlKGF0dCwgcmVzb3VyY2UuYXR0cmlidXRlcyksXG4gICAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIubmVlZHNJbnB1dEVzY2FwZShhdHQsIHJlc291cmNlLmF0dHJpYnV0ZXMpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbml0aWFsaXplcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgY29uc3QgY29tbWVudCA9IHNhbml0aXplZENvbW1lbnQodGhpcy5jb2RlKTtcbiAgICBjb21tZW50LmxpbmUoXG4gICAgICBgQ3JlYXRlIGEgbmV3IHtAbGluayAke3Jlc291cmNlLmxpbmtUb0RvY3N9ICR7XG4gICAgICAgIHJlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZVxuICAgICAgfX0gJHtcbiAgICAgICAgcmVzb3VyY2UuaXNEYXRhU291cmNlXG4gICAgICAgICAgPyBcIkRhdGEgU291cmNlXCJcbiAgICAgICAgICA6IHJlc291cmNlLmlzRXBoZW1lcmFsUmVzb3VyY2VcbiAgICAgICAgICAgID8gXCJFcGhlbWVyYWwgUmVzb3VyY2VcIlxuICAgICAgICAgICAgOiBcIlJlc291cmNlXCJcbiAgICAgIH1gLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKGBgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0YCk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZWAsXG4gICAgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBvcHRpb25zICR7cmVzb3VyY2UuY29uZmlnU3RydWN0LmF0dHJpYnV0ZVR5cGV9YCk7XG4gICAgY29tbWVudC5lbmQoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6ICR7cmVzb3VyY2UuY29uZmlnU3RydWN0LmF0dHJpYnV0ZVR5cGV9KWAsXG4gICAgKTtcblxuICAgIGlmIChyZXNvdXJjZS5pc1Byb3ZpZGVyKSB7XG4gICAgICB0aGlzLmVtaXRQcm92aWRlclN1cGVyKHJlc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlLmlzRXBoZW1lcmFsUmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuZW1pdEVwaGVtZXJhbFJlc291cmNlU3VwZXIocmVzb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRSZXNvdXJjZVN1cGVyKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGNvbmZpZyBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2UuY29uZmlnU3RydWN0LmFzc2lnbmFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoYXR0LnNldHRlclR5cGUuX3R5cGUgPT09IFwic3RvcmVkX2NsYXNzXCIpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9LmludGVybmFsVmFsdWUgPSBjb25maWcuJHthdHQubmFtZX07YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7YXR0LnN0b3JhZ2VOYW1lfSA9IGNvbmZpZy4ke2F0dC5uYW1lfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTdXBlcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5vcGVuKGBzdXBlcihzY29wZSwgaWQsIHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICcke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX0nLGAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRUZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YShyZXNvdXJjZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixgKTtcbiAgICB0aGlzLmNvZGUubGluZShgY291bnQ6IGNvbmZpZy5jb3VudCxgKTtcbiAgICB0aGlzLmNvZGUubGluZShgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBmb3JFYWNoOiBjb25maWcuZm9yRWFjaGApO1xuICAgIHRoaXMuY29kZS5jbG9zZShgfSk7YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRFcGhlbWVyYWxSZXNvdXJjZVN1cGVyKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLm9wZW4oYHN1cGVyKHNjb3BlLCBpZCwge2ApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRlcnJhZm9ybVJlc291cmNlVHlwZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfScsYCxcbiAgICApO1xuICAgIHRoaXMuZW1pdFRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhKHJlc291cmNlKTtcbiAgICB0aGlzLmNvZGUubGluZShgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixgKTtcbiAgICB0aGlzLmNvZGUubGluZShgZGVwZW5kc09uOiBjb25maWcuZGVwZW5kc09uLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBjb3VudDogY29uZmlnLmNvdW50LGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoYCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlKGB9KTtgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFByb3ZpZGVyU3VwZXIocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUub3Blbihgc3VwZXIoc2NvcGUsIGlkLCB7YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9JyxgLFxuICAgICk7XG4gICAgdGhpcy5lbWl0VGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGEocmVzb3VyY2UpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRlcnJhZm9ybVByb3ZpZGVyU291cmNlOiAnJHtyZXNvdXJjZS50ZXJyYWZvcm1Qcm92aWRlclNvdXJjZX0nYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZShgfSk7YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRUZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YShyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5vcGVuKGB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YToge2ApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHByb3ZpZGVyTmFtZTogJyR7cmVzb3VyY2UucHJvdmlkZXJ9JyR7XG4gICAgICAgIHJlc291cmNlLnByb3ZpZGVyVmVyc2lvbiB8fCByZXNvdXJjZS5wcm92aWRlclZlcnNpb25Db25zdHJhaW50XG4gICAgICAgICAgPyBcIixcIlxuICAgICAgICAgIDogXCJcIlxuICAgICAgfWAsXG4gICAgKTtcblxuICAgIGlmIChyZXNvdXJjZS5wcm92aWRlclZlcnNpb24pIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJvdmlkZXJWZXJzaW9uOiAnJHtyZXNvdXJjZS5wcm92aWRlclZlcnNpb259JyR7XG4gICAgICAgICAgcmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludCA/IFwiLFwiIDogXCJcIlxuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludDogJyR7cmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludH0nYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlKGB9LGApO1xuICB9XG59XG4iXX0=
|