@fjall/components-infrastructure 0.86.0 → 0.87.3
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/README.md +3 -3
- package/dist/lib/app.d.ts +166 -6
- package/dist/lib/app.js +212 -20
- package/dist/lib/aspects/resourceInventory.d.ts +4 -4
- package/dist/lib/aspects/resourceInventory.js +3 -3
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
- package/dist/lib/config/aws/identityCenter.js +1 -5
- package/dist/lib/config/aws/organisation.js +1 -4
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +7 -1
- package/dist/lib/patterns/aws/buildkite.js +3 -2
- package/dist/lib/patterns/aws/cdn.d.ts +164 -0
- package/dist/lib/patterns/aws/cdn.js +264 -0
- package/dist/lib/patterns/aws/compute.d.ts +278 -59
- package/dist/lib/patterns/aws/compute.js +384 -188
- package/dist/lib/patterns/aws/connections.d.ts +46 -0
- package/dist/lib/patterns/aws/connections.js +159 -0
- package/dist/lib/patterns/aws/database.d.ts +124 -11
- package/dist/lib/patterns/aws/database.js +188 -66
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/index.d.ts +3 -0
- package/dist/lib/patterns/aws/index.js +4 -1
- package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
- package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
- package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
- package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
- package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/database.js +65 -0
- package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
- package/dist/lib/patterns/aws/interfaces/index.js +49 -0
- package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
- package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
- package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
- package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
- package/dist/lib/patterns/aws/messaging.d.ts +183 -0
- package/dist/lib/patterns/aws/messaging.js +239 -0
- package/dist/lib/patterns/aws/network.js +4 -4
- package/dist/lib/patterns/aws/pattern.d.ts +67 -0
- package/dist/lib/patterns/aws/pattern.js +69 -0
- package/dist/lib/patterns/aws/payload.d.ts +87 -0
- package/dist/lib/patterns/aws/payload.js +526 -0
- package/dist/lib/patterns/aws/storage.d.ts +127 -15
- package/dist/lib/patterns/aws/storage.js +234 -38
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
- package/dist/lib/resources/aws/backup/backupVault.js +1 -2
- package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
- package/dist/lib/resources/aws/base/awsStack.js +1 -7
- package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
- package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
- package/dist/lib/resources/aws/cdn/index.js +18 -0
- package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
- package/dist/lib/resources/aws/compute/ec2.js +33 -6
- package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
- package/dist/lib/resources/aws/compute/ecs.js +31 -115
- package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
- package/dist/lib/resources/aws/compute/lambda.js +209 -32
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
- package/dist/lib/resources/aws/database/dynamodb.js +181 -0
- package/dist/lib/resources/aws/database/index.d.ts +1 -0
- package/dist/lib/resources/aws/database/index.js +2 -1
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
- package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
- package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
- package/dist/lib/resources/aws/index.d.ts +2 -0
- package/dist/lib/resources/aws/index.js +3 -1
- package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
- package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
- package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/index.js +20 -0
- package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
- package/dist/lib/resources/aws/messaging/sns.js +70 -0
- package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
- package/dist/lib/resources/aws/messaging/sqs.js +231 -0
- package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/utils.js +7 -0
- package/dist/lib/resources/aws/networking/ipam.js +1 -2
- package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
- package/dist/lib/resources/aws/networking/vpc.js +1 -2
- package/dist/lib/resources/aws/storage/ecr.js +8 -5
- package/dist/lib/resources/aws/storage/s3.js +1 -2
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.js +1 -1
- package/dist/lib/utils/getConfig.js +3 -2
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/manifestWriter.d.ts +174 -0
- package/dist/lib/utils/manifestWriter.js +233 -0
- package/dist/lib/utils/standardTagsAspect.js +1 -8
- package/dist/lib/utils/validationLogger.d.ts +34 -0
- package/dist/lib/utils/validationLogger.js +83 -0
- package/package.json +3 -3
- package/dist/lib/__tests__/setup.d.ts +0 -48
- package/dist/lib/__tests__/setup.js +0 -1
- package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
- package/dist/lib/patterns/aws/cicdRole.js +0 -68
- package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
- package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
- package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.isEc2Compute = exports.isLambdaCompute = exports.isEcsCompute = exports.isCompute = exports.Ec2Compute = exports.LambdaCompute = exports.EcsCompute = exports.ComputeFactory = exports.InvokeMode = exports.HttpMethod = exports.Architecture = exports.COMPUTE_DEFAULTS = exports.ECS_CAPACITY_PROVIDER_CONFIG = exports.COMPUTE_TYPE_CONFIG = exports.ScalingType = void 0;
|
|
4
4
|
exports.getComputeTypeConfig = getComputeTypeConfig;
|
|
5
5
|
exports.getEcsCapacityProviderConfig = getEcsCapacityProviderConfig;
|
|
6
|
+
exports.buildContainerConfigs = buildContainerConfigs;
|
|
7
|
+
exports.resolveScalingConfig = resolveScalingConfig;
|
|
8
|
+
exports.resolveLambdaDeployment = resolveLambdaDeployment;
|
|
6
9
|
const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
|
|
7
|
-
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
8
10
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
11
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
9
12
|
const constructs_1 = require("constructs");
|
|
13
|
+
// Import type-safe interfaces
|
|
14
|
+
const compute_js_1 = require("./interfaces/compute.js");
|
|
15
|
+
Object.defineProperty(exports, "isCompute", { enumerable: true, get: function () { return compute_js_1.isCompute; } });
|
|
16
|
+
Object.defineProperty(exports, "isEcsCompute", { enumerable: true, get: function () { return compute_js_1.isEcsCompute; } });
|
|
17
|
+
Object.defineProperty(exports, "isLambdaCompute", { enumerable: true, get: function () { return compute_js_1.isLambdaCompute; } });
|
|
18
|
+
Object.defineProperty(exports, "isEc2Compute", { enumerable: true, get: function () { return compute_js_1.isEc2Compute; } });
|
|
19
|
+
const connections_js_1 = require("./connections.js");
|
|
20
|
+
const validationLogger_js_1 = require("../../utils/validationLogger.js");
|
|
10
21
|
const ecs_1 = require("../../resources/aws/compute/ecs");
|
|
22
|
+
Object.defineProperty(exports, "ScalingType", { enumerable: true, get: function () { return ecs_1.ScalingType; } });
|
|
11
23
|
const ec2_1 = require("../../resources/aws/compute/ec2");
|
|
12
24
|
const lambda_1 = require("../../resources/aws/compute/lambda");
|
|
13
25
|
exports.COMPUTE_TYPE_CONFIG = {
|
|
@@ -44,6 +56,27 @@ exports.ECS_CAPACITY_PROVIDER_CONFIG = {
|
|
|
44
56
|
usesEc2Instances: true
|
|
45
57
|
}
|
|
46
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* Default values for compute resource configuration.
|
|
61
|
+
* Centralised constants to ensure consistency across the codebase.
|
|
62
|
+
*/
|
|
63
|
+
exports.COMPUTE_DEFAULTS = {
|
|
64
|
+
EC2: {
|
|
65
|
+
INSTANCE_TYPE: "t3.micro",
|
|
66
|
+
MIN_CAPACITY: 1,
|
|
67
|
+
MAX_CAPACITY: 1
|
|
68
|
+
},
|
|
69
|
+
ECS: {
|
|
70
|
+
/** AWS sample image used when no ECR repository is provided */
|
|
71
|
+
FALLBACK_IMAGE: "amazon/amazon-ecs-sample",
|
|
72
|
+
/** Default tag for ECR images */
|
|
73
|
+
IMAGE_TAG: "latest"
|
|
74
|
+
},
|
|
75
|
+
LAMBDA: {
|
|
76
|
+
HANDLER: "index.handler",
|
|
77
|
+
RUNTIME: aws_lambda_1.Runtime.NODEJS_18_X
|
|
78
|
+
}
|
|
79
|
+
};
|
|
47
80
|
function getComputeTypeConfig(type) {
|
|
48
81
|
return exports.COMPUTE_TYPE_CONFIG[type];
|
|
49
82
|
}
|
|
@@ -52,65 +85,22 @@ function getEcsCapacityProviderConfig(provider) {
|
|
|
52
85
|
}
|
|
53
86
|
// Re-export Lambda types from CDK for user convenience
|
|
54
87
|
var aws_lambda_2 = require("aws-cdk-lib/aws-lambda");
|
|
88
|
+
Object.defineProperty(exports, "Architecture", { enumerable: true, get: function () { return aws_lambda_2.Architecture; } });
|
|
55
89
|
Object.defineProperty(exports, "HttpMethod", { enumerable: true, get: function () { return aws_lambda_2.HttpMethod; } });
|
|
90
|
+
Object.defineProperty(exports, "InvokeMode", { enumerable: true, get: function () { return aws_lambda_2.InvokeMode; } });
|
|
56
91
|
/**
|
|
57
92
|
* Validates compute props and logs warnings for ignored or misconfigured options.
|
|
58
93
|
* These checks help catch issues when props come from dynamic sources where
|
|
59
94
|
* TypeScript's compile-time checks may not apply.
|
|
60
95
|
*/
|
|
61
96
|
function validateComputeProps(props) {
|
|
62
|
-
const propsAny = props;
|
|
63
97
|
// ECS-specific options on non-ECS compute
|
|
64
|
-
|
|
65
|
-
if ("capacityProvider" in propsAny &&
|
|
66
|
-
propsAny.capacityProvider !== undefined) {
|
|
67
|
-
console.warn(`[Fjall] Warning: 'capacityProvider' is ignored for ${props.type} compute. ` +
|
|
68
|
-
"Capacity provider configuration only applies to ECS compute.");
|
|
69
|
-
}
|
|
70
|
-
if ("ec2Config" in propsAny && propsAny.ec2Config !== undefined) {
|
|
71
|
-
console.warn(`[Fjall] Warning: 'ec2Config' is ignored for ${props.type} compute. ` +
|
|
72
|
-
"EC2 capacity configuration only applies to ECS compute.");
|
|
73
|
-
}
|
|
74
|
-
if ("services" in propsAny && propsAny.services !== undefined) {
|
|
75
|
-
console.warn(`[Fjall] Warning: 'services' is ignored for ${props.type} compute. ` +
|
|
76
|
-
"Services configuration only applies to ECS compute.");
|
|
77
|
-
}
|
|
78
|
-
if ("cluster" in propsAny && propsAny.cluster !== undefined) {
|
|
79
|
-
console.warn(`[Fjall] Warning: 'cluster' is ignored for ${props.type} compute. ` +
|
|
80
|
-
"Cluster configuration only applies to ECS compute.");
|
|
81
|
-
}
|
|
82
|
-
}
|
|
98
|
+
(0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["capacityProvider", "ec2Config", "services", "cluster"], "ecs", "ECS compute");
|
|
83
99
|
// Lambda-specific options on non-Lambda compute
|
|
84
|
-
|
|
85
|
-
if ("functionUrl" in propsAny && propsAny.functionUrl !== undefined) {
|
|
86
|
-
console.warn(`[Fjall] Warning: 'functionUrl' is ignored for ${props.type} compute. ` +
|
|
87
|
-
"Function URL configuration only applies to Lambda compute.");
|
|
88
|
-
}
|
|
89
|
-
if ("handler" in propsAny && propsAny.handler !== undefined) {
|
|
90
|
-
console.warn(`[Fjall] Warning: 'handler' is ignored for ${props.type} compute. ` +
|
|
91
|
-
"Handler configuration only applies to Lambda compute.");
|
|
92
|
-
}
|
|
93
|
-
if ("runtime" in propsAny && propsAny.runtime !== undefined) {
|
|
94
|
-
console.warn(`[Fjall] Warning: 'runtime' is ignored for ${props.type} compute. ` +
|
|
95
|
-
"Runtime configuration only applies to Lambda compute.");
|
|
96
|
-
}
|
|
97
|
-
}
|
|
100
|
+
(0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["functionUrl", "handler", "runtime"], "lambda", "Lambda compute");
|
|
98
101
|
// EC2-specific options on non-EC2 compute
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
console.warn(`[Fjall] Warning: 'ssh' is ignored for ${props.type} compute. ` +
|
|
102
|
-
"SSH configuration only applies to EC2 compute.");
|
|
103
|
-
}
|
|
104
|
-
if ("userData" in propsAny && propsAny.userData !== undefined) {
|
|
105
|
-
console.warn(`[Fjall] Warning: 'userData' is ignored for ${props.type} compute. ` +
|
|
106
|
-
"User data only applies to EC2 compute.");
|
|
107
|
-
}
|
|
108
|
-
if ("machineImage" in propsAny && propsAny.machineImage !== undefined) {
|
|
109
|
-
console.warn(`[Fjall] Warning: 'machineImage' is ignored for ${props.type} compute. ` +
|
|
110
|
-
"Machine image only applies to EC2 compute.");
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// ECS-specific validation
|
|
102
|
+
(0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["ssh", "userData", "machineImage"], "ec2", "EC2 compute");
|
|
103
|
+
// ECS-specific validation - type narrowing handled by discriminated union
|
|
114
104
|
if (props.type === "ecs") {
|
|
115
105
|
validateEcsProps(props);
|
|
116
106
|
}
|
|
@@ -165,44 +155,117 @@ function validateEcsProps(props) {
|
|
|
165
155
|
}
|
|
166
156
|
// Warn if service ec2Config is defined but capacityProvider is not EC2
|
|
167
157
|
if (service.ec2Config && service.capacityProvider !== "EC2") {
|
|
168
|
-
|
|
158
|
+
validationLogger_js_1.FjallLogger.warn(`Service '${service.name}' has ec2Config but capacityProvider is not 'EC2'. ` +
|
|
169
159
|
"The ec2Config will be ignored unless capacityProvider is set to 'EC2'.");
|
|
170
160
|
}
|
|
171
161
|
}
|
|
172
162
|
}
|
|
173
163
|
/**
|
|
174
|
-
*
|
|
164
|
+
* Build container configurations for an ECS service.
|
|
165
|
+
* Converts user-facing EcsContainerConfig to internal EcsClusterProps format.
|
|
166
|
+
* @internal Exported for testing only
|
|
167
|
+
*/
|
|
168
|
+
function buildContainerConfigs(service) {
|
|
169
|
+
if (service.containers && service.containers.length > 0) {
|
|
170
|
+
return service.containers.map((c, index) => ({
|
|
171
|
+
name: c.name || `${service.name}Container${index > 0 ? index : ""}`,
|
|
172
|
+
image: c.image,
|
|
173
|
+
port: c.port,
|
|
174
|
+
environment: c.environment,
|
|
175
|
+
secrets: c.secrets,
|
|
176
|
+
secretsImport: c.secretsImport,
|
|
177
|
+
command: c.command,
|
|
178
|
+
entryPoint: c.entryPoint,
|
|
179
|
+
essential: c.essential,
|
|
180
|
+
healthCheck: c.healthCheck
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
// Default container (no port = worker)
|
|
184
|
+
return [{ name: `${service.name}Container` }];
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Resolve scaling configuration from service props.
|
|
188
|
+
* Handles the three cases: explicit config, disabled (false), or default (undefined).
|
|
189
|
+
* @internal Exported for testing only
|
|
190
|
+
*/
|
|
191
|
+
function resolveScalingConfig(scaling) {
|
|
192
|
+
if (scaling === false) {
|
|
193
|
+
return {
|
|
194
|
+
scalingType: undefined,
|
|
195
|
+
minCapacity: undefined,
|
|
196
|
+
maxCapacity: undefined
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (scaling === undefined) {
|
|
200
|
+
return {
|
|
201
|
+
scalingType: ecs_1.ScalingType.CPU,
|
|
202
|
+
minCapacity: undefined,
|
|
203
|
+
maxCapacity: undefined
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
scalingType: scaling.scalingType ?? ecs_1.ScalingType.CPU,
|
|
208
|
+
minCapacity: scaling.minCapacity,
|
|
209
|
+
maxCapacity: scaling.maxCapacity
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Resolve Lambda deployment configuration from props.
|
|
214
|
+
* Handles container vs code deployment types.
|
|
215
|
+
*/
|
|
216
|
+
function resolveLambdaDeployment(props) {
|
|
217
|
+
if (props.deployment === "container") {
|
|
218
|
+
if (!(props.ecrRepository instanceof aws_ecr_1.Repository)) {
|
|
219
|
+
throw new Error("ecrRepository must be a Repository instance for Lambda compute type");
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
code: aws_lambda_1.Code.fromEcrImage(props.ecrRepository, {
|
|
223
|
+
tagOrDigest: exports.COMPUTE_DEFAULTS.ECS.IMAGE_TAG
|
|
224
|
+
}),
|
|
225
|
+
handler: aws_lambda_1.Handler.FROM_IMAGE,
|
|
226
|
+
runtime: aws_lambda_1.Runtime.FROM_IMAGE
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
code: props.code,
|
|
231
|
+
handler: props.handler || exports.COMPUTE_DEFAULTS.LAMBDA.HANDLER,
|
|
232
|
+
runtime: props.runtime || exports.COMPUTE_DEFAULTS.LAMBDA.RUNTIME
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Factory for creating compute resources with type-safe return types.
|
|
237
|
+
*
|
|
238
|
+
* The factory uses overloads to infer the specific compute type from props,
|
|
239
|
+
* ensuring TypeScript provides only the relevant methods for each compute type.
|
|
175
240
|
*
|
|
176
241
|
* @example
|
|
177
|
-
* //
|
|
178
|
-
* app.addCompute(ComputeFactory.build("WebApp", {
|
|
242
|
+
* // ECS compute - returns EcsCompute with ECS-specific methods
|
|
243
|
+
* const ecs = app.addCompute(ComputeFactory.build("WebApp", {
|
|
179
244
|
* type: "ecs",
|
|
180
245
|
* cluster: { domain: "app.example.com" },
|
|
181
246
|
* services: [{ name: "web", containers: [{ port: 3000 }] }]
|
|
182
247
|
* }));
|
|
248
|
+
* ecs.getLoadBalancer(); // Available on EcsCompute
|
|
183
249
|
*
|
|
184
250
|
* @example
|
|
185
|
-
* //
|
|
186
|
-
* app.addCompute(ComputeFactory.build("
|
|
187
|
-
* type: "
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
* { name: "users", containers: [{ port: 3000 }], routing: { path: "/users/*" } },
|
|
191
|
-
* { name: "orders", containers: [{ port: 3001 }], routing: { path: "/orders/*" } }
|
|
192
|
-
* ]
|
|
251
|
+
* // Lambda compute - returns LambdaCompute with Lambda-specific methods
|
|
252
|
+
* const lambda = app.addCompute(ComputeFactory.build("Fn", {
|
|
253
|
+
* type: "lambda",
|
|
254
|
+
* deployment: "code",
|
|
255
|
+
* code: Code.fromAsset("./lambda")
|
|
193
256
|
* }));
|
|
257
|
+
* lambda.getFunctionUrl(); // Available on LambdaCompute
|
|
194
258
|
*
|
|
195
259
|
* @example
|
|
196
|
-
* //
|
|
197
|
-
* app.addCompute(ComputeFactory.build("
|
|
198
|
-
* type: "
|
|
199
|
-
*
|
|
200
|
-
* services: [
|
|
201
|
-
* { name: "processor", containers: [{ command: ["node", "worker.js"] }] }
|
|
202
|
-
* ]
|
|
260
|
+
* // EC2 compute - returns Ec2Compute with EC2-specific methods
|
|
261
|
+
* const ec2 = app.addCompute(ComputeFactory.build("Instance", {
|
|
262
|
+
* type: "ec2",
|
|
263
|
+
* instanceType: "t3.micro"
|
|
203
264
|
* }));
|
|
265
|
+
* ec2.getAutoScalingGroup(); // Available on Ec2Compute
|
|
204
266
|
*/
|
|
205
267
|
class ComputeFactory {
|
|
268
|
+
// Implementation signature
|
|
206
269
|
static build(id, props) {
|
|
207
270
|
return (app, scope) => {
|
|
208
271
|
validateComputeProps(props);
|
|
@@ -214,95 +277,102 @@ class ComputeFactory {
|
|
|
214
277
|
},
|
|
215
278
|
...props
|
|
216
279
|
};
|
|
217
|
-
if (computeProps.type === "ecs"
|
|
218
|
-
computeProps = {
|
|
280
|
+
if (computeProps.type === "ecs") {
|
|
281
|
+
computeProps = {
|
|
282
|
+
...computeProps,
|
|
283
|
+
appName: computeProps.appName ?? app.getName()
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// Create specific compute class based on type discriminator
|
|
287
|
+
switch (computeProps.type) {
|
|
288
|
+
case "ecs": {
|
|
289
|
+
// Register ECS services with manifest collector for CLI discovery
|
|
290
|
+
const collector = app.getManifestCollector();
|
|
291
|
+
const clusterName = id;
|
|
292
|
+
const appName = computeProps.appName ?? app.getName();
|
|
293
|
+
for (const service of computeProps.services) {
|
|
294
|
+
const manifestService = {
|
|
295
|
+
name: service.name,
|
|
296
|
+
clusterName
|
|
297
|
+
};
|
|
298
|
+
// Include dockerfilePath if specified (metadata for CLI)
|
|
299
|
+
if (service.dockerfilePath) {
|
|
300
|
+
manifestService.dockerfilePath = service.dockerfilePath;
|
|
301
|
+
}
|
|
302
|
+
// Include dockerTarget if specified (metadata for CLI)
|
|
303
|
+
if (service.dockerTarget) {
|
|
304
|
+
manifestService.dockerTarget = service.dockerTarget;
|
|
305
|
+
}
|
|
306
|
+
// Find container port from first container with a port
|
|
307
|
+
const containerWithPort = service.containers?.find((c) => c.port !== undefined);
|
|
308
|
+
if (containerWithPort?.port !== undefined) {
|
|
309
|
+
manifestService.containerPort = containerWithPort.port;
|
|
310
|
+
}
|
|
311
|
+
// Aggregate secrets from all containers (deduplicated)
|
|
312
|
+
const allSecrets = new Set();
|
|
313
|
+
for (const container of service.containers ?? []) {
|
|
314
|
+
if (container.secrets) {
|
|
315
|
+
for (const secret of container.secrets) {
|
|
316
|
+
allSecrets.add(secret);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (allSecrets.size > 0) {
|
|
321
|
+
manifestService.secrets = Array.from(allSecrets);
|
|
322
|
+
}
|
|
323
|
+
// Include ssmSecretsPath (explicit or derived)
|
|
324
|
+
manifestService.ssmSecretsPath =
|
|
325
|
+
service.ssmSecretsPath ??
|
|
326
|
+
`/${appName}/${clusterName}/${service.name}`;
|
|
327
|
+
collector.addService(manifestService);
|
|
328
|
+
}
|
|
329
|
+
return new EcsCompute(scope, id, computeProps);
|
|
330
|
+
}
|
|
331
|
+
case "lambda": {
|
|
332
|
+
// Add appName to props for Lambda (needed for secrets path derivation)
|
|
333
|
+
const lambdaComputeProps = {
|
|
334
|
+
...computeProps,
|
|
335
|
+
appName: app.getName()
|
|
336
|
+
};
|
|
337
|
+
// Always register Lambda with manifest collector for CLI discovery
|
|
338
|
+
// This ensures all Lambdas are discoverable for secrets management,
|
|
339
|
+
// even those that don't currently have secrets configured
|
|
340
|
+
const collector = app.getManifestCollector();
|
|
341
|
+
const manifestLambda = {
|
|
342
|
+
name: id,
|
|
343
|
+
ssmSecretsPath: lambdaComputeProps.ssmSecretsPath ||
|
|
344
|
+
`/${lambdaComputeProps.appName}/lambda/${id}`
|
|
345
|
+
};
|
|
346
|
+
if (lambdaComputeProps.secrets &&
|
|
347
|
+
lambdaComputeProps.secrets.length > 0) {
|
|
348
|
+
manifestLambda.secrets = lambdaComputeProps.secrets;
|
|
349
|
+
}
|
|
350
|
+
collector.addLambda(manifestLambda);
|
|
351
|
+
return new LambdaCompute(scope, id, lambdaComputeProps);
|
|
352
|
+
}
|
|
353
|
+
case "ec2":
|
|
354
|
+
return new Ec2Compute(scope, id, computeProps);
|
|
355
|
+
default: {
|
|
356
|
+
const _exhaustive = computeProps;
|
|
357
|
+
throw new Error(`Unsupported compute type: ${String(_exhaustive.type)}`);
|
|
358
|
+
}
|
|
219
359
|
}
|
|
220
|
-
return new Compute(scope, id, computeProps);
|
|
221
360
|
};
|
|
222
361
|
}
|
|
223
362
|
}
|
|
224
363
|
exports.ComputeFactory = ComputeFactory;
|
|
225
|
-
|
|
364
|
+
/**
|
|
365
|
+
* ECS compute wrapper implementing IEcsCompute.
|
|
366
|
+
* Provides type-safe access to ECS-specific resources.
|
|
367
|
+
*/
|
|
368
|
+
class EcsCompute extends constructs_1.Construct {
|
|
226
369
|
constructor(scope, id, props) {
|
|
227
370
|
super(scope, id);
|
|
228
|
-
this.
|
|
229
|
-
this.scope = scope;
|
|
230
|
-
this.addCompute(props);
|
|
231
|
-
}
|
|
232
|
-
addCompute(props) {
|
|
233
|
-
switch (props.type) {
|
|
234
|
-
case "ecs":
|
|
235
|
-
this.addEcsCompute(props);
|
|
236
|
-
break;
|
|
237
|
-
case "ec2":
|
|
238
|
-
this.addEc2Compute(props);
|
|
239
|
-
break;
|
|
240
|
-
case "lambda":
|
|
241
|
-
this.addLambdaCompute(props);
|
|
242
|
-
break;
|
|
243
|
-
default: {
|
|
244
|
-
// Exhaustiveness check - TypeScript will error if a case is missing
|
|
245
|
-
const _exhaustive = props;
|
|
246
|
-
throw new Error(`Unsupported compute type: ${_exhaustive.type}`);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
addEc2Compute(props) {
|
|
251
|
-
const enableSSH = props.ssh !== undefined && props.ssh !== false;
|
|
252
|
-
const ec2Props = {
|
|
253
|
-
serviceName: `${this.id}Service`,
|
|
254
|
-
instanceType: props.instanceType || "t3.micro",
|
|
255
|
-
enableSSH,
|
|
256
|
-
userData: props.userData,
|
|
257
|
-
machineImage: props.machineImage,
|
|
258
|
-
minCapacity: props.minCapacity || 1,
|
|
259
|
-
maxCapacity: props.maxCapacity || 1,
|
|
260
|
-
vpc: props.vpc
|
|
261
|
-
};
|
|
262
|
-
this.compute = new ec2_1.Ec2Instance(this.scope, `${this.id}Ec2`, ec2Props);
|
|
263
|
-
this.connections = this.compute.connections;
|
|
264
|
-
}
|
|
265
|
-
addEcsCompute(props) {
|
|
371
|
+
this.computeType = "ecs";
|
|
266
372
|
// Transform EcsServiceConfig[] to EcsServiceProps[] for EcsCluster
|
|
267
373
|
const services = props.services.map((service) => {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if (service.containers && service.containers.length > 0) {
|
|
271
|
-
// Map containers, auto-generating names if not provided
|
|
272
|
-
containers = service.containers.map((c, index) => ({
|
|
273
|
-
name: c.name || `${service.name}Container${index > 0 ? index : ""}`,
|
|
274
|
-
image: c.image,
|
|
275
|
-
port: c.port,
|
|
276
|
-
environment: c.environment,
|
|
277
|
-
secretsImport: c.secretsImport,
|
|
278
|
-
ssmSecrets: c.ssmSecrets,
|
|
279
|
-
command: c.command,
|
|
280
|
-
entryPoint: c.entryPoint,
|
|
281
|
-
essential: c.essential,
|
|
282
|
-
healthCheck: c.healthCheck
|
|
283
|
-
}));
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
// Default container (no port = worker)
|
|
287
|
-
containers = [
|
|
288
|
-
{
|
|
289
|
-
name: `${service.name}Container`
|
|
290
|
-
}
|
|
291
|
-
];
|
|
292
|
-
}
|
|
293
|
-
// Determine scaling config
|
|
294
|
-
let scalingType;
|
|
295
|
-
let minCapacity;
|
|
296
|
-
let maxCapacity;
|
|
297
|
-
if (service.scaling !== false && service.scaling !== undefined) {
|
|
298
|
-
scalingType = service.scaling.scalingType ?? ecs_1.ScalingType.CPU;
|
|
299
|
-
minCapacity = service.scaling.minCapacity;
|
|
300
|
-
maxCapacity = service.scaling.maxCapacity;
|
|
301
|
-
}
|
|
302
|
-
else if (service.scaling === undefined) {
|
|
303
|
-
// Default: enable scaling with CPU
|
|
304
|
-
scalingType = ecs_1.ScalingType.CPU;
|
|
305
|
-
}
|
|
374
|
+
const containers = buildContainerConfigs(service);
|
|
375
|
+
const { scalingType, minCapacity, maxCapacity } = resolveScalingConfig(service.scaling);
|
|
306
376
|
return {
|
|
307
377
|
name: service.name,
|
|
308
378
|
image: service.image,
|
|
@@ -320,7 +390,6 @@ class Compute extends constructs_1.Construct {
|
|
|
320
390
|
capacityProvider: service.capacityProvider,
|
|
321
391
|
ec2Config: service.ec2Config,
|
|
322
392
|
ssmSecretsPath: service.ssmSecretsPath,
|
|
323
|
-
dockerfilePath: service.dockerfilePath,
|
|
324
393
|
dockerTarget: service.dockerTarget
|
|
325
394
|
};
|
|
326
395
|
});
|
|
@@ -334,40 +403,75 @@ class Compute extends constructs_1.Construct {
|
|
|
334
403
|
}
|
|
335
404
|
: undefined;
|
|
336
405
|
const ecsProps = {
|
|
337
|
-
clusterName: `${
|
|
406
|
+
clusterName: `${id}Cluster`,
|
|
338
407
|
appName: props.appName,
|
|
339
408
|
vpc: props.vpc,
|
|
340
|
-
ecrRepository: props.ecrRepository ||
|
|
409
|
+
ecrRepository: props.ecrRepository || exports.COMPUTE_DEFAULTS.ECS.FALLBACK_IMAGE,
|
|
341
410
|
cluster,
|
|
342
411
|
services
|
|
343
412
|
};
|
|
344
|
-
this.
|
|
345
|
-
this.connections = this.
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
413
|
+
this.ecsCluster = new ecs_1.default(scope, `${id}Ecs`, ecsProps);
|
|
414
|
+
this.connections = this.ecsCluster.connections;
|
|
415
|
+
}
|
|
416
|
+
/** Get the ECS cluster. */
|
|
417
|
+
getCluster() {
|
|
418
|
+
return this.ecsCluster.getCluster();
|
|
419
|
+
}
|
|
420
|
+
/** Get the Application Load Balancer if one was created. */
|
|
421
|
+
getLoadBalancer() {
|
|
422
|
+
return this.ecsCluster.getLoadBalancer();
|
|
423
|
+
}
|
|
424
|
+
/** Get a specific service by name. */
|
|
425
|
+
getService(name) {
|
|
426
|
+
return this.ecsCluster.getService(name);
|
|
427
|
+
}
|
|
428
|
+
/** Get all services in the cluster. */
|
|
429
|
+
getAllServices() {
|
|
430
|
+
const servicesMap = this.ecsCluster.getServices();
|
|
431
|
+
return Array.from(servicesMap.values());
|
|
432
|
+
}
|
|
433
|
+
/** Get the security group for the cluster. */
|
|
434
|
+
getSecurityGroup() {
|
|
435
|
+
// Return the first security group from connections
|
|
436
|
+
const securityGroups = this.connections.securityGroups;
|
|
437
|
+
if (securityGroups.length === 0) {
|
|
438
|
+
throw new Error("No security groups found for ECS cluster");
|
|
370
439
|
}
|
|
440
|
+
return securityGroups[0];
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Get the ALB listener if this is an ECS compute with ALB.
|
|
444
|
+
*/
|
|
445
|
+
getListener() {
|
|
446
|
+
return this.ecsCluster.getListener();
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Get the underlying ECS cluster construct.
|
|
450
|
+
*/
|
|
451
|
+
getEcsCluster() {
|
|
452
|
+
return this.ecsCluster;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Grants ecs:ExecuteCommand permission for ECS services.
|
|
456
|
+
*/
|
|
457
|
+
grantExecuteCommand(grantee) {
|
|
458
|
+
return aws_iam_1.Grant.addToPrincipal({
|
|
459
|
+
grantee,
|
|
460
|
+
actions: ["ecs:ExecuteCommand"],
|
|
461
|
+
resourceArns: ["*"]
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
exports.EcsCompute = EcsCompute;
|
|
466
|
+
/**
|
|
467
|
+
* Lambda compute wrapper implementing ILambdaCompute.
|
|
468
|
+
* Provides type-safe access to Lambda-specific resources.
|
|
469
|
+
*/
|
|
470
|
+
class LambdaCompute extends constructs_1.Construct {
|
|
471
|
+
constructor(scope, id, props) {
|
|
472
|
+
super(scope, id);
|
|
473
|
+
this.computeType = "lambda";
|
|
474
|
+
const { code, handler, runtime } = resolveLambdaDeployment(props);
|
|
371
475
|
// Convert presence-based functionUrl config to legacy boolean format
|
|
372
476
|
const functionUrlConfig = props.functionUrl;
|
|
373
477
|
const enableFunctionUrl = functionUrlConfig !== undefined && functionUrlConfig !== false;
|
|
@@ -377,11 +481,15 @@ class Compute extends constructs_1.Construct {
|
|
|
377
481
|
const functionUrlCors = enableFunctionUrl && typeof functionUrlConfig === "object"
|
|
378
482
|
? functionUrlConfig.cors
|
|
379
483
|
: undefined;
|
|
484
|
+
const functionUrlInvokeMode = enableFunctionUrl && typeof functionUrlConfig === "object"
|
|
485
|
+
? functionUrlConfig.invokeMode
|
|
486
|
+
: undefined;
|
|
380
487
|
const lambdaProps = {
|
|
381
|
-
code
|
|
488
|
+
code,
|
|
382
489
|
vpc: props.vpc,
|
|
383
490
|
handler,
|
|
384
491
|
runtime,
|
|
492
|
+
architecture: props.architecture,
|
|
385
493
|
timeout: props.timeout,
|
|
386
494
|
memorySize: props.memorySize,
|
|
387
495
|
lambdaDescription: props.description,
|
|
@@ -390,18 +498,106 @@ class Compute extends constructs_1.Construct {
|
|
|
390
498
|
enableFunctionUrl,
|
|
391
499
|
functionUrlAuthType,
|
|
392
500
|
functionUrlCors,
|
|
501
|
+
functionUrlInvokeMode,
|
|
393
502
|
scheduleExpression: props.scheduleExpression,
|
|
394
503
|
ephemeralStorageSize: props.ephemeralStorageSize,
|
|
395
|
-
|
|
396
|
-
|
|
504
|
+
secrets: props.secrets,
|
|
505
|
+
ssmSecretsPath: props.ssmSecretsPath,
|
|
506
|
+
secretsImport: props.secretsImport,
|
|
507
|
+
environment: props.environment,
|
|
508
|
+
appName: props.appName,
|
|
509
|
+
functionName: id
|
|
397
510
|
};
|
|
398
|
-
this.
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
511
|
+
this.lambdaFunction = new lambda_1.LambdaFunction(scope, `${id}Lambda`, lambdaProps);
|
|
512
|
+
this.connections = this.lambdaFunction.connections;
|
|
513
|
+
// Process connections using the unified connector interface
|
|
514
|
+
if (props.connections && props.connections.length > 0) {
|
|
515
|
+
try {
|
|
516
|
+
(0, connections_js_1.processConnections)(props.connections, this.lambdaFunction, // IGrantable (execution role)
|
|
517
|
+
this.lambdaFunction // IConnectable (security group)
|
|
518
|
+
);
|
|
519
|
+
}
|
|
520
|
+
catch (error) {
|
|
521
|
+
throw new Error(`Failed to process connections for Lambda '${id}': ${error instanceof Error ? error.message : String(error)}`);
|
|
402
522
|
}
|
|
403
523
|
}
|
|
404
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Get a Lambda function by name.
|
|
527
|
+
* Since we only have one function, name is ignored.
|
|
528
|
+
*/
|
|
529
|
+
getFunction(_name) {
|
|
530
|
+
return this.lambdaFunction;
|
|
531
|
+
}
|
|
532
|
+
/** Get all Lambda functions. */
|
|
533
|
+
getAllFunctions() {
|
|
534
|
+
return [this.lambdaFunction];
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Get the function URL for a Lambda function.
|
|
538
|
+
*/
|
|
539
|
+
getFunctionUrl(_name) {
|
|
540
|
+
return this.lambdaFunction.getFunctionUrl();
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Grant invoke permissions to a grantee.
|
|
544
|
+
*/
|
|
545
|
+
grantInvoke(grantee, _functionName) {
|
|
546
|
+
return this.lambdaFunction.grantInvoke(grantee);
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Get the security group for VPC-enabled Lambda functions.
|
|
550
|
+
* Returns undefined if the Lambda is not VPC-enabled.
|
|
551
|
+
*/
|
|
552
|
+
getSecurityGroup() {
|
|
553
|
+
const securityGroups = this.connections.securityGroups;
|
|
554
|
+
return securityGroups.length > 0 ? securityGroups[0] : undefined;
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Get the underlying Lambda function construct.
|
|
558
|
+
*/
|
|
559
|
+
getLambdaFunction() {
|
|
560
|
+
return this.lambdaFunction;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
exports.LambdaCompute = LambdaCompute;
|
|
564
|
+
/**
|
|
565
|
+
* EC2 compute wrapper implementing IEc2Compute.
|
|
566
|
+
* Provides type-safe access to EC2-specific resources.
|
|
567
|
+
*/
|
|
568
|
+
class Ec2Compute extends constructs_1.Construct {
|
|
569
|
+
constructor(scope, id, props) {
|
|
570
|
+
super(scope, id);
|
|
571
|
+
this.computeType = "ec2";
|
|
572
|
+
const enableSSH = props.ssh !== undefined && props.ssh !== false;
|
|
573
|
+
const ec2Props = {
|
|
574
|
+
serviceName: `${id}Service`,
|
|
575
|
+
instanceType: props.instanceType || exports.COMPUTE_DEFAULTS.EC2.INSTANCE_TYPE,
|
|
576
|
+
enableSSH,
|
|
577
|
+
userData: props.userData,
|
|
578
|
+
machineImage: props.machineImage,
|
|
579
|
+
minCapacity: props.minCapacity || exports.COMPUTE_DEFAULTS.EC2.MIN_CAPACITY,
|
|
580
|
+
maxCapacity: props.maxCapacity || exports.COMPUTE_DEFAULTS.EC2.MAX_CAPACITY,
|
|
581
|
+
vpc: props.vpc,
|
|
582
|
+
spotCapacityPercentage: props.spotCapacityPercentage
|
|
583
|
+
};
|
|
584
|
+
this.ec2Instance = new ec2_1.Ec2Instance(scope, `${id}Ec2`, ec2Props);
|
|
585
|
+
this.connections = this.ec2Instance.connections;
|
|
586
|
+
}
|
|
587
|
+
/** Get the Auto Scaling Group. */
|
|
588
|
+
getAutoScalingGroup() {
|
|
589
|
+
return this.ec2Instance.getAutoScalingGroup();
|
|
590
|
+
}
|
|
591
|
+
/** Get the security group. */
|
|
592
|
+
getSecurityGroup() {
|
|
593
|
+
return this.ec2Instance.asgSecurityGroup;
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Get the underlying EC2 instance construct.
|
|
597
|
+
*/
|
|
598
|
+
getEc2Instance() {
|
|
599
|
+
return this.ec2Instance;
|
|
600
|
+
}
|
|
405
601
|
}
|
|
406
|
-
exports.
|
|
407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2R0Esb0RBRUM7QUFFRCxvRUFJQztBQXBIRCxpREFBaUQ7QUFDakQsaURBTzZCO0FBQzdCLHVEQU1nQztBQU9oQywyQ0FBdUM7QUFJdkMseURBTXlDO0FBQ3pDLHlEQUE4RDtBQUM5RCwrREFBb0U7QUF5QnZELFFBQUEsbUJBQW1CLEdBQTJDO0lBQ3pFLEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELG1CQUFtQixFQUFFLElBQUk7UUFDekIsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxXQUFXLEVBQUUsRUFBRTtRQUNmLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtRQUNsRCxtQkFBbUIsRUFBRSxJQUFJO1FBQ3pCLFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLENBQUM7UUFDZCxjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDcEQsbUJBQW1CLEVBQUUsS0FBSztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNuQjtDQUNGLENBQUM7QUFZVyxRQUFBLDRCQUE0QixHQUdyQztJQUNGLE9BQU8sRUFBRTtRQUNQLFFBQVEsRUFBRSxLQUFLO1FBQ2YsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELFlBQVksRUFBRTtRQUNaLFFBQVEsRUFBRSxJQUFJO1FBQ2QsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELEdBQUcsRUFBRTtRQUNILFFBQVEsRUFBRSxLQUFLO1FB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TkQsMEJBeU5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBSZXBvc2l0b3J5SW1hZ2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbm5lY3Rpb25zLFxuICB0eXBlIElDb25uZWN0YWJsZSxcbiAgdHlwZSBJVnBjLFxuICB0eXBlIFVzZXJEYXRhLFxuICB0eXBlIElNYWNoaW5lSW1hZ2UsXG4gIFBvcnRcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIENvZGUsXG4gIFJ1bnRpbWUsXG4gIEhhbmRsZXIsXG4gIHR5cGUgRnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICB0eXBlIFBvbGljeVN0YXRlbWVudCxcbiAgdHlwZSBQb2xpY3lEb2N1bWVudCxcbiAgdHlwZSBJTWFuYWdlZFBvbGljeVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuXG5pbXBvcnQgRWNzQ2x1c3Rlciwge1xuICB0eXBlIEVjc0NsdXN0ZXJQcm9wcyxcbiAgU2NhbGluZ1R5cGUsXG4gIHR5cGUgRG9tYWluQ29uZmlnLFxuICB0eXBlIEVjc0NhcGFjaXR5UHJvdmlkZXIsXG4gIHR5cGUgRWMyQ2FwYWNpdHlDb25maWdcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3NcIjtcbmltcG9ydCB7IEVjMkluc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lYzJcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGFcIjtcbmltcG9ydCB7IHR5cGUgU2VjcmV0SW1wb3J0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc2VjcmV0c1wiO1xuXG5leHBvcnQgdHlwZSBDb21wdXRlVHlwZSA9IFwiZWNzXCIgfCBcImVjMlwiIHwgXCJsYW1iZGFcIjtcblxuLy8gUmUtZXhwb3J0IGZyb20gZWNzLnRzIHRvIG1haW50YWluIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGhcbmV4cG9ydCB0eXBlIHsgRWNzQ2FwYWNpdHlQcm92aWRlciwgRWMyQ2FwYWNpdHlDb25maWcgfTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZvciBlYWNoIGNvbXB1dGUgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IHBvcnQgZm9yIHRoZSBjb21wdXRlIHR5cGUuIEVDUzogODAsIEVDMjogMjIsIExhbWJkYTogMCAobm8gcG9ydCkgKi9cbiAgZGVmYXVsdFBvcnQ6IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgc2NhbGluZyBsaW1pdHMgKi9cbiAgZGVmYXVsdFNjYWxpbmc6IHtcbiAgICBtaW5DYXBhY2l0eTogbnVtYmVyO1xuICAgIG1heENhcGFjaXR5OiBudW1iZXI7XG4gIH07XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHN1cHBvcnRzIHNlY3VyaXR5IGdyb3VwIGNvbm5lY3Rpb25zICovXG4gIHN1cHBvcnRzQ29ubmVjdGlvbnM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHJlcXVpcmVzIGEgVlBDICovXG4gIHJlcXVpcmVzVnBjOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQ09NUFVURV9UWVBFX0NPTkZJRzogUmVjb3JkPENvbXB1dGVUeXBlLCBDb21wdXRlVHlwZUNvbmZpZz4gPSB7XG4gIGVjczoge1xuICAgIGRlZmF1bHRQb3J0OiA4MCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDUgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGVjMjoge1xuICAgIGRlZmF1bHRQb3J0OiAyMixcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDMgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGxhbWJkYToge1xuICAgIGRlZmF1bHRQb3J0OiAwLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAwLCBtYXhDYXBhY2l0eTogMTAwIH0sXG4gICAgc3VwcG9ydHNDb25uZWN0aW9uczogZmFsc2UsXG4gICAgcmVxdWlyZXNWcGM6IGZhbHNlXG4gIH1cbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgRUNTIGNhcGFjaXR5IHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdGhpcyB1c2VzIFNwb3QgcHJpY2luZyAqL1xuICB1c2VzU3BvdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBydW5zIG9uIEVDMiBpbnN0YW5jZXMgKHZzIHNlcnZlcmxlc3MgRmFyZ2F0ZSkgKi9cbiAgdXNlc0VjMkluc3RhbmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEVDU19DQVBBQ0lUWV9QUk9WSURFUl9DT05GSUc6IFJlY29yZDxcbiAgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZ1xuPiA9IHtcbiAgRkFSR0FURToge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBGQVJHQVRFX1NQT1Q6IHtcbiAgICB1c2VzU3BvdDogdHJ1ZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBFQzI6IHtcbiAgICB1c2VzU3BvdDogZmFsc2UsXG4gICAgdXNlc0VjMkluc3RhbmNlczogdHJ1ZVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZVR5cGVDb25maWcodHlwZTogQ29tcHV0ZVR5cGUpOiBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIHJldHVybiBDT01QVVRFX1RZUEVfQ09ORklHW3R5cGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyhcbiAgcHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXJcbik6IEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICByZXR1cm4gRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJR1twcm92aWRlcl07XG59XG5cbi8vIFJlLWV4cG9ydCBMYW1iZGEgdHlwZXMgZnJvbSBDREsgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7XG4gIEh0dHBNZXRob2QsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgY29udGFpbmVyIGluIGFuIEVDUyB0YXNrLlxuICpcbiAqIEZvciBzaW5nbGUtY29udGFpbmVyIHNlcnZpY2VzLCBgbmFtZWAgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIGAke3NlcnZpY2VOYW1lfUNvbnRhaW5lcmAuXG4gKiBGb3IgbXVsdGktY29udGFpbmVyIHRhc2tzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBgcG9ydGAgaXMgdGhlICoqcHJpbWFyeSBjb250YWluZXIqKlxuICogdGhhdCByZWNlaXZlcyBsb2FkIGJhbGFuY2VyIHRyYWZmaWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBjb250YWluZXIgKG5hbWUgYXV0by1nZW5lcmF0ZWQpXG4gKiBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLWNvbnRhaW5lciB3aXRoIHNpZGVjYXJzXG4gKiBjb250YWluZXJzOiBbXG4gKiAgIHsgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9LCAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeSAtIHJlY2VpdmVzIEFMQiB0cmFmZmljXG4gKiAgIHsgbmFtZTogXCJkYXRhZG9nXCIsIGltYWdlOiBcImRhdGFkb2cvYWdlbnRcIiB9ICAgICAvLyBTaWRlY2FyIC0gbW9uaXRvcmluZ1xuICogXVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NvbnRhaW5lckNvbmZpZyB7XG4gIC8qKiBDb250YWluZXIgbmFtZS4gT3B0aW9uYWwgZm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250YWluZXIgaW1hZ2UuIE9wdGlvbnM6XG4gICAqIC0gT21pdDogVXNlcyBhcHAncyBkZWZhdWx0IEVDUiByZXBvc2l0b3J5IChwcmltYXJ5IGNvbnRhaW5lciBvbmx5KVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuICAvKipcbiAgICogUG9ydCB0aGUgY29udGFpbmVyIGxpc3RlbnMgb24uXG4gICAqIFRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnQgYmVjb21lcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gICAqIGFuZCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFNlY3JldHMgaW1wb3J0ZWQgZnJvbSBvdGhlciByZXNvdXJjZXMgKEFXUyBTZWNyZXRzIE1hbmFnZXIpICovXG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgc2VydmljZSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgZnJvbSBhcHAvY2x1c3Rlci9zZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTZWNyZXRzIGF0IC9teWFwcC9hcGktY2x1c3Rlci91c2Vycy9BUElfS0VZIGFuZCAvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnMvREJfUEFTU1dPUkRcbiAgICogc3NtU2VjcmV0czogW1wiQVBJX0tFWVwiLCBcIkRCX1BBU1NXT1JEXCJdXG4gICAqL1xuICBzc21TZWNyZXRzPzogc3RyaW5nW107XG4gIC8qKiBDb21tYW5kIHRvIHJ1biBpbiB0aGUgY29udGFpbmVyICovXG4gIGNvbW1hbmQ/OiBzdHJpbmdbXTtcbiAgLyoqIEVudHJ5IHBvaW50IGZvciB0aGUgY29udGFpbmVyICovXG4gIGVudHJ5UG9pbnQ/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgZXNzZW50aWFsLlxuICAgKiBJZiBhbiBlc3NlbnRpYWwgY29udGFpbmVyIHN0b3BzLCBhbGwgY29udGFpbmVycyBpbiB0aGUgdGFzayBzdG9wLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogRUNTIHNjYWxpbmcgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICogLSBgeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDEwIH1gOiBjdXN0b20gc2NhbGluZ1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzU2NhbGluZ0NvbmZpZyB7XG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgc2NhbGluZ1R5cGU/OiBTY2FsaW5nVHlwZTtcbn1cblxuLyoqXG4gKiBDbHVzdGVyLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDbHVzdGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERvbWFpbiBmb3IgSFRUUFMgYWNjZXNzLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBETlMgKCouZWxiLmFtYXpvbmF3cy5jb20pXG4gICAqIC0gU3BlY2lmaWVkOiBDcmVhdGVzIEFDTSBjZXJ0aWZpY2F0ZSArIFJvdXRlNTMgRE5TIEEgcmVjb3JkXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0IG9yIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICogLSBmYWxzZTogTm8gQUxCIChmb3Igd29ya2Vycy9iYWNrZ3JvdW5kIHByb2Nlc3NvcnMpXG4gICAqL1xuICBsb2FkQmFsYW5jZXI/OiBmYWxzZSB8IFwicHVibGljXCIgfCBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkaXJlY3QgRUMyIGFjY2VzcyB3aXRob3V0IEFMQi5cbiAgICogVXNlcyBob3N0IG5ldHdvcmsgbW9kZSBmb3IgcHJlZGljdGFibGUgcG9ydHMuXG4gICAqIEFjY2VzcyB2aWEgRUMyIHB1YmxpYyBJUCBhdCBjb250YWluZXIgcG9ydC5cbiAgICovXG4gIGRpcmVjdEFjY2Vzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VkIGRvbWFpbiBjb25maWd1cmF0aW9uIGZvciByb3V0aW5nIHBvbGljaWVzIChsYXRlbmN5LCB3ZWlnaHRlZCwgZ2VvKS5cbiAgICogT25seSB1c2VkIHdoZW4gZG9tYWluIGlzIHNwZWNpZmllZC5cbiAgICogQWxsb3dzIGZvciBtdWx0aS1yZWdpb24gZGVwbG95bWVudHMgd2l0aCBhZHZhbmNlZCBETlMgcm91dGluZy5cbiAgICovXG4gIGRvbWFpbkNvbmZpZz86IERvbWFpbkNvbmZpZztcbn1cblxuLyoqXG4gKiBSb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIHBhdGgvaG9zdC1iYXNlZCByb3V0aW5nIG9uIHRoZSBBTEIuXG4gKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gKiBPcHRpb25hbCBmb3Igc2luZ2xlIHNlcnZpY2UgKGdldHMgYWxsIHRyYWZmaWMgYXV0b21hdGljYWxseSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzUm91dGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBQYXRoIHBhdHRlcm4gZm9yIHJvdXRpbmcgKGUuZy4sIFwiL2FwaS8qXCIsIFwiL3VzZXJzLypcIikuXG4gICAqIFVzZXMgQUxCIHBhdGgtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvc3QgaGVhZGVyIGZvciByb3V0aW5nIChlLmcuLCBcImFwaS5leGFtcGxlLmNvbVwiKS5cbiAgICogVXNlcyBBTEIgaG9zdC1iYXNlZCByb3V0aW5nLlxuICAgKi9cbiAgaG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgZm9yIHRoaXMgcm91dGluZyBydWxlICgxLTUwMDAwKS5cbiAgICogTG93ZXIgbnVtYmVyID0gaGlnaGVyIHByaW9yaXR5LlxuICAgKiBBdXRvLWFzc2lnbmVkIGlmIG9taXR0ZWQuXG4gICAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIHBhdGggZm9yIHRoaXMgc2VydmljZSdzIHRhcmdldCBncm91cC5cbiAgICogRGVmYXVsdDogXCIvXCJcbiAgICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZyBjb25maWcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbXBsZSBzZXJ2aWNlXG4gKiB7IG5hbWU6IFwiYXBpXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggcm91dGluZyAoZm9yIG11bHRpLXNlcnZpY2UgY2x1c3RlcnMpXG4gKiB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIsIHByaW9yaXR5OiAxMDAgfSB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNlcnZpY2Ugd2l0aCBzaWRlY2Fyc1xuICoge1xuICogICBuYW1lOiBcImFwaVwiLFxuICogICBjb250YWluZXJzOiBbXG4gKiAgICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sXG4gKiAgICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH1cbiAqICAgXVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UgKGFwcGxpZXMgdG8gZmlyc3QgY29udGFpbmVyIHdpdGhvdXQgZXhwbGljaXQgaW1hZ2UpLlxuICAgKiAtIE9taXQ6IFVzZXMgYXBwJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbihzKSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBGb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcywgY29udGFpbmVyIG5hbWUgaXMgb3B0aW9uYWwgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKiBGb3IgbXVsdGktY29udGFpbmVyIHNlcnZpY2VzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0IGlzIHRoZSBwcmltYXJ5IGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnRhaW5lcnM/OiBFY3NDb250YWluZXJDb25maWdbXTtcblxuICAvKipcbiAgICogUm91dGluZyBydWxlcyBmb3IgdGhpcyBzZXJ2aWNlIG9uIHRoZSBjbHVzdGVyJ3MgQUxCLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gICAqIE9wdGlvbmFsIGZvciBzaW5nbGUgc2VydmljZSAoZ2V0cyAvKiBhdXRvbWF0aWNhbGx5KS5cbiAgICovXG4gIHJvdXRpbmc/OiBFY3NSb3V0aW5nQ29uZmlnO1xuXG4gIC8qKiBDUFUgdW5pdHMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICgyNTYtNDA5NikgKi9cbiAgY3B1PzogbnVtYmVyO1xuXG4gIC8qKiBNZW1vcnkgaW4gTWlCIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrcyAoNTEyLTMwNzIwKSAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcblxuICAvKiogRGVzaXJlZCBudW1iZXIgb2YgdGFza3MuIERlZmF1bHQ6IDIgKi9cbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FsaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gICAqIC0gZmFsc2U6IGRpc2FibGVkXG4gICAqL1xuICBzY2FsaW5nPzogRWNzU2NhbGluZ0NvbmZpZyB8IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgZm9yIGJ1aWxkaW5nIHRoaXMgc2VydmljZSdzIGltYWdlLlxuICAgKiBNZXRhZGF0YSBmb3IgQ0xJIGJ1aWxkIHByb2Nlc3MsIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgZG9ja2VyZmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY2tlciBidWlsZCB0YXJnZXQgc3RhZ2UgZm9yIG11bHRpLXN0YWdlIERvY2tlcmZpbGVzLlxuICAgKiBNZXRhZGF0YSBmb3IgQ0xJIGJ1aWxkIHByb2Nlc3MsIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBCdWlsZCBcImFwaVwiIHN0YWdlIGZyb20gRG9ja2VyZmlsZVxuICAgKiBkb2NrZXJUYXJnZXQ6IFwiYXBpXCJcbiAgICovXG4gIGRvY2tlclRhcmdldD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBpbmxpbmUgcG9saWNpZXMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2sgcm9sZS5cbiAgICogQWRkZWQgb24gdG9wIG9mIHRoZSBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zLlxuICAgKiBVc2UgZm9yIHNlcnZpY2Utc3BlY2lmaWMgQVdTIHBlcm1pc3Npb25zIChTMywgRHluYW1vREIsIFNRUywgZXRjLikuXG4gICAqL1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzogUmVjb3JkPHN0cmluZywgUG9saWN5RG9jdW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG1hbmFnZWQgcG9saWNpZXMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2sgcm9sZS5cbiAgICogQWRkZWQgb24gdG9wIG9mIHRoZSBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhpcyBzZXJ2aWNlIG5lZWRzIHRvIGNvbm5lY3QgdG8gKGUuZy4sIGRhdGFiYXNlcykuXG4gICAqIENyZWF0ZXMgc2VjdXJpdHkgZ3JvdXAgcnVsZXMgdG8gYWxsb3cgdHJhZmZpYyBmcm9tIHRoaXMgc2VydmljZS5cbiAgICogRm9sbG93cyBsZWFzdC1wcml2aWxlZ2UgLSBvbmx5IHRoaXMgc2VydmljZSBnZXRzIGFjY2Vzcywgbm90IGFsbCBzZXJ2aWNlcyBpbiB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gT25seSBiYWNrZW5kIHNlcnZpY2UgY29ubmVjdHMgdG8gZGF0YWJhc2VcbiAgICogc2VydmljZXM6IFtcbiAgICogICB7IG5hbWU6IFwiZnJvbnRlbmRcIiB9LFxuICAgKiAgIHsgbmFtZTogXCJiYWNrZW5kXCIsIGNvbm5lY3Rpb25zOiBbYXBwRGF0YWJhc2VdIH1cbiAgICogXVxuICAgKi9cbiAgY29ubmVjdGlvbnM/OiBJQ29ubmVjdGFibGVbXTtcblxuICAvKipcbiAgICogQ2FwYWNpdHkgcHJvdmlkZXIgZm9yIHRoaXMgc2VydmljZS4gUkVRVUlSRUQuXG4gICAqIEVhY2ggc2VydmljZSBzcGVjaWZpZXMgaXRzIG93biBjYXBhY2l0eSBwcm92aWRlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTWl4ZWQgRkFSR0FURSBhbmQgRUMyIHNlcnZpY2VzIGluIHNhbWUgY2x1c3RlclxuICAgKiB7XG4gICAqICAgc2VydmljZXM6IFtcbiAgICogICAgIHsgbmFtZTogXCJhcGlcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJGQVJHQVRFXCIgfSxcbiAgICogICAgIHsgbmFtZTogXCJ3b3JrZXJcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJFQzJcIiwgZWMyQ29uZmlnOiB7IGluc3RhbmNlVHlwZTogXCJ0My5taWNyb1wiIH0gfVxuICAgKiAgIF1cbiAgICogfVxuICAgKi9cbiAgY2FwYWNpdHlQcm92aWRlcjogRWNzQ2FwYWNpdHlQcm92aWRlcjtcblxuICAvKipcbiAgICogRUMyIGNhcGFjaXR5IGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2VydmljZS5cbiAgICogT25seSB1c2VkIHdoZW4gc2VydmljZSBjYXBhY2l0eVByb3ZpZGVyIGlzIFwiRUMyXCIuXG4gICAqIFNlcnZpY2VzIHdpdGggbWF0Y2hpbmcgZWMyQ29uZmlnIHNoYXJlIGFuIEFTRyBmb3IgZWZmaWNpZW5jeS5cbiAgICovXG4gIGVjMkNvbmZpZz86IEVjMkNhcGFjaXR5Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBTU00gUGFyYW1ldGVyIFN0b3JlIHBhdGggZm9yIHNlY3JldHMuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHNlY3JldHMgYXJlIGZldGNoZWQgZnJvbSAvPGFwcD4vPGNsdXN0ZXI+LzxzZXJ2aWNlPi5cbiAgICogVXNlIHRoaXMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29udmVudGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gT3ZlcnJpZGUgZGVmYXVsdCBwYXRoXG4gICAqIHNzbVNlY3JldHNQYXRoOiBcIi9jdXN0b20vcGF0aC90by9zZWNyZXRzXCJcbiAgICovXG4gIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNTSCBhY2Nlc3MgY29uZmlndXJhdGlvbiBmb3IgRUMyIGluc3RhbmNlcy5cbiAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBhdXRvLWdlbmVyYXRlZCBrZXlcbiAqIC0gYHsga2V5TmFtZTogXCJteS1rZXlcIiB9YDogZW5hYmxlZCB3aXRoIGV4aXN0aW5nIGtleVxuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NoQ29uZmlnIHtcbiAgLyoqIFNTSCBrZXkgcGFpciBuYW1lICovXG4gIGtleU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBBbGxvd2VkIENJRFIgYmxvY2tzIGZvciBTU0ggYWNjZXNzICovXG4gIGFsbG93ZWRDaWRycz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIExhbWJkYSBmdW5jdGlvbiBVUkwgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBJQU0gYXV0aFxuICogLSBgeyBhdXRoVHlwZTogXCJOT05FXCIsIGNvcnM6IHsuLi59IH1gOiBwdWJsaWMgd2l0aCBDT1JTXG4gKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblVybENvbmZpZyB7XG4gIC8qKiBBdXRoZW50aWNhdGlvbiB0eXBlLiBEZWZhdWx0OiBBV1NfSUFNICovXG4gIGF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgLyoqIENPUlMgY29uZmlndXJhdGlvbiAqL1xuICBjb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcbn1cblxuaW50ZXJmYWNlIEJhc2VDb21wdXRlUHJvcHMge1xuICB2cGM/OiBJVnBjO1xufVxuXG4vKipcbiAqIEVDUyBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKiBDcmVhdGVzIGFuIEVDUyBjbHVzdGVyIHdpdGggb25lIG9yIG1vcmUgc2VydmljZXMgc2hhcmluZyBhIGxvYWQgYmFsYW5jZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBzZXJ2aWNlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldlYkFwcFwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwcC5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcIndlYlwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1dXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXNlcnZpY2UgY2x1c3RlciB3aXRoIHJvdXRpbmdcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpQ2x1c3RlclwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwaS5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJbnRlcm5hbCB3b3JrZXJzIChubyBBTEIpXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlcnNcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwicHJvY2Vzc29yXCIgfSwgeyBuYW1lOiBcImVtYWlsZXJcIiB9XVxuICogfSkpO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NvbXB1dGVQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImVjc1wiO1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBuYW1lIGZvciBTU00gc2VjcmV0cyBuYW1lc3BhY2UuXG4gICAqIFdoZW4gY29udGFpbmVycyB1c2Ugc3NtU2VjcmV0cywgdGhlIHBhdGggaXMgZGVyaXZlZCBhczogLzxhcHBOYW1lPi88Y2x1c3Rlck5hbWU+LzxzZXJ2aWNlTmFtZT5cbiAgICogQXV0by1kZXJpdmVkIGZyb20gQXBwLmdldE5hbWUoKSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgYXBwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQ2x1c3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAgICogLSBPbWl0OiBBTEIgY3JlYXRlZCB3aXRoIGRlZmF1bHQgc2V0dGluZ3NcbiAgICogLSBgeyBkb21haW46IFwiLi4uXCIgfWA6IEFMQiB3aXRoIEhUVFBTICsgRE5TXG4gICAqIC0gYHsgbG9hZEJhbGFuY2VyOiBmYWxzZSB9YDogTm8gQUxCIChpbnRlcm5hbCB3b3JrZXJzKVxuICAgKi9cbiAgY2x1c3Rlcj86IEVjc0NsdXN0ZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIFNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAgICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIHNjYWxpbmcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gICAqIEVhY2ggc2VydmljZSBNVVNUIHNwZWNpZnkgaXRzIG93biBjYXBhY2l0eVByb3ZpZGVyLlxuICAgKiBBbGwgc2VydmljZXMgc2hhcmUgdGhlIGNsdXN0ZXIncyBBTEIgKHVubGVzcyBkaXNhYmxlZCkuXG4gICAqL1xuICBzZXJ2aWNlczogRWNzU2VydmljZUNvbmZpZ1tdO1xuXG4gIC8qKlxuICAgKiBFQ1IgcmVwb3NpdG9yeSBmb3IgYWxsIHNlcnZpY2VzIChkZWZhdWx0IGltYWdlKS5cbiAgICogSW5kaXZpZHVhbCBzZXJ2aWNlcyBjYW4gb3ZlcnJpZGUgd2l0aCB0aGVpciBvd24gYGltYWdlYCBwcm9wZXJ0eS5cbiAgICovXG4gIGVjclJlcG9zaXRvcnk/OiBSZXBvc2l0b3J5IHwgUmVwb3NpdG9yeUltYWdlO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgZm9yIGJ1aWxkaW5nIGN1c3RvbSBpbWFnZS5cbiAgICogTm90ZTogVGhpcyBpcyBtZXRhZGF0YSBmb3IgdGhlIENMSSBidWlsZCBwcm9jZXNzLFxuICAgKiBub3QgdXNlZCBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAgICovXG4gIGRvY2tlcmZpbGVQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVjMkNvbXB1dGVQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImVjMlwiO1xuXG4gIC8qKiBFQzIgaW5zdGFuY2UgdHlwZS4gRGVmYXVsdDogXCJ0My5taWNyb1wiICovXG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogU1NIIGFjY2VzcyBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICAgKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICAgKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICovXG4gIHNzaD86IFNzaENvbmZpZyB8IGZhbHNlO1xuICAvKiogVXNlciBkYXRhIHNjcmlwdCAqL1xuICB1c2VyRGF0YT86IFVzZXJEYXRhO1xuICAvKiogTWFjaGluZSBpbWFnZSAoQU1JKSAqL1xuICBtYWNoaW5lSW1hZ2U/OiBJTWFjaGluZUltYWdlO1xuICAvKiogTWluaW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAxICovXG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAxICovXG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJhc2UgTGFtYmRhIGNvbmZpZ3VyYXRpb24gc2hhcmVkIGJ5IGJvdGggY29udGFpbmVyIGFuZCBjb2RlIGRlcGxveW1lbnRzLlxuICovXG5pbnRlcmZhY2UgQmFzZUxhbWJkYVByb3BzIGV4dGVuZHMgQmFzZUNvbXB1dGVQcm9wcyB7XG4gIHR5cGU6IFwibGFtYmRhXCI7XG4gIC8qKiBUaW1lb3V0IGluIHNlY29uZHMuIERlZmF1bHQ6IDMgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1lbW9yeSBzaXplIGluIE1CLiBEZWZhdWx0OiAxMjggKi9cbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgZXBoZW1lcmFsU3RvcmFnZVNpemU/OiBudW1iZXI7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gZGVzY3JpcHRpb24gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBkZXNjcmlwdGlvbiAqL1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8gSW5saW5lIHBvbGljaWVzIC0gcm91dGVkIHRvIGV4ZWN1dGlvbiByb2xlIGZvciBFQ1MsIHRhc2sgcm9sZSBmb3IgTGFtYmRhXG4gIC8qKiBJbmxpbmUgSUFNIHBvbGljeSBzdGF0ZW1lbnRzICovXG4gIGlubGluZVBvbGljeT86IFBvbGljeVN0YXRlbWVudFtdO1xuICAvKipcbiAgICogRnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIElBTSBhdXRoXG4gICAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiIH1gOiBwdWJsaWMgYWNjZXNzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb25Vcmw/OiBGdW5jdGlvblVybENvbmZpZyB8IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKiogQ29udGFpbmVyIHNlY3JldHMgaW1wb3J0IChrZXk6IGVudiB2YXIsIHZhbHVlOiBTZWNyZXRJbXBvcnQpICovXG4gIGNvbnRhaW5lclNlY3JldHNJbXBvcnQ/OiB7XG4gICAgW2tleTogc3RyaW5nXTogU2VjcmV0SW1wb3J0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhpcyBMYW1iZGEgbmVlZHMgdG8gY29ubmVjdCB0byAoZS5nLiwgZGF0YWJhc2VzKS5cbiAgICogQ3JlYXRlcyBzZWN1cml0eSBncm91cCBydWxlcyB0byBhbGxvdyB0cmFmZmljIGZyb20gdGhpcyBMYW1iZGEuXG4gICAqL1xuICBjb25uZWN0aW9ucz86IElDb25uZWN0YWJsZVtdO1xufVxuXG4vKipcbiAqIENvbnRhaW5lci1iYXNlZCBMYW1iZGEgdXNpbmcgRUNSIGltYWdlLlxuICpcbiAqIFVzZXMgRG9ja2VyIGltYWdlIGZyb20gRUNSIHJlcG9zaXRvcnkuIEhhbmRsZXIgYW5kIHJ1bnRpbWUgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IHNldCB0byBGUk9NX0lNQUdFLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkltYWdlTGFtYmRhXCIsIHtcbiAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAqICAgZGVwbG95bWVudDogXCJjb250YWluZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29udGFpbmVyLWJhc2VkIGRlcGxveW1lbnQgdXNpbmcgRUNSIGltYWdlICovXG4gIGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCI7XG4gIC8qKiBFQ1IgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBMYW1iZGEgY29udGFpbmVyIGltYWdlICovXG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG59XG5cbi8qKlxuICogQ29kZS1iYXNlZCBMYW1iZGEgdXNpbmcgaW5saW5lIGNvZGUgb3IgUzMuXG4gKlxuICogVXNlcyB0cmFkaXRpb25hbCBMYW1iZGEgZGVwbG95bWVudCB3aXRoIGNvZGUsIGhhbmRsZXIsIGFuZCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkNvZGVMYW1iZGFcIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvZGVcIixcbiAqICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKSxcbiAqICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gKiAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1hcbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29kZS1iYXNlZCBkZXBsb3ltZW50ICovXG4gIGRlcGxveW1lbnQ6IFwiY29kZVwiO1xuICAvKiogTGFtYmRhIGNvZGUgKGZyb20gYXNzZXQsIFMzLCBvciBpbmxpbmUpICovXG4gIGNvZGU6IENvZGU7XG4gIC8qKiBIYW5kbGVyIGZ1bmN0aW9uLiBEZWZhdWx0OiBcImluZGV4LmhhbmRsZXJcIiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogTGFtYmRhIHJ1bnRpbWUuIERlZmF1bHQ6IE5PREVKU18xOF9YICovXG4gIHJ1bnRpbWU/OiBSdW50aW1lO1xufVxuXG4vKipcbiAqIExhbWJkYSBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBlbnN1cmluZyB0eXBlLXNhZmUgTGFtYmRhIGNvbmZpZ3VyYXRpb246XG4gKiAtIGBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiYCByZXF1aXJlcyBgZWNyUmVwb3NpdG9yeWBcbiAqIC0gYGRlcGxveW1lbnQ6IFwiY29kZVwiYCByZXF1aXJlcyBgY29kZWAgYW5kIGFsbG93cyBgaGFuZGxlcmAvYHJ1bnRpbWVgXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnRhaW5lci1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb250YWluZXJcIiwgZWNyUmVwb3NpdG9yeTogZWNyIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29kZS1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb2RlXCIsIGNvZGU6IENvZGUuZnJvbUFzc2V0KFwiLi9sYW1iZGFcIikgfVxuICovXG5leHBvcnQgdHlwZSBMYW1iZGFDb21wdXRlUHJvcHMgPSBDb250YWluZXJMYW1iZGFQcm9wcyB8IENvZGVMYW1iZGFQcm9wcztcblxuZXhwb3J0IHR5cGUgSUNvbXB1dGVQcm9wcyA9XG4gIHwgRWNzQ29tcHV0ZVByb3BzXG4gIHwgRWMyQ29tcHV0ZVByb3BzXG4gIHwgTGFtYmRhQ29tcHV0ZVByb3BzO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBjb21wdXRlIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBpZ25vcmVkIG9yIG1pc2NvbmZpZ3VyZWQgb3B0aW9ucy5cbiAqIFRoZXNlIGNoZWNrcyBoZWxwIGNhdGNoIGlzc3VlcyB3aGVuIHByb3BzIGNvbWUgZnJvbSBkeW5hbWljIHNvdXJjZXMgd2hlcmVcbiAqIFR5cGVTY3JpcHQncyBjb21waWxlLXRpbWUgY2hlY2tzIG1heSBub3QgYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHV0ZVByb3BzKHByb3BzOiBJQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIGNvbnN0IHByb3BzQW55ID0gcHJvcHMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBFQ1Mtc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tRUNTIGNvbXB1dGVcbiAgaWYgKHByb3BzLnR5cGUgIT09IFwiZWNzXCIpIHtcbiAgICBpZiAoXG4gICAgICBcImNhcGFjaXR5UHJvdmlkZXJcIiBpbiBwcm9wc0FueSAmJlxuICAgICAgcHJvcHNBbnkuY2FwYWNpdHlQcm92aWRlciAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdjYXBhY2l0eVByb3ZpZGVyJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiQ2FwYWNpdHkgcHJvdmlkZXIgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUNTIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcImVjMkNvbmZpZ1wiIGluIHByb3BzQW55ICYmIHByb3BzQW55LmVjMkNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdlYzJDb25maWcnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUNTIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcInNlcnZpY2VzXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkuc2VydmljZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnc2VydmljZXMnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJTZXJ2aWNlcyBjb25maWd1cmF0aW9uIG9ubHkgYXBwbGllcyB0byBFQ1MgY29tcHV0ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwiY2x1c3RlclwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LmNsdXN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnY2x1c3RlcicgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIkNsdXN0ZXIgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUNTIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gTGFtYmRhLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUxhbWJkYSBjb21wdXRlXG4gIGlmIChwcm9wcy50eXBlICE9PSBcImxhbWJkYVwiKSB7XG4gICAgaWYgKFwiZnVuY3Rpb25VcmxcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5mdW5jdGlvblVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdmdW5jdGlvblVybCcgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIkZ1bmN0aW9uIFVSTCBjb25maWd1cmF0aW9uIG9ubHkgYXBwbGllcyB0byBMYW1iZGEgY29tcHV0ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwiaGFuZGxlclwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LmhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnaGFuZGxlcicgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIkhhbmRsZXIgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gTGFtYmRhIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcInJ1bnRpbWVcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5ydW50aW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ3J1bnRpbWUnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJSdW50aW1lIGNvbmZpZ3VyYXRpb24gb25seSBhcHBsaWVzIHRvIExhbWJkYSBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVDMi1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1FQzIgY29tcHV0ZVxuICBpZiAocHJvcHMudHlwZSAhPT0gXCJlYzJcIikge1xuICAgIGlmIChcInNzaFwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LnNzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdzc2gnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJTU0ggY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUMyIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcInVzZXJEYXRhXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkudXNlckRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAndXNlckRhdGEnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJVc2VyIGRhdGEgb25seSBhcHBsaWVzIHRvIEVDMiBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXCJtYWNoaW5lSW1hZ2VcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5tYWNoaW5lSW1hZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnbWFjaGluZUltYWdlJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiTWFjaGluZSBpbWFnZSBvbmx5IGFwcGxpZXMgdG8gRUMyIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRUNTLXNwZWNpZmljIHZhbGlkYXRpb25cbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiZWNzXCIpIHtcbiAgICB2YWxpZGF0ZUVjc1Byb3BzKHByb3BzIGFzIEVjc0NvbXB1dGVQcm9wcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgRUNTLXNwZWNpZmljIHByb3BzLlxuICogRXh0cmFjdGVkIGZvciBjbGFyaXR5IGFuZCBkZXRhaWwgcGFyaXR5IHdpdGggZGF0YWJhc2UvbmV0d29yayBwYXR0ZXJucy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFY3NQcm9wcyhwcm9wczogRWNzQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIHNlcnZpY2VzIGFycmF5IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XG4gIGlmICghcHJvcHMuc2VydmljZXMgfHwgcHJvcHMuc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdCBsZWFzdCBvbmUgc2VydmljZSBtdXN0IGJlIHNwZWNpZmllZCBpbiAnc2VydmljZXMnIGFycmF5LlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHVuaXF1ZSBzZXJ2aWNlIG5hbWVzXG4gIGNvbnN0IHNlcnZpY2VOYW1lcyA9IHByb3BzLnNlcnZpY2VzLm1hcCgocykgPT4gcy5uYW1lKTtcbiAgY29uc3QgZHVwbGljYXRlTmFtZXMgPSBzZXJ2aWNlTmFtZXMuZmlsdGVyKFxuICAgIChuYW1lLCBpbmRleCkgPT4gc2VydmljZU5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICk7XG4gIGlmIChkdXBsaWNhdGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYER1cGxpY2F0ZSBzZXJ2aWNlIG5hbWVzOiAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZU5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc2VydmljZSBuYW1lIGZvcm1hdFxuICBjb25zdCBpbnZhbGlkTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoXG4gICAgKHMpID0+ICEvXlthLXpBLVpdW2EtekEtWjAtOS1dKiQvLnRlc3Qocy5uYW1lKVxuICApO1xuICBpZiAoaW52YWxpZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzZXJ2aWNlIG5hbWVzOiAke2ludmFsaWROYW1lcy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgIFwiU2VydmljZSBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVucy5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSByb3V0aW5nIHdoZW4gbXVsdGlwbGUgc2VydmljZXMgaGF2ZSBwb3J0c1xuICBjb25zdCBzZXJ2aWNlc1dpdGhQb3J0cyA9IHByb3BzLnNlcnZpY2VzLmZpbHRlcigocykgPT5cbiAgICBzLmNvbnRhaW5lcnM/LnNvbWUoKGMpID0+IGMucG9ydClcbiAgKTtcblxuICBpZiAoc2VydmljZXNXaXRoUG9ydHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG1pc3NpbmdSb3V0aW5nID0gc2VydmljZXNXaXRoUG9ydHMuZmlsdGVyKFxuICAgICAgKHMpID0+ICFzLnJvdXRpbmc/LnBhdGggJiYgIXMucm91dGluZz8uaG9zdFxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNlcnZpY2VzIHdpdGggcG9ydHMgcmVxdWlyZSByb3V0aW5nIGNvbmZpZyB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzOiBgICtcbiAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSBvciByb3V0aW5nOiB7IGhvc3Q6ICcuLi4nIH0gdG8gZWFjaCBzZXJ2aWNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgaWYgKHNlcnZpY2UuY29udGFpbmVycyAmJiBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2UgKG9ubHkgbmFtZWQgY29udGFpbmVycylcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBEdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzOiBgICtcbiAgICAgICAgICAgIGAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiICYmICFzZXJ2aWNlLmVjMkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlciBidXQgbm8gZWMyQ29uZmlnIGlzIGRlZmluZWQuIGAgK1xuICAgICAgICAgIFwiUHJvdmlkZSBlYzJDb25maWcgb24gdGhlIHNlcnZpY2UuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiBzZXJ2aWNlIGVjMkNvbmZpZyBpcyBkZWZpbmVkIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCBFQzJcbiAgICBpZiAoc2VydmljZS5lYzJDb25maWcgJiYgc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6IFNlcnZpY2UgJyR7c2VydmljZS5uYW1lfScgaGFzIGVjMkNvbmZpZyBidXQgY2FwYWNpdHlQcm92aWRlciBpcyBub3QgJ0VDMicuIGAgK1xuICAgICAgICAgIFwiVGhlIGVjMkNvbmZpZyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGNhcGFjaXR5UHJvdmlkZXIgaXMgc2V0IHRvICdFQzInLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGNvbXB1dGUgcmVzb3VyY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgc2VydmljZSBjbHVzdGVyXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldlYkFwcFwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwcC5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcIndlYlwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1dXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXNlcnZpY2UgY2x1c3RlciB3aXRoIHJvdXRpbmdcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpQ2x1c3RlclwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwaS5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXb3JrZXIgY2x1c3RlciAobm8gQUxCKVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXb3JrZXJzXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH0sXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInByb2Nlc3NvclwiLCBjb250YWluZXJzOiBbeyBjb21tYW5kOiBbXCJub2RlXCIsIFwid29ya2VyLmpzXCJdIH1dIH1cbiAqICAgXVxuICogfSkpO1xuICovXG5leHBvcnQgY2xhc3MgQ29tcHV0ZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICByZXR1cm4gKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KTogQ29tcHV0ZSA9PiB7XG4gICAgICB2YWxpZGF0ZUNvbXB1dGVQcm9wcyhwcm9wcyk7XG5cbiAgICAgIC8vIEF1dG8tZGVyaXZlIGFwcE5hbWUgZnJvbSBBcHAgaW5zdGFuY2UgZm9yIEVDUyBjb21wdXRlXG4gICAgICBsZXQgY29tcHV0ZVByb3BzOiBJQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBhcHAuZ2V0VnBjKCksXG4gICAgICAgICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29tcHV0ZVByb3BzLnR5cGUgPT09IFwiZWNzXCIgJiYgIWNvbXB1dGVQcm9wcy5hcHBOYW1lKSB7XG4gICAgICAgIGNvbXB1dGVQcm9wcyA9IHsgLi4uY29tcHV0ZVByb3BzLCBhcHBOYW1lOiBhcHAuZ2V0TmFtZSgpIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQ29tcHV0ZShzY29wZSwgaWQsIGNvbXB1dGVQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcHV0ZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgc2NvcGU6IENvbnN0cnVjdDtcbiAgcHVibGljIHZwYzogSVZwYztcblxuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgY29tcHV0ZTogRWNzQ2x1c3RlciB8IEVjMkluc3RhbmNlIHwgTGFtYmRhRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICB0aGlzLmFkZENvbXB1dGUocHJvcHMpO1xuICB9XG5cbiAgYWRkQ29tcHV0ZShwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSBcImVjc1wiOlxuICAgICAgICB0aGlzLmFkZEVjc0NvbXB1dGUocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlYzJcIjpcbiAgICAgICAgdGhpcy5hZGRFYzJDb21wdXRlKHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibGFtYmRhXCI6XG4gICAgICAgIHRoaXMuYWRkTGFtYmRhQ29tcHV0ZShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBjaGVjayAtIFR5cGVTY3JpcHQgd2lsbCBlcnJvciBpZiBhIGNhc2UgaXMgbWlzc2luZ1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBjb21wdXRlIHR5cGU6ICR7KF9leGhhdXN0aXZlIGFzIElDb21wdXRlUHJvcHMpLnR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRWMyQ29tcHV0ZShwcm9wczogRWMyQ29tcHV0ZVByb3BzKSB7XG4gICAgY29uc3QgZW5hYmxlU1NIID0gcHJvcHMuc3NoICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuc3NoICE9PSBmYWxzZTtcblxuICAgIGNvbnN0IGVjMlByb3BzID0ge1xuICAgICAgc2VydmljZU5hbWU6IGAke3RoaXMuaWR9U2VydmljZWAsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSB8fCBcInQzLm1pY3JvXCIsXG4gICAgICBlbmFibGVTU0gsXG4gICAgICB1c2VyRGF0YTogcHJvcHMudXNlckRhdGEsXG4gICAgICBtYWNoaW5lSW1hZ2U6IHByb3BzLm1hY2hpbmVJbWFnZSxcbiAgICAgIG1pbkNhcGFjaXR5OiBwcm9wcy5taW5DYXBhY2l0eSB8fCAxLFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5IHx8IDEsXG4gICAgICB2cGM6IHByb3BzLnZwY1xuICAgIH07XG5cbiAgICB0aGlzLmNvbXB1dGUgPSBuZXcgRWMySW5zdGFuY2UodGhpcy5zY29wZSwgYCR7dGhpcy5pZH1FYzJgLCBlYzJQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuY29tcHV0ZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYWRkRWNzQ29tcHV0ZShwcm9wczogRWNzQ29tcHV0ZVByb3BzKSB7XG4gICAgLy8gVHJhbnNmb3JtIEVjc1NlcnZpY2VDb25maWdbXSB0byBFY3NTZXJ2aWNlUHJvcHNbXSBmb3IgRWNzQ2x1c3RlclxuICAgIGNvbnN0IHNlcnZpY2VzOiBFY3NDbHVzdGVyUHJvcHNbXCJzZXJ2aWNlc1wiXSA9IHByb3BzLnNlcnZpY2VzLm1hcChcbiAgICAgIChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIC8vIEJ1aWxkIGNvbnRhaW5lciBjb25maWd1cmF0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlXG4gICAgICAgIGxldCBjb250YWluZXJzOiBFY3NDbHVzdGVyUHJvcHNbXCJzZXJ2aWNlc1wiXVtudW1iZXJdW1wiY29udGFpbmVyc1wiXTtcblxuICAgICAgICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gTWFwIGNvbnRhaW5lcnMsIGF1dG8tZ2VuZXJhdGluZyBuYW1lcyBpZiBub3QgcHJvdmlkZWRcbiAgICAgICAgICBjb250YWluZXJzID0gc2VydmljZS5jb250YWluZXJzLm1hcCgoYywgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBjLm5hbWUgfHwgYCR7c2VydmljZS5uYW1lfUNvbnRhaW5lciR7aW5kZXggPiAwID8gaW5kZXggOiBcIlwifWAsXG4gICAgICAgICAgICBpbWFnZTogYy5pbWFnZSxcbiAgICAgICAgICAgIHBvcnQ6IGMucG9ydCxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBjLmVudmlyb25tZW50LFxuICAgICAgICAgICAgc2VjcmV0c0ltcG9ydDogYy5zZWNyZXRzSW1wb3J0LFxuICAgICAgICAgICAgc3NtU2VjcmV0czogYy5zc21TZWNyZXRzLFxuICAgICAgICAgICAgY29tbWFuZDogYy5jb21tYW5kLFxuICAgICAgICAgICAgZW50cnlQb2ludDogYy5lbnRyeVBvaW50LFxuICAgICAgICAgICAgZXNzZW50aWFsOiBjLmVzc2VudGlhbCxcbiAgICAgICAgICAgIGhlYWx0aENoZWNrOiBjLmhlYWx0aENoZWNrXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERlZmF1bHQgY29udGFpbmVyIChubyBwb3J0ID0gd29ya2VyKVxuICAgICAgICAgIGNvbnRhaW5lcnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBzY2FsaW5nIGNvbmZpZ1xuICAgICAgICBsZXQgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IG1heENhcGFjaXR5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHNlcnZpY2Uuc2NhbGluZyAhPT0gZmFsc2UgJiYgc2VydmljZS5zY2FsaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY2FsaW5nVHlwZSA9IHNlcnZpY2Uuc2NhbGluZy5zY2FsaW5nVHlwZSA/PyBTY2FsaW5nVHlwZS5DUFU7XG4gICAgICAgICAgbWluQ2FwYWNpdHkgPSBzZXJ2aWNlLnNjYWxpbmcubWluQ2FwYWNpdHk7XG4gICAgICAgICAgbWF4Q2FwYWNpdHkgPSBzZXJ2aWNlLnNjYWxpbmcubWF4Q2FwYWNpdHk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZS5zY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBEZWZhdWx0OiBlbmFibGUgc2NhbGluZyB3aXRoIENQVVxuICAgICAgICAgIHNjYWxpbmdUeXBlID0gU2NhbGluZ1R5cGUuQ1BVO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzZXJ2aWNlLm5hbWUsXG4gICAgICAgICAgaW1hZ2U6IHNlcnZpY2UuaW1hZ2UsXG4gICAgICAgICAgY29udGFpbmVycyxcbiAgICAgICAgICBjcHU6IHNlcnZpY2UuY3B1LFxuICAgICAgICAgIG1lbW9yeUxpbWl0TWlCOiBzZXJ2aWNlLm1lbW9yeUxpbWl0TWlCLFxuICAgICAgICAgIGRlc2lyZWRDb3VudDogc2VydmljZS5kZXNpcmVkQ291bnQsXG4gICAgICAgICAgc2NhbGluZ1R5cGUsXG4gICAgICAgICAgbWluQ2FwYWNpdHksXG4gICAgICAgICAgbWF4Q2FwYWNpdHksXG4gICAgICAgICAgcm91dGluZzogc2VydmljZS5yb3V0aW5nLFxuICAgICAgICAgIHRhc2tSb2xlSW5saW5lUG9saWNpZXM6IHNlcnZpY2UudGFza1JvbGVJbmxpbmVQb2xpY2llcyxcbiAgICAgICAgICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llczogc2VydmljZS50YXNrUm9sZU1hbmFnZWRQb2xpY2llcyxcbiAgICAgICAgICBjb25uZWN0aW9uczogc2VydmljZS5jb25uZWN0aW9ucyxcbiAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiBzZXJ2aWNlLmNhcGFjaXR5UHJvdmlkZXIsXG4gICAgICAgICAgZWMyQ29uZmlnOiBzZXJ2aWNlLmVjMkNvbmZpZyxcbiAgICAgICAgICBzc21TZWNyZXRzUGF0aDogc2VydmljZS5zc21TZWNyZXRzUGF0aCxcbiAgICAgICAgICBkb2NrZXJmaWxlUGF0aDogc2VydmljZS5kb2NrZXJmaWxlUGF0aCxcbiAgICAgICAgICBkb2NrZXJUYXJnZXQ6IHNlcnZpY2UuZG9ja2VyVGFyZ2V0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEJ1aWxkIGNsdXN0ZXIgY29uZmlnXG4gICAgY29uc3QgY2x1c3RlcjogRWNzQ2x1c3RlclByb3BzW1wiY2x1c3RlclwiXSA9IHByb3BzLmNsdXN0ZXJcbiAgICAgID8ge1xuICAgICAgICAgIGRvbWFpbjogcHJvcHMuY2x1c3Rlci5kb21haW4sXG4gICAgICAgICAgbG9hZEJhbGFuY2VyOiBwcm9wcy5jbHVzdGVyLmxvYWRCYWxhbmNlcixcbiAgICAgICAgICBkaXJlY3RBY2Nlc3M6IHByb3BzLmNsdXN0ZXIuZGlyZWN0QWNjZXNzLFxuICAgICAgICAgIGRvbWFpbkNvbmZpZzogcHJvcHMuY2x1c3Rlci5kb21haW5Db25maWdcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlY3NQcm9wczogRWNzQ2x1c3RlclByb3BzID0ge1xuICAgICAgY2x1c3Rlck5hbWU6IGAke3RoaXMuaWR9Q2x1c3RlcmAsXG4gICAgICBhcHBOYW1lOiBwcm9wcy5hcHBOYW1lLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBlY3JSZXBvc2l0b3J5OiBwcm9wcy5lY3JSZXBvc2l0b3J5IHx8IFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIsXG4gICAgICBjbHVzdGVyLFxuICAgICAgc2VydmljZXNcbiAgICB9O1xuXG4gICAgdGhpcy5jb21wdXRlID0gbmV3IEVjc0NsdXN0ZXIodGhpcy5zY29wZSwgYCR7dGhpcy5pZH1FY3NgLCBlY3NQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuY29tcHV0ZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYWRkTGFtYmRhQ29tcHV0ZShwcm9wczogTGFtYmRhQ29tcHV0ZVByb3BzKSB7XG4gICAgbGV0IGNvZGU6IENvZGU7XG4gICAgbGV0IGhhbmRsZXI6IHN0cmluZztcbiAgICBsZXQgcnVudGltZTogUnVudGltZTtcblxuICAgIGlmIChwcm9wcy5kZXBsb3ltZW50ID09PSBcImNvbnRhaW5lclwiKSB7XG4gICAgICAvLyBDb250YWluZXItYmFzZWQgTGFtYmRhIHVzaW5nIEVDUlxuICAgICAgaWYgKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICAgIGNvZGUgPSBDb2RlLmZyb21FY3JJbWFnZShwcm9wcy5lY3JSZXBvc2l0b3J5LCB7XG4gICAgICAgICAgdGFnT3JEaWdlc3Q6IFwibGF0ZXN0XCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJlY3JSZXBvc2l0b3J5IG11c3QgYmUgYSBSZXBvc2l0b3J5IGluc3RhbmNlIGZvciBMYW1iZGEgY29tcHV0ZSB0eXBlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udGFpbmVyIExhbWJkYSByZXF1aXJlcyB0aGVzZSBzcGVjaWFsIHZhbHVlc1xuICAgICAgaGFuZGxlciA9IEhhbmRsZXIuRlJPTV9JTUFHRTtcbiAgICAgIHJ1bnRpbWUgPSBSdW50aW1lLkZST01fSU1BR0U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvZGUtYmFzZWQgTGFtYmRhIC0gcHJvcHMuZGVwbG95bWVudCA9PT0gXCJjb2RlXCJcbiAgICAgIGNvZGUgPSBwcm9wcy5jb2RlO1xuICAgICAgaGFuZGxlciA9IHByb3BzLmhhbmRsZXIgfHwgXCJpbmRleC5oYW5kbGVyXCI7XG4gICAgICBydW50aW1lID0gcHJvcHMucnVudGltZSB8fCBSdW50aW1lLk5PREVKU18xOF9YO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgcHJlc2VuY2UtYmFzZWQgZnVuY3Rpb25VcmwgY29uZmlnIHRvIGxlZ2FjeSBib29sZWFuIGZvcm1hdFxuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQ29uZmlnID0gcHJvcHMuZnVuY3Rpb25Vcmw7XG4gICAgY29uc3QgZW5hYmxlRnVuY3Rpb25VcmwgPVxuICAgICAgZnVuY3Rpb25VcmxDb25maWcgIT09IHVuZGVmaW5lZCAmJiBmdW5jdGlvblVybENvbmZpZyAhPT0gZmFsc2U7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxBdXRoVHlwZSA9XG4gICAgICBlbmFibGVGdW5jdGlvblVybCAmJiB0eXBlb2YgZnVuY3Rpb25VcmxDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBmdW5jdGlvblVybENvbmZpZy5hdXRoVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmdW5jdGlvblVybENvcnMgPVxuICAgICAgZW5hYmxlRnVuY3Rpb25VcmwgJiYgdHlwZW9mIGZ1bmN0aW9uVXJsQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gZnVuY3Rpb25VcmxDb25maWcuY29yc1xuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGxhbWJkYVByb3BzID0ge1xuICAgICAgY29kZTogY29kZSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgaGFuZGxlcixcbiAgICAgIHJ1bnRpbWUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogcHJvcHMucm9sZURlc2NyaXB0aW9uLFxuICAgICAgaW5saW5lUG9saWN5OiBwcm9wcy5pbmxpbmVQb2xpY3kgfHwgW10sXG4gICAgICBlbmFibGVGdW5jdGlvblVybCxcbiAgICAgIGZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gICAgICBmdW5jdGlvblVybENvcnMsXG4gICAgICBzY2hlZHVsZUV4cHJlc3Npb246IChwcm9wcyBhcyBhbnkpLnNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZSxcbiAgICAgIGNvbnRhaW5lclNlY3JldHNJbXBvcnQ6IHByb3BzLmNvbnRhaW5lclNlY3JldHNJbXBvcnQsIC8vIFBhc3MgdGhyb3VnaFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50XG4gICAgfTtcblxuICAgIHRoaXMuY29tcHV0ZSA9IG5ldyBMYW1iZGFGdW5jdGlvbihcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBgJHt0aGlzLmlkfUxhbWJkYWAsXG4gICAgICBsYW1iZGFQcm9wc1xuICAgICk7XG5cbiAgICBpZiAocHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29ubiBvZiBwcm9wcy5jb25uZWN0aW9ucykge1xuICAgICAgICB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnMuYWxsb3dUbyhjb25uLCBQb3J0LmFsbFRjcCgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
602
|
+
exports.Ec2Compute = Ec2Compute;
|
|
603
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1S0Esb0RBRUM7QUFFRCxvRUFJQztBQWd2QkQsc0RBbUJDO0FBaUJELG9EQXNCQztBQWVELDBEQXNCQztBQXovQkQsaURBQWlEO0FBUWpELHVEQVNnQztBQUNoQyxpREFNNkI7QUFPN0IsMkNBQXVDO0FBRXZDLDhCQUE4QjtBQUM5Qix3REFTaUM7QUE2NUN4QiwwRkFqNkNQLHNCQUFTLE9BaTZDTztBQUFFLDZGQWg2Q2xCLHlCQUFZLE9BZzZDa0I7QUFBRSxnR0EvNUNoQyw0QkFBZSxPQSs1Q2dDO0FBQUUsNkZBOTVDakQseUJBQVksT0E4NUNpRDtBQTM1Qy9ELHFEQUFzRDtBQUd0RCx5RUFHeUM7QUFNekMseURBTXlDO0FBUWhDLDRGQVpQLGlCQUFXLE9BWU87QUFQcEIseURBQThEO0FBQzlELCtEQUFvRTtBQTBCdkQsUUFBQSxtQkFBbUIsR0FBMkM7SUFDekUsR0FBRyxFQUFFO1FBQ0gsV0FBVyxFQUFFLEVBQUU7UUFDZixjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7UUFDbEQsbUJBQW1CLEVBQUUsSUFBSTtRQUN6QixXQUFXLEVBQUUsSUFBSTtLQUNsQjtJQUNELEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELG1CQUFtQixFQUFFLElBQUk7UUFDekIsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsQ0FBQztRQUNkLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxtQkFBbUIsRUFB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QUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUEzQ0QsZ0NBMkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBSZXBvc2l0b3J5SW1hZ2UsXG4gIHR5cGUgSUNsdXN0ZXIsXG4gIHR5cGUgSUJhc2VTZXJ2aWNlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSVZwYyxcbiAgdHlwZSBVc2VyRGF0YSxcbiAgdHlwZSBJTWFjaGluZUltYWdlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBSdW50aW1lLFxuICBIYW5kbGVyLFxuICB0eXBlIEFyY2hpdGVjdHVyZSxcbiAgdHlwZSBGdW5jdGlvblVybEF1dGhUeXBlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gIHR5cGUgSUZ1bmN0aW9uLFxuICB0eXBlIEludm9rZU1vZGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gIHR5cGUgUG9saWN5U3RhdGVtZW50LFxuICB0eXBlIFBvbGljeURvY3VtZW50LFxuICB0eXBlIElNYW5hZ2VkUG9saWN5LFxuICB0eXBlIElHcmFudGFibGUsXG4gIEdyYW50XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICB0eXBlIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgdHlwZSBBcHBsaWNhdGlvbkxpc3RlbmVyXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgdHlwZSBJQXV0b1NjYWxpbmdHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXV0b3NjYWxpbmdcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLy8gSW1wb3J0IHR5cGUtc2FmZSBpbnRlcmZhY2VzXG5pbXBvcnQge1xuICB0eXBlIElFY3NDb21wdXRlLFxuICB0eXBlIElMYW1iZGFDb21wdXRlLFxuICB0eXBlIElFYzJDb21wdXRlLFxuICB0eXBlIEFueUNvbXB1dGUsXG4gIGlzQ29tcHV0ZSxcbiAgaXNFY3NDb21wdXRlLFxuICBpc0xhbWJkYUNvbXB1dGUsXG4gIGlzRWMyQ29tcHV0ZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzL2NvbXB1dGUuanNcIjtcbmltcG9ydCB7IHR5cGUgQ29ubmVjdGlvblNwZWMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Nvbm5lY3Rvci5qc1wiO1xuaW1wb3J0IHsgcHJvY2Vzc0Nvbm5lY3Rpb25zIH0gZnJvbSBcIi4vY29ubmVjdGlvbnMuanNcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIEZqYWxsTG9nZ2VyLFxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5pZmVzdFNlcnZpY2UsXG4gIHR5cGUgTWFuaWZlc3RMYW1iZGFcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21hbmlmZXN0V3JpdGVyLmpzXCI7XG5cbmltcG9ydCBFY3NDbHVzdGVyLCB7XG4gIHR5cGUgRWNzQ2x1c3RlclByb3BzLFxuICBTY2FsaW5nVHlwZSxcbiAgdHlwZSBEb21haW5Db25maWcsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgdHlwZSBFYzJDYXBhY2l0eUNvbmZpZ1xufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1wiO1xuaW1wb3J0IHsgRWMySW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2VjMlwiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2xhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gXCJlY3NcIiB8IFwiZWMyXCIgfCBcImxhbWJkYVwiO1xuXG4vLyBSZS1leHBvcnQgZnJvbSBlY3MudHMgdG8gbWFpbnRhaW4gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuZXhwb3J0IHsgU2NhbGluZ1R5cGUgfTtcbmV4cG9ydCB0eXBlIHsgRWNzQ2FwYWNpdHlQcm92aWRlciwgRWMyQ2FwYWNpdHlDb25maWcgfTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZvciBlYWNoIGNvbXB1dGUgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IHBvcnQgZm9yIHRoZSBjb21wdXRlIHR5cGUuIEVDUzogODAsIEVDMjogMjIsIExhbWJkYTogMCAobm8gcG9ydCkgKi9cbiAgZGVmYXVsdFBvcnQ6IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgc2NhbGluZyBsaW1pdHMgKi9cbiAgZGVmYXVsdFNjYWxpbmc6IHtcbiAgICBtaW5DYXBhY2l0eTogbnVtYmVyO1xuICAgIG1heENhcGFjaXR5OiBudW1iZXI7XG4gIH07XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHN1cHBvcnRzIHNlY3VyaXR5IGdyb3VwIGNvbm5lY3Rpb25zICovXG4gIHN1cHBvcnRzQ29ubmVjdGlvbnM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHJlcXVpcmVzIGEgVlBDICovXG4gIHJlcXVpcmVzVnBjOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQ09NUFVURV9UWVBFX0NPTkZJRzogUmVjb3JkPENvbXB1dGVUeXBlLCBDb21wdXRlVHlwZUNvbmZpZz4gPSB7XG4gIGVjczoge1xuICAgIGRlZmF1bHRQb3J0OiA4MCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDUgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGVjMjoge1xuICAgIGRlZmF1bHRQb3J0OiAyMixcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDMgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGxhbWJkYToge1xuICAgIGRlZmF1bHRQb3J0OiAwLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAwLCBtYXhDYXBhY2l0eTogMTAwIH0sXG4gICAgc3VwcG9ydHNDb25uZWN0aW9uczogZmFsc2UsXG4gICAgcmVxdWlyZXNWcGM6IGZhbHNlXG4gIH1cbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgRUNTIGNhcGFjaXR5IHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdGhpcyB1c2VzIFNwb3QgcHJpY2luZyAqL1xuICB1c2VzU3BvdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBydW5zIG9uIEVDMiBpbnN0YW5jZXMgKHZzIHNlcnZlcmxlc3MgRmFyZ2F0ZSkgKi9cbiAgdXNlc0VjMkluc3RhbmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEVDU19DQVBBQ0lUWV9QUk9WSURFUl9DT05GSUc6IFJlY29yZDxcbiAgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZ1xuPiA9IHtcbiAgRkFSR0FURToge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBGQVJHQVRFX1NQT1Q6IHtcbiAgICB1c2VzU3BvdDogdHJ1ZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBFQzI6IHtcbiAgICB1c2VzU3BvdDogZmFsc2UsXG4gICAgdXNlc0VjMkluc3RhbmNlczogdHJ1ZVxuICB9XG59O1xuXG4vKipcbiAqIERlZmF1bHQgdmFsdWVzIGZvciBjb21wdXRlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBDZW50cmFsaXNlZCBjb25zdGFudHMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QVVRFX0RFRkFVTFRTID0ge1xuICBFQzI6IHtcbiAgICBJTlNUQU5DRV9UWVBFOiBcInQzLm1pY3JvXCIsXG4gICAgTUlOX0NBUEFDSVRZOiAxLFxuICAgIE1BWF9DQVBBQ0lUWTogMVxuICB9LFxuICBFQ1M6IHtcbiAgICAvKiogQVdTIHNhbXBsZSBpbWFnZSB1c2VkIHdoZW4gbm8gRUNSIHJlcG9zaXRvcnkgaXMgcHJvdmlkZWQgKi9cbiAgICBGQUxMQkFDS19JTUFHRTogXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIixcbiAgICAvKiogRGVmYXVsdCB0YWcgZm9yIEVDUiBpbWFnZXMgKi9cbiAgICBJTUFHRV9UQUc6IFwibGF0ZXN0XCJcbiAgfSxcbiAgTEFNQkRBOiB7XG4gICAgSEFORExFUjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgUlVOVElNRTogUnVudGltZS5OT0RFSlNfMThfWFxuICB9XG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZVR5cGVDb25maWcodHlwZTogQ29tcHV0ZVR5cGUpOiBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIHJldHVybiBDT01QVVRFX1RZUEVfQ09ORklHW3R5cGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyhcbiAgcHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXJcbik6IEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICByZXR1cm4gRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJR1twcm92aWRlcl07XG59XG5cbi8vIFJlLWV4cG9ydCBMYW1iZGEgdHlwZXMgZnJvbSBDREsgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgSHR0cE1ldGhvZCxcbiAgSW52b2tlTW9kZSxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBjb250YWluZXIgaW4gYW4gRUNTIHRhc2suXG4gKlxuICogRm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMsIGBuYW1lYCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gYCR7c2VydmljZU5hbWV9Q29udGFpbmVyYC5cbiAqIEZvciBtdWx0aS1jb250YWluZXIgdGFza3MsIHRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIGBwb3J0YCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gKiB0aGF0IHJlY2VpdmVzIGxvYWQgYmFsYW5jZXIgdHJhZmZpYy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIGNvbnRhaW5lciAobmFtZSBhdXRvLWdlbmVyYXRlZClcbiAqIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktY29udGFpbmVyIHdpdGggc2lkZWNhcnNcbiAqIGNvbnRhaW5lcnM6IFtcbiAqICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sICAgICAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IC0gcmVjZWl2ZXMgQUxCIHRyYWZmaWNcbiAqICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH0gICAgIC8vIFNpZGVjYXIgLSBtb25pdG9yaW5nXG4gKiBdXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqIENvbnRhaW5lciBuYW1lLiBPcHRpb25hbCBmb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcy4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZS4gT3B0aW9uczpcbiAgICogLSBPbWl0OiBVc2VzIGFwcCdzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnkgKHByaW1hcnkgY29udGFpbmVyIG9ubHkpXG4gICAqIC0gc3RyaW5nOiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIHB1YmxpYyBpbWFnZSBVUkxcbiAgICogLSBSZXBvc2l0b3J5OiBDREsgRUNSIFJlcG9zaXRvcnkgY29uc3RydWN0XG4gICAqL1xuICBpbWFnZT86IHN0cmluZyB8IFJlcG9zaXRvcnk7XG4gIC8qKlxuICAgKiBQb3J0IHRoZSBjb250YWluZXIgbGlzdGVucyBvbi5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBiZWNvbWVzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAgICogYW5kIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgc2VydmljZSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgZnJvbSBhcHAvY2x1c3Rlci9zZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTZWNyZXRzIGF0IC9teWFwcC9hcGktY2x1c3Rlci91c2Vycy9BUElfS0VZIGFuZCAvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnMvREJfUEFTU1dPUkRcbiAgICogc2VjcmV0czogW1wiQVBJX0tFWVwiLCBcIkRCX1BBU1NXT1JEXCJdXG4gICAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG4gIC8qKiBTZWNyZXRzIGltcG9ydGVkIGZyb20gb3RoZXIgQ0RLIHJlc291cmNlcyAoQVdTIFNlY3JldHMgTWFuYWdlcikgKi9cbiAgc2VjcmV0c0ltcG9ydD86IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD47XG4gIC8qKiBDb21tYW5kIHRvIHJ1biBpbiB0aGUgY29udGFpbmVyICovXG4gIGNvbW1hbmQ/OiBzdHJpbmdbXTtcbiAgLyoqIEVudHJ5IHBvaW50IGZvciB0aGUgY29udGFpbmVyICovXG4gIGVudHJ5UG9pbnQ/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgZXNzZW50aWFsLlxuICAgKiBJZiBhbiBlc3NlbnRpYWwgY29udGFpbmVyIHN0b3BzLCBhbGwgY29udGFpbmVycyBpbiB0aGUgdGFzayBzdG9wLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogRUNTIHNjYWxpbmcgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICogLSBgeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDEwIH1gOiBjdXN0b20gc2NhbGluZ1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzU2NhbGluZ0NvbmZpZyB7XG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgc2NhbGluZ1R5cGU/OiBTY2FsaW5nVHlwZTtcbn1cblxuLyoqXG4gKiBDbHVzdGVyLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDbHVzdGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERvbWFpbiBmb3IgSFRUUFMgYWNjZXNzLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBETlMgKCouZWxiLmFtYXpvbmF3cy5jb20pXG4gICAqIC0gU3BlY2lmaWVkOiBDcmVhdGVzIEFDTSBjZXJ0aWZpY2F0ZSArIFJvdXRlNTMgRE5TIEEgcmVjb3JkXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0IG9yIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICogLSBmYWxzZTogTm8gQUxCIChmb3Igd29ya2Vycy9iYWNrZ3JvdW5kIHByb2Nlc3NvcnMpXG4gICAqL1xuICBsb2FkQmFsYW5jZXI/OiBmYWxzZSB8IFwicHVibGljXCIgfCBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkaXJlY3QgRUMyIGFjY2VzcyB3aXRob3V0IEFMQi5cbiAgICogVXNlcyBob3N0IG5ldHdvcmsgbW9kZSBmb3IgcHJlZGljdGFibGUgcG9ydHMuXG4gICAqIEFjY2VzcyB2aWEgRUMyIHB1YmxpYyBJUCBhdCBjb250YWluZXIgcG9ydC5cbiAgICovXG4gIGRpcmVjdEFjY2Vzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VkIGRvbWFpbiBjb25maWd1cmF0aW9uIGZvciByb3V0aW5nIHBvbGljaWVzIChsYXRlbmN5LCB3ZWlnaHRlZCwgZ2VvKS5cbiAgICogT25seSB1c2VkIHdoZW4gZG9tYWluIGlzIHNwZWNpZmllZC5cbiAgICogQWxsb3dzIGZvciBtdWx0aS1yZWdpb24gZGVwbG95bWVudHMgd2l0aCBhZHZhbmNlZCBETlMgcm91dGluZy5cbiAgICovXG4gIGRvbWFpbkNvbmZpZz86IERvbWFpbkNvbmZpZztcbn1cblxuLyoqXG4gKiBSb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIHBhdGgvaG9zdC1iYXNlZCByb3V0aW5nIG9uIHRoZSBBTEIuXG4gKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gKiBPcHRpb25hbCBmb3Igc2luZ2xlIHNlcnZpY2UgKGdldHMgYWxsIHRyYWZmaWMgYXV0b21hdGljYWxseSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzUm91dGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBQYXRoIHBhdHRlcm4gZm9yIHJvdXRpbmcgKGUuZy4sIFwiL2FwaS8qXCIsIFwiL3VzZXJzLypcIikuXG4gICAqIFVzZXMgQUxCIHBhdGgtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvc3QgaGVhZGVyIGZvciByb3V0aW5nIChlLmcuLCBcImFwaS5leGFtcGxlLmNvbVwiKS5cbiAgICogVXNlcyBBTEIgaG9zdC1iYXNlZCByb3V0aW5nLlxuICAgKi9cbiAgaG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgZm9yIHRoaXMgcm91dGluZyBydWxlICgxLTUwMDAwKS5cbiAgICogTG93ZXIgbnVtYmVyID0gaGlnaGVyIHByaW9yaXR5LlxuICAgKiBBdXRvLWFzc2lnbmVkIGlmIG9taXR0ZWQuXG4gICAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIHBhdGggZm9yIHRoaXMgc2VydmljZSdzIHRhcmdldCBncm91cC5cbiAgICogRGVmYXVsdDogXCIvXCJcbiAgICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZyBjb25maWcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbXBsZSBzZXJ2aWNlXG4gKiB7IG5hbWU6IFwiYXBpXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggcm91dGluZyAoZm9yIG11bHRpLXNlcnZpY2UgY2x1c3RlcnMpXG4gKiB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIsIHByaW9yaXR5OiAxMDAgfSB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNlcnZpY2Ugd2l0aCBzaWRlY2Fyc1xuICoge1xuICogICBuYW1lOiBcImFwaVwiLFxuICogICBjb250YWluZXJzOiBbXG4gKiAgICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sXG4gKiAgICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH1cbiAqICAgXVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UgKGFwcGxpZXMgdG8gZmlyc3QgY29udGFpbmVyIHdpdGhvdXQgZXhwbGljaXQgaW1hZ2UpLlxuICAgKiAtIE9taXQ6IFVzZXMgYXBwJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbihzKSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBGb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcywgY29udGFpbmVyIG5hbWUgaXMgb3B0aW9uYWwgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKiBGb3IgbXVsdGktY29udGFpbmVyIHNlcnZpY2VzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0IGlzIHRoZSBwcmltYXJ5IGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnRhaW5lcnM/OiBFY3NDb250YWluZXJDb25maWdbXTtcblxuICAvKipcbiAgICogUm91dGluZyBydWxlcyBmb3IgdGhpcyBzZXJ2aWNlIG9uIHRoZSBjbHVzdGVyJ3MgQUxCLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gICAqIE9wdGlvbmFsIGZvciBzaW5nbGUgc2VydmljZSAoZ2V0cyAvKiBhdXRvbWF0aWNhbGx5KS5cbiAgICovXG4gIHJvdXRpbmc/OiBFY3NSb3V0aW5nQ29uZmlnO1xuXG4gIC8qKiBDUFUgdW5pdHMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICgyNTYtNDA5NikgKi9cbiAgY3B1PzogbnVtYmVyO1xuXG4gIC8qKiBNZW1vcnkgaW4gTWlCIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrcyAoNTEyLTMwNzIwKSAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcblxuICAvKiogRGVzaXJlZCBudW1iZXIgb2YgdGFza3MuIERlZmF1bHQ6IDIgKi9cbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FsaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gICAqIC0gZmFsc2U6IGRpc2FibGVkXG4gICAqL1xuICBzY2FsaW5nPzogRWNzU2NhbGluZ0NvbmZpZyB8IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgZm9yIGJ1aWxkaW5nIHRoaXMgc2VydmljZSdzIGltYWdlLlxuICAgKiBNZXRhZGF0YSBmb3IgQ0xJIGJ1aWxkIHByb2Nlc3MsIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgZG9ja2VyZmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY2tlciBidWlsZCB0YXJnZXQgc3RhZ2UgZm9yIG11bHRpLXN0YWdlIERvY2tlcmZpbGVzLlxuICAgKiBXaGVuIHNwZWNpZmllZCwgdGhlIENMSSBidWlsZHMgd2l0aCBgLS10YXJnZXQgPGRvY2tlclRhcmdldD5gLlxuICAgKiBUaGUgaW1hZ2UgdGFnIHN1ZmZpeCBpcyBhbHNvIHVwZGF0ZWQ6IGA8c2VydmljZT4tPHRhcmdldD4tbGF0ZXN0YC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRG9ja2VyZmlsZTogRlJPTSBub2RlIEFTIGJhc2UgLi4uIEZST00gYmFzZSBBUyBhcGkgLi4uIEZST00gYmFzZSBBUyB3b3JrZXJcbiAgICogeyBuYW1lOiBcImFwaVwiLCBkb2NrZXJUYXJnZXQ6IFwiYXBpXCIgfSAgIC8vIGJ1aWxkczogbXlhcHAtYXBpLWFwaS1sYXRlc3RcbiAgICogeyBuYW1lOiBcIndvcmtlclwiLCBkb2NrZXJUYXJnZXQ6IFwid29ya2VyXCIgfSAgLy8gYnVpbGRzOiBteWFwcC13b3JrZXItd29ya2VyLWxhdGVzdFxuICAgKi9cbiAgZG9ja2VyVGFyZ2V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGlubGluZSBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqIFVzZSBmb3Igc2VydmljZS1zcGVjaWZpYyBBV1MgcGVybWlzc2lvbnMgKFMzLCBEeW5hbW9EQiwgU1FTLCBldGMuKS5cbiAgICovXG4gIHRhc2tSb2xlSW5saW5lUG9saWNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBQb2xpY3lEb2N1bWVudD47XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgbWFuYWdlZCBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqL1xuICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llcz86IElNYW5hZ2VkUG9saWN5W107XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGlzIHNlcnZpY2UgbmVlZHMgdG8gY29ubmVjdCB0byAoZS5nLiwgZGF0YWJhc2VzLCBTMyBidWNrZXRzLCBTUVMgcXVldWVzKS5cbiAgICogQ3JlYXRlcyBzZWN1cml0eSBncm91cCBydWxlcyBmb3IgSUNvbm5lY3RhYmxlIHJlc291cmNlcyBhbmQgSUFNIGdyYW50cyBmb3IgSUFNIHJlc291cmNlcy5cbiAgICogRm9sbG93cyBsZWFzdC1wcml2aWxlZ2UgLSBvbmx5IHRoaXMgc2VydmljZSBnZXRzIGFjY2Vzcywgbm90IGFsbCBzZXJ2aWNlcyBpbiB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogU3VwcG9ydHM6XG4gICAqIC0gSUNvbm5lY3RhYmxlOiBTZWN1cml0eSBncm91cCByZXNvdXJjZXMgKFJEUywgRUNTLCBldGMuKVxuICAgKiAtIElTdG9yYWdlQ29ubmVjdG9yOiBTMyBidWNrZXRzIChJQU0gZ3JhbnRzKVxuICAgKiAtIElEeW5hbW9EQkNvbm5lY3RvcjogRHluYW1vREIgdGFibGVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIElRdWV1ZUNvbm5lY3RvcjogU1FTIHF1ZXVlcyAoSUFNIGdyYW50cylcbiAgICogLSBDb25uZWN0aW9uQ29uZmlnOiBFeHBsaWNpdCBhY2Nlc3MgbGV2ZWwgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTaW1wbGUgY29ubmVjdGlvbnMgKGRlZmF1bHQgcGVybWlzc2lvbnMpXG4gICAqIGNvbm5lY3Rpb25zOiBbZGF0YWJhc2UsIGJ1Y2tldCwgY2FjaGUsIHF1ZXVlXVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFeHBsaWNpdCBhY2Nlc3MgbGV2ZWxzXG4gICAqIGNvbm5lY3Rpb25zOiBbXG4gICAqICAgZGF0YWJhc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgZ3JvdXAgKFJEUylcbiAgICogICB7IHJlc291cmNlOiBjYWNoZSwgYWNjZXNzOiBcInJlYWRcIiB9LCAgIC8vIFJlYWQtb25seSBEeW5hbW9EQlxuICAgKiAgIHsgcmVzb3VyY2U6IGJ1Y2tldCwgYWNjZXNzOiBcIndyaXRlXCIgfSwgLy8gV3JpdGUtb25seSBTM1xuICAgKiAgIHsgcmVzb3VyY2U6IHF1ZXVlLCBhY2Nlc3M6IFwiY29uc3VtZVwiIH0gLy8gQ29uc3VtZS1vbmx5IFNRU1xuICAgKiBdXG4gICAqL1xuICBjb25uZWN0aW9ucz86IENvbm5lY3Rpb25TcGVjW107XG5cbiAgLyoqXG4gICAqIENhcGFjaXR5IHByb3ZpZGVyIGZvciB0aGlzIHNlcnZpY2UuIFJFUVVJUkVELlxuICAgKiBFYWNoIHNlcnZpY2Ugc3BlY2lmaWVzIGl0cyBvd24gY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE1peGVkIEZBUkdBVEUgYW5kIEVDMiBzZXJ2aWNlcyBpbiBzYW1lIGNsdXN0ZXJcbiAgICoge1xuICAgKiAgIHNlcnZpY2VzOiBbXG4gICAqICAgICB7IG5hbWU6IFwiYXBpXCIsIGNhcGFjaXR5UHJvdmlkZXI6IFwiRkFSR0FURVwiIH0sXG4gICAqICAgICB7IG5hbWU6IFwid29ya2VyXCIsIGNhcGFjaXR5UHJvdmlkZXI6IFwiRUMyXCIsIGVjMkNvbmZpZzogeyBpbnN0YW5jZVR5cGU6IFwidDMubWljcm9cIiB9IH1cbiAgICogICBdXG4gICAqIH1cbiAgICovXG4gIGNhcGFjaXR5UHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEVDMiBjYXBhY2l0eSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIE9ubHkgdXNlZCB3aGVuIHNlcnZpY2UgY2FwYWNpdHlQcm92aWRlciBpcyBcIkVDMlwiLlxuICAgKiBTZXJ2aWNlcyB3aXRoIG1hdGNoaW5nIGVjMkNvbmZpZyBzaGFyZSBhbiBBU0cgZm9yIGVmZmljaWVuY3kuXG4gICAqL1xuICBlYzJDb25maWc/OiBFYzJDYXBhY2l0eUNvbmZpZztcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBTdG9yZSBwYXRoIGZvciBzZWNyZXRzLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBzZWNyZXRzIGFyZSBmZXRjaGVkIGZyb20gLzxhcHA+LzxjbHVzdGVyPi88c2VydmljZT4uXG4gICAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE92ZXJyaWRlIGRlZmF1bHQgcGF0aFxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvY3VzdG9tL3BhdGgvdG8vc2VjcmV0c1wiXG4gICAqL1xuICBzc21TZWNyZXRzUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTU0ggYWNjZXNzIGNvbmZpZ3VyYXRpb24gZm9yIEVDMiBpbnN0YW5jZXMuXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggYXV0by1nZW5lcmF0ZWQga2V5XG4gKiAtIGB7IGtleU5hbWU6IFwibXkta2V5XCIgfWA6IGVuYWJsZWQgd2l0aCBleGlzdGluZyBrZXlcbiAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzaENvbmZpZyB7XG4gIC8qKiBTU0gga2V5IHBhaXIgbmFtZSAqL1xuICBrZXlOYW1lPzogc3RyaW5nO1xuICAvKiogQWxsb3dlZCBDSURSIGJsb2NrcyBmb3IgU1NIIGFjY2VzcyAqL1xuICBhbGxvd2VkQ2lkcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgZnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggSUFNIGF1dGhcbiAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiLCBjb3JzOiB7Li4ufSB9YDogcHVibGljIHdpdGggQ09SU1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25VcmxDb25maWcge1xuICAvKiogQXV0aGVudGljYXRpb24gdHlwZS4gRGVmYXVsdDogQVdTX0lBTSAqL1xuICBhdXRoVHlwZT86IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG4gIC8qKiBDT1JTIGNvbmZpZ3VyYXRpb24gKi9cbiAgY29ycz86IEZ1bmN0aW9uVXJsQ29yc09wdGlvbnM7XG4gIC8qKiBJbnZva2UgbW9kZS4gVXNlIFJFU1BPTlNFX1NUUkVBTSBmb3IgTGFtYmRhIHN0cmVhbWluZy4gRGVmYXVsdDogQlVGRkVSRUQgKi9cbiAgaW52b2tlTW9kZT86IEludm9rZU1vZGU7XG59XG5cbmludGVyZmFjZSBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBFQ1MgY29tcHV0ZSBjb25maWd1cmF0aW9uLlxuICogQ3JlYXRlcyBhbiBFQ1MgY2x1c3RlciB3aXRoIG9uZSBvciBtb3JlIHNlcnZpY2VzIHNoYXJpbmcgYSBsb2FkIGJhbGFuY2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgc2VydmljZVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXZWJBcHBcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcHAuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSB9XVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS1zZXJ2aWNlIGNsdXN0ZXIgd2l0aCByb3V0aW5nXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaUNsdXN0ZXJcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcGkuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJ1c2Vyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL3VzZXJzLypcIiB9IH0sXG4gKiAgICAgeyBuYW1lOiBcIm9yZGVyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAxIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL29yZGVycy8qXCIgfSB9XG4gKiAgIF1cbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW50ZXJuYWwgd29ya2VycyAobm8gQUxCKVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXb3JrZXJzXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcInByb2Nlc3NvclwiIH0sIHsgbmFtZTogXCJlbWFpbGVyXCIgfV1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlY3NcIjtcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gbmFtZSBmb3IgU1NNIHNlY3JldHMgbmFtZXNwYWNlLlxuICAgKiBXaGVuIGNvbnRhaW5lcnMgdXNlIHNlY3JldHMsIHRoZSBwYXRoIGlzIGRlcml2ZWQgYXM6IC88YXBwTmFtZT4vPGNsdXN0ZXJOYW1lPi88c2VydmljZU5hbWU+XG4gICAqIEF1dG8tZGVyaXZlZCBmcm9tIEFwcC5nZXROYW1lKCkgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgY29uZmlndXJhdGlvbi5cbiAgICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIC0gT21pdDogQUxCIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IHNldHRpbmdzXG4gICAqIC0gYHsgZG9tYWluOiBcIi4uLlwiIH1gOiBBTEIgd2l0aCBIVFRQUyArIEROU1xuICAgKiAtIGB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfWA6IE5vIEFMQiAoaW50ZXJuYWwgd29ya2VycylcbiAgICovXG4gIGNsdXN0ZXI/OiBFY3NDbHVzdGVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBzY2FsaW5nLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKiBFYWNoIHNlcnZpY2UgTVVTVCBzcGVjaWZ5IGl0cyBvd24gY2FwYWNpdHlQcm92aWRlci5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKi9cbiAgc2VydmljZXM6IEVjc1NlcnZpY2VDb25maWdbXTtcblxuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgZm9yIGFsbCBzZXJ2aWNlcyAoZGVmYXVsdCBpbWFnZSkuXG4gICAqIEluZGl2aWR1YWwgc2VydmljZXMgY2FuIG92ZXJyaWRlIHdpdGggdGhlaXIgb3duIGBpbWFnZWAgcHJvcGVydHkuXG4gICAqL1xuICBlY3JSZXBvc2l0b3J5PzogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyBjdXN0b20gaW1hZ2UuXG4gICAqIE5vdGU6IFRoaXMgaXMgbWV0YWRhdGEgZm9yIHRoZSBDTEkgYnVpbGQgcHJvY2VzcyxcbiAgICogbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFYzJDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlYzJcIjtcblxuICAvKiogRUMyIGluc3RhbmNlIHR5cGUuIERlZmF1bHQ6IFwidDMubWljcm9cIiAqL1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNTSCBhY2Nlc3MgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0OiBkaXNhYmxlZCAoZGVmYXVsdClcbiAgICogLSBge31gOiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAgICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAqL1xuICBzc2g/OiBTc2hDb25maWcgfCBmYWxzZTtcbiAgLyoqIFVzZXIgZGF0YSBzY3JpcHQgKi9cbiAgdXNlckRhdGE/OiBVc2VyRGF0YTtcbiAgLyoqIE1hY2hpbmUgaW1hZ2UgKEFNSSkgKi9cbiAgbWFjaGluZUltYWdlPzogSU1hY2hpbmVJbWFnZTtcbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMSAqL1xuICBtaW5DYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMSAqL1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBlcmNlbnRhZ2Ugb2YgY2FwYWNpdHkgdG8gcnVuIG9uIFNwb3QgaW5zdGFuY2VzICgwLTEwMCkuXG4gICAqIC0gT21pdCBvciAwOiBBbGwgT24tRGVtYW5kIGluc3RhbmNlcyAoZGVmYXVsdClcbiAgICogLSAxMDA6IEFsbCBTcG90IGluc3RhbmNlc1xuICAgKiAtIDUwOiBIYWxmIFNwb3QsIGhhbGYgT24tRGVtYW5kXG4gICAqXG4gICAqIFNwb3QgaW5zdGFuY2VzIGNhbiByZWR1Y2UgY29zdHMgYnkgdXAgdG8gOTAlIGJ1dCBtYXkgYmUgaW50ZXJydXB0ZWQuXG4gICAqIFVzZSBmb3IgZmF1bHQtdG9sZXJhbnQgd29ya2xvYWRzLlxuICAgKi9cbiAgc3BvdENhcGFjaXR5UGVyY2VudGFnZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYXNlIExhbWJkYSBjb25maWd1cmF0aW9uIHNoYXJlZCBieSBib3RoIGNvbnRhaW5lciBhbmQgY29kZSBkZXBsb3ltZW50cy5cbiAqL1xuaW50ZXJmYWNlIEJhc2VMYW1iZGFQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImxhbWJkYVwiO1xuICAvKiogVGltZW91dCBpbiBzZWNvbmRzLiBEZWZhdWx0OiAzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgc2l6ZSBpbiBNQi4gRGVmYXVsdDogMTI4ICovXG4gIG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIGVwaGVtZXJhbFN0b3JhZ2VTaXplPzogbnVtYmVyO1xuICAvKiogQ1BVIGFyY2hpdGVjdHVyZS4gRGVmYXVsdDogeDg2XzY0LiBVc2UgQXJjaGl0ZWN0dXJlLkFSTV82NCBmb3IgR3Jhdml0b24yLiAqL1xuICBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gZGVzY3JpcHRpb24gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBkZXNjcmlwdGlvbiAqL1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8gSW5saW5lIHBvbGljaWVzIC0gcm91dGVkIHRvIGV4ZWN1dGlvbiByb2xlIGZvciBFQ1MsIHRhc2sgcm9sZSBmb3IgTGFtYmRhXG4gIC8qKiBJbmxpbmUgSUFNIHBvbGljeSBzdGF0ZW1lbnRzICovXG4gIGlubGluZVBvbGljeT86IFBvbGljeVN0YXRlbWVudFtdO1xuICAvKipcbiAgICogRnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIElBTSBhdXRoXG4gICAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiIH1gOiBwdWJsaWMgYWNjZXNzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb25Vcmw/OiBGdW5jdGlvblVybENvbmZpZyB8IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgTGFtYmRhJ3MgU1NNIG5hbWVzcGFjZS5cbiAgICogVGhlIG5hbWVzcGFjZSBwYXRoIGlzIGF1dG8tZGV0ZXJtaW5lZCBhczogLzxhcHBOYW1lPi9sYW1iZGEvPGZ1bmN0aW9uTmFtZT5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2VjcmV0czogW1wiQVBJX0tFWVwiLCBcIlNUUklQRV9TRUNSRVRcIl1cbiAgICovXG4gIHNlY3JldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBTdG9yZSBwYXRoIGZvciBzZWNyZXRzLlxuICAgKiBJZiBzZWNyZXRzIGFyZSBkZWZpbmVkLCB0aGlzIHBhdGggaXMgdXNlZCBhcyB0aGUgYmFzZSBwYXRoLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB1c2VzOiAvPGFwcE5hbWU+L2xhbWJkYS88ZnVuY3Rpb25OYW1lPlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvbXlhcHAvY3VzdG9tL3BhdGhcIlxuICAgKi9cbiAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlY3JldHMgaW1wb3J0ZWQgZnJvbSBvdGhlciBDREsgcmVzb3VyY2VzIChBV1MgU2VjcmV0cyBNYW5hZ2VyKS5cbiAgICogVXNlZCBmb3IgQ0RLLW1hbmFnZWQgc2VjcmV0cyBsaWtlIGRhdGFiYXNlIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWNyZXRzSW1wb3J0OiB7XG4gICAqICAgREFUQUJBU0VfVVNFUk5BTUU6IGRhdGFiYXNlLmdldENyZWRlbnRpYWxzKCkuZ2V0SW1wb3J0KFwidXNlcm5hbWVcIiksXG4gICAqICAgREFUQUJBU0VfUEFTU1dPUkQ6IGRhdGFiYXNlLmdldENyZWRlbnRpYWxzKCkuZ2V0SW1wb3J0KFwicGFzc3dvcmRcIilcbiAgICogfVxuICAgKi9cbiAgc2VjcmV0c0ltcG9ydD86IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD47XG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIG5hbWUgZm9yIFNTTSBzZWNyZXRzIHBhdGggZGVyaXZhdGlvbi5cbiAgICogQXV0by1kZXJpdmVkIGZyb20gQXBwIGluc3RhbmNlIHdoZW4gdXNpbmcgQ29tcHV0ZUZhY3RvcnkuXG4gICAqIE9ubHkgc3BlY2lmeSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLlxuICAgKi9cbiAgYXBwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2VzIHRoaXMgTGFtYmRhIG5lZWRzIHRvIGNvbm5lY3QgdG8gKGUuZy4sIGRhdGFiYXNlcywgUzMgYnVja2V0cywgU1FTIHF1ZXVlcykuXG4gICAqIENyZWF0ZXMgc2VjdXJpdHkgZ3JvdXAgcnVsZXMgZm9yIElDb25uZWN0YWJsZSByZXNvdXJjZXMgYW5kIElBTSBncmFudHMgZm9yIElBTSByZXNvdXJjZXMuXG4gICAqXG4gICAqIFN1cHBvcnRzOlxuICAgKiAtIElDb25uZWN0YWJsZTogU2VjdXJpdHkgZ3JvdXAgcmVzb3VyY2VzIChSRFMsIEVDUywgZXRjLilcbiAgICogLSBJU3RvcmFnZUNvbm5lY3RvcjogUzMgYnVja2V0cyAoSUFNIGdyYW50cylcbiAgICogLSBJRHluYW1vREJDb25uZWN0b3I6IER5bmFtb0RCIHRhYmxlcyAoSUFNIGdyYW50cylcbiAgICogLSBJUXVldWVDb25uZWN0b3I6IFNRUyBxdWV1ZXMgKElBTSBncmFudHMpXG4gICAqIC0gQ29ubmVjdGlvbkNvbmZpZzogRXhwbGljaXQgYWNjZXNzIGxldmVsIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29ubmVjdGlvbnM6IFtcbiAgICogICBkYXRhYmFzZSxcbiAgICogICB7IHJlc291cmNlOiBxdWV1ZSwgYWNjZXNzOiBcInNlbmRcIiB9XG4gICAqIF1cbiAgICovXG4gIGNvbm5lY3Rpb25zPzogQ29ubmVjdGlvblNwZWNbXTtcblxuICAvKipcbiAgICogRXZlbnRCcmlkZ2Ugc2NoZWR1bGUgZXhwcmVzc2lvbiBmb3Igc2NoZWR1bGVkIExhbWJkYSBpbnZvY2F0aW9ucy5cbiAgICogVXNlcyBjcm9uIG9yIHJhdGUgc3ludGF4OiBcInJhdGUoMSBob3VyKVwiIG9yIFwiY3JvbigwIDEyICogKiA/ICopXCIuXG4gICAqL1xuICBzY2hlZHVsZUV4cHJlc3Npb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udGFpbmVyLWJhc2VkIExhbWJkYSB1c2luZyBFQ1IgaW1hZ2UuXG4gKlxuICogVXNlcyBEb2NrZXIgaW1hZ2UgZnJvbSBFQ1IgcmVwb3NpdG9yeS4gSGFuZGxlciBhbmQgcnVudGltZSBhcmVcbiAqIGF1dG9tYXRpY2FsbHkgc2V0IHRvIEZST01fSU1BR0UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiSW1hZ2VMYW1iZGFcIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiLFxuICogICBlY3JSZXBvc2l0b3J5OiBhcHAuZ2V0RGVmYXVsdENvbnRhaW5lclJlZ2lzdHJ5KClcbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJMYW1iZGFQcm9wcyBleHRlbmRzIEJhc2VMYW1iZGFQcm9wcyB7XG4gIC8qKiBDb250YWluZXItYmFzZWQgZGVwbG95bWVudCB1c2luZyBFQ1IgaW1hZ2UgKi9cbiAgZGVwbG95bWVudDogXCJjb250YWluZXJcIjtcbiAgLyoqIEVDUiByZXBvc2l0b3J5IGNvbnRhaW5pbmcgdGhlIExhbWJkYSBjb250YWluZXIgaW1hZ2UgKi9cbiAgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcbn1cblxuLyoqXG4gKiBDb2RlLWJhc2VkIExhbWJkYSB1c2luZyBpbmxpbmUgY29kZSBvciBTMy5cbiAqXG4gKiBVc2VzIHRyYWRpdGlvbmFsIExhbWJkYSBkZXBsb3ltZW50IHdpdGggY29kZSwgaGFuZGxlciwgYW5kIHJ1bnRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQ29kZUxhbWJkYVwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICogICBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpLFxuICogICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAqICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWFxuICogfSkpO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVMYW1iZGFQcm9wcyBleHRlbmRzIEJhc2VMYW1iZGFQcm9wcyB7XG4gIC8qKiBDb2RlLWJhc2VkIGRlcGxveW1lbnQgKi9cbiAgZGVwbG95bWVudDogXCJjb2RlXCI7XG4gIC8qKiBMYW1iZGEgY29kZSAoZnJvbSBhc3NldCwgUzMsIG9yIGlubGluZSkgKi9cbiAgY29kZTogQ29kZTtcbiAgLyoqIEhhbmRsZXIgZnVuY3Rpb24uIERlZmF1bHQ6IFwiaW5kZXguaGFuZGxlclwiICovXG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIC8qKiBMYW1iZGEgcnVudGltZS4gRGVmYXVsdDogTk9ERUpTXzE4X1ggKi9cbiAgcnVudGltZT86IFJ1bnRpbWU7XG59XG5cbi8qKlxuICogTGFtYmRhIGNvbXB1dGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIGVuc3VyaW5nIHR5cGUtc2FmZSBMYW1iZGEgY29uZmlndXJhdGlvbjpcbiAqIC0gYGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCJgIHJlcXVpcmVzIGBlY3JSZXBvc2l0b3J5YFxuICogLSBgZGVwbG95bWVudDogXCJjb2RlXCJgIHJlcXVpcmVzIGBjb2RlYCBhbmQgYWxsb3dzIGBoYW5kbGVyYC9gcnVudGltZWBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udGFpbmVyLWJhc2VkIExhbWJkYVxuICogeyB0eXBlOiBcImxhbWJkYVwiLCBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiLCBlY3JSZXBvc2l0b3J5OiBlY3IgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb2RlLWJhc2VkIExhbWJkYVxuICogeyB0eXBlOiBcImxhbWJkYVwiLCBkZXBsb3ltZW50OiBcImNvZGVcIiwgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKSB9XG4gKi9cbmV4cG9ydCB0eXBlIExhbWJkYUNvbXB1dGVQcm9wcyA9IENvbnRhaW5lckxhbWJkYVByb3BzIHwgQ29kZUxhbWJkYVByb3BzO1xuXG4vLyBUeXBlLXNhZmUgcHJvcHMgd2l0aCBsaXRlcmFsIGRpc2NyaW1pbmF0b3JzIGZvciBmYWN0b3J5IG92ZXJsb2Fkc1xuZXhwb3J0IHR5cGUgSUVjc0NvbXB1dGVQcm9wcyA9IEVjc0NvbXB1dGVQcm9wcztcbmV4cG9ydCB0eXBlIElMYW1iZGFDb21wdXRlUHJvcHMgPSBMYW1iZGFDb21wdXRlUHJvcHM7XG5leHBvcnQgdHlwZSBJRWMyQ29tcHV0ZVByb3BzID0gRWMyQ29tcHV0ZVByb3BzO1xuXG5leHBvcnQgdHlwZSBJQ29tcHV0ZVByb3BzID1cbiAgfCBJRWNzQ29tcHV0ZVByb3BzXG4gIHwgSUxhbWJkYUNvbXB1dGVQcm9wc1xuICB8IElFYzJDb21wdXRlUHJvcHM7XG5cbi8qKlxuICogVmFsaWRhdGVzIGNvbXB1dGUgcHJvcHMgYW5kIGxvZ3Mgd2FybmluZ3MgZm9yIGlnbm9yZWQgb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICogVGhlc2UgY2hlY2tzIGhlbHAgY2F0Y2ggaXNzdWVzIHdoZW4gcHJvcHMgY29tZSBmcm9tIGR5bmFtaWMgc291cmNlcyB3aGVyZVxuICogVHlwZVNjcmlwdCdzIGNvbXBpbGUtdGltZSBjaGVja3MgbWF5IG5vdCBhcHBseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb21wdXRlUHJvcHMocHJvcHM6IElDb21wdXRlUHJvcHMpOiB2b2lkIHtcbiAgLy8gRUNTLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUVDUyBjb21wdXRlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcImNhcGFjaXR5UHJvdmlkZXJcIiwgXCJlYzJDb25maWdcIiwgXCJzZXJ2aWNlc1wiLCBcImNsdXN0ZXJcIl0sXG4gICAgXCJlY3NcIixcbiAgICBcIkVDUyBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBMYW1iZGEtc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tTGFtYmRhIGNvbXB1dGVcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wiZnVuY3Rpb25VcmxcIiwgXCJoYW5kbGVyXCIsIFwicnVudGltZVwiXSxcbiAgICBcImxhbWJkYVwiLFxuICAgIFwiTGFtYmRhIGNvbXB1dGVcIlxuICApO1xuXG4gIC8vIEVDMi1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1FQzIgY29tcHV0ZVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJzc2hcIiwgXCJ1c2VyRGF0YVwiLCBcIm1hY2hpbmVJbWFnZVwiXSxcbiAgICBcImVjMlwiLFxuICAgIFwiRUMyIGNvbXB1dGVcIlxuICApO1xuXG4gIC8vIEVDUy1zcGVjaWZpYyB2YWxpZGF0aW9uIC0gdHlwZSBuYXJyb3dpbmcgaGFuZGxlZCBieSBkaXNjcmltaW5hdGVkIHVuaW9uXG4gIGlmIChwcm9wcy50eXBlID09PSBcImVjc1wiKSB7XG4gICAgdmFsaWRhdGVFY3NQcm9wcyhwcm9wcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgRUNTLXNwZWNpZmljIHByb3BzLlxuICogRXh0cmFjdGVkIGZvciBjbGFyaXR5IGFuZCBkZXRhaWwgcGFyaXR5IHdpdGggZGF0YWJhc2UvbmV0d29yayBwYXR0ZXJucy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFY3NQcm9wcyhwcm9wczogRWNzQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIHNlcnZpY2VzIGFycmF5IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XG4gIGlmICghcHJvcHMuc2VydmljZXMgfHwgcHJvcHMuc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdCBsZWFzdCBvbmUgc2VydmljZSBtdXN0IGJlIHNwZWNpZmllZCBpbiAnc2VydmljZXMnIGFycmF5LlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHVuaXF1ZSBzZXJ2aWNlIG5hbWVzXG4gIGNvbnN0IHNlcnZpY2VOYW1lcyA9IHByb3BzLnNlcnZpY2VzLm1hcCgocykgPT4gcy5uYW1lKTtcbiAgY29uc3QgZHVwbGljYXRlTmFtZXMgPSBzZXJ2aWNlTmFtZXMuZmlsdGVyKFxuICAgIChuYW1lLCBpbmRleCkgPT4gc2VydmljZU5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICk7XG4gIGlmIChkdXBsaWNhdGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYER1cGxpY2F0ZSBzZXJ2aWNlIG5hbWVzOiAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZU5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc2VydmljZSBuYW1lIGZvcm1hdFxuICBjb25zdCBpbnZhbGlkTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoXG4gICAgKHMpID0+ICEvXlthLXpBLVpdW2EtekEtWjAtOS1dKiQvLnRlc3Qocy5uYW1lKVxuICApO1xuICBpZiAoaW52YWxpZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzZXJ2aWNlIG5hbWVzOiAke2ludmFsaWROYW1lcy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgIFwiU2VydmljZSBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVucy5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSByb3V0aW5nIHdoZW4gbXVsdGlwbGUgc2VydmljZXMgaGF2ZSBwb3J0c1xuICBjb25zdCBzZXJ2aWNlc1dpdGhQb3J0cyA9IHByb3BzLnNlcnZpY2VzLmZpbHRlcigocykgPT5cbiAgICBzLmNvbnRhaW5lcnM/LnNvbWUoKGMpID0+IGMucG9ydClcbiAgKTtcblxuICBpZiAoc2VydmljZXNXaXRoUG9ydHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG1pc3NpbmdSb3V0aW5nID0gc2VydmljZXNXaXRoUG9ydHMuZmlsdGVyKFxuICAgICAgKHMpID0+ICFzLnJvdXRpbmc/LnBhdGggJiYgIXMucm91dGluZz8uaG9zdFxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNlcnZpY2VzIHdpdGggcG9ydHMgcmVxdWlyZSByb3V0aW5nIGNvbmZpZyB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzOiBgICtcbiAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSBvciByb3V0aW5nOiB7IGhvc3Q6ICcuLi4nIH0gdG8gZWFjaCBzZXJ2aWNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgaWYgKHNlcnZpY2UuY29udGFpbmVycyAmJiBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2UgKG9ubHkgbmFtZWQgY29udGFpbmVycylcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBEdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzOiBgICtcbiAgICAgICAgICAgIGAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiICYmICFzZXJ2aWNlLmVjMkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlciBidXQgbm8gZWMyQ29uZmlnIGlzIGRlZmluZWQuIGAgK1xuICAgICAgICAgIFwiUHJvdmlkZSBlYzJDb25maWcgb24gdGhlIHNlcnZpY2UuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiBzZXJ2aWNlIGVjMkNvbmZpZyBpcyBkZWZpbmVkIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCBFQzJcbiAgICBpZiAoc2VydmljZS5lYzJDb25maWcgJiYgc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyBoYXMgZWMyQ29uZmlnIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCAnRUMyJy4gYCArXG4gICAgICAgICAgXCJUaGUgZWMyQ29uZmlnIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgY2FwYWNpdHlQcm92aWRlciBpcyBzZXQgdG8gJ0VDMicuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgY29udGFpbmVyIGNvbmZpZ3VyYXRpb25zIGZvciBhbiBFQ1Mgc2VydmljZS5cbiAqIENvbnZlcnRzIHVzZXItZmFjaW5nIEVjc0NvbnRhaW5lckNvbmZpZyB0byBpbnRlcm5hbCBFY3NDbHVzdGVyUHJvcHMgZm9ybWF0LlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29udGFpbmVyQ29uZmlncyhcbiAgc2VydmljZTogRWNzU2VydmljZUNvbmZpZ1xuKTogRWNzQ2x1c3RlclByb3BzW1wic2VydmljZXNcIl1bbnVtYmVyXVtcImNvbnRhaW5lcnNcIl0ge1xuICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuY29udGFpbmVycy5tYXAoKGMsIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogYy5uYW1lIHx8IGAke3NlcnZpY2UubmFtZX1Db250YWluZXIke2luZGV4ID4gMCA/IGluZGV4IDogXCJcIn1gLFxuICAgICAgaW1hZ2U6IGMuaW1hZ2UsXG4gICAgICBwb3J0OiBjLnBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogYy5lbnZpcm9ubWVudCxcbiAgICAgIHNlY3JldHM6IGMuc2VjcmV0cyxcbiAgICAgIHNlY3JldHNJbXBvcnQ6IGMuc2VjcmV0c0ltcG9ydCxcbiAgICAgIGNvbW1hbmQ6IGMuY29tbWFuZCxcbiAgICAgIGVudHJ5UG9pbnQ6IGMuZW50cnlQb2ludCxcbiAgICAgIGVzc2VudGlhbDogYy5lc3NlbnRpYWwsXG4gICAgICBoZWFsdGhDaGVjazogYy5oZWFsdGhDaGVja1xuICAgIH0pKTtcbiAgfVxuICAvLyBEZWZhdWx0IGNvbnRhaW5lciAobm8gcG9ydCA9IHdvcmtlcilcbiAgcmV0dXJuIFt7IG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgIH1dO1xufVxuXG4vKipcbiAqIFJlc29sdmVkIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmb3IgYW4gRUNTIHNlcnZpY2UuXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIHNjYWxpbmdUeXBlOiBTY2FsaW5nVHlwZSB8IHVuZGVmaW5lZDtcbiAgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbWF4Q2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmcm9tIHNlcnZpY2UgcHJvcHMuXG4gKiBIYW5kbGVzIHRoZSB0aHJlZSBjYXNlczogZXhwbGljaXQgY29uZmlnLCBkaXNhYmxlZCAoZmFsc2UpLCBvciBkZWZhdWx0ICh1bmRlZmluZWQpLlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTY2FsaW5nQ29uZmlnKFxuICBzY2FsaW5nOiBFY3NTY2FsaW5nQ29uZmlnIHwgZmFsc2UgfCB1bmRlZmluZWRcbik6IFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIGlmIChzY2FsaW5nID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2FsaW5nVHlwZTogdW5kZWZpbmVkLFxuICAgICAgbWluQ2FwYWNpdHk6IHVuZGVmaW5lZCxcbiAgICAgIG1heENhcGFjaXR5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIGlmIChzY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlLkNQVSxcbiAgICAgIG1pbkNhcGFjaXR5OiB1bmRlZmluZWQsXG4gICAgICBtYXhDYXBhY2l0eTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjYWxpbmdUeXBlOiBzY2FsaW5nLnNjYWxpbmdUeXBlID8/IFNjYWxpbmdUeXBlLkNQVSxcbiAgICBtaW5DYXBhY2l0eTogc2NhbGluZy5taW5DYXBhY2l0eSxcbiAgICBtYXhDYXBhY2l0eTogc2NhbGluZy5tYXhDYXBhY2l0eVxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVkIExhbWJkYSBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRMYW1iZGFEZXBsb3ltZW50IHtcbiAgY29kZTogQ29kZTtcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBydW50aW1lOiBSdW50aW1lO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFtYmRhIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBmcm9tIHByb3BzLlxuICogSGFuZGxlcyBjb250YWluZXIgdnMgY29kZSBkZXBsb3ltZW50IHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxhbWJkYURlcGxveW1lbnQoXG4gIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4pOiBSZXNvbHZlZExhbWJkYURlcGxveW1lbnQge1xuICBpZiAocHJvcHMuZGVwbG95bWVudCA9PT0gXCJjb250YWluZXJcIikge1xuICAgIGlmICghKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImVjclJlcG9zaXRvcnkgbXVzdCBiZSBhIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUVjckltYWdlKHByb3BzLmVjclJlcG9zaXRvcnksIHtcbiAgICAgICAgdGFnT3JEaWdlc3Q6IENPTVBVVEVfREVGQVVMVFMuRUNTLklNQUdFX1RBR1xuICAgICAgfSksXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0VcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgY29kZTogcHJvcHMuY29kZSxcbiAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyIHx8IENPTVBVVEVfREVGQVVMVFMuTEFNQkRBLkhBTkRMRVIsXG4gICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBDT01QVVRFX0RFRkFVTFRTLkxBTUJEQS5SVU5USU1FXG4gIH07XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgY29tcHV0ZSByZXNvdXJjZXMgd2l0aCB0eXBlLXNhZmUgcmV0dXJuIHR5cGVzLlxuICpcbiAqIFRoZSBmYWN0b3J5IHVzZXMgb3ZlcmxvYWRzIHRvIGluZmVyIHRoZSBzcGVjaWZpYyBjb21wdXRlIHR5cGUgZnJvbSBwcm9wcyxcbiAqIGVuc3VyaW5nIFR5cGVTY3JpcHQgcHJvdmlkZXMgb25seSB0aGUgcmVsZXZhbnQgbWV0aG9kcyBmb3IgZWFjaCBjb21wdXRlIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVDUyBjb21wdXRlIC0gcmV0dXJucyBFY3NDb21wdXRlIHdpdGggRUNTLXNwZWNpZmljIG1ldGhvZHNcbiAqIGNvbnN0IGVjcyA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV2ViQXBwXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBwLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfV1cbiAqIH0pKTtcbiAqIGVjcy5nZXRMb2FkQmFsYW5jZXIoKTsgLy8gQXZhaWxhYmxlIG9uIEVjc0NvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTGFtYmRhIGNvbXB1dGUgLSByZXR1cm5zIExhbWJkYUNvbXB1dGUgd2l0aCBMYW1iZGEtc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgbGFtYmRhID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJGblwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICogICBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpXG4gKiB9KSk7XG4gKiBsYW1iZGEuZ2V0RnVuY3Rpb25VcmwoKTsgLy8gQXZhaWxhYmxlIG9uIExhbWJkYUNvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRUMyIGNvbXB1dGUgLSByZXR1cm5zIEVjMkNvbXB1dGUgd2l0aCBFQzItc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgZWMyID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJJbnN0YW5jZVwiLCB7XG4gKiAgIHR5cGU6IFwiZWMyXCIsXG4gKiAgIGluc3RhbmNlVHlwZTogXCJ0My5taWNyb1wiXG4gKiB9KSk7XG4gKiBlYzIuZ2V0QXV0b1NjYWxpbmdHcm91cCgpOyAvLyBBdmFpbGFibGUgb24gRWMyQ29tcHV0ZVxuICovXG5leHBvcnQgY2xhc3MgQ29tcHV0ZUZhY3Rvcnkge1xuICAvLyBPdmVybG9hZDogRUNTIHByb3BzIHJldHVybnMgRWNzQ29tcHV0ZVxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUVjc0NvbXB1dGVQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEVjc0NvbXB1dGU7XG4gIC8vIE92ZXJsb2FkOiBMYW1iZGEgcHJvcHMgcmV0dXJucyBMYW1iZGFDb21wdXRlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gTGFtYmRhQ29tcHV0ZTtcbiAgLy8gT3ZlcmxvYWQ6IEVDMiBwcm9wcyByZXR1cm5zIEVjMkNvbXB1dGVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElFYzJDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBFYzJDb21wdXRlO1xuICAvLyBJbXBsZW1lbnRhdGlvbiBzaWduYXR1cmVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBBbnlDb21wdXRlIHtcbiAgICByZXR1cm4gKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KTogQW55Q29tcHV0ZSA9PiB7XG4gICAgICB2YWxpZGF0ZUNvbXB1dGVQcm9wcyhwcm9wcyk7XG5cbiAgICAgIC8vIEF1dG8tZGVyaXZlIGFwcE5hbWUgZnJvbSBBcHAgaW5zdGFuY2UgZm9yIEVDUyBjb21wdXRlXG4gICAgICBsZXQgY29tcHV0ZVByb3BzOiBJQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBhcHAuZ2V0VnBjKCksXG4gICAgICAgICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29tcHV0ZVByb3BzLnR5cGUgPT09IFwiZWNzXCIpIHtcbiAgICAgICAgY29tcHV0ZVByb3BzID0ge1xuICAgICAgICAgIC4uLmNvbXB1dGVQcm9wcyxcbiAgICAgICAgICBhcHBOYW1lOiBjb21wdXRlUHJvcHMuYXBwTmFtZSA/PyBhcHAuZ2V0TmFtZSgpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBzcGVjaWZpYyBjb21wdXRlIGNsYXNzIGJhc2VkIG9uIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgc3dpdGNoIChjb21wdXRlUHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiZWNzXCI6IHtcbiAgICAgICAgICAvLyBSZWdpc3RlciBFQ1Mgc2VydmljZXMgd2l0aCBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIENMSSBkaXNjb3ZlcnlcbiAgICAgICAgICBjb25zdCBjb2xsZWN0b3IgPSBhcHAuZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTtcbiAgICAgICAgICBjb25zdCBjbHVzdGVyTmFtZSA9IGlkO1xuICAgICAgICAgIGNvbnN0IGFwcE5hbWUgPSBjb21wdXRlUHJvcHMuYXBwTmFtZSA/PyBhcHAuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIGNvbXB1dGVQcm9wcy5zZXJ2aWNlcykge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RTZXJ2aWNlOiBNYW5pZmVzdFNlcnZpY2UgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHNlcnZpY2UubmFtZSxcbiAgICAgICAgICAgICAgY2x1c3Rlck5hbWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgZG9ja2VyZmlsZVBhdGggaWYgc3BlY2lmaWVkIChtZXRhZGF0YSBmb3IgQ0xJKVxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZG9ja2VyZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLmRvY2tlcmZpbGVQYXRoID0gc2VydmljZS5kb2NrZXJmaWxlUGF0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5jbHVkZSBkb2NrZXJUYXJnZXQgaWYgc3BlY2lmaWVkIChtZXRhZGF0YSBmb3IgQ0xJKVxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZG9ja2VyVGFyZ2V0KSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5kb2NrZXJUYXJnZXQgPSBzZXJ2aWNlLmRvY2tlclRhcmdldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluZCBjb250YWluZXIgcG9ydCBmcm9tIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydFxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV2l0aFBvcnQgPSBzZXJ2aWNlLmNvbnRhaW5lcnM/LmZpbmQoXG4gICAgICAgICAgICAgIChjKSA9PiBjLnBvcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJXaXRoUG9ydD8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5jb250YWluZXJQb3J0ID0gY29udGFpbmVyV2l0aFBvcnQucG9ydDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWdncmVnYXRlIHNlY3JldHMgZnJvbSBhbGwgY29udGFpbmVycyAoZGVkdXBsaWNhdGVkKVxuICAgICAgICAgICAgY29uc3QgYWxsU2VjcmV0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2Ygc2VydmljZS5jb250YWluZXJzID8/IFtdKSB7XG4gICAgICAgICAgICAgIGlmIChjb250YWluZXIuc2VjcmV0cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjcmV0IG9mIGNvbnRhaW5lci5zZWNyZXRzKSB7XG4gICAgICAgICAgICAgICAgICBhbGxTZWNyZXRzLmFkZChzZWNyZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbFNlY3JldHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLnNlY3JldHMgPSBBcnJheS5mcm9tKGFsbFNlY3JldHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIHNzbVNlY3JldHNQYXRoIChleHBsaWNpdCBvciBkZXJpdmVkKVxuICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLnNzbVNlY3JldHNQYXRoID1cbiAgICAgICAgICAgICAgc2VydmljZS5zc21TZWNyZXRzUGF0aCA/P1xuICAgICAgICAgICAgICBgLyR7YXBwTmFtZX0vJHtjbHVzdGVyTmFtZX0vJHtzZXJ2aWNlLm5hbWV9YDtcblxuICAgICAgICAgICAgY29sbGVjdG9yLmFkZFNlcnZpY2UobWFuaWZlc3RTZXJ2aWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBFY3NDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwibGFtYmRhXCI6IHtcbiAgICAgICAgICAvLyBBZGQgYXBwTmFtZSB0byBwcm9wcyBmb3IgTGFtYmRhIChuZWVkZWQgZm9yIHNlY3JldHMgcGF0aCBkZXJpdmF0aW9uKVxuICAgICAgICAgIGNvbnN0IGxhbWJkYUNvbXB1dGVQcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmNvbXB1dGVQcm9wcyxcbiAgICAgICAgICAgIGFwcE5hbWU6IGFwcC5nZXROYW1lKClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQWx3YXlzIHJlZ2lzdGVyIExhbWJkYSB3aXRoIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgQ0xJIGRpc2NvdmVyeVxuICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgTGFtYmRhcyBhcmUgZGlzY292ZXJhYmxlIGZvciBzZWNyZXRzIG1hbmFnZW1lbnQsXG4gICAgICAgICAgLy8gZXZlbiB0aG9zZSB0aGF0IGRvbid0IGN1cnJlbnRseSBoYXZlIHNlY3JldHMgY29uZmlndXJlZFxuICAgICAgICAgIGNvbnN0IGNvbGxlY3RvciA9IGFwcC5nZXRNYW5pZmVzdENvbGxlY3RvcigpO1xuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0TGFtYmRhOiBNYW5pZmVzdExhbWJkYSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGlkLFxuICAgICAgICAgICAgc3NtU2VjcmV0c1BhdGg6XG4gICAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zc21TZWNyZXRzUGF0aCB8fFxuICAgICAgICAgICAgICBgLyR7bGFtYmRhQ29tcHV0ZVByb3BzLmFwcE5hbWV9L2xhbWJkYS8ke2lkfWBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zZWNyZXRzICYmXG4gICAgICAgICAgICBsYW1iZGFDb21wdXRlUHJvcHMuc2VjcmV0cy5sZW5ndGggPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYW5pZmVzdExhbWJkYS5zZWNyZXRzID0gbGFtYmRhQ29tcHV0ZVByb3BzLnNlY3JldHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbGxlY3Rvci5hZGRMYW1iZGEobWFuaWZlc3RMYW1iZGEpO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBMYW1iZGFDb21wdXRlKHNjb3BlLCBpZCwgbGFtYmRhQ29tcHV0ZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZWMyXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFYzJDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IGNvbXB1dGVQcm9wcztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29tcHV0ZSB0eXBlOiAke1N0cmluZygoX2V4aGF1c3RpdmUgYXMgSUNvbXB1dGVQcm9wcykudHlwZSl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRUNTIGNvbXB1dGUgd3JhcHBlciBpbXBsZW1lbnRpbmcgSUVjc0NvbXB1dGUuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIEVDUy1zcGVjaWZpYyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFY3NDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUVjc0NvbXB1dGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHV0ZVR5cGUgPSBcImVjc1wiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWNzQ2x1c3RlcjogRWNzQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSUVjc0NvbXB1dGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gRWNzU2VydmljZUNvbmZpZ1tdIHRvIEVjc1NlcnZpY2VQcm9wc1tdIGZvciBFY3NDbHVzdGVyXG4gICAgY29uc3Qgc2VydmljZXM6IEVjc0NsdXN0ZXJQcm9wc1tcInNlcnZpY2VzXCJdID0gcHJvcHMuc2VydmljZXMubWFwKFxuICAgICAgKHNlcnZpY2UpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IGJ1aWxkQ29udGFpbmVyQ29uZmlncyhzZXJ2aWNlKTtcbiAgICAgICAgY29uc3QgeyBzY2FsaW5nVHlwZSwgbWluQ2FwYWNpdHksIG1heENhcGFjaXR5IH0gPSByZXNvbHZlU2NhbGluZ0NvbmZpZyhcbiAgICAgICAgICBzZXJ2aWNlLnNjYWxpbmdcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHNlcnZpY2UubmFtZSxcbiAgICAgICAgICBpbWFnZTogc2VydmljZS5pbWFnZSxcbiAgICAgICAgICBjb250YWluZXJzLFxuICAgICAgICAgIGNwdTogc2VydmljZS5jcHUsXG4gICAgICAgICAgbWVtb3J5TGltaXRNaUI6IHNlcnZpY2UubWVtb3J5TGltaXRNaUIsXG4gICAgICAgICAgZGVzaXJlZENvdW50OiBzZXJ2aWNlLmRlc2lyZWRDb3VudCxcbiAgICAgICAgICBzY2FsaW5nVHlwZSxcbiAgICAgICAgICBtaW5DYXBhY2l0eSxcbiAgICAgICAgICBtYXhDYXBhY2l0eSxcbiAgICAgICAgICByb3V0aW5nOiBzZXJ2aWNlLnJvdXRpbmcsXG4gICAgICAgICAgdGFza1JvbGVJbmxpbmVQb2xpY2llczogc2VydmljZS50YXNrUm9sZUlubGluZVBvbGljaWVzLFxuICAgICAgICAgIHRhc2tSb2xlTWFuYWdlZFBvbGljaWVzOiBzZXJ2aWNlLnRhc2tSb2xlTWFuYWdlZFBvbGljaWVzLFxuICAgICAgICAgIGNvbm5lY3Rpb25zOiBzZXJ2aWNlLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6IHNlcnZpY2UuY2FwYWNpdHlQcm92aWRlcixcbiAgICAgICAgICBlYzJDb25maWc6IHNlcnZpY2UuZWMyQ29uZmlnLFxuICAgICAgICAgIHNzbVNlY3JldHNQYXRoOiBzZXJ2aWNlLnNzbVNlY3JldHNQYXRoLFxuICAgICAgICAgIGRvY2tlclRhcmdldDogc2VydmljZS5kb2NrZXJUYXJnZXRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQnVpbGQgY2x1c3RlciBjb25maWdcbiAgICBjb25zdCBjbHVzdGVyOiBFY3NDbHVzdGVyUHJvcHNbXCJjbHVzdGVyXCJdID0gcHJvcHMuY2x1c3RlclxuICAgICAgPyB7XG4gICAgICAgICAgZG9tYWluOiBwcm9wcy5jbHVzdGVyLmRvbWFpbixcbiAgICAgICAgICBsb2FkQmFsYW5jZXI6IHByb3BzLmNsdXN0ZXIubG9hZEJhbGFuY2VyLFxuICAgICAgICAgIGRpcmVjdEFjY2VzczogcHJvcHMuY2x1c3Rlci5kaXJlY3RBY2Nlc3MsXG4gICAgICAgICAgZG9tYWluQ29uZmlnOiBwcm9wcy5jbHVzdGVyLmRvbWFpbkNvbmZpZ1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVjc1Byb3BzOiBFY3NDbHVzdGVyUHJvcHMgPSB7XG4gICAgICBjbHVzdGVyTmFtZTogYCR7aWR9Q2x1c3RlcmAsXG4gICAgICBhcHBOYW1lOiBwcm9wcy5hcHBOYW1lLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBlY3JSZXBvc2l0b3J5OiBwcm9wcy5lY3JSZXBvc2l0b3J5IHx8IENPTVBVVEVfREVGQVVMVFMuRUNTLkZBTExCQUNLX0lNQUdFLFxuICAgICAgY2x1c3RlcixcbiAgICAgIHNlcnZpY2VzXG4gICAgfTtcblxuICAgIHRoaXMuZWNzQ2x1c3RlciA9IG5ldyBFY3NDbHVzdGVyKHNjb3BlLCBgJHtpZH1FY3NgLCBlY3NQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZWNzQ2x1c3Rlci5jb25uZWN0aW9ucztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEVDUyBjbHVzdGVyLiAqL1xuICBnZXRDbHVzdGVyKCk6IElDbHVzdGVyIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyLmdldENsdXN0ZXIoKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgaWYgb25lIHdhcyBjcmVhdGVkLiAqL1xuICBnZXRMb2FkQmFsYW5jZXIoKTogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyLmdldExvYWRCYWxhbmNlcigpO1xuICB9XG5cbiAgLyoqIEdldCBhIHNwZWNpZmljIHNlcnZpY2UgYnkgbmFtZS4gKi9cbiAgZ2V0U2VydmljZShuYW1lOiBzdHJpbmcpOiBJQmFzZVNlcnZpY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0U2VydmljZShuYW1lKTtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIHNlcnZpY2VzIGluIHRoZSBjbHVzdGVyLiAqL1xuICBnZXRBbGxTZXJ2aWNlcygpOiBJQmFzZVNlcnZpY2VbXSB7XG4gICAgY29uc3Qgc2VydmljZXNNYXAgPSB0aGlzLmVjc0NsdXN0ZXIuZ2V0U2VydmljZXMoKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZXJ2aWNlc01hcC52YWx1ZXMoKSk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBzZWN1cml0eSBncm91cCBmb3IgdGhlIGNsdXN0ZXIuICovXG4gIGdldFNlY3VyaXR5R3JvdXAoKTogSVNlY3VyaXR5R3JvdXAge1xuICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgc2VjdXJpdHkgZ3JvdXAgZnJvbSBjb25uZWN0aW9uc1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gdGhpcy5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3VwcztcbiAgICBpZiAoc2VjdXJpdHlHcm91cHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZWN1cml0eSBncm91cHMgZm91bmQgZm9yIEVDUyBjbHVzdGVyXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2VjdXJpdHlHcm91cHNbMF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBBTEIgbGlzdGVuZXIgaWYgdGhpcyBpcyBhbiBFQ1MgY29tcHV0ZSB3aXRoIEFMQi5cbiAgICovXG4gIGdldExpc3RlbmVyKCk6IEFwcGxpY2F0aW9uTGlzdGVuZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0TGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgRUNTIGNsdXN0ZXIgY29uc3RydWN0LlxuICAgKi9cbiAgZ2V0RWNzQ2x1c3RlcigpOiBFY3NDbHVzdGVyIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBlY3M6RXhlY3V0ZUNvbW1hbmQgcGVybWlzc2lvbiBmb3IgRUNTIHNlcnZpY2VzLlxuICAgKi9cbiAgZ3JhbnRFeGVjdXRlQ29tbWFuZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogW1wiZWNzOkV4ZWN1dGVDb21tYW5kXCJdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXCIqXCJdXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYW1iZGEgY29tcHV0ZSB3cmFwcGVyIGltcGxlbWVudGluZyBJTGFtYmRhQ29tcHV0ZS5cbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBhY2Nlc3MgdG8gTGFtYmRhLXNwZWNpZmljIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUNvbXB1dGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJTGFtYmRhQ29tcHV0ZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb21wdXRlVHlwZSA9IFwibGFtYmRhXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogTGFtYmRhRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElMYW1iZGFDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBoYW5kbGVyLCBydW50aW1lIH0gPSByZXNvbHZlTGFtYmRhRGVwbG95bWVudChwcm9wcyk7XG5cbiAgICAvLyBDb252ZXJ0IHByZXNlbmNlLWJhc2VkIGZ1bmN0aW9uVXJsIGNvbmZpZyB0byBsZWdhY3kgYm9vbGVhbiBmb3JtYXRcbiAgICBjb25zdCBmdW5jdGlvblVybENvbmZpZyA9IHByb3BzLmZ1bmN0aW9uVXJsO1xuICAgIGNvbnN0IGVuYWJsZUZ1bmN0aW9uVXJsID1cbiAgICAgIGZ1bmN0aW9uVXJsQ29uZmlnICE9PSB1bmRlZmluZWQgJiYgZnVuY3Rpb25VcmxDb25maWcgIT09IGZhbHNlO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQXV0aFR5cGUgPVxuICAgICAgZW5hYmxlRnVuY3Rpb25VcmwgJiYgdHlwZW9mIGZ1bmN0aW9uVXJsQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gZnVuY3Rpb25VcmxDb25maWcuYXV0aFR5cGVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxDb3JzID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmNvcnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxJbnZva2VNb2RlID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmludm9rZU1vZGVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBsYW1iZGFQcm9wcyA9IHtcbiAgICAgIGNvZGUsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBydW50aW1lLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogcHJvcHMucm9sZURlc2NyaXB0aW9uLFxuICAgICAgaW5saW5lUG9saWN5OiBwcm9wcy5pbmxpbmVQb2xpY3kgfHwgW10sXG4gICAgICBlbmFibGVGdW5jdGlvblVybCxcbiAgICAgIGZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gICAgICBmdW5jdGlvblVybENvcnMsXG4gICAgICBmdW5jdGlvblVybEludm9rZU1vZGUsXG4gICAgICBzY2hlZHVsZUV4cHJlc3Npb246IHByb3BzLnNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZSxcbiAgICAgIHNlY3JldHM6IHByb3BzLnNlY3JldHMsXG4gICAgICBzc21TZWNyZXRzUGF0aDogcHJvcHMuc3NtU2VjcmV0c1BhdGgsXG4gICAgICBzZWNyZXRzSW1wb3J0OiBwcm9wcy5zZWNyZXRzSW1wb3J0LFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgYXBwTmFtZTogcHJvcHMuYXBwTmFtZSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogaWRcbiAgICB9O1xuXG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzY29wZSwgYCR7aWR9TGFtYmRhYCwgbGFtYmRhUHJvcHMpO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmxhbWJkYUZ1bmN0aW9uLmNvbm5lY3Rpb25zO1xuXG4gICAgLy8gUHJvY2VzcyBjb25uZWN0aW9ucyB1c2luZyB0aGUgdW5pZmllZCBjb25uZWN0b3IgaW50ZXJmYWNlXG4gICAgaWYgKHByb3BzLmNvbm5lY3Rpb25zICYmIHByb3BzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3NDb25uZWN0aW9ucyhcbiAgICAgICAgICBwcm9wcy5jb25uZWN0aW9ucyxcbiAgICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uLCAvLyBJR3JhbnRhYmxlIChleGVjdXRpb24gcm9sZSlcbiAgICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uIC8vIElDb25uZWN0YWJsZSAoc2VjdXJpdHkgZ3JvdXApXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBwcm9jZXNzIGNvbm5lY3Rpb25zIGZvciBMYW1iZGEgJyR7aWR9JzogJHtcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIExhbWJkYSBmdW5jdGlvbiBieSBuYW1lLlxuICAgKiBTaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGZ1bmN0aW9uLCBuYW1lIGlzIGlnbm9yZWQuXG4gICAqL1xuICBnZXRGdW5jdGlvbihfbmFtZT86IHN0cmluZyk6IElGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb247XG4gIH1cblxuICAvKiogR2V0IGFsbCBMYW1iZGEgZnVuY3Rpb25zLiAqL1xuICBnZXRBbGxGdW5jdGlvbnMoKTogSUZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBbdGhpcy5sYW1iZGFGdW5jdGlvbl07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdW5jdGlvbiBVUkwgZm9yIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgZ2V0RnVuY3Rpb25VcmwoX25hbWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYUZ1bmN0aW9uLmdldEZ1bmN0aW9uVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgaW52b2tlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IElHcmFudGFibGUsIF9mdW5jdGlvbk5hbWU/OiBzdHJpbmcpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb24uZ3JhbnRJbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZWN1cml0eSBncm91cCBmb3IgVlBDLWVuYWJsZWQgTGFtYmRhIGZ1bmN0aW9ucy5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIExhbWJkYSBpcyBub3QgVlBDLWVuYWJsZWQuXG4gICAqL1xuICBnZXRTZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZWN1cml0eUdyb3VwcyA9IHRoaXMuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHM7XG4gICAgcmV0dXJuIHNlY3VyaXR5R3JvdXBzLmxlbmd0aCA+IDAgPyBzZWN1cml0eUdyb3Vwc1swXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgTGFtYmRhIGZ1bmN0aW9uIGNvbnN0cnVjdC5cbiAgICovXG4gIGdldExhbWJkYUZ1bmN0aW9uKCk6IExhbWJkYUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFGdW5jdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEVDMiBjb21wdXRlIHdyYXBwZXIgaW1wbGVtZW50aW5nIElFYzJDb21wdXRlLlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byBFQzItc3BlY2lmaWMgcmVzb3VyY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRWMyQ29tcHV0ZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElFYzJDb21wdXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXB1dGVUeXBlID0gXCJlYzJcIiBhcyBjb25zdDtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IGVjMkluc3RhbmNlOiBFYzJJbnN0YW5jZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSUVjMkNvbXB1dGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBlbmFibGVTU0ggPSBwcm9wcy5zc2ggIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zc2ggIT09IGZhbHNlO1xuXG4gICAgY29uc3QgZWMyUHJvcHMgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogYCR7aWR9U2VydmljZWAsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSB8fCBDT01QVVRFX0RFRkFVTFRTLkVDMi5JTlNUQU5DRV9UWVBFLFxuICAgICAgZW5hYmxlU1NILFxuICAgICAgdXNlckRhdGE6IHByb3BzLnVzZXJEYXRhLFxuICAgICAgbWFjaGluZUltYWdlOiBwcm9wcy5tYWNoaW5lSW1hZ2UsXG4gICAgICBtaW5DYXBhY2l0eTogcHJvcHMubWluQ2FwYWNpdHkgfHwgQ09NUFVURV9ERUZBVUxUUy5FQzIuTUlOX0NBUEFDSVRZLFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5IHx8IENPTVBVVEVfREVGQVVMVFMuRUMyLk1BWF9DQVBBQ0lUWSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgc3BvdENhcGFjaXR5UGVyY2VudGFnZTogcHJvcHMuc3BvdENhcGFjaXR5UGVyY2VudGFnZVxuICAgIH07XG5cbiAgICB0aGlzLmVjMkluc3RhbmNlID0gbmV3IEVjMkluc3RhbmNlKHNjb3BlLCBgJHtpZH1FYzJgLCBlYzJQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZWMySW5zdGFuY2UuY29ubmVjdGlvbnM7XG4gIH1cblxuICAvKiogR2V0IHRoZSBBdXRvIFNjYWxpbmcgR3JvdXAuICovXG4gIGdldEF1dG9TY2FsaW5nR3JvdXAoKTogSUF1dG9TY2FsaW5nR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlLmdldEF1dG9TY2FsaW5nR3JvdXAoKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlY3VyaXR5IGdyb3VwLiAqL1xuICBnZXRTZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5lYzJJbnN0YW5jZS5hc2dTZWN1cml0eUdyb3VwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBFQzIgaW5zdGFuY2UgY29uc3RydWN0LlxuICAgKi9cbiAgZ2V0RWMySW5zdGFuY2UoKTogRWMySW5zdGFuY2Uge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlIGd1YXJkcyBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB7IGlzQ29tcHV0ZSwgaXNFY3NDb21wdXRlLCBpc0xhbWJkYUNvbXB1dGUsIGlzRWMyQ29tcHV0ZSB9O1xuZXhwb3J0IHR5cGUgeyBJRWNzQ29tcHV0ZSwgSUxhbWJkYUNvbXB1dGUsIElFYzJDb21wdXRlLCBBbnlDb21wdXRlIH07XG4iXX0=
|