@aws-cdk/toolkit-lib 1.20.1 → 1.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build-info.json +2 -2
- package/lib/actions/diff/private/helpers.js +38 -1
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.js +2 -1
- package/lib/actions/publish-assets/index.d.ts +29 -0
- package/lib/actions/publish-assets/index.js +3 -0
- package/lib/api/aws-auth/sdk.d.ts +2 -1
- package/lib/api/aws-auth/sdk.js +2 -1
- package/lib/api/bootstrap/bootstrap-template.yaml +4 -2
- package/lib/api/cloudformation/nested-stack-helpers.d.ts +10 -0
- package/lib/api/cloudformation/nested-stack-helpers.js +8 -1
- package/lib/api/deployments/cfn-api.d.ts +2 -0
- package/lib/api/deployments/cfn-api.js +11 -15
- package/lib/api/deployments/deploy-stack.js +3 -1
- package/lib/api/diff/diff-formatter.d.ts +34 -24
- package/lib/api/diff/diff-formatter.js +114 -85
- package/lib/api/io/private/messages.d.ts +4 -0
- package/lib/api/io/private/messages.js +18 -3
- package/lib/api/io/toolkit-action.d.ts +1 -1
- package/lib/api/io/toolkit-action.js +1 -1
- package/lib/api/stack-events/stack-activity-monitor.d.ts +23 -1
- package/lib/api/stack-events/stack-activity-monitor.js +73 -2
- package/lib/payloads/diff.d.ts +9 -0
- package/lib/payloads/diff.js +1 -1
- package/lib/payloads/index.d.ts +1 -0
- package/lib/payloads/index.js +2 -1
- package/lib/payloads/publish-assets.d.ts +8 -0
- package/lib/payloads/publish-assets.js +3 -0
- package/lib/toolkit/toolkit.d.ts +16 -1
- package/lib/toolkit/toolkit.js +162 -80
- package/package.json +3 -4
|
@@ -11,39 +11,35 @@ const streams_1 = require("../streams");
|
|
|
11
11
|
* Class for formatting the diff output
|
|
12
12
|
*/
|
|
13
13
|
class DiffFormatter {
|
|
14
|
-
|
|
15
|
-
newTemplate;
|
|
14
|
+
templateInfo;
|
|
16
15
|
stackName;
|
|
17
|
-
changeSet;
|
|
18
|
-
nestedStacks;
|
|
19
16
|
isImport;
|
|
20
17
|
mappings;
|
|
21
18
|
/**
|
|
22
|
-
*
|
|
23
|
-
* indexed by the stack name.
|
|
19
|
+
* Cache of computed TemplateDiffs, indexed by stack name.
|
|
24
20
|
*/
|
|
25
|
-
|
|
21
|
+
cache = new Map();
|
|
26
22
|
constructor(props) {
|
|
27
|
-
this.
|
|
28
|
-
this.newTemplate = props.templateInfo.newTemplate;
|
|
23
|
+
this.templateInfo = props.templateInfo;
|
|
29
24
|
this.stackName = props.templateInfo.newTemplate.displayName ?? props.templateInfo.newTemplate.stackName;
|
|
30
|
-
this.changeSet = props.templateInfo.changeSet;
|
|
31
|
-
this.nestedStacks = props.templateInfo.nestedStacks;
|
|
32
25
|
this.isImport = props.templateInfo.isImport ?? false;
|
|
33
26
|
this.mappings = props.templateInfo.mappings ?? {};
|
|
34
27
|
}
|
|
35
28
|
get diffs() {
|
|
36
|
-
return this.
|
|
29
|
+
return Object.fromEntries(this.cache);
|
|
37
30
|
}
|
|
38
31
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
32
|
+
* Compute the diff for a single stack. Results are cached by stack name.
|
|
33
|
+
*
|
|
34
|
+
* @param stackName - The name to cache the diff under
|
|
35
|
+
* @param oldTemplate - The deployed template
|
|
36
|
+
* @param newTemplate - The new/generated template (read from the artifact)
|
|
37
|
+
* @param changeSet - The CloudFormation changeset for this specific stack, if available
|
|
38
|
+
* @param mappings - Resource move mappings
|
|
42
39
|
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const templateDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate ?? this.oldTemplate, this.newTemplate.template, this.changeSet, this.isImport);
|
|
40
|
+
computeDiff(stackName, oldTemplate, newTemplate, changeSet, mappings) {
|
|
41
|
+
if (!this.cache.has(stackName)) {
|
|
42
|
+
const templateDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate, newTemplate, changeSet, this.isImport);
|
|
47
43
|
const setMove = (change, direction, location) => {
|
|
48
44
|
if (location != null) {
|
|
49
45
|
const [sourceStackName, sourceLogicalId] = location.split('.');
|
|
@@ -55,7 +51,7 @@ class DiffFormatter {
|
|
|
55
51
|
}
|
|
56
52
|
};
|
|
57
53
|
templateDiff.resources.forEachDifference((id, change) => {
|
|
58
|
-
const location = `${
|
|
54
|
+
const location = `${stackName}.${id}`;
|
|
59
55
|
if (change.isAddition && Object.values(mappings).includes(location)) {
|
|
60
56
|
setMove(change, 'from', Object.keys(mappings).find(k => mappings[k] === location));
|
|
61
57
|
}
|
|
@@ -63,40 +59,27 @@ class DiffFormatter {
|
|
|
63
59
|
setMove(change, 'to', mappings[location]);
|
|
64
60
|
}
|
|
65
61
|
});
|
|
66
|
-
this.
|
|
67
|
-
}
|
|
68
|
-
return this._diffs[realStackName];
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Return whether the diff has security-impacting changes that need confirmation.
|
|
72
|
-
*
|
|
73
|
-
* If no stackName is given, then the root stack name is used.
|
|
74
|
-
*/
|
|
75
|
-
permissionType() {
|
|
76
|
-
const diff = this.diff();
|
|
77
|
-
if (diff.permissionsBroadened) {
|
|
78
|
-
return payloads_1.PermissionChangeType.BROADENING;
|
|
79
|
-
}
|
|
80
|
-
else if (diff.permissionsAnyChanges) {
|
|
81
|
-
return payloads_1.PermissionChangeType.NON_BROADENING;
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
return payloads_1.PermissionChangeType.NONE;
|
|
62
|
+
this.cache.set(stackName, templateDiff);
|
|
85
63
|
}
|
|
64
|
+
return this.cache.get(stackName);
|
|
86
65
|
}
|
|
87
66
|
/**
|
|
88
|
-
* Format the stack diff
|
|
67
|
+
* Format the stack diff, including all nested stacks.
|
|
89
68
|
*/
|
|
90
69
|
formatStackDiff(options = {}) {
|
|
91
|
-
return this.formatStackDiffHelper(
|
|
70
|
+
return this.formatStackDiffHelper({
|
|
71
|
+
oldTemplate: this.templateInfo.oldTemplate,
|
|
72
|
+
newTemplate: this.templateInfo.newTemplate.template,
|
|
73
|
+
stackName: this.stackName,
|
|
74
|
+
nestedStacks: this.templateInfo.nestedStacks,
|
|
75
|
+
changeSet: this.templateInfo.changeSet,
|
|
76
|
+
mappings: this.mappings,
|
|
77
|
+
logicalIdMap: buildLogicalToPathMap(this.templateInfo.newTemplate),
|
|
78
|
+
}, options);
|
|
92
79
|
}
|
|
93
|
-
formatStackDiffHelper(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
// and sends its output directly to that stream. To facilitate use of the
|
|
97
|
-
// global CliIoHost, we create our own stream to capture the output of
|
|
98
|
-
// `Formatter` and return the output as a string for the consumer of
|
|
99
|
-
// `formatStackDiff` to decide what to do with it.
|
|
80
|
+
formatStackDiffHelper(params, options = {}) {
|
|
81
|
+
const { oldTemplate, newTemplate, stackName, nestedStacks, changeSet, mappings, logicalIdMap } = params;
|
|
82
|
+
const diff = this.computeDiff(stackName, oldTemplate, newTemplate, changeSet, mappings);
|
|
100
83
|
const stream = new streams_1.StringWriteStream();
|
|
101
84
|
let numStacksWithChanges = 0;
|
|
102
85
|
let formattedDiff = '';
|
|
@@ -110,25 +93,26 @@ class DiffFormatter {
|
|
|
110
93
|
stream.write('Parameters and rules created during migration do not affect resource configuration.\n');
|
|
111
94
|
}
|
|
112
95
|
// detect and filter out mangled characters from the diff
|
|
96
|
+
let activeDiff = diff;
|
|
113
97
|
if (diff.differenceCount && !options.strict) {
|
|
114
|
-
const mangledNewTemplate = JSON.parse((0, cloudformation_diff_1.mangleLikeCloudFormation)(JSON.stringify(
|
|
115
|
-
const mangledDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate, mangledNewTemplate,
|
|
98
|
+
const mangledNewTemplate = JSON.parse((0, cloudformation_diff_1.mangleLikeCloudFormation)(JSON.stringify(newTemplate)));
|
|
99
|
+
const mangledDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate, mangledNewTemplate, changeSet);
|
|
116
100
|
filteredChangesCount = Math.max(0, diff.differenceCount - mangledDiff.differenceCount);
|
|
117
101
|
if (filteredChangesCount > 0) {
|
|
118
|
-
|
|
102
|
+
activeDiff = mangledDiff;
|
|
119
103
|
}
|
|
120
104
|
}
|
|
121
105
|
// filter out 'AWS::CDK::Metadata' resources from the template
|
|
122
106
|
// filter out 'CheckBootstrapVersion' rules from the template
|
|
123
107
|
if (!options.strict) {
|
|
124
|
-
obscureDiff(
|
|
108
|
+
obscureDiff(activeDiff);
|
|
125
109
|
}
|
|
126
|
-
if (!
|
|
110
|
+
if (!activeDiff.isEmpty) {
|
|
127
111
|
numStacksWithChanges++;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
...logicalIdMapFromTemplate(
|
|
131
|
-
...
|
|
112
|
+
(0, cloudformation_diff_1.formatDifferences)(stream, activeDiff, {
|
|
113
|
+
...logicalIdMapFromTemplate(oldTemplate),
|
|
114
|
+
...logicalIdMapFromTemplate(newTemplate),
|
|
115
|
+
...logicalIdMap,
|
|
132
116
|
}, options.contextLines);
|
|
133
117
|
}
|
|
134
118
|
else if (!options.quiet) {
|
|
@@ -139,50 +123,95 @@ class DiffFormatter {
|
|
|
139
123
|
}
|
|
140
124
|
}
|
|
141
125
|
finally {
|
|
142
|
-
// store the stream containing a formatted stack diff
|
|
143
126
|
formattedDiff = stream.toString();
|
|
144
127
|
stream.end();
|
|
145
128
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
129
|
+
// Recurse into nested stacks
|
|
130
|
+
for (const [logicalId, nestedStack] of Object.entries(nestedStacks ?? {})) {
|
|
131
|
+
const nextDiff = this.formatStackDiffHelper({
|
|
132
|
+
oldTemplate: nestedStack.deployedTemplate,
|
|
133
|
+
newTemplate: nestedStack.generatedTemplate,
|
|
134
|
+
stackName: nestedStack.physicalName ?? logicalId,
|
|
135
|
+
nestedStacks: nestedStack.nestedStackTemplates,
|
|
136
|
+
changeSet: nestedStack.changeSet,
|
|
137
|
+
mappings,
|
|
138
|
+
logicalIdMap: {},
|
|
139
|
+
}, options);
|
|
153
140
|
numStacksWithChanges += nextDiff.numStacksWithChanges;
|
|
154
141
|
formattedDiff += nextDiff.formattedDiff;
|
|
155
142
|
}
|
|
156
|
-
return {
|
|
157
|
-
numStacksWithChanges,
|
|
158
|
-
formattedDiff,
|
|
159
|
-
};
|
|
143
|
+
return { numStacksWithChanges, formattedDiff };
|
|
160
144
|
}
|
|
161
145
|
/**
|
|
162
|
-
* Format the security diff
|
|
146
|
+
* Format the security diff, including all nested stacks.
|
|
163
147
|
*/
|
|
164
|
-
formatSecurityDiff() {
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
148
|
+
formatSecurityDiff(options = {}) {
|
|
149
|
+
const { formattedDiff, permissionChangeType, numStacksWithChanges } = this.formatSecurityDiffHelper({
|
|
150
|
+
oldTemplate: this.templateInfo.oldTemplate,
|
|
151
|
+
newTemplate: this.templateInfo.newTemplate.template,
|
|
152
|
+
stackName: this.stackName,
|
|
153
|
+
nestedStacks: this.templateInfo.nestedStacks,
|
|
154
|
+
changeSet: this.templateInfo.changeSet,
|
|
155
|
+
logicalIdMap: buildLogicalToPathMap(this.templateInfo.newTemplate),
|
|
156
|
+
}, options);
|
|
157
|
+
return { formattedDiff, permissionChangeType, numStacksWithChanges };
|
|
158
|
+
}
|
|
159
|
+
formatSecurityDiffHelper(params, options = {}) {
|
|
160
|
+
const { oldTemplate, newTemplate, stackName, nestedStacks, changeSet, logicalIdMap } = params;
|
|
161
|
+
const diff = this.computeDiff(stackName, oldTemplate, newTemplate, changeSet, this.mappings);
|
|
162
|
+
const permissionChangeType = permissionTypeFromDiff(diff);
|
|
171
163
|
const stream = new streams_1.StringWriteStream();
|
|
172
|
-
|
|
164
|
+
if (!options.quiet || permissionChangeType !== payloads_1.PermissionChangeType.NONE) {
|
|
165
|
+
stream.write((0, node_util_1.format)(`Stack ${chalk.bold(stackName)}\n`));
|
|
166
|
+
}
|
|
173
167
|
try {
|
|
174
|
-
|
|
175
|
-
|
|
168
|
+
(0, cloudformation_diff_1.formatSecurityChanges)(stream, diff, {
|
|
169
|
+
...logicalIdMapFromTemplate(newTemplate),
|
|
170
|
+
...logicalIdMap,
|
|
171
|
+
});
|
|
176
172
|
}
|
|
177
173
|
finally {
|
|
178
174
|
stream.end();
|
|
179
175
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
176
|
+
let formattedDiff = stream.toString();
|
|
177
|
+
if (!options.quiet && permissionChangeType === payloads_1.PermissionChangeType.NONE) {
|
|
178
|
+
formattedDiff += chalk.green('There were no security-related changes (limitations: https://github.com/aws/aws-cdk/issues/1299)\n');
|
|
179
|
+
}
|
|
180
|
+
let numStacksWithChanges = permissionChangeType !== payloads_1.PermissionChangeType.NONE ? 1 : 0;
|
|
181
|
+
let escalatedPermissionType = permissionChangeType;
|
|
182
|
+
// Recurse into nested stacks
|
|
183
|
+
for (const [logicalId, nestedStack] of Object.entries(nestedStacks ?? {})) {
|
|
184
|
+
const nestedResult = this.formatSecurityDiffHelper({
|
|
185
|
+
oldTemplate: nestedStack.deployedTemplate,
|
|
186
|
+
newTemplate: nestedStack.generatedTemplate,
|
|
187
|
+
stackName: nestedStack.physicalName ?? logicalId,
|
|
188
|
+
nestedStacks: nestedStack.nestedStackTemplates,
|
|
189
|
+
changeSet: nestedStack.changeSet,
|
|
190
|
+
}, options);
|
|
191
|
+
formattedDiff += nestedResult.formattedDiff ? '\n' + nestedResult.formattedDiff : '';
|
|
192
|
+
numStacksWithChanges += nestedResult.numStacksWithChanges;
|
|
193
|
+
// Escalate: if any nested stack broadens permissions, the whole thing broadens
|
|
194
|
+
if (nestedResult.permissionChangeType === payloads_1.PermissionChangeType.BROADENING) {
|
|
195
|
+
escalatedPermissionType = payloads_1.PermissionChangeType.BROADENING;
|
|
196
|
+
}
|
|
197
|
+
else if (nestedResult.permissionChangeType === payloads_1.PermissionChangeType.NON_BROADENING
|
|
198
|
+
&& escalatedPermissionType === payloads_1.PermissionChangeType.NONE) {
|
|
199
|
+
escalatedPermissionType = payloads_1.PermissionChangeType.NON_BROADENING;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return { formattedDiff, permissionChangeType: escalatedPermissionType, numStacksWithChanges };
|
|
183
203
|
}
|
|
184
204
|
}
|
|
185
205
|
exports.DiffFormatter = DiffFormatter;
|
|
206
|
+
function permissionTypeFromDiff(diff) {
|
|
207
|
+
if (diff.permissionsBroadened) {
|
|
208
|
+
return payloads_1.PermissionChangeType.BROADENING;
|
|
209
|
+
}
|
|
210
|
+
else if (diff.permissionsAnyChanges) {
|
|
211
|
+
return payloads_1.PermissionChangeType.NON_BROADENING;
|
|
212
|
+
}
|
|
213
|
+
return payloads_1.PermissionChangeType.NONE;
|
|
214
|
+
}
|
|
186
215
|
function buildLogicalToPathMap(stack) {
|
|
187
216
|
const map = {};
|
|
188
217
|
for (const md of stack.findMetadataByType(cxschema.ArtifactMetadataEntryType.LOGICAL_ID)) {
|
|
@@ -192,7 +221,7 @@ function buildLogicalToPathMap(stack) {
|
|
|
192
221
|
}
|
|
193
222
|
function logicalIdMapFromTemplate(template) {
|
|
194
223
|
const ret = {};
|
|
195
|
-
for (const [logicalId, resource] of Object.entries(template.Resources ?? {})) {
|
|
224
|
+
for (const [logicalId, resource] of Object.entries((template.Resources ?? {}))) {
|
|
196
225
|
const path = resource?.Metadata?.['aws:cdk:path'];
|
|
197
226
|
if (path) {
|
|
198
227
|
ret[logicalId] = path;
|
|
@@ -237,4 +266,4 @@ function obscureDiff(diff) {
|
|
|
237
266
|
});
|
|
238
267
|
}
|
|
239
268
|
}
|
|
240
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUM7QUFFbkMsMkRBQTJEO0FBQzNELHNFQU9zQztBQUN0QywrQkFBK0I7QUFDL0IsNkNBQXNEO0FBRXRELHdDQUErQztBQXlIL0M7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxXQUFXLENBQU07SUFDakIsV0FBVyxDQUFvQztJQUMvQyxTQUFTLENBQVM7SUFDbEIsU0FBUyxDQUFPO0lBQ2hCLFlBQVksQ0FBdUU7SUFDbkYsUUFBUSxDQUFVO0lBQ2xCLFFBQVEsQ0FBeUI7SUFFbEQ7OztPQUdHO0lBQ0ssTUFBTSxHQUFxQyxFQUFFLENBQUM7SUFFdEQsWUFBWSxLQUF5QjtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFB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aWwnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0ICogYXMgY3hzY2hlbWEgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7XG4gIGZvcm1hdERpZmZlcmVuY2VzLFxuICBmb3JtYXRTZWN1cml0eUNoYW5nZXMsXG4gIGZ1bGxEaWZmLFxuICBtYW5nbGVMaWtlQ2xvdWRGb3JtYXRpb24sXG4gIHR5cGUgUmVzb3VyY2VEaWZmZXJlbmNlLFxuICB0eXBlIFRlbXBsYXRlRGlmZixcbn0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2hhbmdlVHlwZSB9IGZyb20gJy4uLy4uL3BheWxvYWRzJztcbmltcG9ydCB0eXBlIHsgTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBTdHJpbmdXcml0ZVN0cmVhbSB9IGZyb20gJy4uL3N0cmVhbXMnO1xuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTZWN1cml0eURpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgc2VjdXJpdHkgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwZXJtaXNzaW9uIGNoYW5nZXMgaW4gdGhlIHNlY3VyaXR5IGRpZmYuXG4gICAqIFRoZSBJb0hvc3Qgd2lsbCB1c2UgdGhpcyB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gcHJpbnQuXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uQ2hhbmdlVHlwZTogUGVybWlzc2lvbkNoYW5nZVR5cGU7XG59XG5cbi8qKlxuICogT3V0cHV0IG9mIGZvcm1hdFN0YWNrRGlmZlxuICovXG5pbnRlcmZhY2UgRm9ybWF0U3RhY2tEaWZmT3V0cHV0IHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiBzdGFja3Mgd2l0aCBkaWZmIGNoYW5nZXNcbiAgICovXG4gIHJlYWRvbmx5IG51bVN0YWNrc1dpdGhDaGFuZ2VzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGZvcm1hdHRlZCBkaWZmXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZWREaWZmOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBEaWZmIEZvcm1hdHRlclxuICovXG5pbnRlcmZhY2UgRGlmZkZvcm1hdHRlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBmb3IgdGhlIFRlbXBsYXRlIHRoYXQgaXMgYmVpbmcgZGlmZmVkLlxuICAgKiBJbmNsdWRlcyB0aGUgb2xkL2N1cnJlbnQgc3RhdGUgb2YgdGhlIHN0YWNrIGFzIHdlbGwgYXMgdGhlIG5ldyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBsYXRlSW5mbzogVGVtcGxhdGVJbmZvO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgc3BlY2lmaWMgdG8gZm9ybWF0dGluZyB0aGUgc3RhY2sgZGlmZlxuICovXG5pbnRlcmZhY2UgRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBkbyBub3QgZmlsdGVyIG91dCBBV1M6OkNESzo6TWV0YWRhdGEgb3IgUnVsZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0cmljdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGxpbmVzIG9mIGNvbnRleHQgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmZcbiAgICpcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dExpbmVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBzaWxlbmNlcyBcXCdUaGVyZSB3ZXJlIG5vIGRpZmZlcmVuY2VzXFwnIG1lc3NhZ2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSZXVzYWJsZVN0YWNrRGlmZk9wdGlvbnMgZXh0ZW5kcyBGb3JtYXRTdGFja0RpZmZPcHRpb25zIHtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiBhIHRlbXBsYXRlJ3Mgb2xkL25ldyBzdGF0ZVxuICogdGhhdCBpcyB1c2VkIGZvciBkaWZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgb2xkL2V4aXN0aW5nIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvbGRUZW1wbGF0ZTogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBuZXdUZW1wbGF0ZTogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBBIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCB0byBoZWxwIHRoZSBkaWZmIG9wZXJhdGlvbi5cbiAgICogUHJvYmFibHkgY3JlYXRlZCB2aWEgYGNyZWF0ZURpZmZDaGFuZ2VTZXRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldD86IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlcmUgYXJlIGFueSBpbXBvcnRlZCByZXNvdXJjZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzSW1wb3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW55IG5lc3RlZCBzdGFja3MgaW5jbHVkZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAqXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICByZWFkb25seSBuZXN0ZWRTdGFja3M/OiB7XG4gICAgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcztcbiAgfTtcblxuICAvKipcbiAgICogTWFwcGluZ3Mgb2Ygb2xkIGxvY2F0aW9ucyB0byBuZXcgbG9jYXRpb25zLiBJZiB0aGVzZSBhcmUgcHJvdmlkZWQsXG4gICAqIGZvciBhbGwgcmVzb3VyY2VzIHRoYXQgd2VyZSBtb3ZlZCwgdGhlaXIgY29ycmVzcG9uZGluZyBhZGRpdGlvblxuICAgKiBhbmQgcmVtb3ZhbCBsaW5lcyB3aWxsIGJlIGF1Z21lbnRlZCB3aXRoIHRoZSBsb2NhdGlvbiB0aGV5IHdlcmVcbiAgICogbW92ZWQgZm9tIGFuZCB0bywgcmVzcGVjdGl2ZWx5LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFwcGluZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENsYXNzIGZvciBmb3JtYXR0aW5nIHRoZSBkaWZmIG91dHB1dFxuICovXG5leHBvcnQgY2xhc3MgRGlmZkZvcm1hdHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkVGVtcGxhdGU6IGFueTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdUZW1wbGF0ZTogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZVNldD86IGFueTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXN0ZWRTdGFja3M6IHsgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcyB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSW1wb3J0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgdGhlIFRlbXBsYXRlRGlmZnMgdGhhdCBnZXQgY2FsY3VsYXRlZCBpbiB0aGlzIERpZmZGb3JtYXR0ZXIsXG4gICAqIGluZGV4ZWQgYnkgdGhlIHN0YWNrIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIF9kaWZmczogeyBbbmFtZTogc3RyaW5nXTogVGVtcGxhdGVEaWZmIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRGlmZkZvcm1hdHRlclByb3BzKSB7XG4gICAgdGhpcy5vbGRUZW1wbGF0ZSA9IHByb3BzLnRlbXBsYXRlSW5mby5vbGRUZW1wbGF0ZTtcbiAgICB0aGlzLm5ld1RlbXBsYXRlID0gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLmRpc3BsYXlOYW1lID8/IHByb3BzLnRlbXBsYXRlSW5mby5uZXdUZW1wbGF0ZS5zdGFja05hbWU7XG4gICAgdGhpcy5jaGFuZ2VTZXQgPSBwcm9wcy50ZW1wbGF0ZUluZm8uY2hhbmdlU2V0O1xuICAgIHRoaXMubmVzdGVkU3RhY2tzID0gcHJvcHMudGVtcGxhdGVJbmZvLm5lc3RlZFN0YWNrcztcbiAgICB0aGlzLmlzSW1wb3J0ID0gcHJvcHMudGVtcGxhdGVJbmZvLmlzSW1wb3J0ID8/IGZhbHNlO1xuICAgIHRoaXMubWFwcGluZ3MgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubWFwcGluZ3MgPz8ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZzKCkge1xuICAgIHJldHVybiB0aGlzLl9kaWZmcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY3JlYXRlcyB0aGUgZGlmZiBvZiBhIHN0YWNrLlxuICAgKiBJZiBpdCBjcmVhdGVzIHRoZSBkaWZmLCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBhIG1hcCBmb3JcbiAgICogZWFzaWVyIHJldHJpZXZhbCBsYXRlci5cbiAgICovXG4gIHByaXZhdGUgZGlmZihzdGFja05hbWU/OiBzdHJpbmcsIG9sZFRlbXBsYXRlPzogYW55LCBtYXBwaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSB7XG4gICAgY29uc3QgcmVhbFN0YWNrTmFtZSA9IHN0YWNrTmFtZSA/PyB0aGlzLnN0YWNrTmFtZTtcblxuICAgIGlmICghdGhpcy5fZGlmZnNbcmVhbFN0YWNrTmFtZV0pIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlRGlmZiA9IGZ1bGxEaWZmKFxuICAgICAgICBvbGRUZW1wbGF0ZSA/PyB0aGlzLm9sZFRlbXBsYXRlLFxuICAgICAgICB0aGlzLm5ld1RlbXBsYXRlLnRlbXBsYXRlLFxuICAgICAgICB0aGlzLmNoYW5nZVNldCxcbiAgICAgICAgdGhpcy5pc0ltcG9ydCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNldE1vdmUgPSAoY2hhbmdlOiBSZXNvdXJjZURpZmZlcmVuY2UsIGRpcmVjdGlvbjogJ2Zyb20nIHwgJ3RvJywgbG9jYXRpb24/OiBzdHJpbmcpPT4ge1xuICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IFtzb3VyY2VTdGFja05hbWUsIHNvdXJjZUxvZ2ljYWxJZF0gPSBsb2NhdGlvbi5zcGxpdCgnLicpO1xuICAgICAgICAgIGNoYW5nZS5tb3ZlID0ge1xuICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiBzb3VyY2VTdGFja05hbWUsXG4gICAgICAgICAgICByZXNvdXJjZUxvZ2ljYWxJZDogc291cmNlTG9naWNhbElkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGlkLCBjaGFuZ2UpID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtyZWFsU3RhY2tOYW1lfS4ke2lkfWA7XG4gICAgICAgIGlmIChjaGFuZ2UuaXNBZGRpdGlvbiAmJiBPYmplY3QudmFsdWVzKG1hcHBpbmdzKS5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgICBzZXRNb3ZlKGNoYW5nZSwgJ2Zyb20nLCBPYmplY3Qua2V5cyhtYXBwaW5ncykuZmluZChrID0+IG1hcHBpbmdzW2tdID09PSBsb2NhdGlvbikpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS5pc1JlbW92YWwgJiYgT2JqZWN0LmtleXMobWFwcGluZ3MpLmluY2x1ZGVzKGxvY2F0aW9uKSkge1xuICAgICAgICAgIHNldE1vdmUoY2hhbmdlLCAndG8nLCBtYXBwaW5nc1tsb2NhdGlvbl0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZGlmZnNbcmVhbFN0YWNrTmFtZV0gPSB0ZW1wbGF0ZURpZmY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaWZmc1tyZWFsU3RhY2tOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZGlmZiBoYXMgc2VjdXJpdHktaW1wYWN0aW5nIGNoYW5nZXMgdGhhdCBuZWVkIGNvbmZpcm1hdGlvbi5cbiAgICpcbiAgICogSWYgbm8gc3RhY2tOYW1lIGlzIGdpdmVuLCB0aGVuIHRoZSByb290IHN0YWNrIG5hbWUgaXMgdXNlZC5cbiAgICovXG4gIHByaXZhdGUgcGVybWlzc2lvblR5cGUoKTogUGVybWlzc2lvbkNoYW5nZVR5cGUge1xuICAgIGNvbnN0IGRpZmYgPSB0aGlzLmRpZmYoKTtcblxuICAgIGlmIChkaWZmLnBlcm1pc3Npb25zQnJvYWRlbmVkKSB7XG4gICAgICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORztcbiAgICB9IGVsc2UgaWYgKGRpZmYucGVybWlzc2lvbnNBbnlDaGFuZ2VzKSB7XG4gICAgICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9OX0JST0FERU5JTkc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIHN0YWNrIGRpZmZcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRTdGFja0RpZmYob3B0aW9uczogRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyA9IHt9KTogRm9ybWF0U3RhY2tEaWZmT3V0cHV0IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRTdGFja0RpZmZIZWxwZXIoXG4gICAgICB0aGlzLm9sZFRlbXBsYXRlLFxuICAgICAgdGhpcy5zdGFja05hbWUsXG4gICAgICB0aGlzLm5lc3RlZFN0YWNrcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICB0aGlzLm1hcHBpbmdzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFN0YWNrRGlmZkhlbHBlcihcbiAgICBvbGRUZW1wbGF0ZTogYW55LFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIG5lc3RlZFN0YWNrVGVtcGxhdGVzOiB7IFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBSZXVzYWJsZVN0YWNrRGlmZk9wdGlvbnMsXG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgKSB7XG4gICAgbGV0IGRpZmYgPSB0aGlzLmRpZmYoc3RhY2tOYW1lLCBvbGRUZW1wbGF0ZSwgbWFwcGluZ3MpO1xuXG4gICAgLy8gVGhlIHN0YWNrIGRpZmYgaXMgZm9ybWF0dGVkIHZpYSBgRm9ybWF0dGVyYCwgd2hpY2ggdGFrZXMgaW4gYSBzdHJlYW1cbiAgICAvLyBhbmQgc2VuZHMgaXRzIG91dHB1dCBkaXJlY3RseSB0byB0aGF0IHN0cmVhbS4gVG8gZmFjaWxpdGF0ZSB1c2Ugb2YgdGhlXG4gICAgLy8gZ2xvYmFsIENsaUlvSG9zdCwgd2UgY3JlYXRlIG91ciBvd24gc3RyZWFtIHRvIGNhcHR1cmUgdGhlIG91dHB1dCBvZlxuICAgIC8vIGBGb3JtYXR0ZXJgIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmluZyBmb3IgdGhlIGNvbnN1bWVyIG9mXG4gICAgLy8gYGZvcm1hdFN0YWNrRGlmZmAgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBpdC5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nV3JpdGVTdHJlYW0oKTtcblxuICAgIGxldCBudW1TdGFja3NXaXRoQ2hhbmdlcyA9IDA7XG4gICAgbGV0IGZvcm1hdHRlZERpZmYgPSAnJztcbiAgICBsZXQgZmlsdGVyZWRDaGFuZ2VzQ291bnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICAvLyBtdXN0IG91dHB1dCB0aGUgc3RhY2sgbmFtZSBpZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgcXVpZXRcbiAgICAgIGlmIChzdGFja05hbWUgJiYgKCFvcHRpb25zLnF1aWV0IHx8ICFkaWZmLmlzRW1wdHkpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShmb3JtYXQoYFN0YWNrICR7Y2hhbGsuYm9sZChzdGFja05hbWUpfVxcbmApKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnF1aWV0ICYmIHRoaXMuaXNJbXBvcnQpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKCdQYXJhbWV0ZXJzIGFuZCBydWxlcyBjcmVhdGVkIGR1cmluZyBtaWdyYXRpb24gZG8gbm90IGFmZmVjdCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxcbicpO1xuICAgICAgfVxuXG4gICAgICAvLyBkZXRlY3QgYW5kIGZpbHRlciBvdXQgbWFuZ2xlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGRpZmZcbiAgICAgIGlmIChkaWZmLmRpZmZlcmVuY2VDb3VudCAmJiAhb3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgICAgY29uc3QgbWFuZ2xlZE5ld1RlbXBsYXRlID0gSlNPTi5wYXJzZShtYW5nbGVMaWtlQ2xvdWRGb3JtYXRpb24oSlNPTi5zdHJpbmdpZnkodGhpcy5uZXdUZW1wbGF0ZS50ZW1wbGF0ZSkpKTtcbiAgICAgICAgY29uc3QgbWFuZ2xlZERpZmYgPSBmdWxsRGlmZihvbGRUZW1wbGF0ZSwgbWFuZ2xlZE5ld1RlbXBsYXRlLCB0aGlzLmNoYW5nZVNldCk7XG4gICAgICAgIGZpbHRlcmVkQ2hhbmdlc0NvdW50ID0gTWF0aC5tYXgoMCwgZGlmZi5kaWZmZXJlbmNlQ291bnQgLSBtYW5nbGVkRGlmZi5kaWZmZXJlbmNlQ291bnQpO1xuICAgICAgICBpZiAoZmlsdGVyZWRDaGFuZ2VzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZGlmZiA9IG1hbmdsZWREaWZmO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbHRlciBvdXQgJ0FXUzo6Q0RLOjpNZXRhZGF0YScgcmVzb3VyY2VzIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgICAvLyBmaWx0ZXIgb3V0ICdDaGVja0Jvb3RzdHJhcFZlcnNpb24nIHJ1bGVzIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgICBpZiAoIW9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgIG9ic2N1cmVEaWZmKGRpZmYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZmYuaXNFbXB0eSkge1xuICAgICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcysrO1xuXG4gICAgICAgIC8vIGZvcm1hdERpZmZlcmVuY2VzIHVwZGF0ZXMgdGhlIHN0cmVhbSB3aXRoIHRoZSBmb3JtYXR0ZWQgc3RhY2sgZGlmZlxuICAgICAgICBmb3JtYXREaWZmZXJlbmNlcyhzdHJlYW0sIGRpZmYsIHtcbiAgICAgICAgICAuLi5sb2dpY2FsSWRNYXBGcm9tVGVtcGxhdGUodGhpcy5vbGRUZW1wbGF0ZSksXG4gICAgICAgICAgLi4uYnVpbGRMb2dpY2FsVG9QYXRoTWFwKHRoaXMubmV3VGVtcGxhdGUpLFxuICAgICAgICB9LCBvcHRpb25zLmNvbnRleHRMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShjaGFsay5ncmVlbignVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlc1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbHRlcmVkQ2hhbmdlc0NvdW50ID4gMCkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGBPbWl0dGVkICR7ZmlsdGVyZWRDaGFuZ2VzQ291bnR9IGNoYW5nZXMgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgbWFuZ2xlZCBub24tQVNDSUkgY2hhcmFjdGVycy4gVXNlIC0tc3RyaWN0IHRvIHByaW50IHRoZW0uXFxuYCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBzdG9yZSB0aGUgc3RyZWFtIGNvbnRhaW5pbmcgYSBmb3JtYXR0ZWQgc3RhY2sgZGlmZlxuICAgICAgZm9ybWF0dGVkRGlmZiA9IHN0cmVhbS50b1N0cmluZygpO1xuICAgICAgc3RyZWFtLmVuZCgpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmVzdGVkU3RhY2tMb2dpY2FsSWQgb2YgT2JqZWN0LmtleXMobmVzdGVkU3RhY2tUZW1wbGF0ZXMgPz8ge30pKSB7XG4gICAgICBpZiAoIW5lc3RlZFN0YWNrVGVtcGxhdGVzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkU3RhY2sgPSBuZXN0ZWRTdGFja1RlbXBsYXRlc1tuZXN0ZWRTdGFja0xvZ2ljYWxJZF07XG5cbiAgICAgICh0aGlzLm5ld1RlbXBsYXRlIGFzIGFueSkuX3RlbXBsYXRlID0gbmVzdGVkU3RhY2suZ2VuZXJhdGVkVGVtcGxhdGU7XG4gICAgICBjb25zdCBuZXh0RGlmZiA9IHRoaXMuZm9ybWF0U3RhY2tEaWZmSGVscGVyKFxuICAgICAgICBuZXN0ZWRTdGFjay5kZXBsb3llZFRlbXBsYXRlLFxuICAgICAgICBuZXN0ZWRTdGFjay5waHlzaWNhbE5hbWUgPz8gbmVzdGVkU3RhY2tMb2dpY2FsSWQsXG4gICAgICAgIG5lc3RlZFN0YWNrLm5lc3RlZFN0YWNrVGVtcGxhdGVzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICB0aGlzLm1hcHBpbmdzLFxuICAgICAgKTtcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzICs9IG5leHREaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgZm9ybWF0dGVkRGlmZiArPSBuZXh0RGlmZi5mb3JtYXR0ZWREaWZmO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcyxcbiAgICAgIGZvcm1hdHRlZERpZmYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIHNlY3VyaXR5IGRpZmZcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRTZWN1cml0eURpZmYoKTogRm9ybWF0U2VjdXJpdHlEaWZmT3V0cHV0IHtcbiAgICBjb25zdCBkaWZmID0gdGhpcy5kaWZmKCk7XG5cbiAgICAvLyBUaGUgc2VjdXJpdHkgZGlmZiBpcyBmb3JtYXR0ZWQgdmlhIGBGb3JtYXR0ZXJgLCB3aGljaCB0YWtlcyBpbiBhIHN0cmVhbVxuICAgIC8vIGFuZCBzZW5kcyBpdHMgb3V0cHV0IGRpcmVjdGx5IHRvIHRoYXQgc3RyZWFtLiBUbyBmYWNpbGlhdGUgdXNlIG9mIHRoZVxuICAgIC8vIGdsb2JhbCBDbGlJb0hvc3QsIHdlIGNyZWF0ZSBvdXIgb3duIHN0cmVhbSB0byBjYXB0dXJlIHRoZSBvdXRwdXQgb2ZcbiAgICAvLyBgRm9ybWF0dGVyYCBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgYXMgYSBzdHJpbmcgZm9yIHRoZSBjb25zdW1lciBvZlxuICAgIC8vIGBmb3JtYXRTZWN1cml0eURpZmZgIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmluZ1dyaXRlU3RyZWFtKCk7XG5cbiAgICBzdHJlYW0ud3JpdGUoZm9ybWF0KGBTdGFjayAke2NoYWxrLmJvbGQodGhpcy5zdGFja05hbWUpfVxcbmApKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBmb3JtYXRTZWN1cml0eUNoYW5nZXMgdXBkYXRlcyB0aGUgc3RyZWFtIHdpdGggdGhlIGZvcm1hdHRlZCBzZWN1cml0eSBkaWZmXG4gICAgICBmb3JtYXRTZWN1cml0eUNoYW5nZXMoc3RyZWFtLCBkaWZmLCBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy5uZXdUZW1wbGF0ZSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzdHJlYW0uZW5kKCk7XG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBzdHJlYW0gY29udGFpbmluZyBhIGZvcm1hdHRlZCBzdGFjayBkaWZmXG4gICAgY29uc3QgZm9ybWF0dGVkRGlmZiA9IHN0cmVhbS50b1N0cmluZygpO1xuICAgIHJldHVybiB7IGZvcm1hdHRlZERpZmYsIHBlcm1pc3Npb25DaGFuZ2VUeXBlOiB0aGlzLnBlcm1pc3Npb25UeXBlKCkgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZExvZ2ljYWxUb1BhdGhNYXAoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkge1xuICBjb25zdCBtYXA6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBmb3IgKGNvbnN0IG1kIG9mIHN0YWNrLmZpbmRNZXRhZGF0YUJ5VHlwZShjeHNjaGVtYS5BcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlLkxPR0lDQUxfSUQpKSB7XG4gICAgbWFwW21kLmRhdGEgYXMgc3RyaW5nXSA9IG1kLnBhdGg7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gbG9naWNhbElkTWFwRnJvbVRlbXBsYXRlKHRlbXBsYXRlOiBhbnkpIHtcbiAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBbbG9naWNhbElkLCByZXNvdXJjZV0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KSkge1xuICAgIGNvbnN0IHBhdGggPSAocmVzb3VyY2UgYXMgYW55KT8uTWV0YWRhdGE/LlsnYXdzOmNkazpwYXRoJ107XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHJldFtsb2dpY2FsSWRdID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYW55IHRlbXBsYXRlIGVsZW1lbnRzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBzaG93IHVzZXJzLlxuICogVGhpcyBpcyBjdXJyZW50bHk6XG4gKiAtIEFXUzo6Q0RLOjpNZXRhZGF0YSByZXNvdXJjZVxuICogLSBDaGVja0Jvb3RzdHJhcFZlcnNpb24gUnVsZVxuICovXG5mdW5jdGlvbiBvYnNjdXJlRGlmZihkaWZmOiBUZW1wbGF0ZURpZmYpIHtcbiAgaWYgKGRpZmYudW5rbm93bikge1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE3OTQyXG4gICAgZGlmZi51bmtub3duID0gZGlmZi51bmtub3duLmZpbHRlcihjaGFuZ2UgPT4ge1xuICAgICAgaWYgKCFjaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlLm5ld1ZhbHVlPy5DaGVja0Jvb3RzdHJhcFZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5vbGRWYWx1ZT8uQ2hlY2tCb290c3RyYXBWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRpZmYucmVzb3VyY2VzKSB7XG4gICAgZGlmZi5yZXNvdXJjZXMgPSBkaWZmLnJlc291cmNlcy5maWx0ZXIoY2hhbmdlID0+IHtcbiAgICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5uZXdSZXNvdXJjZVR5cGUgPT09ICdBV1M6OkNESzo6TWV0YWRhdGEnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2Uub2xkUmVzb3VyY2VUeXBlID09PSAnQVdTOjpDREs6Ok1ldGFkYXRhJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUM7QUFFbkMsMkRBQTJEO0FBQzNELHNFQVFzQztBQUN0QywrQkFBK0I7QUFDL0IsNkNBQXNEO0FBRXRELHdDQUErQztBQTBJL0M7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxZQUFZLENBQWU7SUFDM0IsU0FBUyxDQUFTO0lBQ2xCLFFBQVEsQ0FBVTtJQUNsQixRQUFRLENBQXlCO0lBRWxEOztPQUVHO0lBQ2MsS0FBSyxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBRXpELFlBQVksS0FBeUI7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN4RyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxXQUFXLENBQ2pCLFNBQWlCLEVBQ2pCLFdBQXFCLEVBQ3JCLFdBQXFCLEVBQ3JCLFNBQThDLEVBQzlDLFFBQWdDO1FBRWhDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sWUFBWSxHQUFHLElB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QU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztnQkFDM0MsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztnQkFDcEQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsZUFBZSxLQUFLLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3BELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgdHlwZSAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgKiBhcyBjeHNjaGVtYSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHtcbiAgZm9ybWF0RGlmZmVyZW5jZXMsXG4gIGZvcm1hdFNlY3VyaXR5Q2hhbmdlcyxcbiAgZnVsbERpZmYsXG4gIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbixcbiAgdHlwZSBEZXNjcmliZUNoYW5nZVNldE91dHB1dCxcbiAgdHlwZSBSZXNvdXJjZURpZmZlcmVuY2UsXG4gIHR5cGUgVGVtcGxhdGVEaWZmLFxufSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IFBlcm1pc3Npb25DaGFuZ2VUeXBlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRTdGFja1RlbXBsYXRlcywgVGVtcGxhdGUgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBTdHJpbmdXcml0ZVN0cmVhbSB9IGZyb20gJy4uL3N0cmVhbXMnO1xuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTZWN1cml0eURpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgc2VjdXJpdHkgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwZXJtaXNzaW9uIGNoYW5nZXMgaW4gdGhlIHNlY3VyaXR5IGRpZmYuXG4gICAqIFRoZSBJb0hvc3Qgd2lsbCB1c2UgdGhpcyB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gcHJpbnQuXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uQ2hhbmdlVHlwZTogUGVybWlzc2lvbkNoYW5nZVR5cGU7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBzdGFja3Mgd2l0aCBzZWN1cml0eSBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBudW1TdGFja3NXaXRoQ2hhbmdlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTdGFja0RpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFN0YWNrRGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2Ygc3RhY2tzIHdpdGggZGlmZiBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBudW1TdGFja3NXaXRoQ2hhbmdlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRGlmZiBGb3JtYXR0ZXJcbiAqL1xuaW50ZXJmYWNlIERpZmZGb3JtYXR0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBUZW1wbGF0ZSB0aGF0IGlzIGJlaW5nIGRpZmZlZC5cbiAgICogSW5jbHVkZXMgdGhlIG9sZC9jdXJyZW50IHN0YXRlIG9mIHRoZSBzdGFjayBhcyB3ZWxsIGFzIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZUluZm86IFRlbXBsYXRlSW5mbztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHNwZWNpZmljIHRvIGZvcm1hdHRpbmcgdGhlIHN0YWNrIGRpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFN0YWNrRGlmZk9wdGlvbnMge1xuICAvKipcbiAgICogZG8gbm90IGZpbHRlciBvdXQgQVdTOjpDREs6Ok1ldGFkYXRhIG9yIFJ1bGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdHJpY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBsaW5lcyBvZiBjb250ZXh0IHRvIHVzZSBpbiBhcmJpdHJhcnkgSlNPTiBkaWZmXG4gICAqXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRMaW5lcz86IG51bWJlcjtcblxuICAvKipcbiAgICogc2lsZW5jZXMgXFwnVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlc1xcJyBtZXNzYWdlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmV1c2FibGVTdGFja0RpZmZPcHRpb25zIGV4dGVuZHMgRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyB7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBzcGVjaWZpYyB0byBmb3JtYXR0aW5nIHRoZSBzZWN1cml0eSBkaWZmXG4gKi9cbmludGVyZmFjZSBGb3JtYXRTZWN1cml0eURpZmZPcHRpb25zIHtcbiAgLyoqXG4gICAqIHNpbGVuY2VzIHN0YWNrIG5hbWVzIGFuZCAnbm8gY2hhbmdlcycgbWVzc2FnZXMgZm9yIHN0YWNrcyB3aXRob3V0IHNlY3VyaXR5IGNoYW5nZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiBhIHRlbXBsYXRlJ3Mgb2xkL25ldyBzdGF0ZVxuICogdGhhdCBpcyB1c2VkIGZvciBkaWZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgb2xkL2V4aXN0aW5nIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvbGRUZW1wbGF0ZTogVGVtcGxhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IG5ld1RlbXBsYXRlOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEEgQ2xvdWRGb3JtYXRpb24gQ2hhbmdlU2V0IHRvIGhlbHAgdGhlIGRpZmYgb3BlcmF0aW9uLlxuICAgKiBQcm9iYWJseSBjcmVhdGVkIHZpYSBgY3JlYXRlRGlmZkNoYW5nZVNldGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlU2V0PzogRGVzY3JpYmVDaGFuZ2VTZXRPdXRwdXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBhbnkgaW1wb3J0ZWQgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc0ltcG9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFueSBuZXN0ZWQgc3RhY2tzIGluY2x1ZGVkIGluIHRoZSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAZGVmYXVsdCB7fVxuICAgKi9cbiAgcmVhZG9ubHkgbmVzdGVkU3RhY2tzPzoge1xuICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcHBpbmdzIG9mIG9sZCBsb2NhdGlvbnMgdG8gbmV3IGxvY2F0aW9ucy4gSWYgdGhlc2UgYXJlIHByb3ZpZGVkLFxuICAgKiBmb3IgYWxsIHJlc291cmNlcyB0aGF0IHdlcmUgbW92ZWQsIHRoZWlyIGNvcnJlc3BvbmRpbmcgYWRkaXRpb25cbiAgICogYW5kIHJlbW92YWwgbGluZXMgd2lsbCBiZSBhdWdtZW50ZWQgd2l0aCB0aGUgbG9jYXRpb24gdGhleSB3ZXJlXG4gICAqIG1vdmVkIGZvbSBhbmQgdG8sIHJlc3BlY3RpdmVseS5cbiAgICovXG4gIHJlYWRvbmx5IG1hcHBpbmdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgZm9ybWF0dGluZyB0aGUgZGlmZiBvdXRwdXRcbiAqL1xuZXhwb3J0IGNsYXNzIERpZmZGb3JtYXR0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlSW5mbzogVGVtcGxhdGVJbmZvO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSW1wb3J0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDYWNoZSBvZiBjb21wdXRlZCBUZW1wbGF0ZURpZmZzLCBpbmRleGVkIGJ5IHN0YWNrIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlRGlmZj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRGlmZkZvcm1hdHRlclByb3BzKSB7XG4gICAgdGhpcy50ZW1wbGF0ZUluZm8gPSBwcm9wcy50ZW1wbGF0ZUluZm87XG4gICAgdGhpcy5zdGFja05hbWUgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUuZGlzcGxheU5hbWUgPz8gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLnN0YWNrTmFtZTtcbiAgICB0aGlzLmlzSW1wb3J0ID0gcHJvcHMudGVtcGxhdGVJbmZvLmlzSW1wb3J0ID8/IGZhbHNlO1xuICAgIHRoaXMubWFwcGluZ3MgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubWFwcGluZ3MgPz8ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZzKCkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5jYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgZGlmZiBmb3IgYSBzaW5nbGUgc3RhY2suIFJlc3VsdHMgYXJlIGNhY2hlZCBieSBzdGFjayBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIC0gVGhlIG5hbWUgdG8gY2FjaGUgdGhlIGRpZmYgdW5kZXJcbiAgICogQHBhcmFtIG9sZFRlbXBsYXRlIC0gVGhlIGRlcGxveWVkIHRlbXBsYXRlXG4gICAqIEBwYXJhbSBuZXdUZW1wbGF0ZSAtIFRoZSBuZXcvZ2VuZXJhdGVkIHRlbXBsYXRlIChyZWFkIGZyb20gdGhlIGFydGlmYWN0KVxuICAgKiBAcGFyYW0gY2hhbmdlU2V0IC0gVGhlIENsb3VkRm9ybWF0aW9uIGNoYW5nZXNldCBmb3IgdGhpcyBzcGVjaWZpYyBzdGFjaywgaWYgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSBtYXBwaW5ncyAtIFJlc291cmNlIG1vdmUgbWFwcGluZ3NcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZURpZmYoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgb2xkVGVtcGxhdGU6IFRlbXBsYXRlLFxuICAgIG5ld1RlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICBjaGFuZ2VTZXQ6IERlc2NyaWJlQ2hhbmdlU2V0T3V0cHV0IHwgdW5kZWZpbmVkLFxuICAgIG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICApOiBUZW1wbGF0ZURpZmYge1xuICAgIGlmICghdGhpcy5jYWNoZS5oYXMoc3RhY2tOYW1lKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVEaWZmID0gZnVsbERpZmYob2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQsIHRoaXMuaXNJbXBvcnQpO1xuXG4gICAgICBjb25zdCBzZXRNb3ZlID0gKGNoYW5nZTogUmVzb3VyY2VEaWZmZXJlbmNlLCBkaXJlY3Rpb246ICdmcm9tJyB8ICd0bycsIGxvY2F0aW9uPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgW3NvdXJjZVN0YWNrTmFtZSwgc291cmNlTG9naWNhbElkXSA9IGxvY2F0aW9uLnNwbGl0KCcuJyk7XG4gICAgICAgICAgY2hhbmdlLm1vdmUgPSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgICBzdGFja05hbWU6IHNvdXJjZVN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlTG9naWNhbElkOiBzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGVtcGxhdGVEaWZmLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgoaWQsIGNoYW5nZSkgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAke3N0YWNrTmFtZX0uJHtpZH1gO1xuICAgICAgICBpZiAoY2hhbmdlLmlzQWRkaXRpb24gJiYgT2JqZWN0LnZhbHVlcyhtYXBwaW5ncykuaW5jbHVkZXMobG9jYXRpb24pKSB7XG4gICAgICAgICAgc2V0TW92ZShjaGFuZ2UsICdmcm9tJywgT2JqZWN0LmtleXMobWFwcGluZ3MpLmZpbmQoayA9PiBtYXBwaW5nc1trXSA9PT0gbG9jYXRpb24pKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuaXNSZW1vdmFsICYmIE9iamVjdC5rZXlzKG1hcHBpbmdzKS5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgICBzZXRNb3ZlKGNoYW5nZSwgJ3RvJywgbWFwcGluZ3NbbG9jYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2FjaGUuc2V0KHN0YWNrTmFtZSwgdGVtcGxhdGVEaWZmKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHN0YWNrTmFtZSkhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aGUgc3RhY2sgZGlmZiwgaW5jbHVkaW5nIGFsbCBuZXN0ZWQgc3RhY2tzLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFN0YWNrRGlmZihvcHRpb25zOiBGb3JtYXRTdGFja0RpZmZPcHRpb25zID0ge30pOiBGb3JtYXRTdGFja0RpZmZPdXRwdXQge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFN0YWNrRGlmZkhlbHBlcih7XG4gICAgICBvbGRUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ub2xkVGVtcGxhdGUsXG4gICAgICBuZXdUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUudGVtcGxhdGUsXG4gICAgICBzdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgbmVzdGVkU3RhY2tzOiB0aGlzLnRlbXBsYXRlSW5mby5uZXN0ZWRTdGFja3MsXG4gICAgICBjaGFuZ2VTZXQ6IHRoaXMudGVtcGxhdGVJbmZvLmNoYW5nZVNldCxcbiAgICAgIG1hcHBpbmdzOiB0aGlzLm1hcHBpbmdzLFxuICAgICAgbG9naWNhbElkTWFwOiBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUpLFxuICAgIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRTdGFja0RpZmZIZWxwZXIocGFyYW1zOiB7XG4gICAgb2xkVGVtcGxhdGU6IFRlbXBsYXRlO1xuICAgIG5ld1RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICBzdGFja05hbWU6IHN0cmluZztcbiAgICBuZXN0ZWRTdGFja3M6IHsgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcyB9IHwgdW5kZWZpbmVkO1xuICAgIGNoYW5nZVNldDogRGVzY3JpYmVDaGFuZ2VTZXRPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbG9naWNhbElkTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9LCBvcHRpb25zOiBSZXVzYWJsZVN0YWNrRGlmZk9wdGlvbnMgPSB7fSk6IEZvcm1hdFN0YWNrRGlmZk91dHB1dCB7XG4gICAgY29uc3QgeyBvbGRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUsIHN0YWNrTmFtZSwgbmVzdGVkU3RhY2tzLCBjaGFuZ2VTZXQsIG1hcHBpbmdzLCBsb2dpY2FsSWRNYXAgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGRpZmYgPSB0aGlzLmNvbXB1dGVEaWZmKHN0YWNrTmFtZSwgb2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQsIG1hcHBpbmdzKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJpbmdXcml0ZVN0cmVhbSgpO1xuICAgIGxldCBudW1TdGFja3NXaXRoQ2hhbmdlcyA9IDA7XG4gICAgbGV0IGZvcm1hdHRlZERpZmYgPSAnJztcbiAgICBsZXQgZmlsdGVyZWRDaGFuZ2VzQ291bnQgPSAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIG11c3Qgb3V0cHV0IHRoZSBzdGFjayBuYW1lIGlmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcywgZXZlbiBpZiBxdWlldFxuICAgICAgaWYgKHN0YWNrTmFtZSAmJiAoIW9wdGlvbnMucXVpZXQgfHwgIWRpZmYuaXNFbXB0eSkpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKGZvcm1hdChgU3RhY2sgJHtjaGFsay5ib2xkKHN0YWNrTmFtZSl9XFxuYCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMucXVpZXQgJiYgdGhpcy5pc0ltcG9ydCkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoJ1BhcmFtZXRlcnMgYW5kIHJ1bGVzIGNyZWF0ZWQgZHVyaW5nIG1pZ3JhdGlvbiBkbyBub3QgYWZmZWN0IHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXFxuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRldGVjdCBhbmQgZmlsdGVyIG91dCBtYW5nbGVkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZGlmZlxuICAgICAgbGV0IGFjdGl2ZURpZmYgPSBkaWZmO1xuICAgICAgaWYgKGRpZmYuZGlmZmVyZW5jZUNvdW50ICYmICFvcHRpb25zLnN0cmljdCkge1xuICAgICAgICBjb25zdCBtYW5nbGVkTmV3VGVtcGxhdGUgPSBKU09OLnBhcnNlKG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbihKU09OLnN0cmluZ2lmeShuZXdUZW1wbGF0ZSkpKTtcbiAgICAgICAgY29uc3QgbWFuZ2xlZERpZmYgPSBmdWxsRGlmZihvbGRUZW1wbGF0ZSwgbWFuZ2xlZE5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQpO1xuICAgICAgICBmaWx0ZXJlZENoYW5nZXNDb3VudCA9IE1hdGgubWF4KDAsIGRpZmYuZGlmZmVyZW5jZUNvdW50IC0gbWFuZ2xlZERpZmYuZGlmZmVyZW5jZUNvdW50KTtcbiAgICAgICAgaWYgKGZpbHRlcmVkQ2hhbmdlc0NvdW50ID4gMCkge1xuICAgICAgICAgIGFjdGl2ZURpZmYgPSBtYW5nbGVkRGlmZjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaWx0ZXIgb3V0ICdBV1M6OkNESzo6TWV0YWRhdGEnIHJlc291cmNlcyBmcm9tIHRoZSB0ZW1wbGF0ZVxuICAgICAgLy8gZmlsdGVyIG91dCAnQ2hlY2tCb290c3RyYXBWZXJzaW9uJyBydWxlcyBmcm9tIHRoZSB0ZW1wbGF0ZVxuICAgICAgaWYgKCFvcHRpb25zLnN0cmljdCkge1xuICAgICAgICBvYnNjdXJlRGlmZihhY3RpdmVEaWZmKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhY3RpdmVEaWZmLmlzRW1wdHkpIHtcbiAgICAgICAgbnVtU3RhY2tzV2l0aENoYW5nZXMrKztcblxuICAgICAgICBmb3JtYXREaWZmZXJlbmNlcyhzdHJlYW0sIGFjdGl2ZURpZmYsIHtcbiAgICAgICAgICAuLi5sb2dpY2FsSWRNYXBGcm9tVGVtcGxhdGUob2xkVGVtcGxhdGUpLFxuICAgICAgICAgIC4uLmxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZShuZXdUZW1wbGF0ZSksXG4gICAgICAgICAgLi4ubG9naWNhbElkTWFwLFxuICAgICAgICB9LCBvcHRpb25zLmNvbnRleHRMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShjaGFsay5ncmVlbignVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlc1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbHRlcmVkQ2hhbmdlc0NvdW50ID4gMCkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGBPbWl0dGVkICR7ZmlsdGVyZWRDaGFuZ2VzQ291bnR9IGNoYW5nZXMgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgbWFuZ2xlZCBub24tQVNDSUkgY2hhcmFjdGVycy4gVXNlIC0tc3RyaWN0IHRvIHByaW50IHRoZW0uXFxuYCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3JtYXR0ZWREaWZmID0gc3RyZWFtLnRvU3RyaW5nKCk7XG4gICAgICBzdHJlYW0uZW5kKCk7XG4gICAgfVxuXG4gICAgLy8gUmVjdXJzZSBpbnRvIG5lc3RlZCBzdGFja3NcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIG5lc3RlZFN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRTdGFja3MgPz8ge30pKSB7XG4gICAgICBjb25zdCBuZXh0RGlmZiA9IHRoaXMuZm9ybWF0U3RhY2tEaWZmSGVscGVyKHtcbiAgICAgICAgb2xkVGVtcGxhdGU6IG5lc3RlZFN0YWNrLmRlcGxveWVkVGVtcGxhdGUsXG4gICAgICAgIG5ld1RlbXBsYXRlOiBuZXN0ZWRTdGFjay5nZW5lcmF0ZWRUZW1wbGF0ZSxcbiAgICAgICAgc3RhY2tOYW1lOiBuZXN0ZWRTdGFjay5waHlzaWNhbE5hbWUgPz8gbG9naWNhbElkLFxuICAgICAgICBuZXN0ZWRTdGFja3M6IG5lc3RlZFN0YWNrLm5lc3RlZFN0YWNrVGVtcGxhdGVzLFxuICAgICAgICBjaGFuZ2VTZXQ6IG5lc3RlZFN0YWNrLmNoYW5nZVNldCxcbiAgICAgICAgbWFwcGluZ3MsXG4gICAgICAgIGxvZ2ljYWxJZE1hcDoge30sXG4gICAgICB9LCBvcHRpb25zKTtcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzICs9IG5leHREaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgZm9ybWF0dGVkRGlmZiArPSBuZXh0RGlmZi5mb3JtYXR0ZWREaWZmO1xuICAgIH1cblxuICAgIHJldHVybiB7IG51bVN0YWNrc1dpdGhDaGFuZ2VzLCBmb3JtYXR0ZWREaWZmIH07XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRoZSBzZWN1cml0eSBkaWZmLCBpbmNsdWRpbmcgYWxsIG5lc3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgZm9ybWF0U2VjdXJpdHlEaWZmKG9wdGlvbnM6IEZvcm1hdFNlY3VyaXR5RGlmZk9wdGlvbnMgPSB7fSk6IEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gICAgY29uc3QgeyBmb3JtYXR0ZWREaWZmLCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSwgbnVtU3RhY2tzV2l0aENoYW5nZXMgfSA9IHRoaXMuZm9ybWF0U2VjdXJpdHlEaWZmSGVscGVyKHtcbiAgICAgIG9sZFRlbXBsYXRlOiB0aGlzLnRlbXBsYXRlSW5mby5vbGRUZW1wbGF0ZSxcbiAgICAgIG5ld1RlbXBsYXRlOiB0aGlzLnRlbXBsYXRlSW5mby5uZXdUZW1wbGF0ZS50ZW1wbGF0ZSxcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICBuZXN0ZWRTdGFja3M6IHRoaXMudGVtcGxhdGVJbmZvLm5lc3RlZFN0YWNrcyxcbiAgICAgIGNoYW5nZVNldDogdGhpcy50ZW1wbGF0ZUluZm8uY2hhbmdlU2V0LFxuICAgICAgbG9naWNhbElkTWFwOiBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUpLFxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHsgZm9ybWF0dGVkRGlmZiwgcGVybWlzc2lvbkNoYW5nZVR5cGUsIG51bVN0YWNrc1dpdGhDaGFuZ2VzIH07XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFNlY3VyaXR5RGlmZkhlbHBlcihwYXJhbXM6IHtcbiAgICBvbGRUZW1wbGF0ZTogVGVtcGxhdGU7XG4gICAgbmV3VGVtcGxhdGU6IFRlbXBsYXRlO1xuICAgIHN0YWNrTmFtZTogc3RyaW5nO1xuICAgIG5lc3RlZFN0YWNrczogeyBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzIH0gfCB1bmRlZmluZWQ7XG4gICAgY2hhbmdlU2V0OiBEZXNjcmliZUNoYW5nZVNldE91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICBsb2dpY2FsSWRNYXA/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9LCBvcHRpb25zOiBGb3JtYXRTZWN1cml0eURpZmZPcHRpb25zID0ge30pOiBGb3JtYXRTZWN1cml0eURpZmZPdXRwdXQge1xuICAgIGNvbnN0IHsgb2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBzdGFja05hbWUsIG5lc3RlZFN0YWNrcywgY2hhbmdlU2V0LCBsb2dpY2FsSWRNYXAgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGRpZmYgPSB0aGlzLmNvbXB1dGVEaWZmKHN0YWNrTmFtZSwgb2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQsIHRoaXMubWFwcGluZ3MpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25DaGFuZ2VUeXBlID0gcGVybWlzc2lvblR5cGVGcm9tRGlmZihkaWZmKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJpbmdXcml0ZVN0cmVhbSgpO1xuICAgIGlmICghb3B0aW9ucy5xdWlldCB8fCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSAhPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSkge1xuICAgICAgc3RyZWFtLndyaXRlKGZvcm1hdChgU3RhY2sgJHtjaGFsay5ib2xkKHN0YWNrTmFtZSl9XFxuYCkpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBmb3JtYXRTZWN1cml0eUNoYW5nZXMoc3RyZWFtLCBkaWZmLCB7XG4gICAgICAgIC4uLmxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZShuZXdUZW1wbGF0ZSksXG4gICAgICAgIC4uLmxvZ2ljYWxJZE1hcCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzdHJlYW0uZW5kKCk7XG4gICAgfVxuXG4gICAgbGV0IGZvcm1hdHRlZERpZmYgPSBzdHJlYW0udG9TdHJpbmcoKTtcbiAgICBpZiAoIW9wdGlvbnMucXVpZXQgJiYgcGVybWlzc2lvbkNoYW5nZVR5cGUgPT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkUpIHtcbiAgICAgIGZvcm1hdHRlZERpZmYgKz0gY2hhbGsuZ3JlZW4oJ1RoZXJlIHdlcmUgbm8gc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzIChsaW1pdGF0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xMjk5KVxcbicpO1xuICAgIH1cbiAgICBsZXQgbnVtU3RhY2tzV2l0aENoYW5nZXMgPSBwZXJtaXNzaW9uQ2hhbmdlVHlwZSAhPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSA/IDEgOiAwO1xuICAgIGxldCBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSA9IHBlcm1pc3Npb25DaGFuZ2VUeXBlO1xuXG4gICAgLy8gUmVjdXJzZSBpbnRvIG5lc3RlZCBzdGFja3NcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIG5lc3RlZFN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRTdGFja3MgPz8ge30pKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSB0aGlzLmZvcm1hdFNlY3VyaXR5RGlmZkhlbHBlcih7XG4gICAgICAgIG9sZFRlbXBsYXRlOiBuZXN0ZWRTdGFjay5kZXBsb3llZFRlbXBsYXRlLFxuICAgICAgICBuZXdUZW1wbGF0ZTogbmVzdGVkU3RhY2suZ2VuZXJhdGVkVGVtcGxhdGUsXG4gICAgICAgIHN0YWNrTmFtZTogbmVzdGVkU3RhY2sucGh5c2ljYWxOYW1lID8/IGxvZ2ljYWxJZCxcbiAgICAgICAgbmVzdGVkU3RhY2tzOiBuZXN0ZWRTdGFjay5uZXN0ZWRTdGFja1RlbXBsYXRlcyxcbiAgICAgICAgY2hhbmdlU2V0OiBuZXN0ZWRTdGFjay5jaGFuZ2VTZXQsXG4gICAgICB9LCBvcHRpb25zKTtcbiAgICAgIGZvcm1hdHRlZERpZmYgKz0gbmVzdGVkUmVzdWx0LmZvcm1hdHRlZERpZmYgPyAnXFxuJyArIG5lc3RlZFJlc3VsdC5mb3JtYXR0ZWREaWZmIDogJyc7XG4gICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcyArPSBuZXN0ZWRSZXN1bHQubnVtU3RhY2tzV2l0aENoYW5nZXM7XG4gICAgICAvLyBFc2NhbGF0ZTogaWYgYW55IG5lc3RlZCBzdGFjayBicm9hZGVucyBwZXJtaXNzaW9ucywgdGhlIHdob2xlIHRoaW5nIGJyb2FkZW5zXG4gICAgICBpZiAobmVzdGVkUmVzdWx0LnBlcm1pc3Npb25DaGFuZ2VUeXBlID09PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5CUk9BREVOSU5HKSB7XG4gICAgICAgIGVzY2FsYXRlZFBlcm1pc3Npb25UeXBlID0gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORztcbiAgICAgIH0gZWxzZSBpZiAobmVzdGVkUmVzdWx0LnBlcm1pc3Npb25DaGFuZ2VUeXBlID09PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05fQlJPQURFTklOR1xuICAgICAgICAmJiBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSA9PT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSkge1xuICAgICAgICBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSA9IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTl9CUk9BREVOSU5HO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGZvcm1hdHRlZERpZmYsIHBlcm1pc3Npb25DaGFuZ2VUeXBlOiBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSwgbnVtU3RhY2tzV2l0aENoYW5nZXMgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwZXJtaXNzaW9uVHlwZUZyb21EaWZmKGRpZmY6IFRlbXBsYXRlRGlmZik6IFBlcm1pc3Npb25DaGFuZ2VUeXBlIHtcbiAgaWYgKGRpZmYucGVybWlzc2lvbnNCcm9hZGVuZWQpIHtcbiAgICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORztcbiAgfSBlbHNlIGlmIChkaWZmLnBlcm1pc3Npb25zQW55Q2hhbmdlcykge1xuICAgIHJldHVybiBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05fQlJPQURFTklORztcbiAgfVxuICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMb2dpY2FsVG9QYXRoTWFwKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpIHtcbiAgY29uc3QgbWFwOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtZCBvZiBzdGFjay5maW5kTWV0YWRhdGFCeVR5cGUoY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5MT0dJQ0FMX0lEKSkge1xuICAgIG1hcFttZC5kYXRhIGFzIHN0cmluZ10gPSBtZC5wYXRoO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbmZ1bmN0aW9uIGxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcbiAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBbbG9naWNhbElkLCByZXNvdXJjZV0gb2YgT2JqZWN0LmVudHJpZXMoKHRlbXBsYXRlLlJlc291cmNlcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PikpIHtcbiAgICBjb25zdCBwYXRoID0gcmVzb3VyY2U/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICByZXRbbG9naWNhbElkXSA9IHBhdGg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogUmVtb3ZlIGFueSB0ZW1wbGF0ZSBlbGVtZW50cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc2hvdyB1c2Vycy5cbiAqIFRoaXMgaXMgY3VycmVudGx5OlxuICogLSBBV1M6OkNESzo6TWV0YWRhdGEgcmVzb3VyY2VcbiAqIC0gQ2hlY2tCb290c3RyYXBWZXJzaW9uIFJ1bGVcbiAqL1xuZnVuY3Rpb24gb2JzY3VyZURpZmYoZGlmZjogVGVtcGxhdGVEaWZmKSB7XG4gIGlmIChkaWZmLnVua25vd24pIHtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xNzk0MlxuICAgIGRpZmYudW5rbm93biA9IGRpZmYudW5rbm93bi5maWx0ZXIoY2hhbmdlID0+IHtcbiAgICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5uZXdWYWx1ZT8uQ2hlY2tCb290c3RyYXBWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2Uub2xkVmFsdWU/LkNoZWNrQm9vdHN0cmFwVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChkaWZmLnJlc291cmNlcykge1xuICAgIGRpZmYucmVzb3VyY2VzID0gZGlmZi5yZXNvdXJjZXMuZmlsdGVyKGNoYW5nZSA9PiB7XG4gICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2UubmV3UmVzb3VyY2VUeXBlID09PSAnQVdTOjpDREs6Ok1ldGFkYXRhJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlLm9sZFJlc291cmNlVHlwZSA9PT0gJ0FXUzo6Q0RLOjpNZXRhZGF0YScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -12,6 +12,7 @@ import type { HotswapDeploymentDetails, HotswapDeploymentAttempt, HotswappableCh
|
|
|
12
12
|
import type { ResourceIdentificationRequest, ResourceImportRequest } from '../../../payloads/import';
|
|
13
13
|
import type { StackDetailsPayload } from '../../../payloads/list';
|
|
14
14
|
import type { CloudWatchLogEvent, CloudWatchLogMonitorControlEvent } from '../../../payloads/logs-monitor';
|
|
15
|
+
import type { AssetsPayload } from '../../../payloads/publish-assets';
|
|
15
16
|
import type { RefactorResult } from '../../../payloads/refactor';
|
|
16
17
|
import type { StackRollbackProgress } from '../../../payloads/rollback';
|
|
17
18
|
import type { MfaTokenRequest, SdkTrace } from '../../../payloads/sdk';
|
|
@@ -106,6 +107,9 @@ export declare const IO: {
|
|
|
106
107
|
}>;
|
|
107
108
|
CDK_TOOLKIT_E9900: make.IoMessageMaker<ErrorPayload>;
|
|
108
109
|
CDK_TOOLKIT_I9300: make.IoMessageMaker<FeatureFlagChangeRequest>;
|
|
110
|
+
CDK_TOOLKIT_I9400: make.IoMessageMaker<void>;
|
|
111
|
+
CDK_TOOLKIT_I9401: make.IoMessageMaker<AssetsPayload>;
|
|
112
|
+
CDK_TOOLKIT_I9402: make.IoMessageMaker<AssetsPayload>;
|
|
109
113
|
CDK_TOOLKIT_I0100: make.IoMessageMaker<void>;
|
|
110
114
|
CDK_TOOLKIT_W0101: make.IoMessageMaker<void>;
|
|
111
115
|
CDK_TOOLKIT_E0101: make.IoMessageMaker<void>;
|