deployable-awscdk-app-ts 0.1.680 → 0.1.682
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/.jsii +108 -30
- package/API.md +53 -0
- package/lib/index.d.ts +8 -1
- package/lib/index.js +22 -80
- package/lib/steps.d.ts +196 -11
- package/lib/steps.js +503 -154
- package/lib/types.d.ts +13 -0
- package/lib/types.js +7 -1
- package/package.json +1 -1
package/lib/steps.js
CHANGED
|
@@ -1,163 +1,512 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.deploymentStep = deploymentStep;
|
|
7
|
-
exports.setAwsCredentialsSteps = setAwsCredentialsSteps;
|
|
8
|
-
exports.setNpmConfig = setNpmConfig;
|
|
9
|
-
exports.checkActiveDeploymentStep = checkActiveDeploymentStep;
|
|
10
|
-
exports.postDeploymentStep = postDeploymentStep;
|
|
11
|
-
exports.preDeploymentStep = preDeploymentStep;
|
|
12
|
-
exports.preInstallDependenciesStep = preInstallDependenciesStep;
|
|
13
|
-
const projen_1 = require("projen");
|
|
3
|
+
exports.DeployableAwsCdkTypeScriptAppStepsFactory = void 0;
|
|
4
|
+
const github_1 = require("projen/lib/github");
|
|
5
|
+
const workflows_model_1 = require("projen/lib/github/workflows-model");
|
|
14
6
|
const javascript_1 = require("projen/lib/javascript");
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return 'npm run';
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
const checkActiveDeploymentStepId = 'deployment-check';
|
|
9
|
+
const skipIfAlreadyActiveDeploymentCondition = `steps.${checkActiveDeploymentStepId}.outputs.has_active_deployment != 'true'`;
|
|
10
|
+
/**
|
|
11
|
+
* Factory to create reusable steps for the deployment workflow
|
|
12
|
+
* @experimental
|
|
13
|
+
*/
|
|
14
|
+
class DeployableAwsCdkTypeScriptAppStepsFactory {
|
|
15
|
+
/**
|
|
16
|
+
* Validate that the provided environment deployment dependencies are valid
|
|
17
|
+
* @param deployOptions The deployment options
|
|
18
|
+
* @param environmentDependencies The environment deployment dependencies to validate
|
|
19
|
+
*/
|
|
20
|
+
static validateEnvironmentDeploymentDependencies(deployOptions, environmentDependencies) {
|
|
21
|
+
if (deployOptions.jobStrategy !== types_1.DeployJobStrategy.MULTI_JOB) {
|
|
22
|
+
throw new Error('Environment deployment dependencies are only supported for MULTI_JOB strategy');
|
|
23
|
+
}
|
|
24
|
+
Object.entries(environmentDependencies).forEach(([env, deps]) => {
|
|
25
|
+
const hasEnvironment = deployOptions.environments.some(e => e.name === env);
|
|
26
|
+
if (!hasEnvironment) {
|
|
27
|
+
throw new Error(`Environment "${env}" defined in dependencies does not exist in deployOptions.environments`);
|
|
28
|
+
}
|
|
29
|
+
deps.forEach(dep => {
|
|
30
|
+
const hasDepEnvironment = deployOptions.environments.some(e => e.name === dep);
|
|
31
|
+
if (!hasDepEnvironment) {
|
|
32
|
+
throw new Error(`Dependency environment "${dep}" for environment "${env}" does not exist in deployOptions.environments`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
45
36
|
}
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Create a new DeployableAwsCdkTypeScriptAppStepsFactory
|
|
39
|
+
* @param project The project
|
|
40
|
+
* @param props The factory properties
|
|
41
|
+
*/
|
|
42
|
+
constructor(project, props) {
|
|
43
|
+
this.project = project;
|
|
44
|
+
this.props = props;
|
|
48
45
|
}
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Condition to skip a step if an active deployment is already present
|
|
48
|
+
* @returns JobStep condition or undefined if checkActiveDeployment is false
|
|
49
|
+
*/
|
|
50
|
+
get skipIfAlreadyActiveDeploymentCondition() {
|
|
51
|
+
return this.props.checkActiveDeployment ? { if: `\${{ ${skipIfAlreadyActiveDeploymentCondition} }}` } : undefined;
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
53
|
+
get checkoutStep() {
|
|
54
|
+
return github_1.WorkflowSteps.checkout({
|
|
55
|
+
with: {
|
|
56
|
+
fetchDepth: 0,
|
|
57
|
+
ref: '${{ github.sha }}',
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Step to run before installing dependencies if exists
|
|
63
|
+
* @returns JobStep or undefined if no preInstallTaskName is provided
|
|
64
|
+
*/
|
|
65
|
+
get preInstallDependenciesStep() {
|
|
66
|
+
if (!this.props.preInstallTaskName) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
...this.skipIfAlreadyActiveDeploymentCondition,
|
|
71
|
+
name: this.props.preInstallTaskName,
|
|
72
|
+
run: `npx projen ${this.props.preInstallTaskName}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Step to check if there is an active deployment for the environment in the matrix strategy
|
|
77
|
+
* @returns JobStep
|
|
78
|
+
*/
|
|
79
|
+
get checkActiveDeploymentStepForMatrix() {
|
|
80
|
+
return this.getCheckActiveDeploymentStepForEnvironment('${{ matrix.environment }}');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Step to check if there is an active deployment for a specific environment
|
|
84
|
+
* @param environment The environment to check
|
|
85
|
+
* @returns JobStep
|
|
86
|
+
*/
|
|
87
|
+
getCheckActiveDeploymentStepForEnvironment(environment) {
|
|
88
|
+
if (!this.props.checkActiveDeployment) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
id: checkActiveDeploymentStepId,
|
|
93
|
+
uses: 'AminFazlMondo/check-deployed-environment@v1',
|
|
94
|
+
with: {
|
|
95
|
+
environment: environment,
|
|
96
|
+
},
|
|
97
|
+
env: {
|
|
98
|
+
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Step to setup AWS credentials in the environment for the matrix strategy
|
|
104
|
+
* @returns JobStep[]
|
|
105
|
+
*/
|
|
106
|
+
get setupAwsCredentialsStepsForMatrix() {
|
|
107
|
+
return [
|
|
108
|
+
this.setupAwsCredentialsInEnvironmentForMatrix,
|
|
109
|
+
this.assumeAwsRoleStepForMatrix,
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get the steps to setup AWS credentials for a specific environment
|
|
114
|
+
* @param environmentOptions The environment options
|
|
115
|
+
* @returns JobStep[]
|
|
116
|
+
*/
|
|
117
|
+
getSetupAwsCredentialsStepsForEnvironment(environmentOptions) {
|
|
118
|
+
const steps = [];
|
|
119
|
+
const fromEnvVariableStep = this.getSetupAwsCredentialsInEnvironmentForEnvironment(environmentOptions.awsCredentials.roleToAssume ? true : false, environmentOptions.awsCredentials.accessKeyIdSecretName ?? 'AWS_ACCESS_KEY_ID', environmentOptions.awsCredentials.secretAccessKeySecretName ?? 'AWS_SECRET_ACCESS_KEY', environmentOptions.awsCredentials.region);
|
|
120
|
+
if (fromEnvVariableStep) {
|
|
121
|
+
steps.push(fromEnvVariableStep);
|
|
122
|
+
}
|
|
123
|
+
const assumeRoleStep = this.getAssumeAwsRoleStepForEnvironment(environmentOptions.awsCredentials.roleToAssume ? true : false, environmentOptions.awsCredentials.accessKeyIdSecretName ?? 'AWS_ACCESS_KEY_ID', environmentOptions.awsCredentials.secretAccessKeySecretName ?? 'AWS_SECRET_ACCESS_KEY', environmentOptions.awsCredentials.region, environmentOptions.awsCredentials.roleToAssume ?? '', environmentOptions.awsCredentials.assumeRoleDurationSeconds ?? 900);
|
|
124
|
+
if (assumeRoleStep) {
|
|
125
|
+
steps.push(assumeRoleStep);
|
|
126
|
+
}
|
|
127
|
+
return steps;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Step to setup AWS credentials in the environment for the matrix strategy
|
|
131
|
+
* @returns JobStep
|
|
132
|
+
*/
|
|
133
|
+
get setupAwsCredentialsInEnvironmentForMatrix() {
|
|
134
|
+
return this.getSetupAwsCredentialsInEnvironmentForEnvironment('matrix.assumeRole', 'matrix.accessKeyIdSecretName', 'matrix.secretAccessKeySecretName', '${{ matrix.region }}');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Step to setup AWS credentials in the environment for a specific environment
|
|
138
|
+
* @param assumeRoleFlag Whether to assume a role, can be a boolean or a string for matrix strategy
|
|
139
|
+
* @param accessKeyIdSecretName The GitHub secret name for the access key ID
|
|
140
|
+
* @param secretAccessKeySecretName The GitHub secret name for the secret access key
|
|
141
|
+
* @param region The region
|
|
142
|
+
* @returns JobStep or undefined if no AWS credentials are provided,
|
|
143
|
+
* if assumeRoleFlag is boolean will be evaluated and return a JobStep only if false
|
|
144
|
+
* if assumeRoleFlag is string will always return a JobStep (for matrix strategy)
|
|
145
|
+
*/
|
|
146
|
+
getSetupAwsCredentialsInEnvironmentForEnvironment(assumeRoleFlag, accessKeyIdSecretName, secretAccessKeySecretName, region) {
|
|
147
|
+
function getCondition(factory) {
|
|
148
|
+
if (typeof assumeRoleFlag === 'boolean') {
|
|
149
|
+
if (assumeRoleFlag) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
return factory.props.checkActiveDeployment ? skipIfAlreadyActiveDeploymentCondition : undefined;
|
|
153
|
+
}
|
|
154
|
+
return factory.props.checkActiveDeployment ?
|
|
155
|
+
`\${{ ${assumeRoleFlag} == 'false' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
|
|
156
|
+
`\${{ ${assumeRoleFlag} == 'false' }}`;
|
|
157
|
+
}
|
|
158
|
+
const commands = [
|
|
159
|
+
'echo "AWS_ACCESS_KEY_ID=$accessKeyId" >> $GITHUB_ENV',
|
|
160
|
+
'echo "AWS_SECRET_ACCESS_KEY=$secretAccessKey" >> $GITHUB_ENV',
|
|
161
|
+
'echo "AWS_REGION=$region" >> $GITHUB_ENV',
|
|
162
|
+
];
|
|
163
|
+
if (typeof assumeRoleFlag === 'boolean' && assumeRoleFlag) {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
const condition = getCondition(this);
|
|
167
|
+
return {
|
|
168
|
+
if: condition,
|
|
169
|
+
name: 'Configure AWS Credentials',
|
|
170
|
+
run: `${commands.join('\n')}`,
|
|
171
|
+
env: {
|
|
172
|
+
accessKeyId: `\${{ secrets[${accessKeyIdSecretName}] }}`,
|
|
173
|
+
secretAccessKey: `\${{ secrets[${secretAccessKeySecretName}] }}`,
|
|
174
|
+
region,
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Step to assume an AWS role for the matrix strategy
|
|
180
|
+
* @returns JobStep
|
|
181
|
+
*/
|
|
182
|
+
get assumeAwsRoleStepForMatrix() {
|
|
183
|
+
return this.getAssumeAwsRoleStepForEnvironment('matrix.assumeRole', 'matrix.accessKeyIdSecretName', 'matrix.secretAccessKeySecretName', '${{ matrix.region }}', '${{ matrix.roleToAssume }}', '${{ matrix.assumeRoleDurationSeconds }}');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Step to assume an AWS role for a specific environment
|
|
187
|
+
* @param assumeRoleFlag Whether to assume a role, can be a boolean or a string for matrix strategy
|
|
188
|
+
* @param accessKeyIdSecretName The GitHub secret name for the access key ID
|
|
189
|
+
* @param secretAccessKeySecretName The GitHub secret name for the secret access key
|
|
190
|
+
* @param region The region
|
|
191
|
+
* @param roleToAssume The role to assume
|
|
192
|
+
* @param assumeRoleDurationSeconds The duration for assuming the role
|
|
193
|
+
* @returns JobStep or undefined if assumeRoleFlag is boolean and false
|
|
194
|
+
* if assumeRoleFlag is string will always return a JobStep (for matrix strategy)
|
|
195
|
+
*/
|
|
196
|
+
getAssumeAwsRoleStepForEnvironment(assumeRoleFlag, accessKeyIdSecretName, secretAccessKeySecretName, region, roleToAssume, assumeRoleDurationSeconds) {
|
|
197
|
+
function getCondition(factory) {
|
|
198
|
+
if (typeof assumeRoleFlag === 'boolean') {
|
|
199
|
+
if (!assumeRoleFlag) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
return factory.props.checkActiveDeployment ? skipIfAlreadyActiveDeploymentCondition : undefined;
|
|
203
|
+
}
|
|
204
|
+
return factory.props.checkActiveDeployment ?
|
|
205
|
+
`\${{ ${assumeRoleFlag} == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
|
|
206
|
+
`\${{ ${assumeRoleFlag} == 'true' }}`;
|
|
207
|
+
}
|
|
208
|
+
if (typeof assumeRoleFlag === 'boolean' && !assumeRoleFlag) {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
const condition = getCondition(this);
|
|
212
|
+
const secretsParams = this.props.authProvider === javascript_1.CodeArtifactAuthProvider.ACCESS_AND_SECRET_KEY_PAIR ?
|
|
213
|
+
{
|
|
214
|
+
'aws-access-key-id': `\${{ secrets[${accessKeyIdSecretName}] }}`,
|
|
215
|
+
'aws-secret-access-key': `\${{ secrets[${secretAccessKeySecretName}] }}`,
|
|
216
|
+
} : undefined;
|
|
217
|
+
return {
|
|
218
|
+
if: condition,
|
|
219
|
+
name: 'Assume AWS Role',
|
|
220
|
+
uses: 'aws-actions/configure-aws-credentials@v4',
|
|
221
|
+
with: {
|
|
222
|
+
...secretsParams,
|
|
223
|
+
'role-to-assume': roleToAssume,
|
|
224
|
+
'aws-region': region,
|
|
225
|
+
'role-duration-seconds': assumeRoleDurationSeconds,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Step to setup NPM config if provided
|
|
231
|
+
* @returns JobStep or undefined if no npmConfig is provided
|
|
232
|
+
*/
|
|
233
|
+
get setupNpmConfigForMatrix() {
|
|
234
|
+
return this.getSetupNpmConfigForEnvironment('${{ matrix.environment }}');
|
|
235
|
+
}
|
|
236
|
+
getSetupNpmConfigForEnvironment(environment) {
|
|
237
|
+
const { npmConfigEnvironment } = this.props;
|
|
238
|
+
if (!npmConfigEnvironment) {
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
const environmentVariableName = 'CONFIG_VALUE';
|
|
242
|
+
return {
|
|
243
|
+
...this.skipIfAlreadyActiveDeploymentCondition,
|
|
244
|
+
name: 'Setting NPM Config',
|
|
245
|
+
env: {
|
|
246
|
+
[environmentVariableName]: environment,
|
|
247
|
+
},
|
|
248
|
+
run: `npm config set ${npmConfigEnvironment} $${environmentVariableName}`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get the step to run a specific script
|
|
253
|
+
* @param scriptName The name of the script to run
|
|
254
|
+
* @param stepName The name of the step in the workflow
|
|
255
|
+
* @param hasScriptFlag Whether the script should be run
|
|
256
|
+
* @returns The job step to run the script or undefined if not applicable
|
|
257
|
+
* If hasScriptFlag is boolean and false will return undefined
|
|
258
|
+
* If hasScriptFlag is string will always return a JobStep (for matrix strategy)
|
|
259
|
+
*/
|
|
260
|
+
getRunScriptStep(scriptName, stepName, hasScriptFlag) {
|
|
261
|
+
function getCondition(factory) {
|
|
262
|
+
if (typeof hasScriptFlag === 'boolean') {
|
|
263
|
+
if (!hasScriptFlag) {
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
return factory.props.checkActiveDeployment ? skipIfAlreadyActiveDeploymentCondition : undefined;
|
|
267
|
+
}
|
|
268
|
+
return factory.props.checkActiveDeployment ?
|
|
269
|
+
`\${{ ${hasScriptFlag} == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
|
|
270
|
+
`\${{ ${hasScriptFlag} == 'true' }}`;
|
|
271
|
+
}
|
|
272
|
+
if (typeof hasScriptFlag === 'boolean' && !hasScriptFlag) {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
const condition = getCondition(this);
|
|
276
|
+
return {
|
|
277
|
+
if: condition,
|
|
278
|
+
name: `Run ${stepName}`,
|
|
279
|
+
run: `${this.project.runScriptCommand} ${scriptName}`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Step to deploy the workflow
|
|
284
|
+
* @returns JobStep
|
|
285
|
+
*/
|
|
286
|
+
get deploymentStep() {
|
|
287
|
+
return this.getRunScriptStep('deploy:workflow', 'Deployment', true);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Step to run post deployment script in matrix strategy
|
|
291
|
+
* @returns JobStep
|
|
292
|
+
*/
|
|
293
|
+
get preDeploymentStepForMatrix() {
|
|
294
|
+
return this.getPreDeploymentStepForEnvironment('matrix.hasPreDeployTask', '${{ matrix.preDeploymentScript }}');
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Get the pre-deployment step for a specific environment
|
|
298
|
+
* @param hasPreDeployTaskFlag Whether the pre-deployment task should be run
|
|
299
|
+
* @param preDeploymentScript The script to run
|
|
300
|
+
* @returns The job step to run the pre-deployment script or undefined if not applicable
|
|
301
|
+
* If hasPreDeployTaskFlag is boolean and false will return undefined
|
|
302
|
+
* If hasPreDeployTaskFlag is string will always return a JobStep (for matrix strategy)
|
|
303
|
+
*/
|
|
304
|
+
getPreDeploymentStepForEnvironment(hasPreDeployTaskFlag, preDeploymentScript) {
|
|
305
|
+
return this.getRunScriptStep(preDeploymentScript, 'Pre Deployment', hasPreDeployTaskFlag);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Step to run post deployment script in matrix strategy
|
|
309
|
+
* @returns JobStep
|
|
310
|
+
*/
|
|
311
|
+
get postDeploymentStepForMatrix() {
|
|
312
|
+
return this.getPostDeploymentStepForEnvironment('matrix.hasPostDeployTask', '${{ matrix.postDeploymentScript }}');
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Get the post-deployment step for a specific environment
|
|
316
|
+
* @param hasPostDeployTaskFlag Whether the post-deployment task should be run
|
|
317
|
+
* @param postDeploymentScript The script to run
|
|
318
|
+
* @returns The job step to run the post-deployment script or undefined if not applicable
|
|
319
|
+
* If hasPostDeployTaskFlag is boolean and false will return undefined
|
|
320
|
+
* If hasPostDeployTaskFlag is string will always return a JobStep (for matrix strategy)
|
|
321
|
+
*/
|
|
322
|
+
getPostDeploymentStepForEnvironment(hasPostDeployTaskFlag, postDeploymentScript) {
|
|
323
|
+
return this.getRunScriptStep(postDeploymentScript, 'Post Deployment', hasPostDeployTaskFlag);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get all deployment jobs whether for matrix strategy or not
|
|
327
|
+
* @returns Record of jobs
|
|
328
|
+
*/
|
|
329
|
+
get deploymentJobs() {
|
|
330
|
+
if (this.props.deployOptions.environments.length === 0) {
|
|
331
|
+
this.project.logger.warn('The project does not have any environment set, make sure this is desired setting');
|
|
332
|
+
}
|
|
333
|
+
return this.props.jobStrategy === types_1.DeployJobStrategy.MATRIX ? this.deploymentJobsForMatrix : this.getDeploymentJobsForMultiJob();
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Get deployment jobs for matrix strategy
|
|
337
|
+
* @returns Record of jobs
|
|
338
|
+
*/
|
|
339
|
+
get deploymentJobsForMatrix() {
|
|
340
|
+
const { environments, environmentVariableName } = this.props.deployOptions;
|
|
341
|
+
const include = environments.map(environmentOptions => {
|
|
342
|
+
const { awsCredentials } = environmentOptions;
|
|
343
|
+
const assumeRole = awsCredentials.roleToAssume ? 'true' : 'false';
|
|
344
|
+
const assumeRoleSettings = awsCredentials.roleToAssume ? {
|
|
345
|
+
roleToAssume: awsCredentials.roleToAssume,
|
|
346
|
+
assumeRoleDurationSeconds: awsCredentials.assumeRoleDurationSeconds || 900,
|
|
347
|
+
} : undefined;
|
|
348
|
+
const accessKeyIdSecretName = awsCredentials.accessKeyIdSecretName ?? 'AWS_ACCESS_KEY_ID';
|
|
349
|
+
const secretAccessKeySecretName = awsCredentials.secretAccessKeySecretName ?? 'AWS_SECRET_ACCESS_KEY';
|
|
350
|
+
const hasPostDeployTask = environmentOptions.postDeployWorkflowScript ? 'true' : 'false';
|
|
351
|
+
const hasPreDeployTask = environmentOptions.preDeployWorkflowScript ? 'true' : 'false';
|
|
352
|
+
return {
|
|
353
|
+
environment: environmentOptions.name,
|
|
354
|
+
accessKeyIdSecretName,
|
|
355
|
+
secretAccessKeySecretName,
|
|
356
|
+
region: awsCredentials.region,
|
|
357
|
+
assumeRole,
|
|
358
|
+
hasPostDeployTask,
|
|
359
|
+
postDeploymentScript: environmentOptions.postDeployWorkflowScript || '',
|
|
360
|
+
hasPreDeployTask,
|
|
361
|
+
preDeploymentScript: environmentOptions.preDeployWorkflowScript || '',
|
|
362
|
+
...assumeRoleSettings,
|
|
363
|
+
};
|
|
364
|
+
});
|
|
365
|
+
const deployJobEnv = environmentVariableName ? {
|
|
366
|
+
[environmentVariableName]: '${{ matrix.environment }}',
|
|
89
367
|
} : undefined;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
368
|
+
const jobDefinition = {
|
|
369
|
+
runsOn: ['ubuntu-latest'],
|
|
370
|
+
concurrency: {
|
|
371
|
+
'group': '${{ matrix.environment }}-deploy',
|
|
372
|
+
'cancel-in-progress': false,
|
|
373
|
+
},
|
|
374
|
+
needs: [
|
|
375
|
+
'release_github',
|
|
376
|
+
],
|
|
377
|
+
permissions: {
|
|
378
|
+
contents: workflows_model_1.JobPermission.READ,
|
|
379
|
+
deployments: workflows_model_1.JobPermission.READ,
|
|
380
|
+
idToken: this.props.authProvider === javascript_1.CodeArtifactAuthProvider.GITHUB_OIDC ? workflows_model_1.JobPermission.WRITE : undefined,
|
|
381
|
+
},
|
|
382
|
+
strategy: {
|
|
383
|
+
maxParallel: 1,
|
|
384
|
+
matrix: {
|
|
385
|
+
domain: {
|
|
386
|
+
environment: include.map(e => e.environment),
|
|
387
|
+
},
|
|
388
|
+
include,
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
environment: {
|
|
392
|
+
name: '${{ matrix.environment }}',
|
|
393
|
+
},
|
|
394
|
+
env: deployJobEnv,
|
|
395
|
+
steps: [],
|
|
396
|
+
};
|
|
397
|
+
jobDefinition.steps.push(this.checkoutStep);
|
|
398
|
+
const preInstallDependenciesStep = this.preInstallDependenciesStep;
|
|
399
|
+
if (preInstallDependenciesStep) {
|
|
400
|
+
jobDefinition.steps.push(preInstallDependenciesStep);
|
|
401
|
+
}
|
|
402
|
+
jobDefinition.steps.push(...(this.project).renderWorkflowSetup());
|
|
403
|
+
const checkActiveDeploymentStepForMatrix = this.checkActiveDeploymentStepForMatrix;
|
|
404
|
+
if (checkActiveDeploymentStepForMatrix) {
|
|
405
|
+
jobDefinition.steps.push(checkActiveDeploymentStepForMatrix);
|
|
406
|
+
}
|
|
407
|
+
jobDefinition.steps.push(...this.setupAwsCredentialsStepsForMatrix);
|
|
408
|
+
const setupNpmConfigStep = this.setupNpmConfigForMatrix;
|
|
409
|
+
if (setupNpmConfigStep) {
|
|
410
|
+
jobDefinition.steps.push(setupNpmConfigStep);
|
|
411
|
+
}
|
|
412
|
+
jobDefinition.steps.push(this.preDeploymentStepForMatrix);
|
|
413
|
+
jobDefinition.steps.push(this.deploymentStep);
|
|
414
|
+
jobDefinition.steps.push(this.postDeploymentStepForMatrix);
|
|
415
|
+
return { deploy: jobDefinition };
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Get the IDs of the jobs that must be completed before the specified environment's deployment job
|
|
419
|
+
* @param environmentName The name of the environment
|
|
420
|
+
* @returns An array of job IDs
|
|
421
|
+
*/
|
|
422
|
+
getDeploymentJobPrerequisiteJobIds(environmentName) {
|
|
423
|
+
const result = ['release_github'];
|
|
424
|
+
if (!this.props.environmentDependencies) {
|
|
425
|
+
const index = this.props.deployOptions.environments.findIndex(env => env.name === environmentName);
|
|
426
|
+
const prerequisiteEnvironment = index > 0 ? this.props.deployOptions.environments[index - 1] : undefined;
|
|
427
|
+
if (prerequisiteEnvironment) {
|
|
428
|
+
result.push(getDeployJobId(prerequisiteEnvironment.name));
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
const dependencies = this.props.environmentDependencies[environmentName];
|
|
433
|
+
if (dependencies) {
|
|
434
|
+
dependencies.forEach(dep => {
|
|
435
|
+
result.push(getDeployJobId(dep));
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return result;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Get deployment jobs for multi-job strategy
|
|
443
|
+
* @returns Record of jobs
|
|
444
|
+
*/
|
|
445
|
+
getDeploymentJobsForMultiJob() {
|
|
446
|
+
const { environmentVariableName, environments } = this.props.deployOptions;
|
|
447
|
+
const jobs = environments.map((environmentOptions) => {
|
|
448
|
+
return [getDeployJobId(environmentOptions.name), this.getJobForEnvironment(environmentOptions, environmentVariableName)];
|
|
449
|
+
});
|
|
450
|
+
return Object.fromEntries(jobs);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Get the job definition for a specific environment
|
|
454
|
+
* @param environmentOptions The environment options
|
|
455
|
+
* @param environmentVariableName The name of the environment variable to set with the environment name, if any
|
|
456
|
+
* @returns The job definition for the environment
|
|
457
|
+
*/
|
|
458
|
+
getJobForEnvironment(environmentOptions, environmentVariableName) {
|
|
459
|
+
const { name } = environmentOptions;
|
|
460
|
+
const deployJobEnv = environmentVariableName ? {
|
|
461
|
+
[environmentVariableName]: name,
|
|
462
|
+
} : undefined;
|
|
463
|
+
const jobDefinition = {
|
|
464
|
+
runsOn: ['ubuntu-latest'],
|
|
465
|
+
concurrency: {
|
|
466
|
+
'group': `${name}-deploy`,
|
|
467
|
+
'cancel-in-progress': false,
|
|
468
|
+
},
|
|
469
|
+
needs: this.getDeploymentJobPrerequisiteJobIds(name),
|
|
470
|
+
permissions: {
|
|
471
|
+
contents: workflows_model_1.JobPermission.READ,
|
|
472
|
+
deployments: workflows_model_1.JobPermission.READ,
|
|
473
|
+
idToken: this.props.authProvider === javascript_1.CodeArtifactAuthProvider.GITHUB_OIDC ? workflows_model_1.JobPermission.WRITE : undefined,
|
|
474
|
+
},
|
|
475
|
+
environment: {
|
|
476
|
+
name: name,
|
|
477
|
+
},
|
|
478
|
+
env: deployJobEnv,
|
|
479
|
+
steps: [],
|
|
480
|
+
};
|
|
481
|
+
jobDefinition.steps.push(this.checkoutStep);
|
|
482
|
+
const preInstallDependenciesStep = this.preInstallDependenciesStep;
|
|
483
|
+
if (preInstallDependenciesStep) {
|
|
484
|
+
jobDefinition.steps.push(preInstallDependenciesStep);
|
|
485
|
+
}
|
|
486
|
+
jobDefinition.steps.push(...(this.project).renderWorkflowSetup());
|
|
487
|
+
const checkActiveDeploymentStep = this.getCheckActiveDeploymentStepForEnvironment(name);
|
|
488
|
+
if (checkActiveDeploymentStep) {
|
|
489
|
+
jobDefinition.steps.push(checkActiveDeploymentStep);
|
|
490
|
+
}
|
|
491
|
+
jobDefinition.steps.push(...this.getSetupAwsCredentialsStepsForEnvironment(environmentOptions));
|
|
492
|
+
const setupNpmConfigStep = this.getSetupNpmConfigForEnvironment(name);
|
|
493
|
+
if (setupNpmConfigStep) {
|
|
494
|
+
jobDefinition.steps.push(setupNpmConfigStep);
|
|
495
|
+
}
|
|
496
|
+
const preDeploymentStep = this.getPreDeploymentStepForEnvironment(environmentOptions.preDeployWorkflowScript ? true : false, environmentOptions.preDeployWorkflowScript || '');
|
|
497
|
+
if (preDeploymentStep) {
|
|
498
|
+
jobDefinition.steps.push(preDeploymentStep);
|
|
499
|
+
}
|
|
500
|
+
jobDefinition.steps.push(this.deploymentStep);
|
|
501
|
+
const postDeploymentStep = this.getPostDeploymentStepForEnvironment(environmentOptions.postDeployWorkflowScript ? true : false, environmentOptions.postDeployWorkflowScript || '');
|
|
502
|
+
if (postDeploymentStep) {
|
|
503
|
+
jobDefinition.steps.push(postDeploymentStep);
|
|
504
|
+
}
|
|
505
|
+
return jobDefinition;
|
|
506
|
+
}
|
|
155
507
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
name: taskName,
|
|
160
|
-
run: `npx projen ${taskName}`,
|
|
161
|
-
};
|
|
508
|
+
exports.DeployableAwsCdkTypeScriptAppStepsFactory = DeployableAwsCdkTypeScriptAppStepsFactory;
|
|
509
|
+
function getDeployJobId(environmentName) {
|
|
510
|
+
return `Deploy-${environmentName}`;
|
|
162
511
|
}
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxvQ0FTQztBQUVELGdEQVNDO0FBRUQsMERBTUM7QUFZRCx3Q0FPQztBQW1ERCx3REFRQztBQUVELG9DQVVDO0FBR0QsOERBV0M7QUFRRCxnREFVQztBQUVELDhDQVVDO0FBRUQsZ0VBTUM7QUE5S0QsbUNBQW9DO0FBRXBDLHNEQUFpRTtBQUVqRSxTQUFnQixZQUFZO0lBQzFCLE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVTtRQUNoQixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLElBQUksRUFBRTtZQUNKLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsYUFBYSxFQUFFLENBQUM7U0FDakI7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLFdBQW1CLEVBQUUscUJBQThCO0lBQ3BGLE9BQU87UUFDTCxHQUFHLHlDQUF5QyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksRUFBRSxlQUFlO1FBQ3JCLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsSUFBSSxFQUFFO1lBQ0osY0FBYyxFQUFFLFdBQVc7U0FDNUI7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE9BQWUsRUFBRSxxQkFBOEI7SUFDckYsT0FBTztRQUNMLEdBQUcseUNBQXlDLENBQUMscUJBQXFCLENBQUM7UUFDbkUsSUFBSSxFQUFFLHNCQUFzQjtRQUM1QixHQUFHLEVBQUUsT0FBTztLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyw4QkFBOEIsQ0FBQyxjQUE2QztJQUNuRixJQUFJLGNBQWMsS0FBSyxtQkFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQUEsT0FBTyxTQUFTLENBQUM7SUFBQSxDQUFDO0lBRTdFLElBQUksY0FBYyxLQUFLLG1CQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFBQSxPQUFPLE1BQU0sQ0FBQztJQUFBLENBQUM7SUFFM0UsSUFBSSxjQUFjLEtBQUssbUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUFBLE9BQU8sTUFBTSxDQUFDO0lBQUEsQ0FBQztJQUUzRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMscUJBQThCLEVBQUUsY0FBNkM7SUFFMUcsT0FBTztRQUNMLEdBQUcseUNBQXlDLENBQUMscUJBQXFCLENBQUM7UUFDbkUsSUFBSSxFQUFFLFlBQVk7UUFDbEIsR0FBRyxFQUFFLEdBQUcsOEJBQThCLENBQUMsY0FBYyxDQUFDLGtCQUFrQjtLQUN6RSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsOEJBQThCLENBQUMscUJBQThCO0lBQ3BFLE1BQU0sUUFBUSxHQUFHO1FBQ2Ysc0RBQXNEO1FBQ3RELDhEQUE4RDtRQUM5RCwwQ0FBMEM7S0FDM0MsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUNiLHFCQUFxQixDQUFDLENBQUM7UUFDckIsd0NBQXdDLHNDQUFzQyxLQUFLLENBQUMsQ0FBQztRQUNyRix1Q0FBdUMsQ0FBQztJQUU1QyxPQUFPO1FBQ0wsRUFBRSxFQUFFLFNBQVM7UUFDYixJQUFJLEVBQUUsMkJBQTJCO1FBQ2pDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDN0IsR0FBRyxFQUFFO1lBQ0gsV0FBVyxFQUFFLDhDQUE4QztZQUMzRCxlQUFlLEVBQUUsa0RBQWtEO1lBQ25FLE1BQU0sRUFBRSxzQkFBc0I7U0FDL0I7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMscUJBQThCLEVBQUUsWUFBc0M7SUFDL0YsTUFBTSxTQUFTLEdBQ2IscUJBQXFCLENBQUMsQ0FBQztRQUNyQix1Q0FBdUMsc0NBQXNDLEtBQUssQ0FBQyxDQUFDO1FBQ3BGLHNDQUFzQyxDQUFDO0lBRTNDLE1BQU0sYUFBYSxHQUNqQixZQUFZLEtBQUsscUNBQXdCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNwRTtZQUNFLG1CQUFtQixFQUFFLDhDQUE4QztZQUNuRSx1QkFBdUIsRUFBRSxrREFBa0Q7U0FDNUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xCLE9BQU87UUFDTCxFQUFFLEVBQUUsU0FBUztRQUNiLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsSUFBSSxFQUFFLDBDQUEwQztRQUNoRCxJQUFJLEVBQUU7WUFDSixHQUFHLGFBQWE7WUFDaEIsZ0JBQWdCLEVBQUUsNEJBQTRCO1lBQzlDLFlBQVksRUFBRSxzQkFBc0I7WUFDcEMsdUJBQXVCLEVBQUUseUNBQXlDO1NBQ25FO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FDcEMscUJBQThCLEVBQzlCLGVBQXlDLHFDQUF3QixDQUFDLDBCQUEwQjtJQUU1RixPQUFPO1FBQ0wsOEJBQThCLENBQUMscUJBQXFCLENBQUM7UUFDckQsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDO0tBQ3ZELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLFVBQWtCLEVBQUUsV0FBbUIsRUFBRSxxQkFBOEI7SUFDbEcsTUFBTSx1QkFBdUIsR0FBRyxjQUFjLENBQUM7SUFDL0MsT0FBTztRQUNMLEdBQUcseUNBQXlDLENBQUMscUJBQXFCLENBQUM7UUFDbkUsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixHQUFHLEVBQUU7WUFDSCxDQUFDLHVCQUF1QixDQUFDLEVBQUUsV0FBVztTQUN2QztRQUNELEdBQUcsRUFBRSxrQkFBa0IsVUFBVSxLQUFLLHVCQUF1QixFQUFFO0tBQ2hFLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSwyQkFBMkIsR0FBRyxrQkFBa0IsQ0FBQztBQUN2RCxTQUFnQix5QkFBeUI7SUFDdkMsT0FBTztRQUNMLEVBQUUsRUFBRSwyQkFBMkI7UUFDL0IsSUFBSSxFQUFFLDZDQUE2QztRQUNuRCxJQUFJLEVBQUU7WUFDSixXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDO1FBQ0QsR0FBRyxFQUFFO1lBQ0gsWUFBWSxFQUFFLDZCQUE2QjtTQUM1QztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxzQ0FBc0MsR0FBRSxTQUFTLDJCQUEyQiwwQ0FBMEMsQ0FBQztBQUU3SCxTQUFTLHlDQUF5QyxDQUFDLHFCQUE4QjtJQUMvRSxPQUFPLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLHNDQUFzQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3pHLENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxxQkFBOEIsRUFBRSxjQUE2QztJQUM5RyxNQUFNLFNBQVMsR0FDZixxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JCLDhDQUE4QyxzQ0FBc0MsS0FBSyxDQUFDLENBQUM7UUFDM0YsNkNBQTZDLENBQUM7SUFDaEQsT0FBTztRQUNMLEVBQUUsRUFBRSxTQUFTO1FBQ2IsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixHQUFHLEVBQUUsR0FBRyw4QkFBOEIsQ0FBQyxjQUFjLENBQUMsc0NBQXNDO0tBQzdGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMscUJBQThCLEVBQUUsY0FBNkM7SUFDN0csTUFBTSxTQUFTLEdBQ2YscUJBQXFCLENBQUMsQ0FBQztRQUNyQiw2Q0FBNkMsc0NBQXNDLEtBQUssQ0FBQyxDQUFDO1FBQzFGLDRDQUE0QyxDQUFDO0lBQy9DLE9BQU87UUFDTCxFQUFFLEVBQUUsU0FBUztRQUNiLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsR0FBRyxFQUFFLEdBQUcsOEJBQThCLENBQUMsY0FBYyxDQUFDLHFDQUFxQztLQUM1RixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLDBCQUEwQixDQUFDLFFBQWdCLEVBQUUscUJBQThCO0lBQ3pGLE9BQU87UUFDTCxHQUFHLHlDQUF5QyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksRUFBRSxRQUFRO1FBQ2QsR0FBRyxFQUFFLGNBQWMsUUFBUSxFQUFFO0tBQzlCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgamF2YXNjcmlwdCB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBKb2JTdGVwIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcbmltcG9ydCB7IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlciB9IGZyb20gJ3Byb2plbi9saWIvamF2YXNjcmlwdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja291dFN0ZXAoKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NCcsXG4gICAgd2l0aDoge1xuICAgICAgJ3JlZic6ICcke3sgZ2l0aHViLnNoYSB9fScsXG4gICAgICAnZmV0Y2gtZGVwdGgnOiAwLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROb2RlVmVyc2lvblN0ZXAobm9kZVZlcnNpb246IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NCcsXG4gICAgd2l0aDoge1xuICAgICAgJ25vZGUtdmVyc2lvbic6IG5vZGVWZXJzaW9uLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jaWVzU3RlcChjb21tYW5kOiBzdHJpbmcsIGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAge1xuICByZXR1cm4ge1xuICAgIC4uLmdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICBydW46IGNvbW1hbmQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZFByZWZpeChwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTSkge3JldHVybiAnbnBtIHJ1bic7fVxuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuWUFSTikge3JldHVybiAneWFybic7fVxuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuUE5QTSkge3JldHVybiAncG5wbSc7fVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIG1hbmFnZXIgc2VsZWN0ZWQgKCR7cGFja2FnZU1hbmFnZXJ9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95bWVudFN0ZXAoY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuLCBwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIpOiBKb2JTdGVwIHtcblxuICByZXR1cm4ge1xuICAgIC4uLmdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgbmFtZTogJ0RlcGxveW1lbnQnLFxuICAgIHJ1bjogYCR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kUHJlZml4KHBhY2thZ2VNYW5hZ2VyKX0gZGVwbG95OndvcmtmbG93YCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2V0QXdzQ3JlZGVudGlhbHNJbkVudmlyb25tZW50KGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAge1xuICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAnZWNobyBcIkFXU19BQ0NFU1NfS0VZX0lEPSRhY2Nlc3NLZXlJZFwiID4+ICRHSVRIVUJfRU5WJyxcbiAgICAnZWNobyBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWT0kc2VjcmV0QWNjZXNzS2V5XCIgPj4gJEdJVEhVQl9FTlYnLFxuICAgICdlY2hvIFwiQVdTX1JFR0lPTj0kcmVnaW9uXCIgPj4gJEdJVEhVQl9FTlYnLFxuICBdO1xuXG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gICAgY2hlY2tBY3RpdmVEZXBsb3ltZW50ID9cbiAgICAgIGBcXCR7eyBtYXRyaXguYXNzdW1lUm9sZSA9PSAnZmFsc2UnICYmICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCA6XG4gICAgICAnJHt7IG1hdHJpeC5hc3N1bWVSb2xlID09IFxcJ2ZhbHNlXFwnIH19JztcblxuICByZXR1cm4ge1xuICAgIGlmOiBjb25kaXRpb24sXG4gICAgbmFtZTogJ0NvbmZpZ3VyZSBBV1MgQ3JlZGVudGlhbHMnLFxuICAgIHJ1bjogYCR7Y29tbWFuZHMuam9pbignXFxuJyl9YCxcbiAgICBlbnY6IHtcbiAgICAgIGFjY2Vzc0tleUlkOiAnJHt7IHNlY3JldHNbbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZV0gfX0nLFxuICAgICAgc2VjcmV0QWNjZXNzS2V5OiAnJHt7IHNlY3JldHNbbWF0cml4LnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWVdIH19JyxcbiAgICAgIHJlZ2lvbjogJyR7eyBtYXRyaXgucmVnaW9uIH19JyxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc3N1bWVBd3NSb2xlU3RlcChjaGVja0FjdGl2ZURlcGxveW1lbnQ6IGJvb2xlYW4sIGF1dGhQcm92aWRlcjogQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gICAgY2hlY2tBY3RpdmVEZXBsb3ltZW50ID9cbiAgICAgIGBcXCR7eyBtYXRyaXguYXNzdW1lUm9sZSA9PSAndHJ1ZScgJiYgJHtza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbn0gfX1gIDpcbiAgICAgICcke3sgbWF0cml4LmFzc3VtZVJvbGUgPT0gXFwndHJ1ZVxcJyB9fSc7XG5cbiAgY29uc3Qgc2VjcmV0c1BhcmFtcyA9XG4gICAgYXV0aFByb3ZpZGVyID09PSBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVIgP1xuICAgICAge1xuICAgICAgICAnYXdzLWFjY2Vzcy1rZXktaWQnOiAnJHt7IHNlY3JldHNbbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZV0gfX0nLFxuICAgICAgICAnYXdzLXNlY3JldC1hY2Nlc3Mta2V5JzogJyR7eyBzZWNyZXRzW21hdHJpeC5zZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lXSB9fScsXG4gICAgICB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGlmOiBjb25kaXRpb24sXG4gICAgbmFtZTogJ0Fzc3VtZSBBV1MgUm9sZScsXG4gICAgdXNlczogJ2F3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAdjQnLFxuICAgIHdpdGg6IHtcbiAgICAgIC4uLnNlY3JldHNQYXJhbXMsXG4gICAgICAncm9sZS10by1hc3N1bWUnOiAnJHt7IG1hdHJpeC5yb2xlVG9Bc3N1bWUgfX0nLFxuICAgICAgJ2F3cy1yZWdpb24nOiAnJHt7IG1hdHJpeC5yZWdpb24gfX0nLFxuICAgICAgJ3JvbGUtZHVyYXRpb24tc2Vjb25kcyc6ICcke3sgbWF0cml4LmFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHMgfX0nLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBd3NDcmVkZW50aWFsc1N0ZXBzKFxuICBjaGVja0FjdGl2ZURlcGxveW1lbnQ6IGJvb2xlYW4sXG4gIGF1dGhQcm92aWRlcjogQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyID0gQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSKVxuICA6IEpvYlN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAgc2V0QXdzQ3JlZGVudGlhbHNJbkVudmlyb25tZW50KGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgYXNzdW1lQXdzUm9sZVN0ZXAoY2hlY2tBY3RpdmVEZXBsb3ltZW50LCBhdXRoUHJvdmlkZXIpLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TnBtQ29uZmlnKGNvbmZpZ05hbWU6IHN0cmluZywgY29uZmlnVmFsdWU6IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIGNvbnN0IGVudmlyb25tZW50VmFyaWFibGVOYW1lID0gJ0NPTkZJR19WQUxVRSc7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiAnU2V0dGluZyBOUE0gQ29uZmlnJyxcbiAgICBlbnY6IHtcbiAgICAgIFtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZV06IGNvbmZpZ1ZhbHVlLFxuICAgIH0sXG4gICAgcnVuOiBgbnBtIGNvbmZpZyBzZXQgJHtjb25maWdOYW1lfSAkJHtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZX1gLFxuICB9O1xufVxuXG5jb25zdCBjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwSWQgPSAnZGVwbG95bWVudC1jaGVjayc7XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcCgpOiBKb2JTdGVwIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcElkLFxuICAgIHVzZXM6ICdBbWluRmF6bE1vbmRvL2NoZWNrLWRlcGxveWVkLWVudmlyb25tZW50QHYxJyxcbiAgICB3aXRoOiB7XG4gICAgICBlbnZpcm9ubWVudDogJyR7eyBtYXRyaXguZW52aXJvbm1lbnQgfX0nLFxuICAgIH0sXG4gICAgZW52OiB7XG4gICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IHNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uPSBgc3RlcHMuJHtjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwSWR9Lm91dHB1dHMuaGFzX2FjdGl2ZV9kZXBsb3ltZW50ICE9ICd0cnVlJ2A7XG5cbmZ1bmN0aW9uIGdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2hlY2tBY3RpdmVEZXBsb3ltZW50ID8geyBpZjogYFxcJHt7ICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCB9IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zdERlcGxveW1lbnRTdGVwKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbiwgcGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gIGNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgYFxcJHt7IG1hdHJpeC5oYXNQb3N0RGVwbG95VGFzayA9PSAndHJ1ZScgJiYgJHtza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbn0gfX1gIDpcbiAgICAnJHt7IG1hdHJpeC5oYXNQb3N0RGVwbG95VGFzayA9PSBcXCd0cnVlXFwnIH19JztcbiAgcmV0dXJuIHtcbiAgICBpZjogY29uZGl0aW9uLFxuICAgIG5hbWU6ICdQb3N0IERlcGxveW1lbnQnLFxuICAgIHJ1bjogYCR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kUHJlZml4KHBhY2thZ2VNYW5hZ2VyKX0gXFwke3sgbWF0cml4LnBvc3REZXBsb3ltZW50U2NyaXB0IH19YCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZURlcGxveW1lbnRTdGVwKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbiwgcGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gIGNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgYFxcJHt7IG1hdHJpeC5oYXNQcmVEZXBsb3lUYXNrID09ICd0cnVlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICcke3sgbWF0cml4Lmhhc1ByZURlcGxveVRhc2sgPT0gXFwndHJ1ZVxcJyB9fSc7XG4gIHJldHVybiB7XG4gICAgaWY6IGNvbmRpdGlvbixcbiAgICBuYW1lOiAnUHJlIERlcGxveW1lbnQnLFxuICAgIHJ1bjogYCR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kUHJlZml4KHBhY2thZ2VNYW5hZ2VyKX0gXFwke3sgbWF0cml4LnByZURlcGxveW1lbnRTY3JpcHQgfX1gLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXAodGFza05hbWU6IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiB0YXNrTmFtZSxcbiAgICBydW46IGBucHggcHJvamVuICR7dGFza05hbWV9YCxcbiAgfTtcbn0iXX0=
|
|
512
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsOENBQWtEO0FBQ2xELHVFQUFnRjtBQUNoRixzREFBaUU7QUFDakUsbUNBQWtIO0FBRWxILE1BQU0sMkJBQTJCLEdBQUcsa0JBQWtCLENBQUM7QUFDdkQsTUFBTSxzQ0FBc0MsR0FBRSxTQUFTLDJCQUEyQiwwQ0FBMEMsQ0FBQztBQXdDN0g7OztHQUdHO0FBQ0gsTUFBYSx5Q0FBeUM7SUFFcEQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FDckQsYUFBNEIsRUFDNUIsdUJBQTBEO1FBRzFELElBQUksYUFBYSxDQUFDLFdBQVcsS0FBSyx5QkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLCtFQUErRSxDQUFDLENBQUM7UUFDbkcsQ0FBQztRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQzlELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsd0VBQXdFLENBQUMsQ0FBQztZQUMvRyxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakIsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FB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O1FBRUQsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1DQUFtQyxDQUNqRSxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQzFELGtCQUFrQixDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FDbEQsQ0FBQztRQUNGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBRUY7QUF2b0JELDhGQXVvQkM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxlQUF1QjtJQUM3QyxPQUFPLFVBQVUsZUFBZSxFQUFFLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGphdmFzY3JpcHQgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgV29ya2Zsb3dTdGVwcyB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24sIEpvYlN0ZXAsIEpvYiB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbCc7XG5pbXBvcnQgeyBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuaW1wb3J0IHsgRGVwbG95Sm9iU3RyYXRlZ3ksIERlcGxveU9wdGlvbnMsIEVudmlyb25tZW50RGVwbG95bWVudERlcGVuZGVuY2llcywgRW52aXJvbm1lbnRPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBJZCA9ICdkZXBsb3ltZW50LWNoZWNrJztcbmNvbnN0IHNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uPSBgc3RlcHMuJHtjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwSWR9Lm91dHB1dHMuaGFzX2FjdGl2ZV9kZXBsb3ltZW50ICE9ICd0cnVlJ2A7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95YWJsZUF3c0Nka1R5cGVTY3JpcHRBcHBTdGVwc0ZhY3RvcnlQcm9wcyB7XG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveU9wdGlvbnM6IERlcGxveU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gY2hlY2sgZm9yIGFjdGl2ZSBkZXBsb3ltZW50cyBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIGRlcGxveW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gcnVuIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcywgaWYgYW55XG4gICAqL1xuICByZWFkb25seSBwcmVJbnN0YWxsVGFza05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBmb3IgQ29kZUFydGlmYWN0LCBpZiBhbnlcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhQcm92aWRlcj86IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlcjtcblxuICAvKipcbiAgICogVGhlIG5wbSBjb25maWcgdG8gc2V0IHdpdGggdGhlIGVudmlyb25tZW50IHRoYXQgaXMgYmVpbmcgZGVwbG95ZWQsIGlmIGFueVxuICAgKiBOb3RlOiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vZGUgdmVyc2lvbnMgYWJvdmUgMThcbiAgICovXG4gIHJlYWRvbmx5IG5wbUNvbmZpZ0Vudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IGpvYiBzdHJhdGVneSwgd2hldGhlciB0byB1c2UgYSBtYXRyaXggam9iIG9yIG11bHRpcGxlIGpvYnMgZm9yIGVhY2ggZW52aXJvbm1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGpvYlN0cmF0ZWd5OiBEZXBsb3lKb2JTdHJhdGVneTtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgZGVwbG95bWVudCBkZXBlbmRlbmNpZXMsIGlmIGFueVxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnREZXBlbmRlbmNpZXM/OiBFbnZpcm9ubWVudERlcGxveW1lbnREZXBlbmRlbmNpZXM7XG59XG5cbi8qKlxuICogRmFjdG9yeSB0byBjcmVhdGUgcmV1c2FibGUgc3RlcHMgZm9yIHRoZSBkZXBsb3ltZW50IHdvcmtmbG93XG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3lhYmxlQXdzQ2RrVHlwZVNjcmlwdEFwcFN0ZXBzRmFjdG9yeSB7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIHByb3ZpZGVkIGVudmlyb25tZW50IGRlcGxveW1lbnQgZGVwZW5kZW5jaWVzIGFyZSB2YWxpZFxuICAgKiBAcGFyYW0gZGVwbG95T3B0aW9ucyBUaGUgZGVwbG95bWVudCBvcHRpb25zXG4gICAqIEBwYXJhbSBlbnZpcm9ubWVudERlcGVuZGVuY2llcyBUaGUgZW52aXJvbm1lbnQgZGVwbG95bWVudCBkZXBlbmRlbmNpZXMgdG8gdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVFbnZpcm9ubWVudERlcGxveW1lbnREZXBlbmRlbmNpZXMoXG4gICAgZGVwbG95T3B0aW9uczogRGVwbG95T3B0aW9ucyxcbiAgICBlbnZpcm9ubWVudERlcGVuZGVuY2llczogRW52aXJvbm1lbnREZXBsb3ltZW50RGVwZW5kZW5jaWVzLFxuICApOiB2b2lkIHtcblxuICAgIGlmIChkZXBsb3lPcHRpb25zLmpvYlN0cmF0ZWd5ICE9PSBEZXBsb3lKb2JTdHJhdGVneS5NVUxUSV9KT0IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW52aXJvbm1lbnQgZGVwbG95bWVudCBkZXBlbmRlbmNpZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBNVUxUSV9KT0Igc3RyYXRlZ3knKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyhlbnZpcm9ubWVudERlcGVuZGVuY2llcykuZm9yRWFjaCgoW2VudiwgZGVwc10pID0+IHtcbiAgICAgIGNvbnN0IGhhc0Vudmlyb25tZW50ID0gZGVwbG95T3B0aW9ucy5lbnZpcm9ubWVudHMuc29tZShlID0+IGUubmFtZSA9PT0gZW52KTtcbiAgICAgIGlmICghaGFzRW52aXJvbm1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnZpcm9ubWVudCBcIiR7ZW52fVwiIGRlZmluZWQgaW4gZGVwZW5kZW5jaWVzIGRvZXMgbm90IGV4aXN0IGluIGRlcGxveU9wdGlvbnMuZW52aXJvbm1lbnRzYCk7XG4gICAgICB9XG4gICAgICBkZXBzLmZvckVhY2goZGVwID0+IHtcbiAgICAgICAgY29uc3QgaGFzRGVwRW52aXJvbm1lbnQgPSBkZXBsb3lPcHRpb25zLmVudmlyb25tZW50cy5zb21lKGUgPT4gZS5uYW1lID09PSBkZXApO1xuICAgICAgICBpZiAoIWhhc0RlcEVudmlyb25tZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5IGVudmlyb25tZW50IFwiJHtkZXB9XCIgZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCIgZG9lcyBub3QgZXhpc3QgaW4gZGVwbG95T3B0aW9ucy5lbnZpcm9ubWVudHNgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IERlcGxveWFibGVBd3NDZGtUeXBlU2NyaXB0QXBwU3RlcHNGYWN0b3J5XG4gICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgZmFjdG9yeSBwcm9wZXJ0aWVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3Q6IGphdmFzY3JpcHQuTm9kZVByb2plY3QsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogRGVwbG95YWJsZUF3c0Nka1R5cGVTY3JpcHRBcHBTdGVwc0ZhY3RvcnlQcm9wcyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDb25kaXRpb24gdG8gc2tpcCBhIHN0ZXAgaWYgYW4gYWN0aXZlIGRlcGxveW1lbnQgaXMgYWxyZWFkeSBwcmVzZW50XG4gICAqIEByZXR1cm5zIEpvYlN0ZXAgY29uZGl0aW9uIG9yIHVuZGVmaW5lZCBpZiBjaGVja0FjdGl2ZURlcGxveW1lbnQgaXMgZmFsc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hlY2tBY3RpdmVEZXBsb3ltZW50ID8geyBpZjogYFxcJHt7ICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCB9IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGVja291dFN0ZXAoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIFdvcmtmbG93U3RlcHMuY2hlY2tvdXQoe1xuICAgICAgd2l0aDoge1xuICAgICAgICBmZXRjaERlcHRoOiAwLFxuICAgICAgICByZWY6ICcke3sgZ2l0aHViLnNoYSB9fScsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gcnVuIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcyBpZiBleGlzdHNcbiAgICogQHJldHVybnMgSm9iU3RlcCBvciB1bmRlZmluZWQgaWYgbm8gcHJlSW5zdGFsbFRhc2tOYW1lIGlzIHByb3ZpZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByZUluc3RhbGxEZXBlbmRlbmNpZXNTdGVwKCk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5wcm9wcy5wcmVJbnN0YWxsVGFza05hbWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24sXG4gICAgICBuYW1lOiB0aGlzLnByb3BzLnByZUluc3RhbGxUYXNrTmFtZSxcbiAgICAgIHJ1bjogYG5weCBwcm9qZW4gJHt0aGlzLnByb3BzLnByZUluc3RhbGxUYXNrTmFtZX1gLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBjaGVjayBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGVwbG95bWVudCBmb3IgdGhlIGVudmlyb25tZW50IGluIHRoZSBtYXRyaXggc3RyYXRlZ3lcbiAgICogQHJldHVybnMgSm9iU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwRm9yTWF0cml4KCk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldENoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBGb3JFbnZpcm9ubWVudCgnJHt7IG1hdHJpeC5lbnZpcm9ubWVudCB9fScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRlcGxveW1lbnQgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBKb2JTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KGVudmlyb25tZW50OiBzdHJpbmcpOiBKb2JTdGVwIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuY2hlY2tBY3RpdmVEZXBsb3ltZW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcElkLFxuICAgICAgdXNlczogJ0FtaW5GYXpsTW9uZG8vY2hlY2stZGVwbG95ZWQtZW52aXJvbm1lbnRAdjEnLFxuICAgICAgd2l0aDoge1xuICAgICAgICBlbnZpcm9ubWVudDogZW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgICAgZW52OiB7XG4gICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBzZXR1cCBBV1MgY3JlZGVudGlhbHMgaW4gdGhlIGVudmlyb25tZW50IGZvciB0aGUgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBbXVxuICAgKi9cbiAgcHVibGljIGdldCBzZXR1cEF3c0NyZWRlbnRpYWxzU3RlcHNGb3JNYXRyaXgoKTogSm9iU3RlcFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5zZXR1cEF3c0NyZWRlbnRpYWxzSW5FbnZpcm9ubWVudEZvck1hdHJpeCxcbiAgICAgIHRoaXMuYXNzdW1lQXdzUm9sZVN0ZXBGb3JNYXRyaXgsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0ZXBzIHRvIHNldHVwIEFXUyBjcmVkZW50aWFscyBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnRPcHRpb25zIFRoZSBlbnZpcm9ubWVudCBvcHRpb25zXG4gICAqIEByZXR1cm5zIEpvYlN0ZXBbXVxuICAgKi9cbiAgcHVibGljIGdldFNldHVwQXdzQ3JlZGVudGlhbHNTdGVwc0ZvckVudmlyb25tZW50KGVudmlyb25tZW50T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25zKTogSm9iU3RlcFtdIHtcbiAgICBjb25zdCBzdGVwczogSm9iU3RlcFtdID0gW107XG5cbiAgICBjb25zdCBmcm9tRW52VmFyaWFibGVTdGVwID0gdGhpcy5nZXRTZXR1cEF3c0NyZWRlbnRpYWxzSW5FbnZpcm9ubWVudEZvckVudmlyb25tZW50KFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5hd3NDcmVkZW50aWFscy5hY2Nlc3NLZXlJZFNlY3JldE5hbWUgPz8gJ0FXU19BQ0NFU1NfS0VZX0lEJyxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5hd3NDcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lID8/ICdBV1NfU0VDUkVUX0FDQ0VTU19LRVknLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnJlZ2lvbixcbiAgICApO1xuXG4gICAgaWYgKGZyb21FbnZWYXJpYWJsZVN0ZXApIHtcbiAgICAgIHN0ZXBzLnB1c2goZnJvbUVudlZhcmlhYmxlU3RlcCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzdW1lUm9sZVN0ZXAgPSB0aGlzLmdldEFzc3VtZUF3c1JvbGVTdGVwRm9yRW52aXJvbm1lbnQoXG4gICAgICBlbnZpcm9ubWVudE9wdGlvbnMuYXdzQ3JlZGVudGlhbHMucm9sZVRvQXNzdW1lID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLmFjY2Vzc0tleUlkU2VjcmV0TmFtZSA/PyAnQVdTX0FDQ0VTU19LRVlfSUQnLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUgPz8gJ0FXU19TRUNSRVRfQUNDRVNTX0tFWScsXG4gICAgICBlbnZpcm9ubWVudE9wdGlvbnMuYXdzQ3JlZGVudGlhbHMucmVnaW9uLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/PyAnJyxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5hd3NDcmVkZW50aWFscy5hc3N1bWVSb2xlRHVyYXRpb25TZWNvbmRzID8/IDkwMCxcbiAgICApO1xuXG4gICAgaWYgKGFzc3VtZVJvbGVTdGVwKSB7XG4gICAgICBzdGVwcy5wdXNoKGFzc3VtZVJvbGVTdGVwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBzZXR1cCBBV1MgY3JlZGVudGlhbHMgaW4gdGhlIGVudmlyb25tZW50IGZvciB0aGUgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dXBBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnRGb3JNYXRyaXgoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2V0dXBBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnRGb3JFbnZpcm9ubWVudChcbiAgICAgICdtYXRyaXguYXNzdW1lUm9sZScsXG4gICAgICAnbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZScsXG4gICAgICAnbWF0cml4LnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUnLFxuICAgICAgJyR7eyBtYXRyaXgucmVnaW9uIH19JyxcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRvIHNldHVwIEFXUyBjcmVkZW50aWFscyBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGFzc3VtZVJvbGVGbGFnIFdoZXRoZXIgdG8gYXNzdW1lIGEgcm9sZSwgY2FuIGJlIGEgYm9vbGVhbiBvciBhIHN0cmluZyBmb3IgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEBwYXJhbSBhY2Nlc3NLZXlJZFNlY3JldE5hbWUgVGhlIEdpdEh1YiBzZWNyZXQgbmFtZSBmb3IgdGhlIGFjY2VzcyBrZXkgSURcbiAgICogQHBhcmFtIHNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUgVGhlIEdpdEh1YiBzZWNyZXQgbmFtZSBmb3IgdGhlIHNlY3JldCBhY2Nlc3Mga2V5XG4gICAqIEBwYXJhbSByZWdpb24gVGhlIHJlZ2lvblxuICAgKiBAcmV0dXJucyBKb2JTdGVwIG9yIHVuZGVmaW5lZCBpZiBubyBBV1MgY3JlZGVudGlhbHMgYXJlIHByb3ZpZGVkLFxuICAgKiBpZiBhc3N1bWVSb2xlRmxhZyBpcyBib29sZWFuIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCByZXR1cm4gYSBKb2JTdGVwIG9ubHkgaWYgZmFsc2VcbiAgICogaWYgYXNzdW1lUm9sZUZsYWcgaXMgc3RyaW5nIHdpbGwgYWx3YXlzIHJldHVybiBhIEpvYlN0ZXAgKGZvciBtYXRyaXggc3RyYXRlZ3kpXG4gICAqL1xuICBwdWJsaWMgZ2V0U2V0dXBBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnRGb3JFbnZpcm9ubWVudChcbiAgICBhc3N1bWVSb2xlRmxhZzogYm9vbGVhbiB8IHN0cmluZyxcbiAgICBhY2Nlc3NLZXlJZFNlY3JldE5hbWU6IHN0cmluZyxcbiAgICBzZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lOiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKGZhY3Rvcnk6IERlcGxveWFibGVBd3NDZGtUeXBlU2NyaXB0QXBwU3RlcHNGYWN0b3J5KSB7XG4gICAgICBpZiAodHlwZW9mIGFzc3VtZVJvbGVGbGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgaWYgKGFzc3VtZVJvbGVGbGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFjdG9yeS5wcm9wcy5jaGVja0FjdGl2ZURlcGxveW1lbnQgPyBza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbiA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWN0b3J5LnByb3BzLmNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgICAgIGBcXCR7eyAke2Fzc3VtZVJvbGVGbGFnfSA9PSAnZmFsc2UnICYmICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCA6XG4gICAgICAgIGBcXCR7eyAke2Fzc3VtZVJvbGVGbGFnfSA9PSAnZmFsc2UnIH19YDtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAgICdlY2hvIFwiQVdTX0FDQ0VTU19LRVlfSUQ9JGFjY2Vzc0tleUlkXCIgPj4gJEdJVEhVQl9FTlYnLFxuICAgICAgJ2VjaG8gXCJBV1NfU0VDUkVUX0FDQ0VTU19LRVk9JHNlY3JldEFjY2Vzc0tleVwiID4+ICRHSVRIVUJfRU5WJyxcbiAgICAgICdlY2hvIFwiQVdTX1JFR0lPTj0kcmVnaW9uXCIgPj4gJEdJVEhVQl9FTlYnLFxuICAgIF07XG5cbiAgICBpZiAodHlwZW9mIGFzc3VtZVJvbGVGbGFnID09PSAnYm9vbGVhbicgJiYgYXNzdW1lUm9sZUZsYWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9uID0gZ2V0Q29uZGl0aW9uKHRoaXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlmOiBjb25kaXRpb24sXG4gICAgICBuYW1lOiAnQ29uZmlndXJlIEFXUyBDcmVkZW50aWFscycsXG4gICAgICBydW46IGAke2NvbW1hbmRzLmpvaW4oJ1xcbicpfWAsXG4gICAgICBlbnY6IHtcbiAgICAgICAgYWNjZXNzS2V5SWQ6IGBcXCR7eyBzZWNyZXRzWyR7YWNjZXNzS2V5SWRTZWNyZXROYW1lfV0gfX1gLFxuICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IGBcXCR7eyBzZWNyZXRzWyR7c2VjcmV0QWNjZXNzS2V5U2VjcmV0TmFtZX1dIH19YCxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gYXNzdW1lIGFuIEFXUyByb2xlIGZvciB0aGUgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgYXNzdW1lQXdzUm9sZVN0ZXBGb3JNYXRyaXgoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXNzdW1lQXdzUm9sZVN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICAgICdtYXRyaXguYXNzdW1lUm9sZScsXG4gICAgICAnbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZScsXG4gICAgICAnbWF0cml4LnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUnLFxuICAgICAgJyR7eyBtYXRyaXgucmVnaW9uIH19JyxcbiAgICAgICcke3sgbWF0cml4LnJvbGVUb0Fzc3VtZSB9fScsXG4gICAgICAnJHt7IG1hdHJpeC5hc3N1bWVSb2xlRHVyYXRpb25TZWNvbmRzIH19JyxcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRvIGFzc3VtZSBhbiBBV1Mgcm9sZSBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0gYXNzdW1lUm9sZUZsYWcgV2hldGhlciB0byBhc3N1bWUgYSByb2xlLCBjYW4gYmUgYSBib29sZWFuIG9yIGEgc3RyaW5nIGZvciBtYXRyaXggc3RyYXRlZ3lcbiAgICogQHBhcmFtIGFjY2Vzc0tleUlkU2VjcmV0TmFtZSBUaGUgR2l0SHViIHNlY3JldCBuYW1lIGZvciB0aGUgYWNjZXNzIGtleSBJRFxuICAgKiBAcGFyYW0gc2VjcmV0QWNjZXNzS2V5U2VjcmV0TmFtZSBUaGUgR2l0SHViIHNlY3JldCBuYW1lIGZvciB0aGUgc2VjcmV0IGFjY2VzcyBrZXlcbiAgICogQHBhcmFtIHJlZ2lvbiBUaGUgcmVnaW9uXG4gICAqIEBwYXJhbSByb2xlVG9Bc3N1bWUgVGhlIHJvbGUgdG8gYXNzdW1lXG4gICAqIEBwYXJhbSBhc3N1bWVSb2xlRHVyYXRpb25TZWNvbmRzIFRoZSBkdXJhdGlvbiBmb3IgYXNzdW1pbmcgdGhlIHJvbGVcbiAgICogQHJldHVybnMgSm9iU3RlcCBvciB1bmRlZmluZWQgaWYgYXNzdW1lUm9sZUZsYWcgaXMgYm9vbGVhbiBhbmQgZmFsc2VcbiAgICogaWYgYXNzdW1lUm9sZUZsYWcgaXMgc3RyaW5nIHdpbGwgYWx3YXlzIHJldHVybiBhIEpvYlN0ZXAgKGZvciBtYXRyaXggc3RyYXRlZ3kpXG4gICAqL1xuICBwdWJsaWMgZ2V0QXNzdW1lQXdzUm9sZVN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICBhc3N1bWVSb2xlRmxhZzogYm9vbGVhbiB8IHN0cmluZyxcbiAgICBhY2Nlc3NLZXlJZFNlY3JldE5hbWU6IHN0cmluZyxcbiAgICBzZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lOiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcm9sZVRvQXNzdW1lOiBzdHJpbmcsXG4gICAgYXNzdW1lUm9sZUR1cmF0aW9uU2Vjb25kcz86IHN0cmluZyB8IG51bWJlcixcbiAgKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKGZhY3Rvcnk6IERlcGxveWFibGVBd3NDZGtUeXBlU2NyaXB0QXBwU3RlcHNGYWN0b3J5KSB7XG4gICAgICBpZiAodHlwZW9mIGFzc3VtZVJvbGVGbGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgaWYgKCFhc3N1bWVSb2xlRmxhZykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhY3RvcnkucHJvcHMuY2hlY2tBY3RpdmVEZXBsb3ltZW50ID8gc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFjdG9yeS5wcm9wcy5jaGVja0FjdGl2ZURlcGxveW1lbnQgP1xuICAgICAgICBgXFwke3sgJHthc3N1bWVSb2xlRmxhZ30gPT0gJ3RydWUnICYmICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCA6XG4gICAgICAgIGBcXCR7eyAke2Fzc3VtZVJvbGVGbGFnfSA9PSAndHJ1ZScgfX1gO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXNzdW1lUm9sZUZsYWcgPT09ICdib29sZWFuJyAmJiAhYXNzdW1lUm9sZUZsYWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9uID0gZ2V0Q29uZGl0aW9uKHRoaXMpO1xuXG4gICAgY29uc3Qgc2VjcmV0c1BhcmFtcyA9XG4gICAgICB0aGlzLnByb3BzLmF1dGhQcm92aWRlciA9PT0gQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSID9cbiAgICAgICAge1xuICAgICAgICAgICdhd3MtYWNjZXNzLWtleS1pZCc6IGBcXCR7eyBzZWNyZXRzWyR7YWNjZXNzS2V5SWRTZWNyZXROYW1lfV0gfX1gLFxuICAgICAgICAgICdhd3Mtc2VjcmV0LWFjY2Vzcy1rZXknOiBgXFwke3sgc2VjcmV0c1ske3NlY3JldEFjY2Vzc0tleVNlY3JldE5hbWV9XSB9fWAsXG4gICAgICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlmOiBjb25kaXRpb24sXG4gICAgICBuYW1lOiAnQXNzdW1lIEFXUyBSb2xlJyxcbiAgICAgIHVzZXM6ICdhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQHY0JyxcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLi4uc2VjcmV0c1BhcmFtcyxcbiAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogcm9sZVRvQXNzdW1lLFxuICAgICAgICAnYXdzLXJlZ2lvbic6IHJlZ2lvbixcbiAgICAgICAgJ3JvbGUtZHVyYXRpb24tc2Vjb25kcyc6IGFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBzZXR1cCBOUE0gY29uZmlnIGlmIHByb3ZpZGVkXG4gICAqIEByZXR1cm5zIEpvYlN0ZXAgb3IgdW5kZWZpbmVkIGlmIG5vIG5wbUNvbmZpZyBpcyBwcm92aWRlZFxuICAgKi9cbiAgcHVibGljIGdldCBzZXR1cE5wbUNvbmZpZ0Zvck1hdHJpeCgpOiBKb2JTdGVwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXR1cE5wbUNvbmZpZ0ZvckVudmlyb25tZW50KCcke3sgbWF0cml4LmVudmlyb25tZW50IH19Jyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dXBOcG1Db25maWdGb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudDogc3RyaW5nKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBucG1Db25maWdFbnZpcm9ubWVudCB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoIW5wbUNvbmZpZ0Vudmlyb25tZW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50VmFyaWFibGVOYW1lID0gJ0NPTkZJR19WQUxVRSc7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24sXG4gICAgICBuYW1lOiAnU2V0dGluZyBOUE0gQ29uZmlnJyxcbiAgICAgIGVudjoge1xuICAgICAgICBbZW52aXJvbm1lbnRWYXJpYWJsZU5hbWVdOiBlbnZpcm9ubWVudCxcbiAgICAgIH0sXG4gICAgICBydW46IGBucG0gY29uZmlnIHNldCAke25wbUNvbmZpZ0Vudmlyb25tZW50fSAkJHtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZX1gLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdGVwIHRvIHJ1biBhIHNwZWNpZmljIHNjcmlwdFxuICAgKiBAcGFyYW0gc2NyaXB0TmFtZSBUaGUgbmFtZSBvZiB0aGUgc2NyaXB0IHRvIHJ1blxuICAgKiBAcGFyYW0gc3RlcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0ZXAgaW4gdGhlIHdvcmtmbG93XG4gICAqIEBwYXJhbSBoYXNTY3JpcHRGbGFnIFdoZXRoZXIgdGhlIHNjcmlwdCBzaG91bGQgYmUgcnVuXG4gICAqIEByZXR1cm5zIFRoZSBqb2Igc3RlcCB0byBydW4gdGhlIHNjcmlwdCBvciB1bmRlZmluZWQgaWYgbm90IGFwcGxpY2FibGVcbiAgICogSWYgaGFzU2NyaXB0RmxhZyBpcyBib29sZWFuIGFuZCBmYWxzZSB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICogSWYgaGFzU2NyaXB0RmxhZyBpcyBzdHJpbmcgd2lsbCBhbHdheXMgcmV0dXJuIGEgSm9iU3RlcCAoZm9yIG1hdHJpeCBzdHJhdGVneSlcbiAgICovXG4gIHB1YmxpYyBnZXRSdW5TY3JpcHRTdGVwKFxuICAgIHNjcmlwdE5hbWU6IHN0cmluZyxcbiAgICBzdGVwTmFtZTogc3RyaW5nLFxuICAgIGhhc1NjcmlwdEZsYWc6IGJvb2xlYW4gfCBzdHJpbmcsXG4gICk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGZ1bmN0aW9uIGdldENvbmRpdGlvbihmYWN0b3J5OiBEZXBsb3lhYmxlQXdzQ2RrVHlwZVNjcmlwdEFwcFN0ZXBzRmFjdG9yeSkge1xuICAgICAgaWYgKHR5cGVvZiBoYXNTY3JpcHRGbGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgaWYgKCFoYXNTY3JpcHRGbGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFjdG9yeS5wcm9wcy5jaGVja0FjdGl2ZURlcGxveW1lbnQgPyBza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbiA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWN0b3J5LnByb3BzLmNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgICAgIGBcXCR7eyAke2hhc1NjcmlwdEZsYWd9ID09ICd0cnVlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICAgICBgXFwke3sgJHtoYXNTY3JpcHRGbGFnfSA9PSAndHJ1ZScgfX1gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGhhc1NjcmlwdEZsYWcgPT09ICdib29sZWFuJyAmJiAhaGFzU2NyaXB0RmxhZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25kaXRpb24gPSBnZXRDb25kaXRpb24odGhpcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWY6IGNvbmRpdGlvbixcbiAgICAgIG5hbWU6IGBSdW4gJHtzdGVwTmFtZX1gLFxuICAgICAgcnVuOiBgJHt0aGlzLnByb2plY3QucnVuU2NyaXB0Q29tbWFuZH0gJHtzY3JpcHROYW1lfWAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRvIGRlcGxveSB0aGUgd29ya2Zsb3dcbiAgICogQHJldHVybnMgSm9iU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBkZXBsb3ltZW50U3RlcCgpOiBKb2JTdGVwIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSdW5TY3JpcHRTdGVwKFxuICAgICAgJ2RlcGxveTp3b3JrZmxvdycsXG4gICAgICAnRGVwbG95bWVudCcsXG4gICAgICB0cnVlLFxuICAgICkhO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gcnVuIHBvc3QgZGVwbG95bWVudCBzY3JpcHQgaW4gbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJlRGVwbG95bWVudFN0ZXBGb3JNYXRyaXgoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJlRGVwbG95bWVudFN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICAgICdtYXRyaXguaGFzUHJlRGVwbG95VGFzaycsXG4gICAgICAnJHt7IG1hdHJpeC5wcmVEZXBsb3ltZW50U2NyaXB0IH19JyxcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHByZS1kZXBsb3ltZW50IHN0ZXAgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGhhc1ByZURlcGxveVRhc2tGbGFnIFdoZXRoZXIgdGhlIHByZS1kZXBsb3ltZW50IHRhc2sgc2hvdWxkIGJlIHJ1blxuICAgKiBAcGFyYW0gcHJlRGVwbG95bWVudFNjcmlwdCBUaGUgc2NyaXB0IHRvIHJ1blxuICAgKiBAcmV0dXJucyBUaGUgam9iIHN0ZXAgdG8gcnVuIHRoZSBwcmUtZGVwbG95bWVudCBzY3JpcHQgb3IgdW5kZWZpbmVkIGlmIG5vdCBhcHBsaWNhYmxlXG4gICAqIElmIGhhc1ByZURlcGxveVRhc2tGbGFnIGlzIGJvb2xlYW4gYW5kIGZhbHNlIHdpbGwgcmV0dXJuIHVuZGVmaW5lZFxuICAgKiBJZiBoYXNQcmVEZXBsb3lUYXNrRmxhZyBpcyBzdHJpbmcgd2lsbCBhbHdheXMgcmV0dXJuIGEgSm9iU3RlcCAoZm9yIG1hdHJpeCBzdHJhdGVneSlcbiAgICovXG4gIHB1YmxpYyBnZXRQcmVEZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgIGhhc1ByZURlcGxveVRhc2tGbGFnOiBib29sZWFuIHwgc3RyaW5nLFxuICAgIHByZURlcGxveW1lbnRTY3JpcHQ6IHN0cmluZyxcbiAgKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSdW5TY3JpcHRTdGVwKFxuICAgICAgcHJlRGVwbG95bWVudFNjcmlwdCxcbiAgICAgICdQcmUgRGVwbG95bWVudCcsXG4gICAgICBoYXNQcmVEZXBsb3lUYXNrRmxhZyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gcnVuIHBvc3QgZGVwbG95bWVudCBzY3JpcHQgaW4gbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcG9zdERlcGxveW1lbnRTdGVwRm9yTWF0cml4KCk6IEpvYlN0ZXAge1xuICAgIHJldHVybiB0aGlzLmdldFBvc3REZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgICAgJ21hdHJpeC5oYXNQb3N0RGVwbG95VGFzaycsXG4gICAgICAnJHt7IG1hdHJpeC5wb3N0RGVwbG95bWVudFNjcmlwdCB9fScsXG4gICAgKSE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwb3N0LWRlcGxveW1lbnQgc3RlcCBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0gaGFzUG9zdERlcGxveVRhc2tGbGFnIFdoZXRoZXIgdGhlIHBvc3QtZGVwbG95bWVudCB0YXNrIHNob3VsZCBiZSBydW5cbiAgICogQHBhcmFtIHBvc3REZXBsb3ltZW50U2NyaXB0IFRoZSBzY3JpcHQgdG8gcnVuXG4gICAqIEByZXR1cm5zIFRoZSBqb2Igc3RlcCB0byBydW4gdGhlIHBvc3QtZGVwbG95bWVudCBzY3JpcHQgb3IgdW5kZWZpbmVkIGlmIG5vdCBhcHBsaWNhYmxlXG4gICAqIElmIGhhc1Bvc3REZXBsb3lUYXNrRmxhZyBpcyBib29sZWFuIGFuZCBmYWxzZSB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICogSWYgaGFzUG9zdERlcGxveVRhc2tGbGFnIGlzIHN0cmluZyB3aWxsIGFsd2F5cyByZXR1cm4gYSBKb2JTdGVwIChmb3IgbWF0cml4IHN0cmF0ZWd5KVxuICAgKi9cbiAgcHVibGljIGdldFBvc3REZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgIGhhc1Bvc3REZXBsb3lUYXNrRmxhZzogYm9vbGVhbiB8IHN0cmluZyxcbiAgICBwb3N0RGVwbG95bWVudFNjcmlwdDogc3RyaW5nLFxuICApOiBKb2JTdGVwIHwgdW5kZWZpbmVkIHtcblxuICAgIHJldHVybiB0aGlzLmdldFJ1blNjcmlwdFN0ZXAoXG4gICAgICBwb3N0RGVwbG95bWVudFNjcmlwdCxcbiAgICAgICdQb3N0IERlcGxveW1lbnQnLFxuICAgICAgaGFzUG9zdERlcGxveVRhc2tGbGFnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBkZXBsb3ltZW50IGpvYnMgd2hldGhlciBmb3IgbWF0cml4IHN0cmF0ZWd5IG9yIG5vdFxuICAgKiBAcmV0dXJucyBSZWNvcmQgb2Ygam9ic1xuICAgKi9cbiAgcHVibGljIGdldCBkZXBsb3ltZW50Sm9icygpOiBSZWNvcmQ8c3RyaW5nLCBKb2I+IHtcblxuICAgIGlmICh0aGlzLnByb3BzLmRlcGxveU9wdGlvbnMuZW52aXJvbm1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci53YXJuKCdUaGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGFueSBlbnZpcm9ubWVudCBzZXQsIG1ha2Ugc3VyZSB0aGlzIGlzIGRlc2lyZWQgc2V0dGluZycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5qb2JTdHJhdGVneSA9PT0gRGVwbG95Sm9iU3RyYXRlZ3kuTUFUUklYID8gdGhpcy5kZXBsb3ltZW50Sm9ic0Zvck1hdHJpeCA6IHRoaXMuZ2V0RGVwbG95bWVudEpvYnNGb3JNdWx0aUpvYigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXBsb3ltZW50IGpvYnMgZm9yIG1hdHJpeCBzdHJhdGVneVxuICAgKiBAcmV0dXJucyBSZWNvcmQgb2Ygam9ic1xuICAgKi9cbiAgcHVibGljIGdldCBkZXBsb3ltZW50Sm9ic0Zvck1hdHJpeCgpOiBSZWNvcmQ8c3RyaW5nLCBKb2I+IHtcblxuICAgIGNvbnN0IHsgZW52aXJvbm1lbnRzLCBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZSB9ID0gdGhpcy5wcm9wcy5kZXBsb3lPcHRpb25zO1xuXG4gICAgY29uc3QgaW5jbHVkZSA9IGVudmlyb25tZW50cy5tYXAoZW52aXJvbm1lbnRPcHRpb25zID0+IHtcbiAgICAgIGNvbnN0IHsgYXdzQ3JlZGVudGlhbHMgfSA9IGVudmlyb25tZW50T3B0aW9ucztcblxuICAgICAgY29uc3QgYXNzdW1lUm9sZSA9IGF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICAgIGNvbnN0IGFzc3VtZVJvbGVTZXR0aW5ncyA9IGF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/IHtcbiAgICAgICAgcm9sZVRvQXNzdW1lOiBhd3NDcmVkZW50aWFscy5yb2xlVG9Bc3N1bWUsXG4gICAgICAgIGFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHM6IGF3c0NyZWRlbnRpYWxzLmFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHMgfHwgOTAwLFxuICAgICAgfTogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBhY2Nlc3NLZXlJZFNlY3JldE5hbWUgPSBhd3NDcmVkZW50aWFscy5hY2Nlc3NLZXlJZFNlY3JldE5hbWUgPz8gJ0FXU19BQ0NFU1NfS0VZX0lEJztcbiAgICAgIGNvbnN0IHNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUgPSBhd3NDcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lID8/ICdBV1NfU0VDUkVUX0FDQ0VTU19LRVknO1xuXG4gICAgICBjb25zdCBoYXNQb3N0RGVwbG95VGFzayA9IGVudmlyb25tZW50T3B0aW9ucy5wb3N0RGVwbG95V29ya2Zsb3dTY3JpcHQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgY29uc3QgaGFzUHJlRGVwbG95VGFzayA9IGVudmlyb25tZW50T3B0aW9ucy5wcmVEZXBsb3lXb3JrZmxvd1NjcmlwdCA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudE9wdGlvbnMubmFtZSxcbiAgICAgICAgYWNjZXNzS2V5SWRTZWNyZXROYW1lLFxuICAgICAgICBzZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lLFxuICAgICAgICByZWdpb246IGF3c0NyZWRlbnRpYWxzLnJlZ2lvbixcbiAgICAgICAgYXNzdW1lUm9sZSxcbiAgICAgICAgaGFzUG9zdERlcGxveVRhc2ssXG4gICAgICAgIHBvc3REZXBsb3ltZW50U2NyaXB0OiBlbnZpcm9ubWVudE9wdGlvbnMucG9zdERlcGxveVdvcmtmbG93U2NyaXB0IHx8ICcnLFxuICAgICAgICBoYXNQcmVEZXBsb3lUYXNrLFxuICAgICAgICBwcmVEZXBsb3ltZW50U2NyaXB0OiBlbnZpcm9ubWVudE9wdGlvbnMucHJlRGVwbG95V29ya2Zsb3dTY3JpcHQgfHwgJycsXG4gICAgICAgIC4uLmFzc3VtZVJvbGVTZXR0aW5ncyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBkZXBsb3lKb2JFbnYgPSBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZSA/IHtcbiAgICAgIFtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZV06ICcke3sgbWF0cml4LmVudmlyb25tZW50IH19JyxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgam9iRGVmaW5pdGlvbjogSm9iID0ge1xuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgICdncm91cCc6ICcke3sgbWF0cml4LmVudmlyb25tZW50IH19LWRlcGxveScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBuZWVkczogW1xuICAgICAgICAncmVsZWFzZV9naXRodWInLFxuICAgICAgXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgIGRlcGxveW1lbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgIGlkVG9rZW46IHRoaXMucHJvcHMuYXV0aFByb3ZpZGVyID09PSBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuR0lUSFVCX09JREMgPyBKb2JQZXJtaXNzaW9uLldSSVRFIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHN0cmF0ZWd5OiB7XG4gICAgICAgIG1heFBhcmFsbGVsOiAxLFxuICAgICAgICBtYXRyaXg6IHtcbiAgICAgICAgICBkb21haW46IHtcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBpbmNsdWRlLm1hcChlID0+IGUuZW52aXJvbm1lbnQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5jbHVkZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBuYW1lOiAnJHt7IG1hdHJpeC5lbnZpcm9ubWVudCB9fScsXG4gICAgICB9LFxuICAgICAgZW52OiBkZXBsb3lKb2JFbnYsXG4gICAgICBzdGVwczogW10sXG4gICAgfTtcblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCh0aGlzLmNoZWNrb3V0U3RlcCk7XG5cbiAgICBjb25zdCBwcmVJbnN0YWxsRGVwZW5kZW5jaWVzU3RlcCA9IHRoaXMucHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXA7XG4gICAgaWYgKHByZUluc3RhbGxEZXBlbmRlbmNpZXNTdGVwKSB7XG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2gocHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXApO1xuICAgIH1cblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCguLi4odGhpcy5wcm9qZWN0KS5yZW5kZXJXb3JrZmxvd1NldHVwKCkpO1xuXG4gICAgY29uc3QgY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvck1hdHJpeCA9IHRoaXMuY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvck1hdHJpeDtcbiAgICBpZiAoY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvck1hdHJpeCkge1xuICAgICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBGb3JNYXRyaXgpO1xuICAgIH1cblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCguLi50aGlzLnNldHVwQXdzQ3JlZGVudGlhbHNTdGVwc0Zvck1hdHJpeCk7XG5cbiAgICBjb25zdCBzZXR1cE5wbUNvbmZpZ1N0ZXAgPSB0aGlzLnNldHVwTnBtQ29uZmlnRm9yTWF0cml4O1xuICAgIGlmIChzZXR1cE5wbUNvbmZpZ1N0ZXApIHtcbiAgICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChzZXR1cE5wbUNvbmZpZ1N0ZXApO1xuICAgIH1cblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCh0aGlzLnByZURlcGxveW1lbnRTdGVwRm9yTWF0cml4KTtcbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2godGhpcy5kZXBsb3ltZW50U3RlcCk7XG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKHRoaXMucG9zdERlcGxveW1lbnRTdGVwRm9yTWF0cml4KTtcblxuICAgIHJldHVybiB7IGRlcGxveTogam9iRGVmaW5pdGlvbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgSURzIG9mIHRoZSBqb2JzIHRoYXQgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQncyBkZXBsb3ltZW50IGpvYlxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudFxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBqb2IgSURzXG4gICAqL1xuICBwdWJsaWMgZ2V0RGVwbG95bWVudEpvYlByZXJlcXVpc2l0ZUpvYklkcyhlbnZpcm9ubWVudE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbJ3JlbGVhc2VfZ2l0aHViJ107XG4gICAgaWYgKCF0aGlzLnByb3BzLmVudmlyb25tZW50RGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMucHJvcHMuZGVwbG95T3B0aW9ucy5lbnZpcm9ubWVudHMuZmluZEluZGV4KGVudiA9PiBlbnYubmFtZSA9PT0gZW52aXJvbm1lbnROYW1lKTtcbiAgICAgIGNvbnN0IHByZXJlcXVpc2l0ZUVudmlyb25tZW50ID0gaW5kZXggPiAwID8gdGhpcy5wcm9wcy5kZXBsb3lPcHRpb25zLmVudmlyb25tZW50c1tpbmRleCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHByZXJlcXVpc2l0ZUVudmlyb25tZW50KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGdldERlcGxveUpvYklkKHByZXJlcXVpc2l0ZUVudmlyb25tZW50Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gdGhpcy5wcm9wcy5lbnZpcm9ubWVudERlcGVuZGVuY2llc1tlbnZpcm9ubWVudE5hbWVdO1xuICAgICAgaWYgKGRlcGVuZGVuY2llcykge1xuICAgICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGdldERlcGxveUpvYklkKGRlcCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGVwbG95bWVudCBqb2JzIGZvciBtdWx0aS1qb2Igc3RyYXRlZ3lcbiAgICogQHJldHVybnMgUmVjb3JkIG9mIGpvYnNcbiAgICovXG4gIHB1YmxpYyBnZXREZXBsb3ltZW50Sm9ic0Zvck11bHRpSm9iKCk6IFJlY29yZDxzdHJpbmcsIEpvYj4ge1xuICAgIGNvbnN0IHsgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWUsIGVudmlyb25tZW50cyB9ID0gdGhpcy5wcm9wcy5kZXBsb3lPcHRpb25zO1xuICAgIGNvbnN0IGpvYnMgPSBlbnZpcm9ubWVudHMubWFwKChlbnZpcm9ubWVudE9wdGlvbnMpOiBbc3RyaW5nLCBKb2JdID0+IHtcbiAgICAgIHJldHVybiBbZ2V0RGVwbG95Sm9iSWQoZW52aXJvbm1lbnRPcHRpb25zLm5hbWUpLCB0aGlzLmdldEpvYkZvckVudmlyb25tZW50KGVudmlyb25tZW50T3B0aW9ucywgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWUpXTtcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGpvYnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgam9iIGRlZmluaXRpb24gZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGVudmlyb25tZW50T3B0aW9ucyBUaGUgZW52aXJvbm1lbnQgb3B0aW9uc1xuICAgKiBAcGFyYW0gZW52aXJvbm1lbnRWYXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNldCB3aXRoIHRoZSBlbnZpcm9ubWVudCBuYW1lLCBpZiBhbnlcbiAgICogQHJldHVybnMgVGhlIGpvYiBkZWZpbml0aW9uIGZvciB0aGUgZW52aXJvbm1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXRKb2JGb3JFbnZpcm9ubWVudChcbiAgICBlbnZpcm9ubWVudE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucyxcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApOiBKb2Ige1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gZW52aXJvbm1lbnRPcHRpb25zO1xuICAgIGNvbnN0IGRlcGxveUpvYkVudiA9IGVudmlyb25tZW50VmFyaWFibGVOYW1lID8ge1xuICAgICAgW2Vudmlyb25tZW50VmFyaWFibGVOYW1lXTogbmFtZSxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgam9iRGVmaW5pdGlvbjogSm9iID0ge1xuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgICdncm91cCc6IGAke25hbWV9LWRlcGxveWAsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBuZWVkczogdGhpcy5nZXREZXBsb3ltZW50Sm9iUHJlcmVxdWlzaXRlSm9iSWRzKG5hbWUpLFxuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgZGVwbG95bWVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgaWRUb2tlbjogdGhpcy5wcm9wcy5hdXRoUHJvdmlkZXIgPT09IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5HSVRIVUJfT0lEQyA/IEpvYlBlcm1pc3Npb24uV1JJVEUgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgIH0sXG4gICAgICBlbnY6IGRlcGxveUpvYkVudixcbiAgICAgIHN0ZXBzOiBbXSxcbiAgICB9O1xuXG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKHRoaXMuY2hlY2tvdXRTdGVwKTtcblxuICAgIGNvbnN0IHByZUluc3RhbGxEZXBlbmRlbmNpZXNTdGVwID0gdGhpcy5wcmVJbnN0YWxsRGVwZW5kZW5jaWVzU3RlcDtcbiAgICBpZiAocHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXApIHtcbiAgICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChwcmVJbnN0YWxsRGVwZW5kZW5jaWVzU3RlcCk7XG4gICAgfVxuXG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKC4uLih0aGlzLnByb2plY3QpLnJlbmRlcldvcmtmbG93U2V0dXAoKSk7XG5cbiAgICBjb25zdCBjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwID0gdGhpcy5nZXRDaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwRm9yRW52aXJvbm1lbnQobmFtZSk7XG4gICAgaWYgKGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXApIHtcbiAgICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwKTtcbiAgICB9XG5cbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goLi4udGhpcy5nZXRTZXR1cEF3c0NyZWRlbnRpYWxzU3RlcHNGb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudE9wdGlvbnMpKTtcblxuICAgIGNvbnN0IHNldHVwTnBtQ29uZmlnU3RlcCA9IHRoaXMuZ2V0U2V0dXBOcG1Db25maWdGb3JFbnZpcm9ubWVudChuYW1lKTtcbiAgICBpZiAoc2V0dXBOcG1Db25maWdTdGVwKSB7XG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goc2V0dXBOcG1Db25maWdTdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVEZXBsb3ltZW50U3RlcCA9IHRoaXMuZ2V0UHJlRGVwbG95bWVudFN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5wcmVEZXBsb3lXb3JrZmxvd1NjcmlwdCA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5wcmVEZXBsb3lXb3JrZmxvd1NjcmlwdCB8fCAnJyxcbiAgICApO1xuICAgIGlmIChwcmVEZXBsb3ltZW50U3RlcCkge1xuICAgICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKHByZURlcGxveW1lbnRTdGVwKTtcbiAgICB9XG5cbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2godGhpcy5kZXBsb3ltZW50U3RlcCk7XG5cbiAgICBjb25zdCBwb3N0RGVwbG95bWVudFN0ZXAgPSB0aGlzLmdldFBvc3REZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLnBvc3REZXBsb3lXb3JrZmxvd1NjcmlwdCA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5wb3N0RGVwbG95V29ya2Zsb3dTY3JpcHQgfHwgJycsXG4gICAgKTtcbiAgICBpZiAocG9zdERlcGxveW1lbnRTdGVwKSB7XG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2gocG9zdERlcGxveW1lbnRTdGVwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9iRGVmaW5pdGlvbjtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGdldERlcGxveUpvYklkKGVudmlyb25tZW50TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBEZXBsb3ktJHtlbnZpcm9ubWVudE5hbWV9YDtcbn1cbiJdfQ==
|