@rio-cloud/cdk-v2-constructs 6.14.0 → 6.15.0-alpha.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/.jsii +214 -47
- package/docs/API.md +159 -13
- package/docs/changelog.md +14 -0
- package/lib/contributions/team-transport-two/pipeline/buildspecs.d.ts +5 -0
- package/lib/contributions/team-transport-two/pipeline/buildspecs.js +191 -0
- package/lib/contributions/team-transport-two/pipeline/pipeline-stack.d.ts +49 -2
- package/lib/contributions/team-transport-two/pipeline/pipeline-stack.js +94 -22
- package/package.json +5 -4
- package/version.json +1 -1
- package/lib/contributions/team-transport-two/pipeline/buildspecs/buildspec-vulnerability-checks.yaml +0 -23
- package/lib/contributions/team-transport-two/pipeline/buildspecs/buildspec.yaml +0 -61
- package/lib/contributions/team-transport-two/pipeline/buildspecs/buildspec_infrastructure.yaml +0 -14
- package/lib/contributions/team-transport-two/pipeline/buildspecs/buildspec_kafka.yaml +0 -64
|
@@ -21,6 +21,7 @@ const pipelines_1 = require("aws-cdk-lib/pipelines");
|
|
|
21
21
|
const yaml = require("js-yaml");
|
|
22
22
|
const application_stage_1 = require("./application-stage");
|
|
23
23
|
const build_project_1 = require("./build-project");
|
|
24
|
+
const buildspecs_1 = require("./buildspecs");
|
|
24
25
|
const datadog_monitors_1 = require("./datadog-monitors");
|
|
25
26
|
const monitoring_deploy_step_1 = require("./monitoring-deploy-step");
|
|
26
27
|
const rio = require("../../../index");
|
|
@@ -68,6 +69,7 @@ var PipelineType;
|
|
|
68
69
|
class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
69
70
|
constructor(scope, id, props) {
|
|
70
71
|
super(scope, id, props);
|
|
72
|
+
this._features = this.parseFeatures(props);
|
|
71
73
|
// populate external parameters
|
|
72
74
|
this._bucket = s3.Bucket.fromBucketName(this, 'TriggerBucket', aws_cdk_lib_1.Fn.importValue('bitbucket-integration-s3-bucket'));
|
|
73
75
|
this._cacheBucket = new s3.Bucket(this, 'CacheBucket', {
|
|
@@ -97,9 +99,11 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
97
99
|
this._codePipelineType = props.codePipelineType ?? codepipeline.PipelineType.V1;
|
|
98
100
|
this._mainCodeBuildProject = this.createRioCodeBuildProject('MainBuild', this._inputMasterTriggerFile, props);
|
|
99
101
|
this.addMainPipeline(props, this._mainCodeBuildProject);
|
|
100
|
-
if (
|
|
102
|
+
if (this._features.branchPipeline) {
|
|
101
103
|
this._branchCodeBuildProject = this.createRioCodeBuildProject('BranchBuild', this._inputBranchTriggerFile, props);
|
|
102
|
-
this.addBranchPipeline(
|
|
104
|
+
this.addBranchPipeline(this._branchCodeBuildProject);
|
|
105
|
+
}
|
|
106
|
+
if (this._features.vulnerabilityPipeline) {
|
|
103
107
|
this.addVulnerabilityPipeline(props);
|
|
104
108
|
}
|
|
105
109
|
const [feature, packageName] = __dirname.split(path.sep).reverse();
|
|
@@ -107,7 +111,7 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
107
111
|
product: index_1.ClaidometerProduct.CDK_CONTRIBUTION,
|
|
108
112
|
packageName,
|
|
109
113
|
feature,
|
|
110
|
-
version: '0.0.
|
|
114
|
+
version: '0.0.24',
|
|
111
115
|
});
|
|
112
116
|
}
|
|
113
117
|
get mainCodebuildProject() {
|
|
@@ -119,12 +123,59 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
119
123
|
}
|
|
120
124
|
return this._branchCodeBuildProject;
|
|
121
125
|
}
|
|
126
|
+
parseFeatures(props) {
|
|
127
|
+
if (props.pipelineType && props.features) {
|
|
128
|
+
throw Error('You cannot provide both a pipelineType and features. Please use features only.');
|
|
129
|
+
}
|
|
130
|
+
if (props.features?.kafkaIntegration && !props.features?.gradleBuild) {
|
|
131
|
+
throw Error('Kafka integration is only supported for pipelines with gradle build');
|
|
132
|
+
}
|
|
133
|
+
if (props.features?.frontendBucketName && !props.features?.npmBuild) {
|
|
134
|
+
throw Error('Frontend bucket name can only be set when npm build is enabled');
|
|
135
|
+
}
|
|
136
|
+
if (props.pipelineType) {
|
|
137
|
+
switch (props.pipelineType) {
|
|
138
|
+
case PipelineType.STANDARD_GRADLE:
|
|
139
|
+
return {
|
|
140
|
+
branchPipeline: true,
|
|
141
|
+
vulnerabilityPipeline: true,
|
|
142
|
+
gradleBuild: true,
|
|
143
|
+
npmBuild: false,
|
|
144
|
+
kafkaIntegration: false,
|
|
145
|
+
};
|
|
146
|
+
case PipelineType.STANDARD_GRADLE_KAFKA:
|
|
147
|
+
return {
|
|
148
|
+
branchPipeline: true,
|
|
149
|
+
vulnerabilityPipeline: true,
|
|
150
|
+
gradleBuild: true,
|
|
151
|
+
npmBuild: false,
|
|
152
|
+
kafkaIntegration: true,
|
|
153
|
+
};
|
|
154
|
+
case PipelineType.STANDARD_INFRASTRUCTURE:
|
|
155
|
+
return {
|
|
156
|
+
branchPipeline: false,
|
|
157
|
+
vulnerabilityPipeline: false,
|
|
158
|
+
gradleBuild: false,
|
|
159
|
+
npmBuild: false,
|
|
160
|
+
kafkaIntegration: false,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
branchPipeline: props.features?.branchPipeline ?? true,
|
|
166
|
+
vulnerabilityPipeline: props.features?.vulnerabilityPipeline ?? true,
|
|
167
|
+
gradleBuild: props.features?.gradleBuild ?? false,
|
|
168
|
+
npmBuild: props.features?.npmBuild ?? false,
|
|
169
|
+
kafkaIntegration: props.features?.kafkaIntegration ?? false,
|
|
170
|
+
frontendBucketName: props.features?.frontendBucketName,
|
|
171
|
+
additionalBuildCommands: props.features?.additionalBuildCommands,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
122
174
|
createRioCodeBuildProject(name, triggerFile, props) {
|
|
123
175
|
return new build_project_1.RioCodeBuildProject(this, name, {
|
|
124
176
|
input: triggerFile,
|
|
125
177
|
cdkOutDirectory: 'infrastructure/cdk.out',
|
|
126
|
-
partialBuildSpec: this.loadBuildSpecFromFile(props?.codeBuildOptions?.partialBuildSpecPath ||
|
|
127
|
-
this.resolveDefaultBuildSpec(props.pipelineType)),
|
|
178
|
+
partialBuildSpec: this.loadBuildSpecFromFile(props?.codeBuildOptions?.partialBuildSpecPath) || (0, buildspecs_1.createMainBuildSpec)(this._features),
|
|
128
179
|
buildEnvironment: props?.codeBuildOptions?.buildEnvironment,
|
|
129
180
|
hostedZoneName: this._hostedZone.zoneName,
|
|
130
181
|
serviceName: props.serviceName,
|
|
@@ -145,34 +196,45 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
145
196
|
codePipeline.addWave('BeforeDeploy', { pre: [stripAssetsStep] });
|
|
146
197
|
const capabilityMonitoringDeployStep = this.createCapabilityMonitoringDeployStep(mainBuild, props);
|
|
147
198
|
const secretsDeployStepProps = this.createSecretsDeployStep(props);
|
|
199
|
+
const frontendDeployStep = this.createDeployFrontendDeployStep(mainBuild);
|
|
200
|
+
const postSteps = [];
|
|
201
|
+
if (capabilityMonitoringDeployStep) {
|
|
202
|
+
postSteps.push(capabilityMonitoringDeployStep);
|
|
203
|
+
}
|
|
204
|
+
if (frontendDeployStep) {
|
|
205
|
+
postSteps.push(frontendDeployStep);
|
|
206
|
+
}
|
|
148
207
|
codePipeline.addStage(new application_stage_1.Application(this, 'DeployApplicationStacks', {
|
|
149
208
|
appStackFactory: props.appStackFactory,
|
|
150
209
|
serviceName: props.serviceName,
|
|
151
210
|
version: process.env.PIPELINE_EXECUTION_ID ?? 'PIPELINE_EXECUTION_ID not set',
|
|
152
211
|
}), {
|
|
153
212
|
pre: secretsDeployStepProps ? [secretsDeployStepProps] : undefined,
|
|
154
|
-
post:
|
|
213
|
+
post: postSteps,
|
|
155
214
|
});
|
|
156
215
|
codePipeline.buildPipeline();
|
|
157
216
|
this.tagCodeBuildProject(stripAssetsStep, 'project_type', 'strip_assets');
|
|
158
217
|
this.tagCodeBuildProject(secretsDeployStepProps, 'project_type', 'deploy_secrets');
|
|
159
218
|
this.tagCodeBuildProject(mainBuild, 'project_type', 'build');
|
|
160
219
|
this.tagCodeBuildProject(capabilityMonitoringDeployStep, 'project_type', 'deploy_capability_monitoring');
|
|
220
|
+
this.tagCodeBuildProject(frontendDeployStep, 'project_type', 'deploy_frontend');
|
|
161
221
|
if (capabilityMonitoringDeployStep) {
|
|
162
222
|
const monitoringTestsuiteRunnerBucket = aws_s3_1.Bucket.fromBucketName(this, 'MonitoringTestsuiteRunnerBucket', `monitoring-testsuite-runner-${this.account}`);
|
|
163
223
|
monitoringTestsuiteRunnerBucket.grantWrite(capabilityMonitoringDeployStep);
|
|
164
224
|
}
|
|
225
|
+
if (frontendDeployStep) {
|
|
226
|
+
const frontendBucket = s3.Bucket.fromBucketName(this, 'FrontendBucket', this._features.frontendBucketName);
|
|
227
|
+
frontendBucket.grantReadWrite(frontendDeployStep);
|
|
228
|
+
}
|
|
165
229
|
const rule = new events.Rule(this, 'PipelineSchedule', {
|
|
166
230
|
schedule: events.Schedule.expression(props.pipelineSchedules?.mainPipeline || 'cron(0 9 ? * 2#1 *)'),
|
|
167
231
|
});
|
|
168
232
|
rule.addTarget(new targets.CodePipeline(codePipeline.pipeline));
|
|
169
233
|
this._ossLicensesBucket.grantReadWrite(mainBuild);
|
|
170
234
|
this._ossLicensesBucketParameter.grantRead(mainBuild);
|
|
171
|
-
|
|
172
|
-
this._serviceKeystorePassword.grantRead(mainBuild);
|
|
173
|
-
}
|
|
235
|
+
this._serviceKeystorePassword.grantRead(mainBuild);
|
|
174
236
|
this._accountNameParameter.grantRead(mainBuild);
|
|
175
|
-
if (
|
|
237
|
+
if (this._features.kafkaIntegration) {
|
|
176
238
|
this.grantPermissionsForKafkaIntegration(mainBuild, 'KafkaIntegrationPolicy');
|
|
177
239
|
}
|
|
178
240
|
codePipeline.pipeline.artifactBucket.grantReadWrite(stripAssetsStep.project);
|
|
@@ -182,7 +244,7 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
182
244
|
accountId: this.account,
|
|
183
245
|
});
|
|
184
246
|
}
|
|
185
|
-
addBranchPipeline(
|
|
247
|
+
addBranchPipeline(branchBuild) {
|
|
186
248
|
const branchPipeline = new codepipeline.Pipeline(this, 'BranchPipeline', {
|
|
187
249
|
artifactBucket: this._cacheBucket,
|
|
188
250
|
pipelineType: this._codePipelineType,
|
|
@@ -200,14 +262,14 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
200
262
|
this._ossLicensesBucketParameter.grantRead(branchBuild);
|
|
201
263
|
this._serviceKeystorePassword.grantRead(branchBuild);
|
|
202
264
|
this._accountNameParameter.grantRead(branchBuild);
|
|
203
|
-
if (
|
|
265
|
+
if (this._features.kafkaIntegration) {
|
|
204
266
|
this.grantPermissionsForKafkaIntegration(branchBuild, 'BranchKafkaIntegrationPolicy');
|
|
205
267
|
}
|
|
206
268
|
}
|
|
207
269
|
addVulnerabilityPipeline(props) {
|
|
208
270
|
const vulnerabilityBuild = new build_project_1.RioCodeBuildProject(this, 'VulnerabilityChecks', {
|
|
209
271
|
input: this._inputMasterTriggerFile,
|
|
210
|
-
partialBuildSpec:
|
|
272
|
+
partialBuildSpec: (0, buildspecs_1.createVulnerabilityBuildSpec)(this._features),
|
|
211
273
|
buildEnvironment: props?.codeBuildOptions?.buildEnvironment,
|
|
212
274
|
hostedZoneName: this._hostedZone.zoneName,
|
|
213
275
|
serviceName: props.serviceName,
|
|
@@ -288,15 +350,22 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
288
350
|
return undefined;
|
|
289
351
|
}
|
|
290
352
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
return path.resolve(__dirname, 'buildspecs/buildspec.yaml');
|
|
295
|
-
case PipelineType.STANDARD_GRADLE_KAFKA:
|
|
296
|
-
return path.resolve(__dirname, 'buildspecs/buildspec_kafka.yaml');
|
|
297
|
-
case PipelineType.STANDARD_INFRASTRUCTURE:
|
|
298
|
-
return path.resolve(__dirname, 'buildspecs/buildspec_infrastructure.yaml');
|
|
353
|
+
createDeployFrontendDeployStep(mainBuild) {
|
|
354
|
+
if (!this._features.frontendBucketName) {
|
|
355
|
+
return undefined;
|
|
299
356
|
}
|
|
357
|
+
const frontendBuildOutput = mainBuild.addOutputDirectory('build');
|
|
358
|
+
return new pipelines_1.CodeBuildStep('DeployFrontend', {
|
|
359
|
+
input: frontendBuildOutput,
|
|
360
|
+
buildEnvironment: {
|
|
361
|
+
buildImage: aws_codebuild_1.LinuxLambdaBuildImage.AMAZON_LINUX_2023_NODE_20,
|
|
362
|
+
computeType: aws_codebuild_1.ComputeType.LAMBDA_1GB,
|
|
363
|
+
},
|
|
364
|
+
commands: [
|
|
365
|
+
`aws s3 sync --exclude index.html --cache-control max-age=31536000 ./ 's3://${this._features.frontendBucketName}'`,
|
|
366
|
+
`aws s3 cp --cache-control no-cache index.html 's3://${this._features.frontendBucketName}'`,
|
|
367
|
+
],
|
|
368
|
+
});
|
|
300
369
|
}
|
|
301
370
|
grantPermissionsForKafkaIntegration(buildProject, policyId) {
|
|
302
371
|
const buildProjectRole = buildProject.project.role;
|
|
@@ -308,6 +377,9 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
308
377
|
}
|
|
309
378
|
}
|
|
310
379
|
loadBuildSpecFromFile(buildSpecPath) {
|
|
380
|
+
if (!buildSpecPath) {
|
|
381
|
+
return undefined;
|
|
382
|
+
}
|
|
311
383
|
return aws_codebuild_1.BuildSpec.fromObject(yaml.load(fs.readFileSync(buildSpecPath, { encoding: 'utf-8' })));
|
|
312
384
|
}
|
|
313
385
|
renamePipelineToLowerCase(pipeline) {
|
|
@@ -329,4 +401,4 @@ class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
|
329
401
|
exports.PipelineStack = PipelineStack;
|
|
330
402
|
_a = JSII_RTTI_SYMBOL_1;
|
|
331
403
|
PipelineStack[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.PipelineStack", version: "0.0.0" };
|
|
332
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29udHJpYnV0aW9ucy90ZWFtLXRyYW5zcG9ydC10d28vcGlwZWxpbmUvcGlwZWxpbmUtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLG1DQUFtQztBQUNuQyw2Q0FBOEY7QUFDOUYsNkRBQTRHO0FBQzVHLDZEQUE2RDtBQUU3RCw2RUFBNkU7QUFDN0UsaURBQWlEO0FBQ2pELDBEQUEwRDtBQUMxRCxpREFBb0Q7QUFFcEQseUNBQXlDO0FBQ3pDLCtDQUFxRDtBQUNyRCwyQ0FBMkM7QUFFM0MsbURBQW1EO0FBQ25ELHFEQUEwRTtBQUUxRSxnQ0FBZ0M7QUFDaEMsMkRBQWtEO0FBQ2xELG1EQUFzRDtBQUN0RCx5REFBZ0g7QUFDaEgscUVBQTZFO0FBRzdFLHNDQUFzQztBQUN0QywwQ0FBaUU7QUFDakUsZ0RBQWlEO0FBMElqRCxJQUFZLFlBc0NYO0FBdENELFdBQVksWUFBWTtJQUV0Qjs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxtREFBbUMsQ0FBQTtJQUNuQzs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsK0RBQStDLENBQUE7SUFDL0M7Ozs7O09BS0c7SUFDSCxtRUFBbUQsQ0FBQTtBQUNyRCxDQUFDLEVBdENXLFlBQVksNEJBQVosWUFBWSxRQXNDdkI7QUFjRCxNQUFhLGFBQWMsU0FBUSxtQkFBSztJQWV0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsZ0JBQUUsQ0FBQyxXQUFXLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxD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SCxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE9BQWtDLEVBQUUsR0FBVyxFQUFFLEtBQWE7UUFDeEYsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLGtCQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDOztBQXRUSCxzQ0F1VEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IER1cmF0aW9uLCBGbiwgUmVmZXJlbmNlLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgU3RhY2tQcm9wcywgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEJ1aWxkRW52aXJvbm1lbnQsIEJ1aWxkU3BlYywgQ29tcHV0ZVR5cGUsIExpbnV4TGFtYmRhQnVpbGRJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0IHsgSVBpcGVsaW5lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgKiBhcyBjb2RlcGlwZWxpbmVfYWN0aW9ucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lLWFjdGlvbnMnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0IHsgTWFuYWdlZFBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgSUhvc3RlZFpvbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQnVja2V0LCBJQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHNzbSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcbmltcG9ydCB7IElTdHJpbmdQYXJhbWV0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcbmltcG9ydCAqIGFzIHBpcGVsaW5lcyBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHsgQ29kZUJ1aWxkU3RlcCwgQ29kZVBpcGVsaW5lU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHBsaWNhdGlvbi1zdGFnZSc7XG5pbXBvcnQgeyBSaW9Db2RlQnVpbGRQcm9qZWN0IH0gZnJvbSAnLi9idWlsZC1wcm9qZWN0JztcbmltcG9ydCB7IERhdGFkb2dQaXBlbGluZUVycm9yQWxlcnQsIERhdGFEb2dQaXBlbGluZUVycm9yQWxlcnRGb3JWdWxuZXJhYmlsaXR5Q2hlY2tzIH0gZnJvbSAnLi9kYXRhZG9nLW1vbml0b3JzJztcbmltcG9ydCB7IFJpb0NhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCB9IGZyb20gJy4vbW9uaXRvcmluZy1kZXBsb3ktc3RlcCc7XG5pbXBvcnQgeyBEYXRhZG9nQWxlcnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YWRvZyc7XG5pbXBvcnQgeyBJTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGF0YWRvZ3YyJztcbmltcG9ydCAqIGFzIHJpbyBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBDbGFpZG9tZXRlciwgQ2xhaWRvbWV0ZXJQcm9kdWN0IH0gZnJvbSAnLi4vLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgVXBwZXJUb0xvd2VyIH0gZnJvbSAnLi4vLi4vLi4vd2F0Y2hmdWwnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTY2hlZHVsZXNQcm9wcyB7XG4gIHJlYWRvbmx5IG1haW5QaXBlbGluZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBpcGVsaW5lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBzdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhpcyBoYXMgdG8gYmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVwb3NpdG9yeSBhcyB0aGUgczMgdHJpZ2dlciBmaWxlIGNyZWF0ZWQgYnkgdGhlIGJpdGJ1Y2tldC1pbnRlZ3JhdGlvbiB1c2VzIHRoaXMgYXMgYSBwcmVmaXhcbiAgICogLSBUaGUgc2VydmljZU5hbWUgaXMgYXZhaWxhYmxlIGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIFNFUlZJQ0VfTkFNRSBpbiB0aGUgQ29kZUJ1aWxkU3RlcFxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIEFwcFN0YWNrUHJvcHMgaW4gdGhlIGFwcFN0YWNrRmFjdG9yeVxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgYXMgc3RhY2tOYW1lIHByb3BlcnR5IGluIHRoZSBBcHBTdGFja1Byb3BzIGluIHRoZSBhcHBTdGFja0ZhY3RvcnkuIEkuZS4gdGhlIHN0YWNrIGlzIG5hbWVkIGFmdGVyIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhlIHNlcnZpY2VOYW1lIGlzIGhhbmRlZCBvdmVyIHRvIGFsbCBEYXRhZG9nIG1vbml0b3JzXG4gICAqIC0gUklPIGNvbnZlbnRpb24gaXMgdGhhdCB1cGxvYWRlZCBsaWNlbnNlLWNoZWNrLWZpbGVzIGFyZSBuYW1lZCBhZnRlciB0aGUgc2VydmljZSwgaS5lLiBzZXJ2aWNlTmFtZS50eHRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVyIGZvciBhcHBTdGFjayB0byBiZSBkZXBsb3llZC5cbiAgICpcbiAgICogVGhpcyBhY3RzIGFzIGEgd3JhcHBlciBmb3IgYWxsIHJlc291cmNlcyB5b3Ugd2FudCB0byBkZXBsb3kgdmlhIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFN0YWNrRmFjdG9yeTogSUFwcFN0YWNrRmFjdG9yeTtcblxuICAvKipcbiAgICogRGVmaW5lcyB3aGljaCBraW5kIG9mIHBpcGVsaW5lIGlzIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVUeXBlOiBQaXBlbGluZVR5cGU7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgaG93IG9mdGVuIHRoZSBwaXBlbGluZSBpcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseS4gSXMgZGVmaW5lZCB2aWEgYSBjcm9uIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL1NjaGVkdWxlZEV2ZW50cy5odG1sXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWVzOlxuICAgKiAtIG1haW4gcGlwZWxpbmU6IGNyb24oMCA5ID8gKiAyIzEgKilcbiAgICogLSB2dWxuZXJhYmlsaXR5IHBpcGVsaW5lOiBjcm9uKDAgNSA/ICogTU9OLUZSSSAqKVxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVTY2hlZHVsZXM/OiBQaXBlbGluZVNjaGVkdWxlc1Byb3BzO1xuXG5cbiAgLyoqXG4gICAqIFBhdGggdG8gc2VjcmV0cyBmaWxlIGNvbnRhaW5pbmcgZW5jcnlwdGVkIHNlY3JldHMuXG4gICAqXG4gICAqIFRoZSBSaW9TZWNyZXRzRGVwbG95U3RlcCBpcyBhZGRlZCBwcmlvciB0byBkZXBsb3ltZW50IG9mIHRoZSBBcHBTdGFjayBpZiBhIHBhdGggaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIE5vIHNlY3JldHMgYXJlIGRlcGxveWVkIGlmIG5vIHBhdGggaXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRzRGVwbG95U3RlcFByb3BzPzogUGlwZWxpbmVTdGFja1Jpb1NlY3JldHNEZXBsb3lTdGVwUHJvcHM7XG5cbiAgLyoqXG4gICAqIENvZGVCdWlsZCBvcHRpb25zIG92ZXJyaWRpbmcgdGhlIHJpby1zcGVjaWZpYyBkZWZhdWx0cy5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVCdWlsZE9wdGlvbnM/OiBDb2RlQnVpbGRPcHRpb25zO1xuICAvKipcbiAgICogSWYgcHJlc2VudCwgdGhlIGNhcGFiaWxpdHkgbW9uaXRvcmluZyBkZXBsb3kgc3RlcCBpcyBhZGRlZCB0byB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nRGVwbG95U3RlcFByb3BzPzogUGlwZWxpbmVTdGFja1Jpb01vbml0b3JpbmdEZXBsb3lTdGVwUHJvcHM7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSBgdnVsbmVyYWJpbGl0eU5vdGlmaWNhdGlvbmAgcHJvcGVydHkgaW5zdGVhZC5cbiAgICogSWYgYG9wc2dlbmllYCBpcyBzcGVjaWZpZWQsIGFuIEV4Y2VwdGlvbiBpcyB0aHJvd24sIGFzIHRoaXMgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWRvZ0FsZXJ0VHlwZT86IERhdGFkb2dBbGVydFR5cGU7XG4gIC8qKlxuICAgKiBOb3RpZmljYXRpb24gdHlwZSBmb3IgdGhlIGF1dG8tZ2VuZXJhdGVkIHZ1bG5lcmFiaWxpdHkgcGlwZWxpbmUgbW9uaXRvci4gRGVmYXVsdHMgdG8gc2xhY2suXG4gICAqL1xuICByZWFkb25seSB2dWxuZXJhYmlsaXR5Tm90aWZpY2F0aW9uPzogSU5vdGlmaWNhdGlvbjtcbiAgLyoqXG4gICAqIENvZGVQaXBlbGluZSBQaXBlbGluZVR5cGUgKFYxIG9yIFYyKS4gRGVmYXVsdHMgdG8gVjEuXG4gICAqL1xuICByZWFkb25seSBjb2RlUGlwZWxpbmVUeXBlPzogY29kZXBpcGVsaW5lLlBpcGVsaW5lVHlwZTtcbn1cblxuLyoqXG4gKiBQcm92aWRlciBpbnRlcmZhY2UgdG8gY3JlYXRlIHRoZSBBcHBTdGFjayB3aXRoaW4gdGhlIHNwZWNpZmljIHNjb3BlXG4gKlxuICogU2ltcGx5IHBsYWNlIHRoZSBBcHBTdGFjayBjcmVhdGlvbiBpbnRvIHRoZSBjcmVhdGUtbWV0aG9kOlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBVc2UgZS5nLiB3aXRoaW4gQXBwbGljYXRpb25Qcm9wcyBhcyBKU09OT2JqZWN0OlxuICogXFx7IGNyZWF0ZTogKGNvbnN0cnVjdCwgcHJvcHMpID1cXD4gbmV3IFN0YWNrKGNvbnN0cnVjdCwgJ0FwcFN0YWNrJywgcHJvcHMpIFxcfVxuICpcbiAqIC8vIG9yIHNpbXBseSBhcyBjbGFzcyBpbnRlcmZhY2Ugd2l0aGluIHlvdXIgc3RhY2sgaW1wbGVtZW50YXRpb246XG4gKiBjbGFzcyBQaXBlbGluZVN0YWdlIGV4dGVuZHMgU3RhZ2UgaW1wbGVtZW50cyBJQXBwU3RhY2tGYWN0b3J5IFxce1xuICogICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RhZ2VQcm9wcykgXFx7XG4gKiAgICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gKiAgICAgLy8geW91ciBzdGFnZSBkZWZpbml0aW9uXG4gKiAgIFxcfVxuICpcbiAqICAgY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBBcHBTdGFja1Byb3BzKTogdm9pZCBcXHtcbiAqICAgICAvLyBhcHAgc3RhY2sgaW5pdGlhdGlvbiBnb2VzIGluIGhlcmVcbiAqICAgXFx9XG4gKiBcXH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXBwU3RhY2tGYWN0b3J5IHtcbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kLCBiZWluZyBpbnZva2VkIHdpdGggdGhlIHNwZWNpZmljIHNjb3BlIGR1cmluZyBwaXBlbGluZSBpbnN0YW50aWF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBwYXJlbnQgY29uc3RydWN0IGZvciB0aGUgYXBwIHN0YWNrXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRoZSBhcHAgc3RhY2tzIHByb3BlcnRpZXNcbiAgICovXG4gIGNyZWF0ZShzY29wZTogQ29uc3RydWN0LCBwcm9wczogQXBwU3RhY2tQcm9wcyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2VsZWN0ZWQgcHJvcGVydGllcyBiZWluZyBoYW5kZWQgb3ZlciB0byBSaW9TZWNyZXRzRGVwbG95U3RlcC5cbiAqXG4gKiBAc2VlIHJpby5SaW9TZWNyZXRzRGVwbG95U3RlcFxuICogQHNlZSByaW8uUmlvU2VjcmV0c0RlcGxveVN0ZXBQcm9wc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lU3RhY2tSaW9TZWNyZXRzRGVwbG95U3RlcFByb3BzIHtcbiAgcmVhZG9ubHkgc2VjcmV0c0ZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFja1Jpb01vbml0b3JpbmdEZXBsb3lTdGVwUHJvcHMge1xuICAvKipcbiAgICogTWFwIFxce2RpcmVjdG9yeTogZmlsZW5hbWVzXFx9IGNvbnRhaW5pbmcgIC5qYXIgb3IgLnppcCBmaWxlcyBjcmVhdGVkIGluIG1haW4gYnVpbGQgc3RlcCB0byBiZSB1cGxvYWRlZCB0byB0aGUgbW9uaXRvcmluZy10ZXN0c3VpdGUtcnVubmVyIGJ1Y2tldCwgZS5nLlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgJ2F2YWlsYWJpbGl0eS1tb25pdG9yaW5nL2J1aWxkL2xpYnMnOiBbJ2Zvby1hdmFpbGFiaWxpdHkuamFyJ10sXG4gICAqICAncGVyZm9ybWFuY2UtbW9uaXRvcmluZy9idWlsZC9saWJzJzogWydhcGktY2hlY2suemlwJywgJ2Zvby1wZXJmb3JtYW5jZS5qYXInXSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IG1vbml0b3JpbmdBcnRpZmFjdHM6IHsgW2RpcmVjdG9yeTogc3RyaW5nXTogc3RyaW5nW10gfTtcbn1cblxuZXhwb3J0IGVudW0gUGlwZWxpbmVUeXBlIHtcblxuICAvKipcbiAgICogU2VsZi1tdXRhdGluZyBjb2RlcGlwZWxpbmUgZGVwbG95aW5nIHRoZSBwcm92aWRlZCBBcHBTdGFjay4gQmUgYXdhcmU6IFRoZSBwcm92aWRlZCBzZXJ2aWNlIHdvbid0IGhhdmUgYWNjZXNzIHRvIEthZmthLlxuICAgKlxuICAgKiBDb21lcyB3aXRoIGEgcHJlLWRlZmluZWQgYnVpbGRzcGVjLnlhbWwgZm9yIGEgZ3JhZGxlIHByb2plY3QuIFRoaXMgYnVpbGRzcGVjLnlhbWwgaXMgdXNlZCBmb3IgYm90aCB0aGUgbWFpbiBhbmRcbiAgICogYnJhbmNoIHBpcGVsaW5lIGFuZCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHN0ZXBzXG4gICAqIC0gYnVpbGQgYW5kIHRlc3Qgb2YgdGhlIGFydGlmYWN0IHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNsZWFuIGJ1aWxkXCIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKiAtIGxpY2Vuc2UtY2hlY2sgYW5kIHVwbG9hZCBvZiBsaWNlbnNlLWNoZWNrLWZpbGUgdmlhIGNvbW1hbmQgXCIuL2dyYWRsZXcgY2hlY2tMaWNlbnNlc1wiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICogLSBjcmVhdGUgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSB0byBtYWtlIFRMUyBjb21tdW5pY2F0aW9uIHBvc3NpYmxlLCBlLmcuIHdpdGggYSBsb2FkYmFsYW5jZXIuXG4gICAqIC0gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZSB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBqaWJCdWlsZFRhclwiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICovXG4gIFNUQU5EQVJEX0dSQURMRSA9ICdTVEFOREFSRF9HUkFETEUnLFxuICAvKipcbiAgICogU2VsZi1tdXRhdGluZyBjb2RlcGlwZWxpbmUgZGVwbG95aW5nIHRoZSBwcm92aWRlZCBBcHBTdGFjayB3aXRoIGFkZGl0aW9uYWwgc3RlcHMgbmVlZGVkIHRvIGFjY2VzcyBLYWZrYS5cbiAgICpcbiAgICogQ29tZXMgd2l0aCBhIHByZS1kZWZpbmVkIGJ1aWxkc3BlYy55YW1sIGZvciBhIGdyYWRsZSBwcm9qZWN0LiBUaGlzIGJ1aWxkc3BlYy55YW1sIGlzIHVzZWQgZm9yIGJvdGggdGhlIG1haW4gYW5kXG4gICAqIGJyYW5jaCBwaXBlbGluZSBhbmQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBzdGVwc1xuICAgKiAtIGJ1aWxkIGFuZCB0ZXN0IG9mIHRoZSBhcnRpZmFjdCB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBjbGVhbiBidWlsZFwiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICogLSBsaWNlbnNlLWNoZWNrIGFuZCB1cGxvYWQgb2YgbGljZW5zZS1jaGVjay1maWxlIHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNoZWNrTGljZW5zZXNcIi5cbiAgICogPHA+IFRoaXMgZ3JhZGxlIGNvbW1hbmQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgZ3JhZGxlIHByb2plY3QuXG4gICAqIC0gY3JlYXRlIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgdG8gbWFrZSBUTFMgY29tbXVuaWNhdGlvbiBwb3NzaWJsZSwgZS5nLiB3aXRoIGEgbG9hZGJhbGFuY2VyLlxuICAgKiAtIHJlcXVlc3QgYSBjZXJ0aWZpY2F0ZSB0byBhdXRoZW50aWNhdGUgYWdhaW5zdCBLYWZrYSB2aWEgbXV0dWFsIFRMU1xuICAgKiAtIGJ1aWxkIHRoZSBjb250YWluZXIgaW1hZ2UgdmlhIGNvbW1hbmQgXCIuL2dyYWRsZXcgamliQnVpbGRUYXJcIi5cbiAgICogPHA+IFRoaXMgZ3JhZGxlIGNvbW1hbmQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgZ3JhZGxlIHByb2plY3QuXG4gICAqL1xuICBTVEFOREFSRF9HUkFETEVfS0FGS0EgPSAnU1RBTkRBUkRfR1JBRExFX0tBRktBJyxcbiAgLyoqXG4gICAqIFNlbGYtbXV0YXRpbmcgY29kZXBpcGVsaW5lIGRlcGxveWluZyB0aGUgcHJvdmlkZWQgQXBwU3RhY2suXG4gICAqXG4gICAqIENvbWVzIHdpdGggYSBwcmUtZGVmaW5lZCBidWlsZHNwZWMueWFtbCB0byBzeW50aGVzaXplIHRoZSBBcHBTdGFjay5cbiAgICogTm8gYnJhbmNoIG9yIHZ1bG5lcmFiaWxpdHkgcGlwZWxpbmUgaXMgY3JlYXRlZC5cbiAgICovXG4gIFNUQU5EQVJEX0lORlJBU1RSVUNUVVJFID0gJ1NUQU5EQVJEX0lORlJBU1RSVUNUVVJFJyxcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGFydGlhbEJ1aWxkU3BlY1BhdGggLSBQYXRoIHRvIGEgY3VzdG9tIGJ1aWxkLXNwZWMgZmlsZSB0byB1c2UgZm9yIHRoZSBtYWluIGFuZCBicmFuY2ggcGlwZWxpbmUuXG4gKiBBIHByZS1kZWZpbmVkIGJ1aWxkc3BlYy55YW1sIGZpdHRpbmcgdGhlIHBpcGVsaW5lVHlwZSBpcyB1c2VkIGlmIG5vdCBwcm92aWRlZC5cbiAqIEBwYXJhbSBidWlsZEVudmlyb25tZW50IC0gQ3VzdG9tIENvZGVCdWlsZCBidWlsZCBlbnZpcm9ubWVudCBvdmVycmlkaW5nIHRoZSByaW8tc3BlY2lmaWMgZGVmYXVsdHMuIFRoZSBkZWZhdWx0cyBhcmU6XG4gKiAgICAgICAgICBidWlsZEltYWdlOiBBTUFaT05fTElOVVhfMl81XG4gKiAgICAgICAgICBjb21wdXRlVHlwZTogTEFSR0VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQnVpbGRPcHRpb25zIHtcbiAgcmVhZG9ubHkgcGFydGlhbEJ1aWxkU3BlY1BhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJ1aWxkRW52aXJvbm1lbnQ/OiBCdWlsZEVudmlyb25tZW50O1xufVxuXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWFpbkNvZGVCdWlsZFByb2plY3Q6IENvZGVCdWlsZFN0ZXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2JyYW5jaENvZGVCdWlsZFByb2plY3Q6IENvZGVCdWlsZFN0ZXAgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1Y2tldDogSUJ1Y2tldDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGVCdWNrZXQ6IElCdWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dE1hc3RlclRyaWdnZXJGaWxlOiBDb2RlUGlwZWxpbmVTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0QnJhbmNoVHJpZ2dlckZpbGU6IENvZGVQaXBlbGluZVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXI6IElTdHJpbmdQYXJhbWV0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29zc0xpY2Vuc2VzQnVja2V0OiBJQnVja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlS2V5c3RvcmVQYXNzd29yZDogSVN0cmluZ1BhcmFtZXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWNjb3VudE5hbWVQYXJhbWV0ZXI6IElTdHJpbmdQYXJhbWV0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25pc3REYXRhTWlycm9yVXJsOiBJU3RyaW5nUGFyYW1ldGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb2RlUGlwZWxpbmVUeXBlOiBjb2RlcGlwZWxpbmUuUGlwZWxpbmVUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIHBvcHVsYXRlIGV4dGVybmFsIHBhcmFtZXRlcnNcbiAgICB0aGlzLl9idWNrZXQgPSBzMy5CdWNrZXQuZnJvbUJ1Y2tldE5hbWUodGhpcywgJ1RyaWdnZXJCdWNrZXQnLCBGbi5pbXBvcnRWYWx1ZSgnYml0YnVja2V0LWludGVncmF0aW9uLXMzLWJ1Y2tldCcpKTtcbiAgICB0aGlzLl9jYWNoZUJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ0NhY2hlQnVja2V0Jywge1xuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICBsaWZlY3ljbGVSdWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cygzMCksXG4gICAgICAgICAgYWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQWZ0ZXI6IER1cmF0aW9uLmRheXMoNyksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIHRoaXMuX2hvc3RlZFpvbmUgPSByaW8uUmlvTGFuZGluZ1pvbmUuZ2V0RGVmYXVsdEhvc3RlZFpvbmUodGhpcyk7XG4gICAgdGhpcy5faW5wdXRNYXN0ZXJUcmlnZ2VyRmlsZSA9IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmVTb3VyY2UuczModGhpcy5fYnVja2V0LCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0vdHJpZ2dlci8ke3Jpby5UcmlnZ2VyS2V5Lk1BU1RFUl9SRVBPfWAsIHsgdHJpZ2dlcjogY29kZXBpcGVsaW5lX2FjdGlvbnMuUzNUcmlnZ2VyLkVWRU5UUyB9KTtcbiAgICB0aGlzLl9pbnB1dEJyYW5jaFRyaWdnZXJGaWxlID0gcGlwZWxpbmVzLkNvZGVQaXBlbGluZVNvdXJjZS5zMyh0aGlzLl9idWNrZXQsIGAke3Byb3BzLnNlcnZpY2VOYW1lfS90cmlnZ2VyLyR7cmlvLlRyaWdnZXJLZXkuQlJBTkNIX1JFUE99YCwgeyB0cmlnZ2VyOiBjb2RlcGlwZWxpbmVfYWN0aW9ucy5TM1RyaWdnZXIuRVZFTlRTIH0pO1xuXG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXIgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKHRoaXMsICdPc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlcicsIHsgcGFyYW1ldGVyTmFtZTogJy9jb25maWcvb3NzLWxpY2Vuc2VzL2J1Y2tldC1uYW1lJyB9KTtcbiAgICB0aGlzLl9vc3NMaWNlbnNlc0J1Y2tldCA9IHMzLkJ1Y2tldC5mcm9tQnVja2V0TmFtZSh0aGlzLCAnT3NzTGljZW5zZXNCdWNrZXQnLCB0aGlzLl9vc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlci5zdHJpbmdWYWx1ZSk7XG4gICAgdGhpcy5fc2VydmljZUtleXN0b3JlUGFzc3dvcmQgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TZWN1cmVTdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKHRoaXMsICdLZXlzdG9yZVBhc3N3b3JkJywge1xuICAgICAgcGFyYW1ldGVyTmFtZTogYC9jb25maWcvJHtwcm9wcy5zZXJ2aWNlTmFtZX0vc2VydmljZS1rZXlzdG9yZS1wYXNzd29yZGAsXG4gICAgICB2ZXJzaW9uOiAxLFxuICAgIH0pO1xuICAgIHRoaXMuX2FjY291bnROYW1lUGFyYW1ldGVyID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyTmFtZSh0aGlzLCAnQWNjb3VudE5hbWVQYXJhbWV0ZXInLCAnL2NvbmZpZy9hY2NvdW50L25hbWUnKTtcbiAgICB0aGlzLl9uaXN0RGF0YU1pcnJvclVybCA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXModGhpcywgJ05pc3REYXRhTWlycm9yVXJsJywge1xuICAgICAgcGFyYW1ldGVyTmFtZTogJy9jb25maWcvbmlzdC1kYXRhLW1pcnJvci91cmwnLFxuICAgICAgdmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2NvZGVQaXBlbGluZVR5cGUgPSBwcm9wcy5jb2RlUGlwZWxpbmVUeXBlID8/IGNvZGVwaXBlbGluZS5QaXBlbGluZVR5cGUuVjE7XG5cbiAgICB0aGlzLl9tYWluQ29kZUJ1aWxkUHJvamVjdCA9IHRoaXMuY3JlYXRlUmlvQ29kZUJ1aWxkUHJvamVjdCgnTWFpbkJ1aWxkJywgdGhpcy5faW5wdXRNYXN0ZXJUcmlnZ2VyRmlsZSwgcHJvcHMpO1xuICAgIHRoaXMuYWRkTWFpblBpcGVsaW5lKHByb3BzLCB0aGlzLl9tYWluQ29kZUJ1aWxkUHJvamVjdCk7XG5cbiAgICBpZiAocHJvcHMucGlwZWxpbmVUeXBlICE9PSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkUpIHtcbiAgICAgIHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3QgPSB0aGlzLmNyZWF0ZVJpb0NvZGVCdWlsZFByb2plY3QoJ0JyYW5jaEJ1aWxkJywgdGhpcy5faW5wdXRCcmFuY2hUcmlnZ2VyRmlsZSwgcHJvcHMpO1xuICAgICAgdGhpcy5hZGRCcmFuY2hQaXBlbGluZShwcm9wcywgdGhpcy5fYnJhbmNoQ29kZUJ1aWxkUHJvamVjdCk7XG4gICAgICB0aGlzLmFkZFZ1bG5lcmFiaWxpdHlQaXBlbGluZShwcm9wcyk7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZlYXR1cmUsIHBhY2thZ2VOYW1lXSA9IF9fZGlybmFtZS5zcGxpdChwYXRoLnNlcCkucmV2ZXJzZSgpO1xuICAgIG5ldyBDbGFpZG9tZXRlcih0aGlzLCAnQ2xhaWRvbWV0ZXInLCB7XG4gICAgICBwcm9kdWN0OiBDbGFpZG9tZXRlclByb2R1Y3QuQ0RLX0NPTlRSSUJVVElPTixcbiAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgZmVhdHVyZSxcbiAgICAgIHZlcnNpb246ICcwLjAuMjMnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBtYWluQ29kZWJ1aWxkUHJvamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFpbkNvZGVCdWlsZFByb2plY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJyYW5jaENvZGVCdWlsZFByb2plY3QoKTogQ29kZUJ1aWxkU3RlcCB7XG4gICAgaWYgKHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3QgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignVGhlIHBpcGVsaW5lIHR5cGUgeW91IGhhdmUgc2VsZWN0ZWQgZG9lcyBub3Qgc3VwcG9ydCBhIGJyYW5jaCBjb2RlYnVpbGQgcHJvamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYnJhbmNoQ29kZUJ1aWxkUHJvamVjdDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmlvQ29kZUJ1aWxkUHJvamVjdChuYW1lOiBzdHJpbmcsIHRyaWdnZXJGaWxlOiBDb2RlUGlwZWxpbmVTb3VyY2UsIHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpIHtcbiAgICByZXR1cm4gbmV3IFJpb0NvZGVCdWlsZFByb2plY3QodGhpcywgbmFtZSwge1xuICAgICAgaW5wdXQ6IHRyaWdnZXJGaWxlLFxuICAgICAgY2RrT3V0RGlyZWN0b3J5OiAnaW5mcmFzdHJ1Y3R1cmUvY2RrLm91dCcsXG4gICAgICBwYXJ0aWFsQnVpbGRTcGVjOiB0aGlzLmxvYWRCdWlsZFNwZWNGcm9tRmlsZShwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8ucGFydGlhbEJ1aWxkU3BlY1BhdGggfHxcbiAgICAgICAgdGhpcy5yZXNvbHZlRGVmYXVsdEJ1aWxkU3BlYyhwcm9wcy5waXBlbGluZVR5cGUpKSxcbiAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHByb3BzPy5jb2RlQnVpbGRPcHRpb25zPy5idWlsZEVudmlyb25tZW50LFxuICAgICAgaG9zdGVkWm9uZU5hbWU6IHRoaXMuX2hvc3RlZFpvbmUuem9uZU5hbWUsXG4gICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5fY2FjaGVCdWNrZXQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZE1haW5QaXBlbGluZShwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzLCBtYWluQnVpbGQ6IENvZGVCdWlsZFN0ZXApIHtcbiAgICBjb25zdCBwaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgJ1BpcGVsaW5lJywge1xuICAgICAgYXJ0aWZhY3RCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgICAgcGlwZWxpbmVUeXBlOiB0aGlzLl9jb2RlUGlwZWxpbmVUeXBlLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvZGVQaXBlbGluZSA9IG5ldyBwaXBlbGluZXMuQ29kZVBpcGVsaW5lKHBpcGVsaW5lLCAnQ29kZVBpcGVsaW5lJywge1xuICAgICAgY29kZVBpcGVsaW5lOiBwaXBlbGluZSxcbiAgICAgIHN5bnRoOiBtYWluQnVpbGQsXG4gICAgfSk7XG4gICAgVGFncy5vZihwaXBlbGluZSkuYWRkKCdwaXBlbGluZV90eXBlJywgJ2J1aWxkJyk7XG5cbiAgICBjb25zdCBzdHJpcEFzc2V0c1N0ZXAgPSB0aGlzLmNyZWF0ZVN0cmlwQXNzZXRzU3RlcChjb2RlUGlwZWxpbmUpO1xuICAgIGNvZGVQaXBlbGluZS5hZGRXYXZlKCdCZWZvcmVEZXBsb3knLCB7IHByZTogW3N0cmlwQXNzZXRzU3RlcF0gfSk7XG5cbiAgICBjb25zdCBjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXAgPSB0aGlzLmNyZWF0ZUNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcChtYWluQnVpbGQsIHByb3BzKTtcbiAgICBjb25zdCBzZWNyZXRzRGVwbG95U3RlcFByb3BzID0gdGhpcy5jcmVhdGVTZWNyZXRzRGVwbG95U3RlcChwcm9wcyk7XG5cbiAgICBjb2RlUGlwZWxpbmUuYWRkU3RhZ2UobmV3IEFwcGxpY2F0aW9uKHRoaXMsICdEZXBsb3lBcHBsaWNhdGlvblN0YWNrcycsIHtcbiAgICAgIGFwcFN0YWNrRmFjdG9yeTogcHJvcHMuYXBwU3RhY2tGYWN0b3J5LFxuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgdmVyc2lvbjogcHJvY2Vzcy5lbnYuUElQRUxJTkVfRVhFQ1VUSU9OX0lEID8/ICdQSVBFTElORV9FWEVDVVRJT05fSUQgbm90IHNldCcsXG4gICAgfSksIHtcbiAgICAgIHByZTogc2VjcmV0c0RlcGxveVN0ZXBQcm9wcyA/IFtzZWNyZXRzRGVwbG95U3RlcFByb3BzXSA6IHVuZGVmaW5lZCxcbiAgICAgIHBvc3Q6IGNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCA/IFtjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXBdIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIGNvZGVQaXBlbGluZS5idWlsZFBpcGVsaW5lKCk7XG5cbiAgICB0aGlzLnRhZ0NvZGVCdWlsZFByb2plY3Qoc3RyaXBBc3NldHNTdGVwLCAncHJvamVjdF90eXBlJywgJ3N0cmlwX2Fzc2V0cycpO1xuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChzZWNyZXRzRGVwbG95U3RlcFByb3BzLCAncHJvamVjdF90eXBlJywgJ2RlcGxveV9zZWNyZXRzJyk7XG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KG1haW5CdWlsZCwgJ3Byb2plY3RfdHlwZScsICdidWlsZCcpO1xuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXAsICdwcm9qZWN0X3R5cGUnLCAnZGVwbG95X2NhcGFiaWxpdHlfbW9uaXRvcmluZycpO1xuXG4gICAgaWYgKGNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCkge1xuICAgICAgY29uc3QgbW9uaXRvcmluZ1Rlc3RzdWl0ZVJ1bm5lckJ1Y2tldCA9IEJ1Y2tldC5mcm9tQnVja2V0TmFtZSh0aGlzLCAnTW9uaXRvcmluZ1Rlc3RzdWl0ZVJ1bm5lckJ1Y2tldCcsIGBtb25pdG9yaW5nLXRlc3RzdWl0ZS1ydW5uZXItJHt0aGlzLmFjY291bnR9YCk7XG4gICAgICBtb25pdG9yaW5nVGVzdHN1aXRlUnVubmVyQnVja2V0LmdyYW50V3JpdGUoY2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdCBydWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdQaXBlbGluZVNjaGVkdWxlJywge1xuICAgICAgc2NoZWR1bGU6IGV2ZW50cy5TY2hlZHVsZS5leHByZXNzaW9uKHByb3BzLnBpcGVsaW5lU2NoZWR1bGVzPy5tYWluUGlwZWxpbmUgfHwgJ2Nyb24oMCA5ID8gKiAyIzEgKiknKSxcbiAgICB9KTtcbiAgICBydWxlLmFkZFRhcmdldChuZXcgdGFyZ2V0cy5Db2RlUGlwZWxpbmUoY29kZVBpcGVsaW5lLnBpcGVsaW5lKSk7XG5cbiAgICB0aGlzLl9vc3NMaWNlbnNlc0J1Y2tldC5ncmFudFJlYWRXcml0ZShtYWluQnVpbGQpO1xuICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyLmdyYW50UmVhZChtYWluQnVpbGQpO1xuICAgIGlmIChwcm9wcy5waXBlbGluZVR5cGUgIT09IFBpcGVsaW5lVHlwZS5TVEFOREFSRF9JTkZSQVNUUlVDVFVSRSkge1xuICAgICAgdGhpcy5fc2VydmljZUtleXN0b3JlUGFzc3dvcmQuZ3JhbnRSZWFkKG1haW5CdWlsZCk7XG4gICAgfVxuICAgIHRoaXMuX2FjY291bnROYW1lUGFyYW1ldGVyLmdyYW50UmVhZChtYWluQnVpbGQpO1xuICAgIGlmIChwcm9wcy5waXBlbGluZVR5cGUgPT09IFBpcGVsaW5lVHlwZS5TVEFOREFSRF9HUkFETEVfS0FGS0EpIHtcbiAgICAgIHRoaXMuZ3JhbnRQZXJtaXNzaW9uc0ZvckthZmthSW50ZWdyYXRpb24obWFpbkJ1aWxkLCAnS2Fma2FJbnRlZ3JhdGlvblBvbGljeScpO1xuICAgIH1cbiAgICBjb2RlUGlwZWxpbmUucGlwZWxpbmUuYXJ0aWZhY3RCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoc3RyaXBBc3NldHNTdGVwLnByb2plY3QpO1xuXG4gICAgbmV3IERhdGFkb2dQaXBlbGluZUVycm9yQWxlcnQodGhpcywgJ0RhdGFkb2dQaXBlbGluZUVycm9yTW9uaXRvcicsIHtcbiAgICAgIHNlcnZpY2VOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgIHBpcGVsaW5lTmFtZTogdGhpcy5yZW5hbWVQaXBlbGluZVRvTG93ZXJDYXNlKHBpcGVsaW5lKSxcbiAgICAgIGFjY291bnRJZDogdGhpcy5hY2NvdW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRCcmFuY2hQaXBlbGluZShwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzLCBicmFuY2hCdWlsZDogQ29kZUJ1aWxkU3RlcCkge1xuICAgIGNvbnN0IGJyYW5jaFBpcGVsaW5lID0gbmV3IGNvZGVwaXBlbGluZS5QaXBlbGluZSh0aGlzLCAnQnJhbmNoUGlwZWxpbmUnLCB7XG4gICAgICBhcnRpZmFjdEJ1Y2tldDogdGhpcy5fY2FjaGVCdWNrZXQsXG4gICAgICBwaXBlbGluZVR5cGU6IHRoaXMuX2NvZGVQaXBlbGluZVR5cGUsXG4gICAgfSk7XG4gICAgY29uc3QgYnJhbmNoQ29kZVBpcGVsaW5lID0gbmV3IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUoYnJhbmNoUGlwZWxpbmUsICdDb2RlUGlwZWxpbmUnLCB7XG4gICAgICBjb2RlUGlwZWxpbmU6IGJyYW5jaFBpcGVsaW5lLFxuICAgICAgc3ludGg6IGJyYW5jaEJ1aWxkLFxuICAgICAgc2VsZk11dGF0aW9uOiBmYWxzZSxcbiAgICB9KTtcbiAgICBUYWdzLm9mKGJyYW5jaFBpcGVsaW5lKS5hZGQoJ3BpcGVsaW5lX3R5cGUnLCAnYnJhbmNoJyk7XG4gICAgYnJhbmNoQ29kZVBpcGVsaW5lLmFkZFdhdmUoJ0JyYW5jaEJ1aWxkJykuYWRkUG9zdChicmFuY2hCdWlsZCk7XG4gICAgYnJhbmNoQ29kZVBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcblxuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChicmFuY2hCdWlsZCwgJ3Byb2plY3RfdHlwZScsICdicmFuY2hfYnVpbGQnKTtcblxuICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0LmdyYW50UmVhZFdyaXRlKGJyYW5jaEJ1aWxkKTtcbiAgICB0aGlzLl9vc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlci5ncmFudFJlYWQoYnJhbmNoQnVpbGQpO1xuICAgIHRoaXMuX3NlcnZpY2VLZXlzdG9yZVBhc3N3b3JkLmdyYW50UmVhZChicmFuY2hCdWlsZCk7XG4gICAgdGhpcy5fYWNjb3VudE5hbWVQYXJhbWV0ZXIuZ3JhbnRSZWFkKGJyYW5jaEJ1aWxkKTtcbiAgICBpZiAocHJvcHMucGlwZWxpbmVUeXBlID09PSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfR1JBRExFX0tBRktBKSB7XG4gICAgICB0aGlzLmdyYW50UGVybWlzc2lvbnNGb3JLYWZrYUludGVncmF0aW9uKGJyYW5jaEJ1aWxkLCAnQnJhbmNoS2Fma2FJbnRlZ3JhdGlvblBvbGljeScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkVnVsbmVyYWJpbGl0eVBpcGVsaW5lKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpIHtcbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5QnVpbGQgPSBuZXcgUmlvQ29kZUJ1aWxkUHJvamVjdCh0aGlzLCAnVnVsbmVyYWJpbGl0eUNoZWNrcycsIHtcbiAgICAgIGlucHV0OiB0aGlzLl9pbnB1dE1hc3RlclRyaWdnZXJGaWxlLFxuICAgICAgcGFydGlhbEJ1aWxkU3BlYzogdGhpcy5sb2FkQnVpbGRTcGVjRnJvbUZpbGUocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ2J1aWxkc3BlY3MvYnVpbGRzcGVjLXZ1bG5lcmFiaWxpdHktY2hlY2tzLnlhbWwnKSksXG4gICAgICBidWlsZEVudmlyb25tZW50OiBwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8uYnVpbGRFbnZpcm9ubWVudCxcbiAgICAgIGhvc3RlZFpvbmVOYW1lOiB0aGlzLl9ob3N0ZWRab25lLnpvbmVOYW1lLFxuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgY2FjaGVCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgIH0pO1xuICAgIGNvbnN0IHZ1bG5lcmFiaWxpdHlQaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgJ1Z1bG5lcmFiaWxpdHlQaXBlbGluZScsIHtcbiAgICAgIGFydGlmYWN0QnVja2V0OiB0aGlzLl9jYWNoZUJ1Y2tldCxcbiAgICAgIHBpcGVsaW5lVHlwZTogdGhpcy5fY29kZVBpcGVsaW5lVHlwZSxcbiAgICB9KTtcbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5Q29kZVBpcGVsaW5lID0gbmV3IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUodnVsbmVyYWJpbGl0eVBpcGVsaW5lLCAnQ29kZVBpcGVsaW5lJywge1xuICAgICAgY29kZVBpcGVsaW5lOiB2dWxuZXJhYmlsaXR5UGlwZWxpbmUsXG4gICAgICBzeW50aDogdnVsbmVyYWJpbGl0eUJ1aWxkLFxuICAgICAgc2VsZk11dGF0aW9uOiBmYWxzZSxcbiAgICB9KTtcbiAgICBUYWdzLm9mKHZ1bG5lcmFiaWxpdHlQaXBlbGluZSkuYWRkKCdwaXBlbGluZV90eXBlJywgJ3Z1bG5lcmFiaWxpdHknKTtcblxuICAgIHZ1bG5lcmFiaWxpdHlDb2RlUGlwZWxpbmUuYWRkV2F2ZSgnVnVsbmVyYWJpbGl0eUNoZWNrcycpLmFkZFBvc3QodnVsbmVyYWJpbGl0eUJ1aWxkKTtcbiAgICB2dWxuZXJhYmlsaXR5Q29kZVBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcbiAgICBUYWdzLm9mKHZ1bG5lcmFiaWxpdHlCdWlsZC5wcm9qZWN0KS5hZGQoJ3Byb2plY3RfdHlwZScsICd2dWxuZXJhYmlsaXR5X2NoZWNrJyk7XG4gICAgdGhpcy5fbmlzdERhdGFNaXJyb3JVcmwuZ3JhbnRSZWFkKHZ1bG5lcmFiaWxpdHlCdWlsZCk7XG5cbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5UnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCAnVnVsbmVyYWJpbGl0eVBpcGVsaW5lU2NoZWR1bGUnLCB7XG4gICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMucGlwZWxpbmVTY2hlZHVsZXM/LnZ1bG5lcmFiaWxpdHlQaXBlbGluZSB8fCAnY3JvbigwIDUgPyAqIE1PTi1GUkkgKiknKSxcbiAgICB9KTtcbiAgICB2dWxuZXJhYmlsaXR5UnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKHZ1bG5lcmFiaWxpdHlDb2RlUGlwZWxpbmUucGlwZWxpbmUpKTtcblxuICAgIGlmIChwcm9wcy5kYXRhZG9nQWxlcnRUeXBlID09PSAnb3BzZ2VuaWUnKSB7XG4gICAgICB0aHJvdyBFcnJvcignVGhlIE9wc0dlbmllIGFsZXJ0VHlwZSBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuIFBsZWFzZSB1c2UgdGhlIHZ1bG5lcmFiaWxpdHlOb3RpZmljYXRpb24gcHJvcGVydHkgaW5zdGVhZC4nKTtcbiAgICB9XG4gICAgbmV3IERhdGFEb2dQaXBlbGluZUVycm9yQWxlcnRGb3JWdWxuZXJhYmlsaXR5Q2hlY2tzKHRoaXMsICdEYXRhRG9nUGlwZWxpbmVFcnJvckZvclZ1bG5lcmFiaWxpdHlDaGVja3NNb25pdG9yJywge1xuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgcGlwZWxpbmVOYW1lOiB0aGlzLnJlbmFtZVBpcGVsaW5lVG9Mb3dlckNhc2UodnVsbmVyYWJpbGl0eVBpcGVsaW5lKSxcbiAgICAgIGFjY291bnRJZDogdGhpcy5hY2NvdW50LFxuICAgICAgbm90aWZpY2F0aW9uOiBwcm9wcy52dWxuZXJhYmlsaXR5Tm90aWZpY2F0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdHJpcEFzc2V0c1N0ZXAocGlwZWxpbmU6IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUpOiBDb2RlQnVpbGRTdGVwIHtcbiAgICAvLyBDbG91ZEFzc2VtYmx5QXJ0aWZhY3RzIG11c3QgYmUgc21hbGxlciB0aGFuIDI1Nk1CLiBEdWUgdG8gdGhlIGdyYWRsZSBhcnRpZmFjdCB3ZSBhcmUgZXhjZWVkaW5nIHRoaXMgbGltaXQgYW5kIHBpcGVsaW5lIGZhaWxzIGluIGRlcGxveW1lbnQgc3RlcC5cbiAgICAvLyBJc3N1ZSBpcyBrbm93biBhbmQgbm90IGZpeGVkIGZvciBhbHJlYWR5IHNvbWUgeWVhcnMuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy85OTE3XG4gICAgLy8gRGlydHkgZml4OiBBc3NldHMgYXJlIGFscmVhZHkgdXBsb2FkZWQgYW5kIHRodXMgbm90IG5lZWRlZC4gUmVtb3ZlIHRoZW0gZnJvbSBwaXBlbGluZSBhcnRpZmFjdC5cbiAgICByZXR1cm4gbmV3IENvZGVCdWlsZFN0ZXAoXG4gICAgICAnU3RyaXBBc3NldHNGcm9tQXNzZW1ibHknLCB7XG4gICAgICAgIGlucHV0OiBwaXBlbGluZS5jbG91ZEFzc2VtYmx5RmlsZVNldCxcbiAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAnUzNfUEFUSD0ke0NPREVCVUlMRF9TT1VSQ0VfVkVSU0lPTiNcImFybjphd3M6czM6OjpcIn0nLFxuICAgICAgICAgICdaSVBfQVJDSElWRT0kKGJhc2VuYW1lICRTM19QQVRIKScsXG4gICAgICAgICAgJ3JtIC1yZnYgYXNzZXQuKicsXG4gICAgICAgICAgJ3ppcCAtciAtcSAtQSAkWklQX0FSQ0hJVkUgKicsXG4gICAgICAgICAgJ2F3cyBzMyBjcCAkWklQX0FSQ0hJVkUgczM6Ly8kUzNfUEFUSCcsXG4gICAgICAgIF0sXG4gICAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBidWlsZEltYWdlOiBMaW51eExhbWJkYUJ1aWxkSW1hZ2UuQU1BWk9OX0xJTlVYXzIwMjNfTk9ERV8yMCxcbiAgICAgICAgICBjb21wdXRlVHlwZTogQ29tcHV0ZVR5cGUuTEFNQkRBXzFHQixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKG1haW5CdWlsZDogQ29kZUJ1aWxkU3RlcCwgcHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wcyk6IENvZGVCdWlsZFN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5tb25pdG9yaW5nRGVwbG95U3RlcFByb3BzKSB7XG4gICAgICBjb25zdCBtb25pdG9yaW5nQXJ0aWZhY3RzID0gT2JqZWN0LmtleXMocHJvcHMubW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcy5tb25pdG9yaW5nQXJ0aWZhY3RzKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBtYWluQnVpbGQuYWRkT3V0cHV0RGlyZWN0b3J5KGtleSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXQ6IG91dHB1dCxcbiAgICAgICAgICBmaWxlczogcHJvcHMubW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcyEubW9uaXRvcmluZ0FydGlmYWN0c1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFJpb0NhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCh0aGlzLCAnRGVwbG95Q2FwYWJpbGl0eU1vbml0b3JpbmcnLCB7XG4gICAgICAgIG1vbml0b3JpbmdBcnRpZmFjdHM6IG1vbml0b3JpbmdBcnRpZmFjdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNlY3JldHNEZXBsb3lTdGVwKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpOiByaW8uUmlvU2VjcmV0c0RlcGxveVN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5zZWNyZXRzRGVwbG95U3RlcFByb3BzKSB7XG4gICAgICByZXR1cm4gbmV3IHJpby5SaW9TZWNyZXRzRGVwbG95U3RlcCh0aGlzLCAnRGVwbG95U2VjcmV0cycsIHtcbiAgICAgICAgLi4ucHJvcHMuc2VjcmV0c0RlcGxveVN0ZXBQcm9wcyxcbiAgICAgICAgaW5wdXQ6IHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVEZWZhdWx0QnVpbGRTcGVjKHBpcGVsaW5lVHlwZTogUGlwZWxpbmVUeXBlKSB7XG4gICAgc3dpdGNoIChwaXBlbGluZVR5cGUpIHtcbiAgICAgIGNhc2UgUGlwZWxpbmVUeXBlLlNUQU5EQVJEX0dSQURMRTpcbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdidWlsZHNwZWNzL2J1aWxkc3BlYy55YW1sJyk7XG4gICAgICBjYXNlIFBpcGVsaW5lVHlwZS5TVEFOREFSRF9HUkFETEVfS0FGS0E6XG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnYnVpbGRzcGVjcy9idWlsZHNwZWNfa2Fma2EueWFtbCcpO1xuICAgICAgY2FzZSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkU6XG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnYnVpbGRzcGVjcy9idWlsZHNwZWNfaW5mcmFzdHJ1Y3R1cmUueWFtbCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ3JhbnRQZXJtaXNzaW9uc0ZvckthZmthSW50ZWdyYXRpb24oYnVpbGRQcm9qZWN0OiBSaW9Db2RlQnVpbGRQcm9qZWN0LCBwb2xpY3lJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVpbGRQcm9qZWN0Um9sZSA9IGJ1aWxkUHJvamVjdC5wcm9qZWN0LnJvbGU7XG4gICAgaWYgKGJ1aWxkUHJvamVjdFJvbGUpIHtcbiAgICAgIGJ1aWxkUHJvamVjdFJvbGUuYWRkTWFuYWdlZFBvbGljeShcbiAgICAgICAgTWFuYWdlZFBvbGljeS5mcm9tTWFuYWdlZFBvbGljeUFybih0aGlzLFxuICAgICAgICAgIHBvbGljeUlkLFxuICAgICAgICAgIEZuLmltcG9ydFZhbHVlKCdrYWZrYS1pbnRlZ3JhdGlvbi1wb2xpY3ktYXJuJyksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ291bGQgbm90IGFkZCBtYW5hZ2VkIHBvbGljeSBmb3Iga2Fma2EtaW50ZWdyYXRpb24gdG8gQ29kZUJ1aWxkIHByb2plY3Qgb2YgJHtidWlsZFByb2plY3QuaWR9IGR1ZSB0byBtaXNzaW5nIHJvbGUuYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQnVpbGRTcGVjRnJvbUZpbGUoYnVpbGRTcGVjUGF0aDogc3RyaW5nKTogQnVpbGRTcGVjIHtcbiAgICByZXR1cm4gQnVpbGRTcGVjLmZyb21PYmplY3QoeWFtbC5sb2FkKGZzLnJlYWRGaWxlU3luYyhidWlsZFNwZWNQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pKSBhcyBPYmplY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5hbWVQaXBlbGluZVRvTG93ZXJDYXNlKHBpcGVsaW5lOiBJUGlwZWxpbmUpOiBSZWZlcmVuY2Uge1xuICAgIGNvbnN0IHVwcGVyVG9Mb3dlckNyID0gbmV3IGNkay5DdXN0b21SZXNvdXJjZSh0aGlzLCBgJHtwaXBlbGluZS5ub2RlLmlkfS1VcHBlclRvTG93ZXJgLCB7XG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OlVwcGVyVG9Mb3dlcicsXG4gICAgICBzZXJ2aWNlVG9rZW46IFVwcGVyVG9Mb3dlci5nZXRPckNyZWF0ZSh0aGlzKS5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFVwcGVyOiBwaXBlbGluZS5waXBlbGluZU5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB1cHBlclRvTG93ZXJDci5nZXRBdHQoJ0xvd2VyJyk7XG4gIH1cblxuICBwcml2YXRlIHRhZ0NvZGVCdWlsZFByb2plY3QocHJvamVjdDogQ29kZUJ1aWxkU3RlcCB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAocHJvamVjdCkge1xuICAgICAgVGFncy5vZihwcm9qZWN0LnByb2plY3QpLmFkZChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29udHJpYnV0aW9ucy90ZWFtLXRyYW5zcG9ydC10d28vcGlwZWxpbmUvcGlwZWxpbmUtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLG1DQUFtQztBQUNuQyw2Q0FBOEY7QUFDOUYsNkRBQTRHO0FBQzVHLDZEQUE2RDtBQUU3RCw2RUFBNkU7QUFDN0UsaURBQWlEO0FBQ2pELDBEQUEwRDtBQUMxRCxpREFBb0Q7QUFFcEQseUNBQXlDO0FBQ3pDLCtDQUFxRDtBQUNyRCwyQ0FBMkM7QUFFM0MsbURBQW1EO0FBQ25ELHFEQUEwRTtBQUUxRSxnQ0FBZ0M7QUFDaEMsMkRBQWtEO0FBQ2xELG1EQUFzRDtBQUN0RCw2Q0FBaUY7QUFDakYseURBQWdIO0FBQ2hILHFFQUE2RTtBQUc3RSxzQ0FBc0M7QUFDdEMsMENBQWlFO0FBQ2pFLGdEQUFpRDtBQXlMakQsSUFBWSxZQXNDWDtBQXRDRCxXQUFZLFlBQVk7SUFFdEI7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsbURBQW1DLENBQUE7SUFDbkM7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILCtEQUErQyxDQUFBO0lBQy9DOzs7OztPQUtHO0lBQ0gsbUVBQW1ELENBQUE7QUFDckQsQ0FBQyxFQXRDVyxZQUFZLDRCQUFaLFlBQVksUUFzQ3ZCO0FBY0QsTUFBYSxhQUFjLFNBQVEsbUJBQUs7SUFnQnRDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLCtCQUErQjtRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsZ0JBQUUsQ0FBQyxXQUFXLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDckQsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztZQUNwQyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxVQUFVLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM3QixtQ0FBbUMsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ3REO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxXQUFXLFlBQVksR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMvTCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLFdBQVcsWUFBWSxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRS9MLElBQUksQ0FBQywyQkFBMkIsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLDZCQUE2QixDQUFDLElBQUksRUFBRSw0QkFBNEIsRUFBRSxFQUFFLGFBQWEsRUFBRSxrQ0FBa0MsRUFBRSxDQUFDLENBQUM7UUFDaEwsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUgsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsbUNBQW1DLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ2hILGFBQWEsRUFBRSxXQUFXLEtBQUssQ0FBQyxXQUFXLDRCQUE0QjtZQUN2RSxPQUFPLEVBQUUsQ0FBQztTQUNYLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQy9ILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLG1DQUFtQyxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUMzRyxhQUFhLEVBQUUsOEJBQThCO1lBQzdDLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUVoRixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuRSxJQUFJLG1CQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUNuQyxPQUFPLEVBQUUsMEJBQWtCLENBQUMsZ0JBQWdCO1lBQzVDLFdBQVc7WUFDWCxPQUFPO1lBQ1AsT0FBTyxFQUFFLFFBQVE7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLHNCQUFzQjtRQUMvQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM5QyxNQUFNLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQXlCO1FBQzdDLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsTUFBTSxLQUFLLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLGdCQUFnQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNyRSxNQUFNLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUMzQixLQUFLLFlBQVksQ0FBQyxlQUFlO29CQUMvQixPQUFPO3dCQUNMLGNBQWMsRUFBRSxJQUFJO3dCQUNwQixxQkFBcUIsRUFBRSxJQUFJO3dCQUMzQixXQUFXLEVBQUUsSUFBSTt3QkFDakIsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsZ0JBQWdCLEVBQUUsS0FBSztxQkFDeEIsQ0FBQztnQkFDSixLQUFLLFlBQVksQ0FBQyxxQkFBcUI7b0JBQ3JDLE9BQU87d0JBQ0wsY0FBYyxFQUFFLElBQUk7d0JBQ3BCLHFCQUFxQixFQUFFLElBQUk7d0JBQzNCLFdBQVcsRUFBRSxJQUFJO3dCQUNqQixRQUFRLEVBQUUsS0FBSzt3QkFDZixnQkFBZ0IsRUFBRSxJQUFJO3FCQUN2QixDQUFDO2dCQUNKLEtBQUssWUFBWSxDQUFDLHVCQUF1QjtvQkFDdkMsT0FBTzt3QkFDTCxjQUFjLEVBQUUsS0FBSzt3QkFDckIscUJBQXFCLEVBQUUsS0FBSzt3QkFDNUIsV0FBVyxFQUFFLEtBQUs7d0JBQ2xCLFFBQVEsRUFBRSxLQUFLO3dCQUNmLGdCQUFnQixFQUFFLEtBQUs7cUJBQ3hCLENBQUM7WUFDTixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU87WUFDTCxjQUFjLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxjQUFjLElBQUksSUFBSTtZQUN0RCxxQkFBcUIsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLHFCQUFxQixJQUFJLElBQUk7WUFDcEUsV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsV0FBVyxJQUFJLEtBQUs7WUFDakQsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxJQUFJLEtBQUs7WUFDM0MsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsSUFBSSxLQUFLO1lBQzNELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsa0JBQWtCO1lBQ3RELHVCQUF1QixFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsdUJBQXVCO1NBQ2pFLENBQUM7SUFDSixDQUFDO0lBRU8seUJBQXlCLENBQUMsSUFBWSxFQUFFLFdBQStCLEVBQUUsS0FBeUI7UUFDeEcsT0FBTyxJQUFJLG1DQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDekMsS0FBSyxFQUFFLFdBQVc7WUFDbEIsZUFBZSxFQUFFLHdCQUF3QjtZQUN6QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLElBQUksSUFBQSxnQ0FBbUIsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2xJLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDM0QsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUN6QyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBeUIsRUFBRSxTQUF3QjtRQUN6RSxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUMzRCxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDakMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7U0FDckMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUU7WUFDeEUsWUFBWSxFQUFFLFFBQVE7WUFDdEIsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsa0JBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVoRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFakUsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25HLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLDhCQUE4QixFQUFFLENBQUM7WUFDbkMsU0FBUyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksK0JBQVcsQ0FBQyxJQUFJLEVBQUUseUJBQXlCLEVBQUU7WUFDckUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1lBQ3RDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSwrQkFBK0I7U0FDOUUsQ0FBQyxFQUFFO1lBQ0YsR0FBRyxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbEUsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsOEJBQThCLEVBQUUsY0FBYyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDekcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRWhGLElBQUksOEJBQThCLEVBQUUsQ0FBQztZQUNuQyxNQUFNLCtCQUErQixHQUFHLGVBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFFLCtCQUErQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN0SiwrQkFBK0IsQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFvQixDQUFDLENBQUM7WUFDN0csY0FBYyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3JELFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxJQUFJLHFCQUFxQixDQUFDO1NBQ3JHLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTdFLElBQUksNENBQXlCLENBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFFO1lBQ2pFLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixZQUFZLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQztZQUN0RCxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDeEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFdBQTBCO1FBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDdkUsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2pDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCO1NBQ3JDLENBQUMsQ0FBQztRQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUU7WUFDcEYsWUFBWSxFQUFFLGNBQWM7WUFDNUIsS0FBSyxFQUFFLFdBQVc7WUFDbEIsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsa0JBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELGtCQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRW5DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFdBQVcsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7SUFDSCxDQUFDO0lBRU8sd0JBQXdCLENBQUMsS0FBeUI7UUFDeEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLG1DQUFtQixDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUM5RSxLQUFLLEVBQUUsSUFBSSxDQUFDLHVCQUF1QjtZQUNuQyxnQkFBZ0IsRUFBRSxJQUFBLHlDQUE0QixFQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDOUQsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtZQUMzRCxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1lBQ3pDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO1lBQ3JGLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtTQUNyQyxDQUFDLENBQUM7UUFDSCxNQUFNLHlCQUF5QixHQUFHLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLEVBQUU7WUFDbEcsWUFBWSxFQUFFLHFCQUFxQjtZQUNuQyxLQUFLLEVBQUUsa0JBQWtCO1lBQ3pCLFlBQVksRUFBRSxLQUFLO1NBQ3BCLENBQUMsQ0FBQztRQUNILGtCQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVyRSx5QkFBeUIsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRix5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQyxrQkFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXRELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSwrQkFBK0IsRUFBRTtZQUMvRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLHFCQUFxQixJQUFJLHlCQUF5QixDQUFDO1NBQ2xILENBQUMsQ0FBQztRQUNILGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUUxRixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQyw2R0FBNkcsQ0FBQyxDQUFDO1FBQzdILENBQUM7UUFDRCxJQUFJLGtFQUErQyxDQUFDLElBQUksRUFBRSxtREFBbUQsRUFBRTtZQUM3RyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQztZQUNuRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDdkIsWUFBWSxFQUFFLEtBQUssQ0FBQyx5QkFBeUI7U0FDOUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFFBQWdDO1FBQzVELG1KQUFtSjtRQUNuSix1R0FBdUc7UUFDdkcsa0dBQWtHO1FBQ2xHLE9BQU8sSUFBSSx5QkFBYSxDQUN0Qix5QkFBeUIsRUFBRTtZQUN6QixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQjtZQUNwQyxRQUFRLEVBQUU7Z0JBQ1IscURBQXFEO2dCQUNyRCxrQ0FBa0M7Z0JBQ2xDLGlCQUFpQjtnQkFDakIsNkJBQTZCO2dCQUM3QixzQ0FBc0M7YUFDdkM7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDaEIsVUFBVSxFQUFFLHFDQUFxQixDQUFDLHlCQUF5QjtnQkFDM0QsV0FBVyxFQUFFLDJCQUFXLENBQUMsVUFBVTthQUNwQztTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxvQ0FBb0MsQ0FBQyxTQUF3QixFQUFFLEtBQXlCO1FBQzlGLElBQUksS0FBSyxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDcEMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN2RyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELE9BQU87b0JBQ0wsS0FBSyxFQUFFLE1BQU07b0JBQ2IsS0FBSyxFQUFFLEtBQUssQ0FBQyx5QkFBMEIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUM7aUJBQ2pFLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSwwREFBaUMsQ0FBQyxJQUFJLEVBQUUsNEJBQTRCLEVBQUU7Z0JBQy9FLG1CQUFtQixFQUFFLG1CQUFtQjthQUN6QyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsS0FBeUI7UUFDdkQsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7Z0JBQ3pELEdBQUcsS0FBSyxDQUFDLHNCQUFzQjtnQkFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyx1QkFBdUI7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVPLDhCQUE4QixDQUFDLFNBQXdCO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSx5QkFBYSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pDLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSxxQ0FBcUIsQ0FBQyx5QkFBeUI7Z0JBQzNELFdBQVcsRUFBRSwyQkFBVyxDQUFDLFVBQVU7YUFDcEM7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsOEVBQThFLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUc7Z0JBQ2xILHVEQUF1RCxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixHQUFHO2FBQzVGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG1DQUFtQyxDQUFDLFlBQWlDLEVBQUUsUUFBZ0I7UUFDN0YsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNuRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQy9CLHVCQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUNyQyxRQUFRLEVBQ1IsZ0JBQUUsQ0FBQyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FDL0MsQ0FDRixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEtBQUssQ0FBQyw4RUFBOEUsWUFBWSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUNwSSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLGFBQXNCO1FBQ2xELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyx5QkFBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQVcsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxRQUFtQjtRQUNuRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsRUFBRTtZQUN0RixZQUFZLEVBQUUsc0JBQXNCO1lBQ3BDLFlBQVksRUFBRSx1QkFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWTtZQUNsRSxVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUFrQyxFQUFFLEdBQVcsRUFBRSxLQUFhO1FBQ3hGLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixrQkFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQzs7QUFqWUgsc0NBa1lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBEdXJhdGlvbiwgRm4sIFJlZmVyZW5jZSwgUmVtb3ZhbFBvbGljeSwgU3RhY2ssIFN0YWNrUHJvcHMsIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBCdWlsZEVudmlyb25tZW50LCBCdWlsZFNwZWMsIENvbXB1dGVUeXBlLCBMaW51eExhbWJkYUJ1aWxkSW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lJztcbmltcG9ydCB7IElQaXBlbGluZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lX2FjdGlvbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZS1hY3Rpb25zJztcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1hbmFnZWRQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElIb3N0ZWRab25lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IEJ1Y2tldCwgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBJU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgKiBhcyBwaXBlbGluZXMgZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvZGVCdWlsZFN0ZXAsIENvZGVQaXBlbGluZVNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL3BpcGVsaW5lcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbiB9IGZyb20gJy4vYXBwbGljYXRpb24tc3RhZ2UnO1xuaW1wb3J0IHsgUmlvQ29kZUJ1aWxkUHJvamVjdCB9IGZyb20gJy4vYnVpbGQtcHJvamVjdCc7XG5pbXBvcnQgeyBjcmVhdGVNYWluQnVpbGRTcGVjLCBjcmVhdGVWdWxuZXJhYmlsaXR5QnVpbGRTcGVjIH0gZnJvbSAnLi9idWlsZHNwZWNzJztcbmltcG9ydCB7IERhdGFkb2dQaXBlbGluZUVycm9yQWxlcnQsIERhdGFEb2dQaXBlbGluZUVycm9yQWxlcnRGb3JWdWxuZXJhYmlsaXR5Q2hlY2tzIH0gZnJvbSAnLi9kYXRhZG9nLW1vbml0b3JzJztcbmltcG9ydCB7IFJpb0NhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCB9IGZyb20gJy4vbW9uaXRvcmluZy1kZXBsb3ktc3RlcCc7XG5pbXBvcnQgeyBEYXRhZG9nQWxlcnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YWRvZyc7XG5pbXBvcnQgeyBJTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGF0YWRvZ3YyJztcbmltcG9ydCAqIGFzIHJpbyBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBDbGFpZG9tZXRlciwgQ2xhaWRvbWV0ZXJQcm9kdWN0IH0gZnJvbSAnLi4vLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgVXBwZXJUb0xvd2VyIH0gZnJvbSAnLi4vLi4vLi4vd2F0Y2hmdWwnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTY2hlZHVsZXNQcm9wcyB7XG4gIHJlYWRvbmx5IG1haW5QaXBlbGluZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBpcGVsaW5lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBzdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhpcyBoYXMgdG8gYmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVwb3NpdG9yeSBhcyB0aGUgczMgdHJpZ2dlciBmaWxlIGNyZWF0ZWQgYnkgdGhlIGJpdGJ1Y2tldC1pbnRlZ3JhdGlvbiB1c2VzIHRoaXMgYXMgYSBwcmVmaXhcbiAgICogLSBUaGUgc2VydmljZU5hbWUgaXMgYXZhaWxhYmxlIGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIFNFUlZJQ0VfTkFNRSBpbiB0aGUgQ29kZUJ1aWxkU3RlcFxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIEFwcFN0YWNrUHJvcHMgaW4gdGhlIGFwcFN0YWNrRmFjdG9yeVxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgYXMgc3RhY2tOYW1lIHByb3BlcnR5IGluIHRoZSBBcHBTdGFja1Byb3BzIGluIHRoZSBhcHBTdGFja0ZhY3RvcnkuIEkuZS4gdGhlIHN0YWNrIGlzIG5hbWVkIGFmdGVyIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhlIHNlcnZpY2VOYW1lIGlzIGhhbmRlZCBvdmVyIHRvIGFsbCBEYXRhZG9nIG1vbml0b3JzXG4gICAqIC0gUklPIGNvbnZlbnRpb24gaXMgdGhhdCB1cGxvYWRlZCBsaWNlbnNlLWNoZWNrLWZpbGVzIGFyZSBuYW1lZCBhZnRlciB0aGUgc2VydmljZSwgaS5lLiBzZXJ2aWNlTmFtZS50eHRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVyIGZvciBhcHBTdGFjayB0byBiZSBkZXBsb3llZC5cbiAgICpcbiAgICogVGhpcyBhY3RzIGFzIGEgd3JhcHBlciBmb3IgYWxsIHJlc291cmNlcyB5b3Ugd2FudCB0byBkZXBsb3kgdmlhIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFN0YWNrRmFjdG9yeTogSUFwcFN0YWNrRmFjdG9yeTtcblxuICAvKipcbiAgICogRGVmaW5lcyB3aGljaCBraW5kIG9mIHBpcGVsaW5lIGlzIGRlcGxveWVkLlxuICAgKlxuICAgKiBVc2UgdGhlIGZlYXR1cmVzIHRvIGNvbWJpbmUgZGlmZmVyZW50IG9waW5pb25hdGVkLCBSSU8tc3BlY2lmaWMgcGlwZWxpbmUgZmVhdHVyZXMgc3VjaCBhcyBhZGRpbmcgYSBicmFuY2ggcGlwZWxpbmUgb3Igc3VwcG9ydGluZyBLYWZrYS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogUGlwZWxpbmVGZWF0dXJlcztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBgZmVhdHVyZXNgIHByb3BlcnR5IGluc3RlYWQuIEZvciBub3csIHRoZSBwaXBlbGluZSB0eXBlcyBhcmUgbWFwcGVkIHRvIHRoZSBmZWF0dXJlcy5cbiAgICogRGVmaW5lcyB3aGljaCBraW5kIG9mIHBpcGVsaW5lIGlzIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVUeXBlPzogUGlwZWxpbmVUeXBlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGhvdyBvZnRlbiB0aGUgcGlwZWxpbmUgaXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkuIElzIGRlZmluZWQgdmlhIGEgY3JvbiBleHByZXNzaW9uLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9TY2hlZHVsZWRFdmVudHMuaHRtbFxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlczpcbiAgICogLSBtYWluIHBpcGVsaW5lOiBjcm9uKDAgOSA/ICogMiMxICopXG4gICAqIC0gdnVsbmVyYWJpbGl0eSBwaXBlbGluZTogY3JvbigwIDUgPyAqIE1PTi1GUkkgKilcbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lU2NoZWR1bGVzPzogUGlwZWxpbmVTY2hlZHVsZXNQcm9wcztcblxuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHNlY3JldHMgZmlsZSBjb250YWluaW5nIGVuY3J5cHRlZCBzZWNyZXRzLlxuICAgKlxuICAgKiBUaGUgUmlvU2VjcmV0c0RlcGxveVN0ZXAgaXMgYWRkZWQgcHJpb3IgdG8gZGVwbG95bWVudCBvZiB0aGUgQXBwU3RhY2sgaWYgYSBwYXRoIGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBObyBzZWNyZXRzIGFyZSBkZXBsb3llZCBpZiBubyBwYXRoIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0c0RlcGxveVN0ZXBQcm9wcz86IFBpcGVsaW5lU3RhY2tSaW9TZWNyZXRzRGVwbG95U3RlcFByb3BzO1xuXG4gIC8qKlxuICAgKiBDb2RlQnVpbGQgb3B0aW9ucyBvdmVycmlkaW5nIHRoZSByaW8tc3BlY2lmaWMgZGVmYXVsdHMuXG4gICAqL1xuICByZWFkb25seSBjb2RlQnVpbGRPcHRpb25zPzogQ29kZUJ1aWxkT3B0aW9ucztcbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHRoZSBjYXBhYmlsaXR5IG1vbml0b3JpbmcgZGVwbG95IHN0ZXAgaXMgYWRkZWQgdG8gdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcz86IFBpcGVsaW5lU3RhY2tSaW9Nb25pdG9yaW5nRGVwbG95U3RlcFByb3BzO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgYHZ1bG5lcmFiaWxpdHlOb3RpZmljYXRpb25gIHByb3BlcnR5IGluc3RlYWQuXG4gICAqIElmIGBvcHNnZW5pZWAgaXMgc3BlY2lmaWVkLCBhbiBFeGNlcHRpb24gaXMgdGhyb3duLCBhcyB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFkb2dBbGVydFR5cGU/OiBEYXRhZG9nQWxlcnRUeXBlO1xuICAvKipcbiAgICogTm90aWZpY2F0aW9uIHR5cGUgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCB2dWxuZXJhYmlsaXR5IHBpcGVsaW5lIG1vbml0b3IuIERlZmF1bHRzIHRvIHNsYWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eU5vdGlmaWNhdGlvbj86IElOb3RpZmljYXRpb247XG4gIC8qKlxuICAgKiBDb2RlUGlwZWxpbmUgUGlwZWxpbmVUeXBlIChWMSBvciBWMikuIERlZmF1bHRzIHRvIFYxLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZVBpcGVsaW5lVHlwZT86IGNvZGVwaXBlbGluZS5QaXBlbGluZVR5cGU7XG59XG5cbi8qKlxuICogUHJvdmlkZXIgaW50ZXJmYWNlIHRvIGNyZWF0ZSB0aGUgQXBwU3RhY2sgd2l0aGluIHRoZSBzcGVjaWZpYyBzY29wZVxuICpcbiAqIFNpbXBseSBwbGFjZSB0aGUgQXBwU3RhY2sgY3JlYXRpb24gaW50byB0aGUgY3JlYXRlLW1ldGhvZDpcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gVXNlIGUuZy4gd2l0aGluIEFwcGxpY2F0aW9uUHJvcHMgYXMgSlNPTk9iamVjdDpcbiAqIFxceyBjcmVhdGU6IChjb25zdHJ1Y3QsIHByb3BzKSA9XFw+IG5ldyBTdGFjayhjb25zdHJ1Y3QsICdBcHBTdGFjaycsIHByb3BzKSBcXH1cbiAqXG4gKiAvLyBvciBzaW1wbHkgYXMgY2xhc3MgaW50ZXJmYWNlIHdpdGhpbiB5b3VyIHN0YWNrIGltcGxlbWVudGF0aW9uOlxuICogY2xhc3MgUGlwZWxpbmVTdGFnZSBleHRlbmRzIFN0YWdlIGltcGxlbWVudHMgSUFwcFN0YWNrRmFjdG9yeSBcXHtcbiAqICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFN0YWdlUHJvcHMpIFxce1xuICogICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICogICAgIC8vIHlvdXIgc3RhZ2UgZGVmaW5pdGlvblxuICogICBcXH1cbiAqXG4gKiAgIGNyZWF0ZShzY29wZTogQ29uc3RydWN0LCBwcm9wczogQXBwU3RhY2tQcm9wcyk6IHZvaWQgXFx7XG4gKiAgICAgLy8gYXBwIHN0YWNrIGluaXRpYXRpb24gZ29lcyBpbiBoZXJlXG4gKiAgIFxcfVxuICogXFx9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFwcFN0YWNrRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCwgYmVpbmcgaW52b2tlZCB3aXRoIHRoZSBzcGVjaWZpYyBzY29wZSBkdXJpbmcgcGlwZWxpbmUgaW5zdGFudGlhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgcGFyZW50IGNvbnN0cnVjdCBmb3IgdGhlIGFwcCBzdGFja1xuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgYXBwIHN0YWNrcyBwcm9wZXJ0aWVzXG4gICAqL1xuICBjcmVhdGUoc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IEFwcFN0YWNrUHJvcHMpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlbGVjdGVkIHByb3BlcnRpZXMgYmVpbmcgaGFuZGVkIG92ZXIgdG8gUmlvU2VjcmV0c0RlcGxveVN0ZXAuXG4gKlxuICogQHNlZSByaW8uUmlvU2VjcmV0c0RlcGxveVN0ZXBcbiAqIEBzZWUgcmlvLlJpb1NlY3JldHNEZXBsb3lTdGVwUHJvcHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0YWNrUmlvU2VjcmV0c0RlcGxveVN0ZXBQcm9wcyB7XG4gIHJlYWRvbmx5IHNlY3JldHNGaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lU3RhY2tSaW9Nb25pdG9yaW5nRGVwbG95U3RlcFByb3BzIHtcbiAgLyoqXG4gICAqIE1hcCBcXHtkaXJlY3Rvcnk6IGZpbGVuYW1lc1xcfSBjb250YWluaW5nICAuamFyIG9yIC56aXAgZmlsZXMgY3JlYXRlZCBpbiBtYWluIGJ1aWxkIHN0ZXAgdG8gYmUgdXBsb2FkZWQgdG8gdGhlIG1vbml0b3JpbmctdGVzdHN1aXRlLXJ1bm5lciBidWNrZXQsIGUuZy5cbiAgICogYGBgXG4gICAqIHtcbiAgICogICdhdmFpbGFiaWxpdHktbW9uaXRvcmluZy9idWlsZC9saWJzJzogWydmb28tYXZhaWxhYmlsaXR5LmphciddLFxuICAgKiAgJ3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvYnVpbGQvbGlicyc6IFsnYXBpLWNoZWNrLnppcCcsICdmb28tcGVyZm9ybWFuY2UuamFyJ10sXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nQXJ0aWZhY3RzOiB7IFtkaXJlY3Rvcnk6IHN0cmluZ106IHN0cmluZ1tdIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVGZWF0dXJlcyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBicmFuY2ggcGlwZWxpbmUgdXNlZCBieSByZW5vdmF0ZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoUGlwZWxpbmU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ3JlYXRlIGEgdnVsbmVyYWJpbGl0eSBwaXBlbGluZSB0byBzY2FuIGRlcGVuZGVuY2llcyBmb3IgdnVsbmVyYWJpbGl0aWVzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSB2dWxuZXJhYmlsaXR5UGlwZWxpbmU/OiBib29sZWFuO1xuICAvKipcbiAgICogUnVuIGEgc3RhbmRhcmQgZ3JhZGxlIGJ1aWxkIGluIHRoZSByZXBvc2l0b3J5IHJvb3QuIERlZmF1bHRzIHRvIGBmYWxzZWA6XG4gICAqIC0gYnVpbGQgYW5kIHRlc3Qgb2YgdGhlIGFydGlmYWN0IHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNsZWFuIGJ1aWxkXCJcbiAgICogLSBsaWNlbnNlLWNoZWNrIGFuZCB1cGxvYWQgb2YgbGljZW5zZS1jaGVjay1maWxlIHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNoZWNrTGljZW5zZXNcIlxuICAgKiAtIGNyZWF0ZSBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHRvIG1ha2UgVExTIGNvbW11bmljYXRpb24gcG9zc2libGUsIGUuZy4gd2l0aCBhIGxvYWRiYWxhbmNlclxuICAgKiAtIGJ1aWxkIHRoZSBjb250YWluZXIgaW1hZ2UgdmlhIGNvbW1hbmQgXCIuL2dyYWRsZXcgamliQnVpbGRUYXJcIlxuICAgKi9cbiAgcmVhZG9ubHkgZ3JhZGxlQnVpbGQ/OiBib29sZWFuO1xuICAvKipcbiAgICogUnVuIGEgc3RhbmRhcmQgbnBtIGJ1aWxkIGluIHRoZSByZXBvc2l0b3J5IHJvb3QuIERlZmF1bHRzIHRvIGBmYWxzZWA6XG4gICAqIC0gcnVuIGxpbnRlciB2aWEgY29tbWFuZCBcIm5wbSBydW4gbGludFwiXG4gICAqIC0gcnVuIHRlc3RzIHZpYSBjb21tYW5kIFwibnBtIHJ1biB0ZXN0OmNpXCJcbiAgICogLSBydW4gYSBsaWNlbnNlIGNoZWNrIGJ5IGNhbGxpbmcgdGhlIHNjcmlwdCBcImNoZWNrLW9zcy1saWNlbnNlcy5zaFwiIChmcm9tIHRoZSBSSU8gZnJvbnRlbmQgdGVtcGxhdGUpXG4gICAqIC0gYnVpbGQgdGhlIGFydGlmYWN0IHZpYSBjb21tYW5kIFwibnBtIHJ1biBidWlsZFwiXG4gICAqL1xuICByZWFkb25seSBucG1CdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBZGQgcmVxdWlyZWQgc3RlcHMgYW5kIHBlcm1pc3Npb25zIHRvIHN1cHBvcnQgS2Fma2EuIEN1cnJlbnRseSwgdGhpcyByZXF1aXJlcyBgZ3JhZGxlQnVpbGRgIHRvIGJlIHNldCB0byBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBrYWZrYUludGVncmF0aW9uPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFMzIEJ1Y2tldCB0byBkZXBsb3kgZnJvbnRlbmQgdG8uIFJlcXVpcmVzIGBucG1CdWlsZGAgdG8gYmUgc2V0IHRvIGB0cnVlYC4gSWYgc2V0LCB0aGUgb3V0cHV0IG9mIHRoZSBucG0gYnVpbGQgaXMgZGVwbG95ZWQgdG8gdGhlIHByb3ZpZGVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGZyb250ZW5kQnVja2V0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYnVpbGQgY29tbWFuZHMgZm9yIG1haW4gYW5kIGJyYW5jaCBwaXBlbGluZS4gV2lsbCBiZSBhZGRlZCBhZnRlciBhbGwgYnVpbGQgJiB0ZXN0IGNvbW1hbmRzLCBiZWZvcmUgdGhlIGluZnJhc3RydWN0dXJlIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEJ1aWxkQ29tbWFuZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGVudW0gUGlwZWxpbmVUeXBlIHtcblxuICAvKipcbiAgICogU2VsZi1tdXRhdGluZyBjb2RlcGlwZWxpbmUgZGVwbG95aW5nIHRoZSBwcm92aWRlZCBBcHBTdGFjay4gQmUgYXdhcmU6IFRoZSBwcm92aWRlZCBzZXJ2aWNlIHdvbid0IGhhdmUgYWNjZXNzIHRvIEthZmthLlxuICAgKlxuICAgKiBDb21lcyB3aXRoIGEgcHJlLWRlZmluZWQgYnVpbGRzcGVjLnlhbWwgZm9yIGEgZ3JhZGxlIHByb2plY3QuIFRoaXMgYnVpbGRzcGVjLnlhbWwgaXMgdXNlZCBmb3IgYm90aCB0aGUgbWFpbiBhbmRcbiAgICogYnJhbmNoIHBpcGVsaW5lIGFuZCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHN0ZXBzXG4gICAqIC0gYnVpbGQgYW5kIHRlc3Qgb2YgdGhlIGFydGlmYWN0IHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNsZWFuIGJ1aWxkXCIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKiAtIGxpY2Vuc2UtY2hlY2sgYW5kIHVwbG9hZCBvZiBsaWNlbnNlLWNoZWNrLWZpbGUgdmlhIGNvbW1hbmQgXCIuL2dyYWRsZXcgY2hlY2tMaWNlbnNlc1wiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICogLSBjcmVhdGUgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSB0byBtYWtlIFRMUyBjb21tdW5pY2F0aW9uIHBvc3NpYmxlLCBlLmcuIHdpdGggYSBsb2FkYmFsYW5jZXIuXG4gICAqIC0gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZSB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBqaWJCdWlsZFRhclwiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICovXG4gIFNUQU5EQVJEX0dSQURMRSA9ICdTVEFOREFSRF9HUkFETEUnLFxuICAvKipcbiAgICogU2VsZi1tdXRhdGluZyBjb2RlcGlwZWxpbmUgZGVwbG95aW5nIHRoZSBwcm92aWRlZCBBcHBTdGFjayB3aXRoIGFkZGl0aW9uYWwgc3RlcHMgbmVlZGVkIHRvIGFjY2VzcyBLYWZrYS5cbiAgICpcbiAgICogQ29tZXMgd2l0aCBhIHByZS1kZWZpbmVkIGJ1aWxkc3BlYy55YW1sIGZvciBhIGdyYWRsZSBwcm9qZWN0LiBUaGlzIGJ1aWxkc3BlYy55YW1sIGlzIHVzZWQgZm9yIGJvdGggdGhlIG1haW4gYW5kXG4gICAqIGJyYW5jaCBwaXBlbGluZSBhbmQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBzdGVwc1xuICAgKiAtIGJ1aWxkIGFuZCB0ZXN0IG9mIHRoZSBhcnRpZmFjdCB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBjbGVhbiBidWlsZFwiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICogLSBsaWNlbnNlLWNoZWNrIGFuZCB1cGxvYWQgb2YgbGljZW5zZS1jaGVjay1maWxlIHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNoZWNrTGljZW5zZXNcIi5cbiAgICogPHA+IFRoaXMgZ3JhZGxlIGNvbW1hbmQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgZ3JhZGxlIHByb2plY3QuXG4gICAqIC0gY3JlYXRlIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgdG8gbWFrZSBUTFMgY29tbXVuaWNhdGlvbiBwb3NzaWJsZSwgZS5nLiB3aXRoIGEgbG9hZGJhbGFuY2VyLlxuICAgKiAtIHJlcXVlc3QgYSBjZXJ0aWZpY2F0ZSB0byBhdXRoZW50aWNhdGUgYWdhaW5zdCBLYWZrYSB2aWEgbXV0dWFsIFRMU1xuICAgKiAtIGJ1aWxkIHRoZSBjb250YWluZXIgaW1hZ2UgdmlhIGNvbW1hbmQgXCIuL2dyYWRsZXcgamliQnVpbGRUYXJcIi5cbiAgICogPHA+IFRoaXMgZ3JhZGxlIGNvbW1hbmQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgZ3JhZGxlIHByb2plY3QuXG4gICAqL1xuICBTVEFOREFSRF9HUkFETEVfS0FGS0EgPSAnU1RBTkRBUkRfR1JBRExFX0tBRktBJyxcbiAgLyoqXG4gICAqIFNlbGYtbXV0YXRpbmcgY29kZXBpcGVsaW5lIGRlcGxveWluZyB0aGUgcHJvdmlkZWQgQXBwU3RhY2suXG4gICAqXG4gICAqIENvbWVzIHdpdGggYSBwcmUtZGVmaW5lZCBidWlsZHNwZWMueWFtbCB0byBzeW50aGVzaXplIHRoZSBBcHBTdGFjay5cbiAgICogTm8gYnJhbmNoIG9yIHZ1bG5lcmFiaWxpdHkgcGlwZWxpbmUgaXMgY3JlYXRlZC5cbiAgICovXG4gIFNUQU5EQVJEX0lORlJBU1RSVUNUVVJFID0gJ1NUQU5EQVJEX0lORlJBU1RSVUNUVVJFJyxcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGFydGlhbEJ1aWxkU3BlY1BhdGggLSBQYXRoIHRvIGEgY3VzdG9tIGJ1aWxkLXNwZWMgZmlsZSB0byB1c2UgZm9yIHRoZSBtYWluIGFuZCBicmFuY2ggcGlwZWxpbmUuXG4gKiBBIHByZS1kZWZpbmVkIGJ1aWxkc3BlYy55YW1sIGZpdHRpbmcgdGhlIHBpcGVsaW5lVHlwZSBpcyB1c2VkIGlmIG5vdCBwcm92aWRlZC5cbiAqIEBwYXJhbSBidWlsZEVudmlyb25tZW50IC0gQ3VzdG9tIENvZGVCdWlsZCBidWlsZCBlbnZpcm9ubWVudCBvdmVycmlkaW5nIHRoZSByaW8tc3BlY2lmaWMgZGVmYXVsdHMuIFRoZSBkZWZhdWx0cyBhcmU6XG4gKiAgICAgICAgICBidWlsZEltYWdlOiBBTUFaT05fTElOVVhfMl81XG4gKiAgICAgICAgICBjb21wdXRlVHlwZTogTEFSR0VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQnVpbGRPcHRpb25zIHtcbiAgcmVhZG9ubHkgcGFydGlhbEJ1aWxkU3BlY1BhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJ1aWxkRW52aXJvbm1lbnQ/OiBCdWlsZEVudmlyb25tZW50O1xufVxuXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmVhdHVyZXM6IFBpcGVsaW5lRmVhdHVyZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21haW5Db2RlQnVpbGRQcm9qZWN0OiBDb2RlQnVpbGRTdGVwO1xuICBwcml2YXRlIHJlYWRvbmx5IF9icmFuY2hDb2RlQnVpbGRQcm9qZWN0OiBDb2RlQnVpbGRTdGVwIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9idWNrZXQ6IElCdWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlQnVja2V0OiBJQnVja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0ZWRab25lOiBJSG9zdGVkWm9uZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXRNYXN0ZXJUcmlnZ2VyRmlsZTogQ29kZVBpcGVsaW5lU291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dEJyYW5jaFRyaWdnZXJGaWxlOiBDb2RlUGlwZWxpbmVTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyOiBJU3RyaW5nUGFyYW1ldGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vc3NMaWNlbnNlc0J1Y2tldDogSUJ1Y2tldDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VydmljZUtleXN0b3JlUGFzc3dvcmQ6IElTdHJpbmdQYXJhbWV0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjY291bnROYW1lUGFyYW1ldGVyOiBJU3RyaW5nUGFyYW1ldGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uaXN0RGF0YU1pcnJvclVybDogSVN0cmluZ1BhcmFtZXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29kZVBpcGVsaW5lVHlwZTogY29kZXBpcGVsaW5lLlBpcGVsaW5lVHlwZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLl9mZWF0dXJlcyA9IHRoaXMucGFyc2VGZWF0dXJlcyhwcm9wcyk7XG5cbiAgICAvLyBwb3B1bGF0ZSBleHRlcm5hbCBwYXJhbWV0ZXJzXG4gICAgdGhpcy5fYnVja2V0ID0gczMuQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMsICdUcmlnZ2VyQnVja2V0JywgRm4uaW1wb3J0VmFsdWUoJ2JpdGJ1Y2tldC1pbnRlZ3JhdGlvbi1zMy1idWNrZXQnKSk7XG4gICAgdGhpcy5fY2FjaGVCdWNrZXQgPSBuZXcgczMuQnVja2V0KHRoaXMsICdDYWNoZUJ1Y2tldCcsIHtcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMoMzApLFxuICAgICAgICAgIGFib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZEFmdGVyOiBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0aGlzLl9ob3N0ZWRab25lID0gcmlvLlJpb0xhbmRpbmdab25lLmdldERlZmF1bHRIb3N0ZWRab25lKHRoaXMpO1xuICAgIHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUgPSBwaXBlbGluZXMuQ29kZVBpcGVsaW5lU291cmNlLnMzKHRoaXMuX2J1Y2tldCwgYCR7cHJvcHMuc2VydmljZU5hbWV9L3RyaWdnZXIvJHtyaW8uVHJpZ2dlcktleS5NQVNURVJfUkVQT31gLCB7IHRyaWdnZXI6IGNvZGVwaXBlbGluZV9hY3Rpb25zLlMzVHJpZ2dlci5FVkVOVFMgfSk7XG4gICAgdGhpcy5faW5wdXRCcmFuY2hUcmlnZ2VyRmlsZSA9IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmVTb3VyY2UuczModGhpcy5fYnVja2V0LCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0vdHJpZ2dlci8ke3Jpby5UcmlnZ2VyS2V5LkJSQU5DSF9SRVBPfWAsIHsgdHJpZ2dlcjogY29kZXBpcGVsaW5lX2FjdGlvbnMuUzNUcmlnZ2VyLkVWRU5UUyB9KTtcblxuICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyh0aGlzLCAnT3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXInLCB7IHBhcmFtZXRlck5hbWU6ICcvY29uZmlnL29zcy1saWNlbnNlcy9idWNrZXQtbmFtZScgfSk7XG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXQgPSBzMy5CdWNrZXQuZnJvbUJ1Y2tldE5hbWUodGhpcywgJ09zc0xpY2Vuc2VzQnVja2V0JywgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXIuc3RyaW5nVmFsdWUpO1xuICAgIHRoaXMuX3NlcnZpY2VLZXlzdG9yZVBhc3N3b3JkID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU2VjdXJlU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyh0aGlzLCAnS2V5c3RvcmVQYXNzd29yZCcsIHtcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAvY29uZmlnLyR7cHJvcHMuc2VydmljZU5hbWV9L3NlcnZpY2Uta2V5c3RvcmUtcGFzc3dvcmRgLFxuICAgICAgdmVyc2lvbjogMSxcbiAgICB9KTtcbiAgICB0aGlzLl9hY2NvdW50TmFtZVBhcmFtZXRlciA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUodGhpcywgJ0FjY291bnROYW1lUGFyYW1ldGVyJywgJy9jb25maWcvYWNjb3VudC9uYW1lJyk7XG4gICAgdGhpcy5fbmlzdERhdGFNaXJyb3JVcmwgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TZWN1cmVTdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKHRoaXMsICdOaXN0RGF0YU1pcnJvclVybCcsIHtcbiAgICAgIHBhcmFtZXRlck5hbWU6ICcvY29uZmlnL25pc3QtZGF0YS1taXJyb3IvdXJsJyxcbiAgICAgIHZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb2RlUGlwZWxpbmVUeXBlID0gcHJvcHMuY29kZVBpcGVsaW5lVHlwZSA/PyBjb2RlcGlwZWxpbmUuUGlwZWxpbmVUeXBlLlYxO1xuXG4gICAgdGhpcy5fbWFpbkNvZGVCdWlsZFByb2plY3QgPSB0aGlzLmNyZWF0ZVJpb0NvZGVCdWlsZFByb2plY3QoJ01haW5CdWlsZCcsIHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUsIHByb3BzKTtcbiAgICB0aGlzLmFkZE1haW5QaXBlbGluZShwcm9wcywgdGhpcy5fbWFpbkNvZGVCdWlsZFByb2plY3QpO1xuXG4gICAgaWYgKHRoaXMuX2ZlYXR1cmVzLmJyYW5jaFBpcGVsaW5lKSB7XG4gICAgICB0aGlzLl9icmFuY2hDb2RlQnVpbGRQcm9qZWN0ID0gdGhpcy5jcmVhdGVSaW9Db2RlQnVpbGRQcm9qZWN0KCdCcmFuY2hCdWlsZCcsIHRoaXMuX2lucHV0QnJhbmNoVHJpZ2dlckZpbGUsIHByb3BzKTtcbiAgICAgIHRoaXMuYWRkQnJhbmNoUGlwZWxpbmUodGhpcy5fYnJhbmNoQ29kZUJ1aWxkUHJvamVjdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZWF0dXJlcy52dWxuZXJhYmlsaXR5UGlwZWxpbmUpIHtcbiAgICAgIHRoaXMuYWRkVnVsbmVyYWJpbGl0eVBpcGVsaW5lKHByb3BzKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZmVhdHVyZSwgcGFja2FnZU5hbWVdID0gX19kaXJuYW1lLnNwbGl0KHBhdGguc2VwKS5yZXZlcnNlKCk7XG4gICAgbmV3IENsYWlkb21ldGVyKHRoaXMsICdDbGFpZG9tZXRlcicsIHtcbiAgICAgIHByb2R1Y3Q6IENsYWlkb21ldGVyUHJvZHVjdC5DREtfQ09OVFJJQlVUSU9OLFxuICAgICAgcGFja2FnZU5hbWUsXG4gICAgICBmZWF0dXJlLFxuICAgICAgdmVyc2lvbjogJzAuMC4yNCcsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1haW5Db2RlYnVpbGRQcm9qZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYWluQ29kZUJ1aWxkUHJvamVjdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYnJhbmNoQ29kZUJ1aWxkUHJvamVjdCgpOiBDb2RlQnVpbGRTdGVwIHtcbiAgICBpZiAodGhpcy5fYnJhbmNoQ29kZUJ1aWxkUHJvamVjdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdUaGUgcGlwZWxpbmUgdHlwZSB5b3UgaGF2ZSBzZWxlY3RlZCBkb2VzIG5vdCBzdXBwb3J0IGEgYnJhbmNoIGNvZGVidWlsZCBwcm9qZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9icmFuY2hDb2RlQnVpbGRQcm9qZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZlYXR1cmVzKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpOiBQaXBlbGluZUZlYXR1cmVzIHtcbiAgICBpZiAocHJvcHMucGlwZWxpbmVUeXBlICYmIHByb3BzLmZlYXR1cmVzKSB7XG4gICAgICB0aHJvdyBFcnJvcignWW91IGNhbm5vdCBwcm92aWRlIGJvdGggYSBwaXBlbGluZVR5cGUgYW5kIGZlYXR1cmVzLiBQbGVhc2UgdXNlIGZlYXR1cmVzIG9ubHkuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5mZWF0dXJlcz8ua2Fma2FJbnRlZ3JhdGlvbiAmJiAhcHJvcHMuZmVhdHVyZXM/LmdyYWRsZUJ1aWxkKSB7XG4gICAgICB0aHJvdyBFcnJvcignS2Fma2EgaW50ZWdyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIHBpcGVsaW5lcyB3aXRoIGdyYWRsZSBidWlsZCcpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZmVhdHVyZXM/LmZyb250ZW5kQnVja2V0TmFtZSAmJiAhcHJvcHMuZmVhdHVyZXM/Lm5wbUJ1aWxkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRnJvbnRlbmQgYnVja2V0IG5hbWUgY2FuIG9ubHkgYmUgc2V0IHdoZW4gbnBtIGJ1aWxkIGlzIGVuYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnBpcGVsaW5lVHlwZSkge1xuICAgICAgc3dpdGNoIChwcm9wcy5waXBlbGluZVR5cGUpIHtcbiAgICAgICAgY2FzZSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfR1JBRExFOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBicmFuY2hQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGdyYWRsZUJ1aWxkOiB0cnVlLFxuICAgICAgICAgICAgbnBtQnVpbGQ6IGZhbHNlLFxuICAgICAgICAgICAga2Fma2FJbnRlZ3JhdGlvbjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfR1JBRExFX0tBRktBOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBicmFuY2hQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGdyYWRsZUJ1aWxkOiB0cnVlLFxuICAgICAgICAgICAgbnBtQnVpbGQ6IGZhbHNlLFxuICAgICAgICAgICAga2Fma2FJbnRlZ3JhdGlvbjogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFBpcGVsaW5lVHlwZS5TVEFOREFSRF9JTkZSQVNUUlVDVFVSRTpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYnJhbmNoUGlwZWxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgdnVsbmVyYWJpbGl0eVBpcGVsaW5lOiBmYWxzZSxcbiAgICAgICAgICAgIGdyYWRsZUJ1aWxkOiBmYWxzZSxcbiAgICAgICAgICAgIG5wbUJ1aWxkOiBmYWxzZSxcbiAgICAgICAgICAgIGthZmthSW50ZWdyYXRpb246IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBicmFuY2hQaXBlbGluZTogcHJvcHMuZmVhdHVyZXM/LmJyYW5jaFBpcGVsaW5lID8/IHRydWUsXG4gICAgICB2dWxuZXJhYmlsaXR5UGlwZWxpbmU6IHByb3BzLmZlYXR1cmVzPy52dWxuZXJhYmlsaXR5UGlwZWxpbmUgPz8gdHJ1ZSxcbiAgICAgIGdyYWRsZUJ1aWxkOiBwcm9wcy5mZWF0dXJlcz8uZ3JhZGxlQnVpbGQgPz8gZmFsc2UsXG4gICAgICBucG1CdWlsZDogcHJvcHMuZmVhdHVyZXM/Lm5wbUJ1aWxkID8/IGZhbHNlLFxuICAgICAga2Fma2FJbnRlZ3JhdGlvbjogcHJvcHMuZmVhdHVyZXM/LmthZmthSW50ZWdyYXRpb24gPz8gZmFsc2UsXG4gICAgICBmcm9udGVuZEJ1Y2tldE5hbWU6IHByb3BzLmZlYXR1cmVzPy5mcm9udGVuZEJ1Y2tldE5hbWUsXG4gICAgICBhZGRpdGlvbmFsQnVpbGRDb21tYW5kczogcHJvcHMuZmVhdHVyZXM/LmFkZGl0aW9uYWxCdWlsZENvbW1hbmRzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJpb0NvZGVCdWlsZFByb2plY3QobmFtZTogc3RyaW5nLCB0cmlnZ2VyRmlsZTogQ29kZVBpcGVsaW5lU291cmNlLCBwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBSaW9Db2RlQnVpbGRQcm9qZWN0KHRoaXMsIG5hbWUsIHtcbiAgICAgIGlucHV0OiB0cmlnZ2VyRmlsZSxcbiAgICAgIGNka091dERpcmVjdG9yeTogJ2luZnJhc3RydWN0dXJlL2Nkay5vdXQnLFxuICAgICAgcGFydGlhbEJ1aWxkU3BlYzogdGhpcy5sb2FkQnVpbGRTcGVjRnJvbUZpbGUocHJvcHM/LmNvZGVCdWlsZE9wdGlvbnM/LnBhcnRpYWxCdWlsZFNwZWNQYXRoKSB8fCBjcmVhdGVNYWluQnVpbGRTcGVjKHRoaXMuX2ZlYXR1cmVzKSxcbiAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHByb3BzPy5jb2RlQnVpbGRPcHRpb25zPy5idWlsZEVudmlyb25tZW50LFxuICAgICAgaG9zdGVkWm9uZU5hbWU6IHRoaXMuX2hvc3RlZFpvbmUuem9uZU5hbWUsXG4gICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5fY2FjaGVCdWNrZXQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZE1haW5QaXBlbGluZShwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzLCBtYWluQnVpbGQ6IENvZGVCdWlsZFN0ZXApIHtcbiAgICBjb25zdCBwaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgJ1BpcGVsaW5lJywge1xuICAgICAgYXJ0aWZhY3RCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgICAgcGlwZWxpbmVUeXBlOiB0aGlzLl9jb2RlUGlwZWxpbmVUeXBlLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvZGVQaXBlbGluZSA9IG5ldyBwaXBlbGluZXMuQ29kZVBpcGVsaW5lKHBpcGVsaW5lLCAnQ29kZVBpcGVsaW5lJywge1xuICAgICAgY29kZVBpcGVsaW5lOiBwaXBlbGluZSxcbiAgICAgIHN5bnRoOiBtYWluQnVpbGQsXG4gICAgfSk7XG4gICAgVGFncy5vZihwaXBlbGluZSkuYWRkKCdwaXBlbGluZV90eXBlJywgJ2J1aWxkJyk7XG5cbiAgICBjb25zdCBzdHJpcEFzc2V0c1N0ZXAgPSB0aGlzLmNyZWF0ZVN0cmlwQXNzZXRzU3RlcChjb2RlUGlwZWxpbmUpO1xuICAgIGNvZGVQaXBlbGluZS5hZGRXYXZlKCdCZWZvcmVEZXBsb3knLCB7IHByZTogW3N0cmlwQXNzZXRzU3RlcF0gfSk7XG5cbiAgICBjb25zdCBjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXAgPSB0aGlzLmNyZWF0ZUNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcChtYWluQnVpbGQsIHByb3BzKTtcbiAgICBjb25zdCBzZWNyZXRzRGVwbG95U3RlcFByb3BzID0gdGhpcy5jcmVhdGVTZWNyZXRzRGVwbG95U3RlcChwcm9wcyk7XG4gICAgY29uc3QgZnJvbnRlbmREZXBsb3lTdGVwID0gdGhpcy5jcmVhdGVEZXBsb3lGcm9udGVuZERlcGxveVN0ZXAobWFpbkJ1aWxkKTtcbiAgICBjb25zdCBwb3N0U3RlcHMgPSBbXTtcbiAgICBpZiAoY2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKSB7XG4gICAgICBwb3N0U3RlcHMucHVzaChjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXApO1xuICAgIH1cbiAgICBpZiAoZnJvbnRlbmREZXBsb3lTdGVwKSB7XG4gICAgICBwb3N0U3RlcHMucHVzaChmcm9udGVuZERlcGxveVN0ZXApO1xuICAgIH1cblxuICAgIGNvZGVQaXBlbGluZS5hZGRTdGFnZShuZXcgQXBwbGljYXRpb24odGhpcywgJ0RlcGxveUFwcGxpY2F0aW9uU3RhY2tzJywge1xuICAgICAgYXBwU3RhY2tGYWN0b3J5OiBwcm9wcy5hcHBTdGFja0ZhY3RvcnksXG4gICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICB2ZXJzaW9uOiBwcm9jZXNzLmVudi5QSVBFTElORV9FWEVDVVRJT05fSUQgPz8gJ1BJUEVMSU5FX0VYRUNVVElPTl9JRCBub3Qgc2V0JyxcbiAgICB9KSwge1xuICAgICAgcHJlOiBzZWNyZXRzRGVwbG95U3RlcFByb3BzID8gW3NlY3JldHNEZXBsb3lTdGVwUHJvcHNdIDogdW5kZWZpbmVkLFxuICAgICAgcG9zdDogcG9zdFN0ZXBzLFxuICAgIH0pO1xuXG4gICAgY29kZVBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcblxuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChzdHJpcEFzc2V0c1N0ZXAsICdwcm9qZWN0X3R5cGUnLCAnc3RyaXBfYXNzZXRzJyk7XG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KHNlY3JldHNEZXBsb3lTdGVwUHJvcHMsICdwcm9qZWN0X3R5cGUnLCAnZGVwbG95X3NlY3JldHMnKTtcbiAgICB0aGlzLnRhZ0NvZGVCdWlsZFByb2plY3QobWFpbkJ1aWxkLCAncHJvamVjdF90eXBlJywgJ2J1aWxkJyk7XG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KGNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCwgJ3Byb2plY3RfdHlwZScsICdkZXBsb3lfY2FwYWJpbGl0eV9tb25pdG9yaW5nJyk7XG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KGZyb250ZW5kRGVwbG95U3RlcCwgJ3Byb2plY3RfdHlwZScsICdkZXBsb3lfZnJvbnRlbmQnKTtcblxuICAgIGlmIChjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXApIHtcbiAgICAgIGNvbnN0IG1vbml0b3JpbmdUZXN0c3VpdGVSdW5uZXJCdWNrZXQgPSBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUodGhpcywgJ01vbml0b3JpbmdUZXN0c3VpdGVSdW5uZXJCdWNrZXQnLCBgbW9uaXRvcmluZy10ZXN0c3VpdGUtcnVubmVyLSR7dGhpcy5hY2NvdW50fWApO1xuICAgICAgbW9uaXRvcmluZ1Rlc3RzdWl0ZVJ1bm5lckJ1Y2tldC5ncmFudFdyaXRlKGNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCk7XG4gICAgfVxuICAgIGlmIChmcm9udGVuZERlcGxveVN0ZXApIHtcbiAgICAgIGNvbnN0IGZyb250ZW5kQnVja2V0ID0gczMuQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMsICdGcm9udGVuZEJ1Y2tldCcsIHRoaXMuX2ZlYXR1cmVzLmZyb250ZW5kQnVja2V0TmFtZSEhKTtcbiAgICAgIGZyb250ZW5kQnVja2V0LmdyYW50UmVhZFdyaXRlKGZyb250ZW5kRGVwbG95U3RlcCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCAnUGlwZWxpbmVTY2hlZHVsZScsIHtcbiAgICAgIHNjaGVkdWxlOiBldmVudHMuU2NoZWR1bGUuZXhwcmVzc2lvbihwcm9wcy5waXBlbGluZVNjaGVkdWxlcz8ubWFpblBpcGVsaW5lIHx8ICdjcm9uKDAgOSA/ICogMiMxICopJyksXG4gICAgfSk7XG4gICAgcnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKGNvZGVQaXBlbGluZS5waXBlbGluZSkpO1xuXG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUobWFpbkJ1aWxkKTtcbiAgICB0aGlzLl9vc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlci5ncmFudFJlYWQobWFpbkJ1aWxkKTtcbiAgICB0aGlzLl9zZXJ2aWNlS2V5c3RvcmVQYXNzd29yZC5ncmFudFJlYWQobWFpbkJ1aWxkKTtcbiAgICB0aGlzLl9hY2NvdW50TmFtZVBhcmFtZXRlci5ncmFudFJlYWQobWFpbkJ1aWxkKTtcbiAgICBpZiAodGhpcy5fZmVhdHVyZXMua2Fma2FJbnRlZ3JhdGlvbikge1xuICAgICAgdGhpcy5ncmFudFBlcm1pc3Npb25zRm9yS2Fma2FJbnRlZ3JhdGlvbihtYWluQnVpbGQsICdLYWZrYUludGVncmF0aW9uUG9saWN5Jyk7XG4gICAgfVxuICAgIGNvZGVQaXBlbGluZS5waXBlbGluZS5hcnRpZmFjdEJ1Y2tldC5ncmFudFJlYWRXcml0ZShzdHJpcEFzc2V0c1N0ZXAucHJvamVjdCk7XG5cbiAgICBuZXcgRGF0YWRvZ1BpcGVsaW5lRXJyb3JBbGVydCh0aGlzLCAnRGF0YWRvZ1BpcGVsaW5lRXJyb3JNb25pdG9yJywge1xuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgcGlwZWxpbmVOYW1lOiB0aGlzLnJlbmFtZVBpcGVsaW5lVG9Mb3dlckNhc2UocGlwZWxpbmUpLFxuICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEJyYW5jaFBpcGVsaW5lKGJyYW5jaEJ1aWxkOiBDb2RlQnVpbGRTdGVwKSB7XG4gICAgY29uc3QgYnJhbmNoUGlwZWxpbmUgPSBuZXcgY29kZXBpcGVsaW5lLlBpcGVsaW5lKHRoaXMsICdCcmFuY2hQaXBlbGluZScsIHtcbiAgICAgIGFydGlmYWN0QnVja2V0OiB0aGlzLl9jYWNoZUJ1Y2tldCxcbiAgICAgIHBpcGVsaW5lVHlwZTogdGhpcy5fY29kZVBpcGVsaW5lVHlwZSxcbiAgICB9KTtcbiAgICBjb25zdCBicmFuY2hDb2RlUGlwZWxpbmUgPSBuZXcgcGlwZWxpbmVzLkNvZGVQaXBlbGluZShicmFuY2hQaXBlbGluZSwgJ0NvZGVQaXBlbGluZScsIHtcbiAgICAgIGNvZGVQaXBlbGluZTogYnJhbmNoUGlwZWxpbmUsXG4gICAgICBzeW50aDogYnJhbmNoQnVpbGQsXG4gICAgICBzZWxmTXV0YXRpb246IGZhbHNlLFxuICAgIH0pO1xuICAgIFRhZ3Mub2YoYnJhbmNoUGlwZWxpbmUpLmFkZCgncGlwZWxpbmVfdHlwZScsICdicmFuY2gnKTtcbiAgICBicmFuY2hDb2RlUGlwZWxpbmUuYWRkV2F2ZSgnQnJhbmNoQnVpbGQnKS5hZGRQb3N0KGJyYW5jaEJ1aWxkKTtcbiAgICBicmFuY2hDb2RlUGlwZWxpbmUuYnVpbGRQaXBlbGluZSgpO1xuXG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KGJyYW5jaEJ1aWxkLCAncHJvamVjdF90eXBlJywgJ2JyYW5jaF9idWlsZCcpO1xuXG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoYnJhbmNoQnVpbGQpO1xuICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyLmdyYW50UmVhZChicmFuY2hCdWlsZCk7XG4gICAgdGhpcy5fc2VydmljZUtleXN0b3JlUGFzc3dvcmQuZ3JhbnRSZWFkKGJyYW5jaEJ1aWxkKTtcbiAgICB0aGlzLl9hY2NvdW50TmFtZVBhcmFtZXRlci5ncmFudFJlYWQoYnJhbmNoQnVpbGQpO1xuICAgIGlmICh0aGlzLl9mZWF0dXJlcy5rYWZrYUludGVncmF0aW9uKSB7XG4gICAgICB0aGlzLmdyYW50UGVybWlzc2lvbnNGb3JLYWZrYUludGVncmF0aW9uKGJyYW5jaEJ1aWxkLCAnQnJhbmNoS2Fma2FJbnRlZ3JhdGlvblBvbGljeScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkVnVsbmVyYWJpbGl0eVBpcGVsaW5lKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpIHtcbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5QnVpbGQgPSBuZXcgUmlvQ29kZUJ1aWxkUHJvamVjdCh0aGlzLCAnVnVsbmVyYWJpbGl0eUNoZWNrcycsIHtcbiAgICAgIGlucHV0OiB0aGlzLl9pbnB1dE1hc3RlclRyaWdnZXJGaWxlLFxuICAgICAgcGFydGlhbEJ1aWxkU3BlYzogY3JlYXRlVnVsbmVyYWJpbGl0eUJ1aWxkU3BlYyh0aGlzLl9mZWF0dXJlcyksXG4gICAgICBidWlsZEVudmlyb25tZW50OiBwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8uYnVpbGRFbnZpcm9ubWVudCxcbiAgICAgIGhvc3RlZFpvbmVOYW1lOiB0aGlzLl9ob3N0ZWRab25lLnpvbmVOYW1lLFxuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgY2FjaGVCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgIH0pO1xuICAgIGNvbnN0IHZ1bG5lcmFiaWxpdHlQaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgJ1Z1bG5lcmFiaWxpdHlQaXBlbGluZScsIHtcbiAgICAgIGFydGlmYWN0QnVja2V0OiB0aGlzLl9jYWNoZUJ1Y2tldCxcbiAgICAgIHBpcGVsaW5lVHlwZTogdGhpcy5fY29kZVBpcGVsaW5lVHlwZSxcbiAgICB9KTtcbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5Q29kZVBpcGVsaW5lID0gbmV3IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUodnVsbmVyYWJpbGl0eVBpcGVsaW5lLCAnQ29kZVBpcGVsaW5lJywge1xuICAgICAgY29kZVBpcGVsaW5lOiB2dWxuZXJhYmlsaXR5UGlwZWxpbmUsXG4gICAgICBzeW50aDogdnVsbmVyYWJpbGl0eUJ1aWxkLFxuICAgICAgc2VsZk11dGF0aW9uOiBmYWxzZSxcbiAgICB9KTtcbiAgICBUYWdzLm9mKHZ1bG5lcmFiaWxpdHlQaXBlbGluZSkuYWRkKCdwaXBlbGluZV90eXBlJywgJ3Z1bG5lcmFiaWxpdHknKTtcblxuICAgIHZ1bG5lcmFiaWxpdHlDb2RlUGlwZWxpbmUuYWRkV2F2ZSgnVnVsbmVyYWJpbGl0eUNoZWNrcycpLmFkZFBvc3QodnVsbmVyYWJpbGl0eUJ1aWxkKTtcbiAgICB2dWxuZXJhYmlsaXR5Q29kZVBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcbiAgICBUYWdzLm9mKHZ1bG5lcmFiaWxpdHlCdWlsZC5wcm9qZWN0KS5hZGQoJ3Byb2plY3RfdHlwZScsICd2dWxuZXJhYmlsaXR5X2NoZWNrJyk7XG4gICAgdGhpcy5fbmlzdERhdGFNaXJyb3JVcmwuZ3JhbnRSZWFkKHZ1bG5lcmFiaWxpdHlCdWlsZCk7XG5cbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5UnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCAnVnVsbmVyYWJpbGl0eVBpcGVsaW5lU2NoZWR1bGUnLCB7XG4gICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMucGlwZWxpbmVTY2hlZHVsZXM/LnZ1bG5lcmFiaWxpdHlQaXBlbGluZSB8fCAnY3JvbigwIDUgPyAqIE1PTi1GUkkgKiknKSxcbiAgICB9KTtcbiAgICB2dWxuZXJhYmlsaXR5UnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKHZ1bG5lcmFiaWxpdHlDb2RlUGlwZWxpbmUucGlwZWxpbmUpKTtcblxuICAgIGlmIChwcm9wcy5kYXRhZG9nQWxlcnRUeXBlID09PSAnb3BzZ2VuaWUnKSB7XG4gICAgICB0aHJvdyBFcnJvcignVGhlIE9wc0dlbmllIGFsZXJ0VHlwZSBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuIFBsZWFzZSB1c2UgdGhlIHZ1bG5lcmFiaWxpdHlOb3RpZmljYXRpb24gcHJvcGVydHkgaW5zdGVhZC4nKTtcbiAgICB9XG4gICAgbmV3IERhdGFEb2dQaXBlbGluZUVycm9yQWxlcnRGb3JWdWxuZXJhYmlsaXR5Q2hlY2tzKHRoaXMsICdEYXRhRG9nUGlwZWxpbmVFcnJvckZvclZ1bG5lcmFiaWxpdHlDaGVja3NNb25pdG9yJywge1xuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgcGlwZWxpbmVOYW1lOiB0aGlzLnJlbmFtZVBpcGVsaW5lVG9Mb3dlckNhc2UodnVsbmVyYWJpbGl0eVBpcGVsaW5lKSxcbiAgICAgIGFjY291bnRJZDogdGhpcy5hY2NvdW50LFxuICAgICAgbm90aWZpY2F0aW9uOiBwcm9wcy52dWxuZXJhYmlsaXR5Tm90aWZpY2F0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdHJpcEFzc2V0c1N0ZXAocGlwZWxpbmU6IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUpOiBDb2RlQnVpbGRTdGVwIHtcbiAgICAvLyBDbG91ZEFzc2VtYmx5QXJ0aWZhY3RzIG11c3QgYmUgc21hbGxlciB0aGFuIDI1Nk1CLiBEdWUgdG8gdGhlIGdyYWRsZSBhcnRpZmFjdCB3ZSBhcmUgZXhjZWVkaW5nIHRoaXMgbGltaXQgYW5kIHBpcGVsaW5lIGZhaWxzIGluIGRlcGxveW1lbnQgc3RlcC5cbiAgICAvLyBJc3N1ZSBpcyBrbm93biBhbmQgbm90IGZpeGVkIGZvciBhbHJlYWR5IHNvbWUgeWVhcnMuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy85OTE3XG4gICAgLy8gRGlydHkgZml4OiBBc3NldHMgYXJlIGFscmVhZHkgdXBsb2FkZWQgYW5kIHRodXMgbm90IG5lZWRlZC4gUmVtb3ZlIHRoZW0gZnJvbSBwaXBlbGluZSBhcnRpZmFjdC5cbiAgICByZXR1cm4gbmV3IENvZGVCdWlsZFN0ZXAoXG4gICAgICAnU3RyaXBBc3NldHNGcm9tQXNzZW1ibHknLCB7XG4gICAgICAgIGlucHV0OiBwaXBlbGluZS5jbG91ZEFzc2VtYmx5RmlsZVNldCxcbiAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAnUzNfUEFUSD0ke0NPREVCVUlMRF9TT1VSQ0VfVkVSU0lPTiNcImFybjphd3M6czM6OjpcIn0nLFxuICAgICAgICAgICdaSVBfQVJDSElWRT0kKGJhc2VuYW1lICRTM19QQVRIKScsXG4gICAgICAgICAgJ3JtIC1yZnYgYXNzZXQuKicsXG4gICAgICAgICAgJ3ppcCAtciAtcSAtQSAkWklQX0FSQ0hJVkUgKicsXG4gICAgICAgICAgJ2F3cyBzMyBjcCAkWklQX0FSQ0hJVkUgczM6Ly8kUzNfUEFUSCcsXG4gICAgICAgIF0sXG4gICAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBidWlsZEltYWdlOiBMaW51eExhbWJkYUJ1aWxkSW1hZ2UuQU1BWk9OX0xJTlVYXzIwMjNfTk9ERV8yMCxcbiAgICAgICAgICBjb21wdXRlVHlwZTogQ29tcHV0ZVR5cGUuTEFNQkRBXzFHQixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKG1haW5CdWlsZDogQ29kZUJ1aWxkU3RlcCwgcHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wcyk6IENvZGVCdWlsZFN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5tb25pdG9yaW5nRGVwbG95U3RlcFByb3BzKSB7XG4gICAgICBjb25zdCBtb25pdG9yaW5nQXJ0aWZhY3RzID0gT2JqZWN0LmtleXMocHJvcHMubW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcy5tb25pdG9yaW5nQXJ0aWZhY3RzKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBtYWluQnVpbGQuYWRkT3V0cHV0RGlyZWN0b3J5KGtleSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXQ6IG91dHB1dCxcbiAgICAgICAgICBmaWxlczogcHJvcHMubW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcyEubW9uaXRvcmluZ0FydGlmYWN0c1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFJpb0NhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCh0aGlzLCAnRGVwbG95Q2FwYWJpbGl0eU1vbml0b3JpbmcnLCB7XG4gICAgICAgIG1vbml0b3JpbmdBcnRpZmFjdHM6IG1vbml0b3JpbmdBcnRpZmFjdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNlY3JldHNEZXBsb3lTdGVwKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpOiByaW8uUmlvU2VjcmV0c0RlcGxveVN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5zZWNyZXRzRGVwbG95U3RlcFByb3BzKSB7XG4gICAgICByZXR1cm4gbmV3IHJpby5SaW9TZWNyZXRzRGVwbG95U3RlcCh0aGlzLCAnRGVwbG95U2VjcmV0cycsIHtcbiAgICAgICAgLi4ucHJvcHMuc2VjcmV0c0RlcGxveVN0ZXBQcm9wcyxcbiAgICAgICAgaW5wdXQ6IHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcGxveUZyb250ZW5kRGVwbG95U3RlcChtYWluQnVpbGQ6IENvZGVCdWlsZFN0ZXApOiBDb2RlQnVpbGRTdGVwIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2ZlYXR1cmVzLmZyb250ZW5kQnVja2V0TmFtZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZnJvbnRlbmRCdWlsZE91dHB1dCA9IG1haW5CdWlsZC5hZGRPdXRwdXREaXJlY3RvcnkoJ2J1aWxkJyk7XG4gICAgcmV0dXJuIG5ldyBDb2RlQnVpbGRTdGVwKCdEZXBsb3lGcm9udGVuZCcsIHtcbiAgICAgIGlucHV0OiBmcm9udGVuZEJ1aWxkT3V0cHV0LFxuICAgICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiBMaW51eExhbWJkYUJ1aWxkSW1hZ2UuQU1BWk9OX0xJTlVYXzIwMjNfTk9ERV8yMCxcbiAgICAgICAgY29tcHV0ZVR5cGU6IENvbXB1dGVUeXBlLkxBTUJEQV8xR0IsXG4gICAgICB9LFxuICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgYGF3cyBzMyBzeW5jIC0tZXhjbHVkZSBpbmRleC5odG1sIC0tY2FjaGUtY29udHJvbCBtYXgtYWdlPTMxNTM2MDAwIC4vICdzMzovLyR7dGhpcy5fZmVhdHVyZXMuZnJvbnRlbmRCdWNrZXROYW1lfSdgLFxuICAgICAgICBgYXdzIHMzIGNwIC0tY2FjaGUtY29udHJvbCBuby1jYWNoZSBpbmRleC5odG1sICdzMzovLyR7dGhpcy5fZmVhdHVyZXMuZnJvbnRlbmRCdWNrZXROYW1lfSdgLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JhbnRQZXJtaXNzaW9uc0ZvckthZmthSW50ZWdyYXRpb24oYnVpbGRQcm9qZWN0OiBSaW9Db2RlQnVpbGRQcm9qZWN0LCBwb2xpY3lJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVpbGRQcm9qZWN0Um9sZSA9IGJ1aWxkUHJvamVjdC5wcm9qZWN0LnJvbGU7XG4gICAgaWYgKGJ1aWxkUHJvamVjdFJvbGUpIHtcbiAgICAgIGJ1aWxkUHJvamVjdFJvbGUuYWRkTWFuYWdlZFBvbGljeShcbiAgICAgICAgTWFuYWdlZFBvbGljeS5mcm9tTWFuYWdlZFBvbGljeUFybih0aGlzLFxuICAgICAgICAgIHBvbGljeUlkLFxuICAgICAgICAgIEZuLmltcG9ydFZhbHVlKCdrYWZrYS1pbnRlZ3JhdGlvbi1wb2xpY3ktYXJuJyksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ291bGQgbm90IGFkZCBtYW5hZ2VkIHBvbGljeSBmb3Iga2Fma2EtaW50ZWdyYXRpb24gdG8gQ29kZUJ1aWxkIHByb2plY3Qgb2YgJHtidWlsZFByb2plY3QuaWR9IGR1ZSB0byBtaXNzaW5nIHJvbGUuYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQnVpbGRTcGVjRnJvbUZpbGUoYnVpbGRTcGVjUGF0aD86IHN0cmluZyk6IEJ1aWxkU3BlYyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFidWlsZFNwZWNQYXRoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gQnVpbGRTcGVjLmZyb21PYmplY3QoeWFtbC5sb2FkKGZzLnJlYWRGaWxlU3luYyhidWlsZFNwZWNQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pKSBhcyBPYmplY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5hbWVQaXBlbGluZVRvTG93ZXJDYXNlKHBpcGVsaW5lOiBJUGlwZWxpbmUpOiBSZWZlcmVuY2Uge1xuICAgIGNvbnN0IHVwcGVyVG9Mb3dlckNyID0gbmV3IGNkay5DdXN0b21SZXNvdXJjZSh0aGlzLCBgJHtwaXBlbGluZS5ub2RlLmlkfS1VcHBlclRvTG93ZXJgLCB7XG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OlVwcGVyVG9Mb3dlcicsXG4gICAgICBzZXJ2aWNlVG9rZW46IFVwcGVyVG9Mb3dlci5nZXRPckNyZWF0ZSh0aGlzKS5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFVwcGVyOiBwaXBlbGluZS5waXBlbGluZU5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB1cHBlclRvTG93ZXJDci5nZXRBdHQoJ0xvd2VyJyk7XG4gIH1cblxuICBwcml2YXRlIHRhZ0NvZGVCdWlsZFByb2plY3QocHJvamVjdDogQ29kZUJ1aWxkU3RlcCB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAocHJvamVjdCkge1xuICAgICAgVGFncy5vZihwcm9qZWN0LnByb2plY3QpLmFkZChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
],
|
|
16
16
|
"main": "lib/index.js",
|
|
17
17
|
"license": "Apache-2.0",
|
|
18
|
-
"version": "6.
|
|
18
|
+
"version": "6.15.0-alpha.0",
|
|
19
19
|
"types": "lib/index.d.ts",
|
|
20
20
|
"stability": "stable",
|
|
21
21
|
"exports": {
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
47
|
"compile": "jsii",
|
|
48
|
-
"build": "npm run compile && node esbuild.mjs && npm run
|
|
49
|
-
"copy-assets": "copyfiles --error --up 1 src/contributions/team-transport-two/pipeline/buildspecs/buildspec*.yaml lib",
|
|
48
|
+
"build": "npm run compile && node esbuild.mjs && npm run eslint && npm test",
|
|
50
49
|
"watch": "jsii -w",
|
|
51
50
|
"bump": "commit-and-tag-version -a -i docs/changelog.md",
|
|
51
|
+
"bump:alpha": "commit-and-tag-version -a -i docs/changelog.md --prerelease alpha",
|
|
52
52
|
"test": "jest --coverage",
|
|
53
53
|
"test:watch": "jest --watch",
|
|
54
54
|
"eslint": "eslint --ext .ts,.tsx --no-error-on-unmatched-pattern src test",
|
|
@@ -57,8 +57,10 @@
|
|
|
57
57
|
"cdk": "cdk",
|
|
58
58
|
"release:check": "node release-commit-check.js",
|
|
59
59
|
"release:build": "npm run build && npm run docgen && npm run bump",
|
|
60
|
+
"release:build:alpha": "npm run build && npm run docgen && npm run bump:alpha",
|
|
60
61
|
"release:push": "echo '✅ pushing release' && git push origin master --follow-tags",
|
|
61
62
|
"release": "npm run release:check && npm run release:build",
|
|
63
|
+
"release:alpha": "npm run release:check && npm run release:build:alpha",
|
|
62
64
|
"release:dry-run": "npm run build && npm run docgen && npm run release:check && commit-and-tag-version -i docs/changelog.md -a --dry-run"
|
|
63
65
|
},
|
|
64
66
|
"devDependencies": {
|
|
@@ -74,7 +76,6 @@
|
|
|
74
76
|
"aws-sdk-client-mock": "^4.1.0",
|
|
75
77
|
"commit-and-tag-version": "^12.5.0",
|
|
76
78
|
"constructs": "10.4.2",
|
|
77
|
-
"copyfiles": "2.4.1",
|
|
78
79
|
"esbuild": "0.24.0",
|
|
79
80
|
"eslint": "8.54.0",
|
|
80
81
|
"eslint-import-resolver-node": "0.3.9",
|
package/version.json
CHANGED
package/lib/contributions/team-transport-two/pipeline/buildspecs/buildspec-vulnerability-checks.yaml
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
version: 0.2
|
|
2
|
-
env:
|
|
3
|
-
variables:
|
|
4
|
-
LANG: C.UTF-8
|
|
5
|
-
parameter-store:
|
|
6
|
-
NIST_DATA_MIRROR_URL: /config/nist-data-mirror/url
|
|
7
|
-
phases:
|
|
8
|
-
install:
|
|
9
|
-
runtime-versions:
|
|
10
|
-
java: corretto17
|
|
11
|
-
build:
|
|
12
|
-
commands:
|
|
13
|
-
# Keep this echo statement for identifying the default buildspec in our test
|
|
14
|
-
- echo "Using standard gradle build spec for vulnerability checks..."
|
|
15
|
-
|
|
16
|
-
# RUNNING OWASP VULNERABILITY CHECK
|
|
17
|
-
- ./gradlew -Dorg.gradle.jvmargs=-Xmx4g dependencyCheckAnalyze
|
|
18
|
-
cache:
|
|
19
|
-
paths:
|
|
20
|
-
- /root/.cache/**/*
|
|
21
|
-
- /root/.gradle/caches/**/*
|
|
22
|
-
- /root/.gradle/wrapper/**/*
|
|
23
|
-
- /root/.gradle/dependency-check-data/**/*
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
version: '0.2'
|
|
2
|
-
env:
|
|
3
|
-
parameter-store:
|
|
4
|
-
SERVICE_KEYSTORE_PASSWORD: /config/${SERVICE_NAME}/service-keystore-password
|
|
5
|
-
LICENSE_BUCKET_NAME: /config/oss-licenses/bucket-name
|
|
6
|
-
ACCOUNT_NAME: /config/account/name
|
|
7
|
-
phases:
|
|
8
|
-
install:
|
|
9
|
-
runtime-versions:
|
|
10
|
-
java: corretto17
|
|
11
|
-
nodejs: 20
|
|
12
|
-
pre_build:
|
|
13
|
-
commands:
|
|
14
|
-
- (echo "Build triggered by commit " && git log --pretty=format:"%h%x09%an%x09%s" -n 1 ) | tr -d "\n"
|
|
15
|
-
build:
|
|
16
|
-
commands:
|
|
17
|
-
# Keep this echo statement for identifying the default buildspec in our test
|
|
18
|
-
- echo "Using standard gradle build spec..."
|
|
19
|
-
|
|
20
|
-
# BUILD AND TEST
|
|
21
|
-
- ./gradlew clean build
|
|
22
|
-
|
|
23
|
-
# LICENSE CHECKING
|
|
24
|
-
- set -u; aws s3 cp s3://${LICENSE_BUCKET_NAME}/whitelist-gradle.txt licenses/approved_licenses.txt
|
|
25
|
-
- ./gradlew checkLicenses
|
|
26
|
-
- set -u; aws s3 cp licenses/licenses.txt s3://${LICENSE_BUCKET_NAME}/reports/${ACCOUNT_NAME}/${SERVICE_NAME}.txt
|
|
27
|
-
|
|
28
|
-
# SELF CERT SIGNING
|
|
29
|
-
- set -u; keytool -genkey -alias InternalServiceCertificate -keyalg RSA -keystore containerfiles/service-keystore.p12 -validity 3650 -storetype PKCS12 -dname "CN=internal.service.${SERVICE_NAME}.${HOSTED_ZONE}, OU=Logistics, O=Rio, L=Munich, ST=BY, C=DE" -keypass ${SERVICE_KEYSTORE_PASSWORD} -storepass ${SERVICE_KEYSTORE_PASSWORD}
|
|
30
|
-
|
|
31
|
-
# DOCKER IMAGE BUILD
|
|
32
|
-
- ./gradlew jibBuildTar --quiet
|
|
33
|
-
|
|
34
|
-
# npm synth action
|
|
35
|
-
- cd infrastructure
|
|
36
|
-
- npm ci
|
|
37
|
-
# mute stdout of cdk synth to not dump the resulting Cfn template in logs
|
|
38
|
-
- npm run cdk synth 1> /dev/null
|
|
39
|
-
|
|
40
|
-
# In pipeline: Error parsing reference: is not a valid repository/tag: invalid reference format.
|
|
41
|
-
# workaround due to https://github.com/aws/aws-cdk/issues/18044',
|
|
42
|
-
- find ./ -type f -name "*DeployApplicationStacks*.assets.json" -print0 | xargs -0 sed --in-place 's|docker load -i asset.|docker load -i ../asset.|g'
|
|
43
|
-
|
|
44
|
-
- cd ..
|
|
45
|
-
post_build:
|
|
46
|
-
commands:
|
|
47
|
-
- (echo "Build triggered by commit " && git log --pretty=format:"%h%x09%an%x09%s" -n 1 ) | tr -d "\n"
|
|
48
|
-
reports:
|
|
49
|
-
JunitTestResults:
|
|
50
|
-
files:
|
|
51
|
-
- '**/*'
|
|
52
|
-
base-directory: build/test-results
|
|
53
|
-
|
|
54
|
-
cache:
|
|
55
|
-
paths:
|
|
56
|
-
- /cert/**/*
|
|
57
|
-
- /root/.cache/**/*
|
|
58
|
-
- /root/.gradle/caches/**/*
|
|
59
|
-
- /root/.gradle/wrapper/**/*
|
|
60
|
-
- /root/google-cloud-tools-java/jib/**/*
|
|
61
|
-
- target/jib-cache/**/*
|