@fjall/components-infrastructure 0.77.4 → 0.78.5
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/dist/lib/app.d.ts +8 -5
- package/dist/lib/app.js +19 -7
- package/dist/lib/patterns/aws/buildkite.js +4 -7
- package/dist/lib/patterns/aws/compute.d.ts +479 -48
- package/dist/lib/patterns/aws/compute.js +307 -94
- package/dist/lib/patterns/aws/database.d.ts +1 -0
- package/dist/lib/patterns/aws/database.js +4 -1
- package/dist/lib/patterns/aws/hostedZone.js +4 -7
- package/dist/lib/patterns/aws/loadBalancer.d.ts +163 -0
- package/dist/lib/patterns/aws/loadBalancer.js +278 -0
- package/dist/lib/patterns/aws/network.d.ts +1 -0
- package/dist/lib/patterns/aws/network.js +2 -1
- package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.d.ts +20 -0
- package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.js +180 -0
- package/dist/lib/resources/aws/compute/ecs.d.ts +294 -57
- package/dist/lib/resources/aws/compute/ecs.js +745 -261
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -1
- package/dist/lib/resources/aws/compute/ecsSpot.js +1 -1
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +20 -0
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +180 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +2 -2
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +2 -1
- package/dist/lib/resources/aws/database/rdsDeletionWaiter.d.ts +33 -0
- package/dist/lib/resources/aws/database/rdsDeletionWaiter.js +74 -0
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsInstance.js +3 -3
- package/dist/lib/resources/aws/networking/vpc.d.ts +1 -0
- package/dist/lib/resources/aws/networking/vpc.js +4 -3
- package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +2 -2
- package/dist/lib/resources/aws/networking/vpcEndpoint.js +1 -1
- package/dist/lib/resources/aws/networking/vpcEndpoints.d.ts +71 -0
- package/dist/lib/resources/aws/networking/vpcEndpoints.js +125 -0
- package/dist/lib/resources/aws/secrets/kms.d.ts +14 -0
- package/dist/lib/resources/aws/secrets/kms.js +5 -2
- package/dist/lib/resources/aws/secrets/secret.js +1 -1
- package/dist/lib/utils/standardTagsAspect.d.ts +26 -12
- package/dist/lib/utils/standardTagsAspect.js +67 -477
- package/dist/lib/utils/tagResource.d.ts +18 -3
- package/dist/lib/utils/tagResource.js +23 -6
- package/package.json +3 -3
- package/dist/lib/aspects/resourceInventory.d.ts +0 -41
- package/dist/lib/aspects/resourceInventory.js +0 -56
- package/dist/lib/config/audit.d.ts +0 -18
- package/dist/lib/config/audit.js +0 -22
- package/dist/lib/patterns/aws/auditRole.d.ts +0 -44
- package/dist/lib/patterns/aws/auditRole.js +0 -58
- package/dist/lib/patterns/aws/basicApp.d.ts +0 -0
- package/dist/lib/patterns/aws/basicApp.js +0 -150
- package/dist/lib/patterns/aws/ec2.d.ts +0 -43
- package/dist/lib/patterns/aws/ec2.js +0 -123
- package/dist/lib/patterns/aws/freeTierApp.d.ts +0 -44
- package/dist/lib/patterns/aws/freeTierApp.js +0 -83
- package/dist/lib/patterns/aws/spotInstanceApp.d.ts +0 -45
- package/dist/lib/patterns/aws/spotInstanceApp.js +0 -85
- package/dist/lib/resources/aws/audit/auditRole.d.ts +0 -32
- package/dist/lib/resources/aws/audit/auditRole.js +0 -46
- package/dist/lib/resources/aws/database/databaseFreeTier.d.ts +0 -15
- package/dist/lib/resources/aws/database/databaseFreeTier.js +0 -29
- package/dist/lib/resources/aws/database/rdsFreeTier.d.ts +0 -37
- package/dist/lib/resources/aws/database/rdsFreeTier.js +0 -84
- package/dist/lib/utils/getCidr.d.ts +0 -8
- package/dist/lib/utils/getCidr.js +0 -40
|
@@ -1,52 +1,207 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Compute = exports.ComputeFactory = void 0;
|
|
3
|
+
exports.Compute = exports.ComputeFactory = exports.HttpMethod = exports.ECS_CAPACITY_PROVIDER_CONFIG = exports.COMPUTE_TYPE_CONFIG = void 0;
|
|
4
|
+
exports.getComputeTypeConfig = getComputeTypeConfig;
|
|
5
|
+
exports.getEcsCapacityProviderConfig = getEcsCapacityProviderConfig;
|
|
4
6
|
const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
|
|
5
7
|
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
6
8
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
7
9
|
const constructs_1 = require("constructs");
|
|
8
10
|
const ecs_1 = require("../../resources/aws/compute/ecs");
|
|
9
|
-
const ecsFreeTier_1 = require("../../resources/aws/compute/ecsFreeTier");
|
|
10
|
-
const ecsSpot_1 = require("../../resources/aws/compute/ecsSpot");
|
|
11
11
|
const ec2_1 = require("../../resources/aws/compute/ec2");
|
|
12
12
|
const lambda_1 = require("../../resources/aws/compute/lambda");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
13
|
+
exports.COMPUTE_TYPE_CONFIG = {
|
|
14
|
+
ecs: {
|
|
15
|
+
defaultPort: 80,
|
|
16
|
+
defaultScaling: { minCapacity: 2, maxCapacity: 5 },
|
|
17
|
+
supportsConnections: true,
|
|
18
|
+
requiresVpc: true
|
|
19
|
+
},
|
|
20
|
+
ec2: {
|
|
21
|
+
defaultPort: 22,
|
|
22
|
+
defaultScaling: { minCapacity: 2, maxCapacity: 3 },
|
|
23
|
+
supportsConnections: true,
|
|
24
|
+
requiresVpc: true
|
|
25
|
+
},
|
|
26
|
+
lambda: {
|
|
27
|
+
defaultPort: 0,
|
|
28
|
+
defaultScaling: { minCapacity: 0, maxCapacity: 100 },
|
|
29
|
+
supportsConnections: false,
|
|
30
|
+
requiresVpc: false
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.ECS_CAPACITY_PROVIDER_CONFIG = {
|
|
34
|
+
FARGATE: {
|
|
35
|
+
usesSpot: false,
|
|
36
|
+
usesEc2Instances: false
|
|
37
|
+
},
|
|
38
|
+
FARGATE_SPOT: {
|
|
39
|
+
usesSpot: true,
|
|
40
|
+
usesEc2Instances: false
|
|
41
|
+
},
|
|
42
|
+
EC2: {
|
|
43
|
+
usesSpot: false,
|
|
44
|
+
usesEc2Instances: true
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
function getComputeTypeConfig(type) {
|
|
48
|
+
return exports.COMPUTE_TYPE_CONFIG[type];
|
|
49
|
+
}
|
|
50
|
+
function getEcsCapacityProviderConfig(provider) {
|
|
51
|
+
return exports.ECS_CAPACITY_PROVIDER_CONFIG[provider];
|
|
52
|
+
}
|
|
53
|
+
// Re-export Lambda types from CDK for user convenience
|
|
54
|
+
var aws_lambda_2 = require("aws-cdk-lib/aws-lambda");
|
|
55
|
+
Object.defineProperty(exports, "HttpMethod", { enumerable: true, get: function () { return aws_lambda_2.HttpMethod; } });
|
|
56
|
+
/**
|
|
57
|
+
* Validates compute props and logs warnings for ignored or misconfigured options.
|
|
58
|
+
* These checks help catch issues when props come from dynamic sources where
|
|
59
|
+
* TypeScript's compile-time checks may not apply.
|
|
60
|
+
*/
|
|
61
|
+
function validateComputeProps(props) {
|
|
62
|
+
const propsAny = props;
|
|
63
|
+
// ECS-specific options on non-ECS compute
|
|
64
|
+
if (props.type !== "ecs") {
|
|
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
|
+
}
|
|
83
|
+
// Lambda-specific options on non-Lambda compute
|
|
84
|
+
if (props.type !== "lambda") {
|
|
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
|
+
}
|
|
98
|
+
// EC2-specific options on non-EC2 compute
|
|
99
|
+
if (props.type !== "ec2") {
|
|
100
|
+
if ("ssh" in propsAny && propsAny.ssh !== undefined) {
|
|
101
|
+
console.warn(`[Fjall] Warning: 'ssh' is ignored for ${props.type} compute. ` +
|
|
102
|
+
"SSH configuration only applies to EC2 compute.");
|
|
28
103
|
}
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
114
|
+
if (props.type === "ecs") {
|
|
115
|
+
validateEcsProps(props);
|
|
116
|
+
}
|
|
31
117
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
118
|
+
/**
|
|
119
|
+
* Validates ECS-specific props.
|
|
120
|
+
* Extracted for clarity and detail parity with database/network patterns.
|
|
121
|
+
*/
|
|
122
|
+
function validateEcsProps(props) {
|
|
123
|
+
// EC2 config validation
|
|
124
|
+
if (props.ec2Config && props.capacityProvider !== "EC2") {
|
|
125
|
+
console.warn("[Fjall] Warning: 'ec2Config' is ignored when capacityProvider is not 'EC2'. " +
|
|
126
|
+
"Set capacityProvider to 'EC2' to use EC2 capacity configuration.");
|
|
127
|
+
}
|
|
128
|
+
// Validate services array exists and is not empty
|
|
129
|
+
if (!props.services || props.services.length === 0) {
|
|
130
|
+
throw new Error("At least one service must be specified in 'services' array.");
|
|
131
|
+
}
|
|
132
|
+
// Validate unique service names
|
|
133
|
+
const serviceNames = props.services.map((s) => s.name);
|
|
134
|
+
const duplicateNames = serviceNames.filter((name, index) => serviceNames.indexOf(name) !== index);
|
|
135
|
+
if (duplicateNames.length > 0) {
|
|
136
|
+
throw new Error(`Duplicate service names: ${[...new Set(duplicateNames)].join(", ")}`);
|
|
137
|
+
}
|
|
138
|
+
// Validate service name format
|
|
139
|
+
const invalidNames = props.services.filter((s) => !/^[a-zA-Z][a-zA-Z0-9-]*$/.test(s.name));
|
|
140
|
+
if (invalidNames.length > 0) {
|
|
141
|
+
throw new Error(`Invalid service names: ${invalidNames.map((s) => s.name).join(", ")}. ` +
|
|
142
|
+
"Service names must start with a letter and contain only letters, numbers, and hyphens.");
|
|
143
|
+
}
|
|
144
|
+
// Validate routing when multiple services have ports
|
|
145
|
+
const servicesWithPorts = props.services.filter((s) => s.containers?.some((c) => c.port));
|
|
146
|
+
if (servicesWithPorts.length > 1) {
|
|
147
|
+
const missingRouting = servicesWithPorts.filter((s) => !s.routing?.path && !s.routing?.host);
|
|
148
|
+
if (missingRouting.length > 0) {
|
|
149
|
+
throw new Error(`Services with ports require routing config when cluster has multiple services: ` +
|
|
150
|
+
`${missingRouting.map((s) => s.name).join(", ")}. ` +
|
|
151
|
+
"Add routing: { path: '/...' } or routing: { host: '...' } to each service.");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Validate each service's containers
|
|
155
|
+
for (const service of props.services) {
|
|
156
|
+
if (service.containers && service.containers.length > 0) {
|
|
157
|
+
// Check for duplicate container names within service (only named containers)
|
|
158
|
+
const containerNames = service.containers
|
|
159
|
+
.filter((c) => c.name)
|
|
160
|
+
.map((c) => c.name);
|
|
161
|
+
const duplicateContainerNames = containerNames.filter((name, index) => containerNames.indexOf(name) !== index);
|
|
162
|
+
if (duplicateContainerNames.length > 0) {
|
|
163
|
+
throw new Error(`Service '${service.name}': Duplicate container names: ` +
|
|
164
|
+
`${[...new Set(duplicateContainerNames)].join(", ")}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
46
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Factory for creating compute resources.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* // Single service cluster
|
|
174
|
+
* app.addCompute(ComputeFactory.build("WebApp", {
|
|
175
|
+
* type: "ecs",
|
|
176
|
+
* cluster: { domain: "app.example.com" },
|
|
177
|
+
* services: [{ name: "web", containers: [{ port: 3000 }] }]
|
|
178
|
+
* }));
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* // Multi-service cluster with routing
|
|
182
|
+
* app.addCompute(ComputeFactory.build("ApiCluster", {
|
|
183
|
+
* type: "ecs",
|
|
184
|
+
* cluster: { domain: "api.example.com" },
|
|
185
|
+
* services: [
|
|
186
|
+
* { name: "users", containers: [{ port: 3000 }], routing: { path: "/users/*" } },
|
|
187
|
+
* { name: "orders", containers: [{ port: 3001 }], routing: { path: "/orders/*" } }
|
|
188
|
+
* ]
|
|
189
|
+
* }));
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* // Worker cluster (no ALB)
|
|
193
|
+
* app.addCompute(ComputeFactory.build("Workers", {
|
|
194
|
+
* type: "ecs",
|
|
195
|
+
* cluster: { loadBalancer: false },
|
|
196
|
+
* services: [
|
|
197
|
+
* { name: "processor", containers: [{ command: ["node", "worker.js"] }] }
|
|
198
|
+
* ]
|
|
199
|
+
* }));
|
|
200
|
+
*/
|
|
47
201
|
class ComputeFactory {
|
|
48
202
|
static build(id, props) {
|
|
49
203
|
return (app, scope) => {
|
|
204
|
+
validateComputeProps(props);
|
|
50
205
|
const computeProps = {
|
|
51
206
|
...{
|
|
52
207
|
vpc: app.getVpc(),
|
|
@@ -67,22 +222,28 @@ class Compute extends constructs_1.Construct {
|
|
|
67
222
|
this.addCompute(props);
|
|
68
223
|
}
|
|
69
224
|
addCompute(props) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
225
|
+
switch (props.type) {
|
|
226
|
+
case "ecs":
|
|
227
|
+
this.addEcsCompute(props);
|
|
228
|
+
break;
|
|
229
|
+
case "ec2":
|
|
230
|
+
this.addEc2Compute(props);
|
|
231
|
+
break;
|
|
232
|
+
case "lambda":
|
|
233
|
+
this.addLambdaCompute(props);
|
|
234
|
+
break;
|
|
235
|
+
default:
|
|
236
|
+
// Exhaustiveness check - TypeScript will error if a case is missing
|
|
237
|
+
const _exhaustive = props;
|
|
238
|
+
throw new Error(`Unsupported compute type: ${_exhaustive.type}`);
|
|
79
239
|
}
|
|
80
240
|
}
|
|
81
241
|
addEc2Compute(props) {
|
|
242
|
+
const enableSSH = props.ssh !== undefined && props.ssh !== false;
|
|
82
243
|
const ec2Props = {
|
|
83
244
|
serviceName: `${this.id}Service`,
|
|
84
245
|
instanceType: props.instanceType || "t3.micro",
|
|
85
|
-
enableSSH
|
|
246
|
+
enableSSH,
|
|
86
247
|
userData: props.userData,
|
|
87
248
|
machineImage: props.machineImage,
|
|
88
249
|
minCapacity: props.minCapacity || 1,
|
|
@@ -91,56 +252,90 @@ class Compute extends constructs_1.Construct {
|
|
|
91
252
|
};
|
|
92
253
|
this.compute = new ec2_1.Ec2Instance(this.scope, `${this.id}Ec2`, ec2Props);
|
|
93
254
|
this.connections = this.compute.connections;
|
|
94
|
-
if (props.connections) {
|
|
95
|
-
for (const conn of props.connections) {
|
|
96
|
-
this.compute.connections.allowToDefaultPort(conn);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
255
|
}
|
|
100
256
|
addEcsCompute(props) {
|
|
101
|
-
const
|
|
102
|
-
//
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
257
|
+
const capacityProvider = props.capacityProvider || "FARGATE";
|
|
258
|
+
// Transform EcsServiceConfig[] to EcsServiceProps[] for EcsCluster
|
|
259
|
+
const services = props.services.map((service) => {
|
|
260
|
+
// Build container configurations for this service
|
|
261
|
+
let containers;
|
|
262
|
+
if (service.containers && service.containers.length > 0) {
|
|
263
|
+
// Map containers, auto-generating names if not provided
|
|
264
|
+
containers = service.containers.map((c, index) => ({
|
|
265
|
+
name: c.name || `${service.name}Container${index > 0 ? index : ""}`,
|
|
266
|
+
image: c.image,
|
|
267
|
+
port: c.port,
|
|
268
|
+
environment: c.environment,
|
|
269
|
+
secretsImport: c.secretsImport,
|
|
270
|
+
command: c.command,
|
|
271
|
+
entryPoint: c.entryPoint,
|
|
272
|
+
essential: c.essential,
|
|
273
|
+
healthCheck: c.healthCheck
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
// Default container (no port = worker)
|
|
278
|
+
containers = [
|
|
279
|
+
{
|
|
280
|
+
name: `${service.name}Container`
|
|
281
|
+
}
|
|
282
|
+
];
|
|
283
|
+
}
|
|
284
|
+
// Determine scaling config
|
|
285
|
+
let scalingType;
|
|
286
|
+
let minCapacity;
|
|
287
|
+
let maxCapacity;
|
|
288
|
+
if (service.scaling !== false && service.scaling !== undefined) {
|
|
289
|
+
scalingType = service.scaling.scalingType ?? ecs_1.ScalingType.CPU;
|
|
290
|
+
minCapacity = service.scaling.minCapacity;
|
|
291
|
+
maxCapacity = service.scaling.maxCapacity;
|
|
292
|
+
}
|
|
293
|
+
else if (service.scaling === undefined) {
|
|
294
|
+
// Default: enable scaling with CPU
|
|
295
|
+
scalingType = ecs_1.ScalingType.CPU;
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
name: service.name,
|
|
299
|
+
image: service.image,
|
|
300
|
+
containers,
|
|
301
|
+
cpu: service.cpu,
|
|
302
|
+
memoryLimitMiB: service.memoryLimitMiB,
|
|
303
|
+
desiredCount: service.desiredCount,
|
|
304
|
+
scalingType,
|
|
305
|
+
minCapacity,
|
|
306
|
+
maxCapacity,
|
|
307
|
+
routing: service.routing,
|
|
308
|
+
taskRoleInlinePolicies: service.taskRoleInlinePolicies,
|
|
309
|
+
taskRoleManagedPolicies: service.taskRoleManagedPolicies,
|
|
310
|
+
connections: service.connections
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
// Build cluster config
|
|
314
|
+
const cluster = props.cluster
|
|
315
|
+
? {
|
|
316
|
+
domain: props.cluster.domain,
|
|
317
|
+
loadBalancer: props.cluster.loadBalancer,
|
|
318
|
+
directAccess: props.cluster.directAccess
|
|
319
|
+
}
|
|
320
|
+
: undefined;
|
|
321
|
+
const ecsProps = {
|
|
107
322
|
clusterName: `${this.id}Cluster`,
|
|
323
|
+
vpc: props.vpc,
|
|
108
324
|
ecrRepository: props.ecrRepository || "amazon/amazon-ecs-sample",
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
325
|
+
capacityProvider,
|
|
326
|
+
ec2Config: capacityProvider === "EC2" ? props.ec2Config : undefined,
|
|
327
|
+
cluster,
|
|
328
|
+
services
|
|
112
329
|
};
|
|
113
|
-
|
|
114
|
-
// Use EC2-based ECS for free tier
|
|
115
|
-
this.compute = new ecsFreeTier_1.default(this.scope, `${this.id}EcsFreeTier`, baseEcsProps);
|
|
116
|
-
}
|
|
117
|
-
else if (ecsType === "spot") {
|
|
118
|
-
// Use EC2 Spot instances for cost optimization
|
|
119
|
-
this.compute = new ecsSpot_1.default(this.scope, `${this.id}EcsSpot`, baseEcsProps);
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
// Default to Fargate
|
|
123
|
-
const fargateProps = {
|
|
124
|
-
...baseEcsProps,
|
|
125
|
-
scalingType: ecs_1.ScalingType.CPU,
|
|
126
|
-
protocol: props.domainConfig ? ecs_1.Protocol.HTTPS : ecs_1.Protocol.HTTP,
|
|
127
|
-
domainConfig: props.domainConfig
|
|
128
|
-
};
|
|
129
|
-
this.compute = new ecs_1.default(this.scope, `${this.id}Fargate`, fargateProps);
|
|
130
|
-
}
|
|
131
|
-
if (props.connections) {
|
|
132
|
-
for (const conn of props.connections) {
|
|
133
|
-
this.compute.connections.allowToDefaultPort(conn);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
330
|
+
this.compute = new ecs_1.default(this.scope, `${this.id}Ecs`, ecsProps);
|
|
136
331
|
this.connections = this.compute.connections;
|
|
137
332
|
}
|
|
138
333
|
addLambdaCompute(props) {
|
|
139
|
-
let code
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
334
|
+
let code;
|
|
335
|
+
let handler;
|
|
336
|
+
let runtime;
|
|
337
|
+
if (props.deployment === "container") {
|
|
338
|
+
// Container-based Lambda using ECR
|
|
144
339
|
if (props.ecrRepository instanceof aws_ecr_1.Repository) {
|
|
145
340
|
code = aws_lambda_1.Code.fromEcrImage(props.ecrRepository, {
|
|
146
341
|
tagOrDigest: "latest"
|
|
@@ -149,20 +344,38 @@ class Compute extends constructs_1.Construct {
|
|
|
149
344
|
else {
|
|
150
345
|
throw new Error("ecrRepository must be a Repository instance for Lambda compute type");
|
|
151
346
|
}
|
|
347
|
+
// Container Lambda requires these special values
|
|
348
|
+
handler = aws_lambda_1.Handler.FROM_IMAGE;
|
|
349
|
+
runtime = aws_lambda_1.Runtime.FROM_IMAGE;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// Code-based Lambda - props.deployment === "code"
|
|
353
|
+
code = props.code;
|
|
354
|
+
handler = props.handler || "index.handler";
|
|
355
|
+
runtime = props.runtime || aws_lambda_1.Runtime.NODEJS_18_X;
|
|
152
356
|
}
|
|
357
|
+
// Convert presence-based functionUrl config to legacy boolean format
|
|
358
|
+
const functionUrlConfig = props.functionUrl;
|
|
359
|
+
const enableFunctionUrl = functionUrlConfig !== undefined && functionUrlConfig !== false;
|
|
360
|
+
const functionUrlAuthType = enableFunctionUrl && typeof functionUrlConfig === "object"
|
|
361
|
+
? functionUrlConfig.authType
|
|
362
|
+
: undefined;
|
|
363
|
+
const functionUrlCors = enableFunctionUrl && typeof functionUrlConfig === "object"
|
|
364
|
+
? functionUrlConfig.cors
|
|
365
|
+
: undefined;
|
|
153
366
|
const lambdaProps = {
|
|
154
367
|
code: code,
|
|
155
|
-
handler
|
|
156
|
-
runtime
|
|
368
|
+
handler,
|
|
369
|
+
runtime,
|
|
157
370
|
timeout: props.timeout,
|
|
158
371
|
memorySize: props.memorySize,
|
|
159
|
-
lambdaDescription: props.
|
|
372
|
+
lambdaDescription: props.description,
|
|
160
373
|
roleDescription: props.roleDescription,
|
|
161
374
|
inlinePolicy: props.inlinePolicy || [],
|
|
162
|
-
enableFunctionUrl
|
|
163
|
-
functionUrlAuthType
|
|
164
|
-
functionUrlCors
|
|
165
|
-
environment: props.
|
|
375
|
+
enableFunctionUrl,
|
|
376
|
+
functionUrlAuthType,
|
|
377
|
+
functionUrlCors,
|
|
378
|
+
environment: props.environment
|
|
166
379
|
};
|
|
167
380
|
this.compute = new lambda_1.LambdaFunction(this.scope, `${this.id}Lambda`, lambdaProps);
|
|
168
381
|
// Lambda functions don't use security groups unless VPC-enabled
|
|
@@ -171,4 +384,4 @@ class Compute extends constructs_1.Construct {
|
|
|
171
384
|
}
|
|
172
385
|
}
|
|
173
386
|
exports.Compute = Compute;
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpREFBaUQ7QUFDakQsaURBTTZCO0FBQzdCLHVEQU1nQztBQUloQywyQ0FBdUM7QUFJdkMseURBS3lDO0FBQ3pDLHlFQUFrRTtBQUNsRSxpRUFBMEQ7QUFDMUQseURBQThEO0FBQzlELCtEQUFvRTtBQW9HcEUsb0VBQW9FO0FBQ3BFLFNBQVMsa0JBQWtCLENBQUMsT0FBMkI7SUFDckQsTUFBTSxTQUFTLEdBQXlDO1FBQ3RELEdBQUcsRUFBRSx1QkFBVSxDQUFDLEdBQUc7UUFDbkIsSUFBSSxFQUFFLHVCQUFVLENBQUMsSUFBSTtRQUNyQixHQUFHLEVBQUUsdUJBQVUsQ0FBQyxHQUFHO1FBQ25CLE1BQU0sRUFBRSx1QkFBVSxDQUFDLE1BQU07UUFDekIsSUFBSSxFQUFFLHVCQUFVLENBQUMsSUFBSTtRQUNyQixPQUFPLEVBQUUsdUJBQVUsQ0FBQyxPQUFPO1FBQzNCLEtBQUssRUFBRSx1QkFBVSxDQUFDLEtBQUs7S0FDeEIsQ0FBQztJQUVGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzVCLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYix3QkFBd0IsTUFBTSx3QkFBd0IsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsU0FBUyxrQkFBa0IsQ0FDekIsY0FBc0M7SUFFdEMsSUFB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LElBQUksS0FBSyxDQUNiLHFFQUFxRSxDQUN0RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRztZQUNsQixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLGVBQWU7WUFDekMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksb0JBQU8sQ0FBQyxXQUFXO1lBQzdDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtZQUMxQyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRTtZQUN0QyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1lBQzFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDOUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDMUQsV0FBVyxFQUFFLEtBQUssQ0FBQyxvQkFBb0I7U0FDeEMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx1QkFBYyxDQUMvQixJQUFJLENBQUMsS0FBSyxFQUNWLEdBQUcsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUNsQixXQUFXLENBQ1osQ0FBQztRQUVGLGdFQUFnRTtRQUNoRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUF4SkQsMEJBd0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBSZXBvc2l0b3J5SW1hZ2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGUsXG4gIHR5cGUgSVZwYyxcbiAgdHlwZSBVc2VyRGF0YSxcbiAgdHlwZSBJTWFjaGluZUltYWdlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBSdW50aW1lLFxuICB0eXBlIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIEh0dHBNZXRob2QsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuXG5pbXBvcnQgRmFyZ2F0ZUNsdXN0ZXIsIHtcbiAgdHlwZSBGYXJnYXRlQ2x1c3RlclByb3BzLFxuICBQcm90b2NvbCxcbiAgU2NhbGluZ1R5cGUsXG4gIHR5cGUgRG9tYWluQ29uZmlnXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2NvbXB1dGUvZWNzXCI7XG5pbXBvcnQgRWNzRnJlZVRpZXIgZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3NGcmVlVGllclwiO1xuaW1wb3J0IEVjc1Nwb3QgZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3NTcG90XCI7XG5pbXBvcnQgeyBFYzJJbnN0YW5jZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2NvbXB1dGUvZWMyXCI7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2NvbXB1dGUvbGFtYmRhXCI7XG5pbXBvcnQgeyB0eXBlIFNlY3JldEltcG9ydCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3NlY3JldHNcIjtcblxuLy8gVXNlci1mcmllbmRseSBIVFRQIG1ldGhvZCB0eXBlXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kU3RyaW5nID1cbiAgfCBcIkdFVFwiXG4gIHwgXCJQT1NUXCJcbiAgfCBcIlBVVFwiXG4gIHwgXCJERUxFVEVcIlxuICB8IFwiSEVBRFwiXG4gIHwgXCJPUFRJT05TXCJcbiAgfCBcIlBBVENIXCI7XG5cbi8vIFVzZXItZnJpZW5kbHkgQ09SUyBvcHRpb25zIHRoYXQgYWNjZXB0IHN0cmluZyBtZXRob2RzXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsaWZpZWRDb3JzT3B0aW9ucyB7XG4gIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG4gIGFsbG93ZWRNZXRob2RzPzogSHR0cE1ldGhvZFN0cmluZ1tdO1xuICBhbGxvd2VkSGVhZGVycz86IHN0cmluZ1tdO1xuICBtYXhBZ2U/OiBEdXJhdGlvbjtcbiAgYWxsb3dDcmVkZW50aWFscz86IGJvb2xlYW47XG4gIGV4cG9zZUhlYWRlcnM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIElDb21wdXRlUHJvcHMge1xuICB2cGM/OiBJVnBjO1xuICBlY3JSZXBvc2l0b3J5PzogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcblxuICAvLyBDb21wdXRlIHR5cGUgc2VsZWN0aW9uXG4gIHR5cGU/OiBcImVjc1wiIHwgXCJlYzJcIiB8IFwibGFtYmRhXCI7XG5cbiAgLy8gRUNTIHN1YnR5cGUgc2VsZWN0aW9uIChvbmx5IGFwcGxpY2FibGUgd2hlbiB0eXBlIGlzIFwiZWNzXCIpXG4gIGVjc1R5cGU/OiBcImZhcmdhdGVcIiB8IFwiZnJlZXRpZXJcIiB8IFwic3BvdFwiO1xuXG4gIC8vIEVDUy1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gIHBhcmVudERvbWFpbj86IHN0cmluZztcbiAgZG9tYWluQ29uZmlnPzogRG9tYWluQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgZm9yIGJ1aWxkaW5nIGN1c3RvbSBpbWFnZS5cbiAgICogTm90ZTogVGhpcyBpcyBtZXRhZGF0YSBmb3IgdGhlIENMSSBidWlsZCBwcm9jZXNzLFxuICAgKiBub3QgdXNlZCBkdXJpbmcgQ0RLIHN5bnRoZXNpc1xuICAgKi9cbiAgZG9ja2VyZmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBvcnQgdGhlIGNvbnRhaW5lciBsaXN0ZW5zIG9uIChkZWZhdWx0OiA4MClcbiAgICovXG4gIGNvbnRhaW5lclBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENQVSB1bml0cyBmb3IgRmFyZ2F0ZSB0YXNrcyAoMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTYpXG4gICAqL1xuICBjcHU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1lbW9yeSBpbiBNaUIgZm9yIEZhcmdhdGUgdGFza3MgKDUxMi0zMDcyMClcbiAgICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubW5ldCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyXG4gICAqL1xuICBjb250YWluZXJFbnZpcm9ubWVudD86IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNhZmVseSBpbXBvcnQgc2VjcmV0cyBmcm9tIGFub3RoZXIgcmVzb3VyY2UsXG4gICAqICBvYmplY3Qga2V5IGlzIHVzZWQgYXMgbmFtZSB3aGVuIHBhc3NpbmcgdG8gY29udGFpbmVyXG4gICAqL1xuICBjb250YWluZXJTZWNyZXRzSW1wb3J0Pzoge1xuICAgIFtrZXk6IHN0cmluZ106IFNlY3JldEltcG9ydDtcbiAgfTtcblxuICAvLyBFQzItc3BlY2lmaWMgcHJvcGVydGllc1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIGVuYWJsZVNTSD86IGJvb2xlYW47XG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcblxuICAvLyBMYW1iZGEtc3BlY2lmaWMgcHJvcGVydGllc1xuICBydW50aW1lPzogUnVudGltZTtcbiAgaGFuZGxlcj86IHN0cmluZztcbiAgY29kZT86IENvZGU7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIGxhbWJkYURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlubGluZVBvbGljeT86IFBvbGljeVN0YXRlbWVudFtdO1xuXG4gIC8vIExhbWJkYSBVUkwgcHJvcGVydGllc1xuICBlbmFibGVGdW5jdGlvblVybD86IGJvb2xlYW47XG4gIGZ1bmN0aW9uVXJsQXV0aFR5cGU/OiBGdW5jdGlvblVybEF1dGhUeXBlO1xuICBmdW5jdGlvblVybENvcnM/OiBTaW1wbGlmaWVkQ29yc09wdGlvbnM7XG5cbiAgY29ubmVjdGlvbnM/OiBJQ29ubmVjdGFibGVbXTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgc3RyaW5nIEhUVFAgbWV0aG9kcyB0byBIdHRwTWV0aG9kIGVudW1cbmZ1bmN0aW9uIGNvbnZlcnRIdHRwTWV0aG9kcyhtZXRob2RzOiBIdHRwTWV0aG9kU3RyaW5nW10pOiBIdHRwTWV0aG9kW10ge1xuICBjb25zdCBtZXRob2RNYXA6IFJlY29yZDxIdHRwTWV0aG9kU3RyaW5nLCBIdHRwTWV0aG9kPiA9IHtcbiAgICBHRVQ6IEh0dHBNZXRob2QuR0VULFxuICAgIFBPU1Q6IEh0dHBNZXRob2QuUE9TVCxcbiAgICBQVVQ6IEh0dHBNZXRob2QuUFVULFxuICAgIERFTEVURTogSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgSEVBRDogSHR0cE1ldGhvZC5IRUFELFxuICAgIE9QVElPTlM6IEh0dHBNZXRob2QuT1BUSU9OUyxcbiAgICBQQVRDSDogSHR0cE1ldGhvZC5QQVRDSFxuICB9O1xuXG4gIHJldHVybiBtZXRob2RzLm1hcCgobWV0aG9kKSA9PiB7XG4gICAgY29uc3QgaHR0cE1ldGhvZCA9IG1ldGhvZE1hcFttZXRob2RdO1xuICAgIGlmICghaHR0cE1ldGhvZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBIVFRQIG1ldGhvZDogJHttZXRob2R9LiBWYWxpZCBtZXRob2RzIGFyZTogJHtPYmplY3Qua2V5cyhtZXRob2RNYXApLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gaHR0cE1ldGhvZDtcbiAgfSk7XG59XG5cbi8vIENvbnZlcnQgc2ltcGxpZmllZCBDT1JTIG9wdGlvbnMgdG8gQ0RLIENPUlMgb3B0aW9uc1xuZnVuY3Rpb24gY29udmVydENvcnNPcHRpb25zKFxuICBzaW1wbGlmaWVkQ29ycz86IFNpbXBsaWZpZWRDb3JzT3B0aW9uc1xuKTogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc2ltcGxpZmllZENvcnMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkT3JpZ2luczogc2ltcGxpZmllZENvcnMuYWxsb3dlZE9yaWdpbnMsXG4gICAgYWxsb3dlZE1ldGhvZHM6IHNpbXBsaWZpZWRDb3JzLmFsbG93ZWRNZXRob2RzXG4gICAgICA/IGNvbnZlcnRIdHRwTWV0aG9kcyhzaW1wbGlmaWVkQ29ycy5hbGxvd2VkTWV0aG9kcylcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGFsbG93ZWRIZWFkZXJzOiBzaW1wbGlmaWVkQ29ycy5hbGxvd2VkSGVhZGVycyxcbiAgICBtYXhBZ2U6IHNpbXBsaWZpZWRDb3JzLm1heEFnZSxcbiAgICBhbGxvd0NyZWRlbnRpYWxzOiBzaW1wbGlmaWVkQ29ycy5hbGxvd0NyZWRlbnRpYWxzLFxuICAgIGV4cG9zZWRIZWFkZXJzOiBzaW1wbGlmaWVkQ29ycy5leHBvc2VIZWFkZXJzXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbXB1dGVQcm9wcyA9IHtcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogYXBwLmdldFZwYygpLFxuICAgICAgICAgIGVjclJlcG9zaXRvcnk6IGFwcC5nZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKVxuICAgICAgICB9LFxuICAgICAgICAuLi5wcm9wc1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyBDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyBzY29wZTogQ29uc3RydWN0O1xuICBwdWJsaWMgdnBjOiBJVnBjO1xuXG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBjb21wdXRlOlxuICAgIHwgRmFyZ2F0ZUNsdXN0ZXJcbiAgICB8IEVjc0ZyZWVUaWVyXG4gICAgfCBFY3NTcG90XG4gICAgfCBFYzJJbnN0YW5jZVxuICAgIHwgTGFtYmRhRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICB0aGlzLmFkZENvbXB1dGUocHJvcHMpO1xuICB9XG5cbiAgYWRkQ29tcHV0ZShwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIGNvbnN0IGNvbXB1dGVUeXBlID0gcHJvcHMudHlwZSB8fCBcImVjc1wiO1xuXG4gICAgaWYgKGNvbXB1dGVUeXBlID09PSBcImVjMlwiKSB7XG4gICAgICB0aGlzLmFkZEVjMkNvbXB1dGUocHJvcHMpO1xuICAgIH0gZWxzZSBpZiAoY29tcHV0ZVR5cGUgPT09IFwibGFtYmRhXCIpIHtcbiAgICAgIHRoaXMuYWRkTGFtYmRhQ29tcHV0ZShwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRWNzQ29tcHV0ZShwcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRFYzJDb21wdXRlKHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgY29uc3QgZWMyUHJvcHMgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogYCR7dGhpcy5pZH1TZXJ2aWNlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlIHx8IFwidDMubWljcm9cIixcbiAgICAgIGVuYWJsZVNTSDogcHJvcHMuZW5hYmxlU1NIIHx8IGZhbHNlLFxuICAgICAgdXNlckRhdGE6IHByb3BzLnVzZXJEYXRhLFxuICAgICAgbWFjaGluZUltYWdlOiBwcm9wcy5tYWNoaW5lSW1hZ2UsXG4gICAgICBtaW5DYXBhY2l0eTogcHJvcHMubWluQ2FwYWNpdHkgfHwgMSxcbiAgICAgIG1heENhcGFjaXR5OiBwcm9wcy5tYXhDYXBhY2l0eSB8fCAxLFxuICAgICAgdnBjOiBwcm9wcy52cGNcbiAgICB9O1xuXG4gICAgdGhpcy5jb21wdXRlID0gbmV3IEVjMkluc3RhbmNlKHRoaXMuc2NvcGUsIGAke3RoaXMuaWR9RWMyYCwgZWMyUHJvcHMpO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnM7XG5cbiAgICBpZiAocHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29ubiBvZiBwcm9wcy5jb25uZWN0aW9ucykge1xuICAgICAgICB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnMuYWxsb3dUb0RlZmF1bHRQb3J0KGNvbm4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRWNzQ29tcHV0ZShwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIGNvbnN0IGVjc1R5cGUgPSBwcm9wcy5lY3NUeXBlIHx8IFwiZmFyZ2F0ZVwiO1xuXG4gICAgLy8gQ29tbW9uIEVDUyBwcm9wc1xuICAgIGNvbnN0IGJhc2VFY3NQcm9wcyA9IHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgY29udGFpbmVyUG9ydDogcHJvcHMuY29udGFpbmVyUG9ydCB8fCA4MCxcbiAgICAgIHNlcnZpY2VOYW1lOiBgJHt0aGlzLmlkfVNlcnZpY2VgLFxuICAgICAgY2x1c3Rlck5hbWU6IGAke3RoaXMuaWR9Q2x1c3RlcmAsXG4gICAgICBlY3JSZXBvc2l0b3J5OiBwcm9wcy5lY3JSZXBvc2l0b3J5IHx8IFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIsXG4gICAgICBjb250YWluZXJFbnZpcm9ubWVudDogcHJvcHMuY29udGFpbmVyRW52aXJvbm1lbnQgfHwge30sXG4gICAgICBjb250YWluZXJTZWNyZXRzSW1wb3J0OiBwcm9wcy5jb250YWluZXJTZWNyZXRzSW1wb3J0IHx8IHt9LFxuICAgICAgdnBjOiBwcm9wcy52cGNcbiAgICB9O1xuXG4gICAgaWYgKGVjc1R5cGUgPT09IFwiZnJlZXRpZXJcIikge1xuICAgICAgLy8gVXNlIEVDMi1iYXNlZCBFQ1MgZm9yIGZyZWUgdGllclxuICAgICAgdGhpcy5jb21wdXRlID0gbmV3IEVjc0ZyZWVUaWVyKFxuICAgICAgICB0aGlzLnNjb3BlLFxuICAgICAgICBgJHt0aGlzLmlkfUVjc0ZyZWVUaWVyYCxcbiAgICAgICAgYmFzZUVjc1Byb3BzXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZWNzVHlwZSA9PT0gXCJzcG90XCIpIHtcbiAgICAgIC8vIFVzZSBFQzIgU3BvdCBpbnN0YW5jZXMgZm9yIGNvc3Qgb3B0aW1pemF0aW9uXG4gICAgICB0aGlzLmNvbXB1dGUgPSBuZXcgRWNzU3BvdCh0aGlzLnNjb3BlLCBgJHt0aGlzLmlkfUVjc1Nwb3RgLCBiYXNlRWNzUHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIEZhcmdhdGVcbiAgICAgIGNvbnN0IGZhcmdhdGVQcm9wcyA9IHtcbiAgICAgICAgLi4uYmFzZUVjc1Byb3BzLFxuICAgICAgICBzY2FsaW5nVHlwZTogU2NhbGluZ1R5cGUuQ1BVLFxuICAgICAgICBwcm90b2NvbDogcHJvcHMuZG9tYWluQ29uZmlnID8gUHJvdG9jb2wuSFRUUFMgOiBQcm90b2NvbC5IVFRQLFxuICAgICAgICBkb21haW5Db25maWc6IHByb3BzLmRvbWFpbkNvbmZpZ1xuICAgICAgfSBhcyBGYXJnYXRlQ2x1c3RlclByb3BzO1xuXG4gICAgICB0aGlzLmNvbXB1dGUgPSBuZXcgRmFyZ2F0ZUNsdXN0ZXIoXG4gICAgICAgIHRoaXMuc2NvcGUsXG4gICAgICAgIGAke3RoaXMuaWR9RmFyZ2F0ZWAsXG4gICAgICAgIGZhcmdhdGVQcm9wc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29ubiBvZiBwcm9wcy5jb25uZWN0aW9ucykge1xuICAgICAgICB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnMuYWxsb3dUb0RlZmF1bHRQb3J0KGNvbm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGFkZExhbWJkYUNvbXB1dGUocHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBsZXQgY29kZSA9IHByb3BzLmNvZGU7XG5cbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIGlmICghcHJvcHMuZWNyUmVwb3NpdG9yeSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJFaXRoZXIgY29kZSBvciBlY3JSZXBvc2l0b3J5IG11c3QgYmUgcHJvdmlkZWQgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZWNyUmVwb3NpdG9yeSBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHtcbiAgICAgICAgY29kZSA9IENvZGUuZnJvbUVjckltYWdlKHByb3BzLmVjclJlcG9zaXRvcnksIHtcbiAgICAgICAgICB0YWdPckRpZ2VzdDogXCJsYXRlc3RcIlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcImVjclJlcG9zaXRvcnkgbXVzdCBiZSBhIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxhbWJkYVByb3BzID0ge1xuICAgICAgY29kZTogY29kZSxcbiAgICAgIGhhbmRsZXI6IHByb3BzLmhhbmRsZXIgfHwgXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBydW50aW1lOiBwcm9wcy5ydW50aW1lIHx8IFJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBwcm9wcy5sYW1iZGFEZXNjcmlwdGlvbixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogcHJvcHMucm9sZURlc2NyaXB0aW9uLFxuICAgICAgaW5saW5lUG9saWN5OiBwcm9wcy5pbmxpbmVQb2xpY3kgfHwgW10sXG4gICAgICBlbmFibGVGdW5jdGlvblVybDogcHJvcHMuZW5hYmxlRnVuY3Rpb25VcmwsXG4gICAgICBmdW5jdGlvblVybEF1dGhUeXBlOiBwcm9wcy5mdW5jdGlvblVybEF1dGhUeXBlLFxuICAgICAgZnVuY3Rpb25VcmxDb3JzOiBjb252ZXJ0Q29yc09wdGlvbnMocHJvcHMuZnVuY3Rpb25VcmxDb3JzKSxcbiAgICAgIGVudmlyb25tZW50OiBwcm9wcy5jb250YWluZXJFbnZpcm9ubWVudFxuICAgIH07XG5cbiAgICB0aGlzLmNvbXB1dGUgPSBuZXcgTGFtYmRhRnVuY3Rpb24oXG4gICAgICB0aGlzLnNjb3BlLFxuICAgICAgYCR7dGhpcy5pZH1MYW1iZGFgLFxuICAgICAgbGFtYmRhUHJvcHNcbiAgICApO1xuXG4gICAgLy8gTGFtYmRhIGZ1bmN0aW9ucyBkb24ndCB1c2Ugc2VjdXJpdHkgZ3JvdXBzIHVubGVzcyBWUEMtZW5hYmxlZFxuICAgIC8vIENyZWF0ZSBlbXB0eSBjb25uZWN0aW9ucyBvYmplY3QgZm9yIGludGVyZmFjZSBjb21wYXRpYmlsaXR5XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucygpO1xuICB9XG59XG4iXX0=
|
|
387
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3R0Esb0RBRUM7QUFFRCxvRUFJQztBQS9HRCxpREFBaUQ7QUFDakQsaURBTTZCO0FBQzdCLHVEQU1nQztBQU9oQywyQ0FBdUM7QUFJdkMseURBSXlDO0FBQ3pDLHlEQUE4RDtBQUM5RCwrREFBb0U7QUF1QnZELFFBQUEsbUJBQW1CLEdBQTJDO0lBQ3pFLEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELG1CQUFtQixFQUFFLElBQUk7UUFDekIsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxXQUFXLEVBQUUsRUFBRTtRQUNmLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtRQUNsRCxtQkFBbUIsRUFBRSxJQUFJO1FBQ3pCLFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLENBQUM7UUFDZCxjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDcEQsbUJBQW1CLEVBQUUsS0FBSztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNuQjtDQUNGLENBQUM7QUFZVyxRQUFBLDRCQUE0QixHQUdyQztJQUNGLE9BQU8sRUFBRTtRQUNQLFFBQVEsRUFBRSxLQUFLO1FBQ2YsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELFlBQVksRUFBRTtRQUNaLFFBQVEsRUFBRSxJQUFJO1FBQ2QsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELEdBQUcsRUFBRTtRQUNILFFBQVEsRUFBRSxLQUFLO1FB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SUFBSSxDQUFDLEVBQUUsUUFBUSxFQUNsQixXQUFXLENBQ1osQ0FBQztRQUVGLGdFQUFnRTtRQUNoRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUEvTUQsMEJBK01DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBSZXBvc2l0b3J5SW1hZ2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGUsXG4gIHR5cGUgSVZwYyxcbiAgdHlwZSBVc2VyRGF0YSxcbiAgdHlwZSBJTWFjaGluZUltYWdlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBSdW50aW1lLFxuICBIYW5kbGVyLFxuICB0eXBlIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBQb2xpY3lTdGF0ZW1lbnQsXG4gIHR5cGUgUG9saWN5RG9jdW1lbnQsXG4gIHR5cGUgSU1hbmFnZWRQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcblxuaW1wb3J0IEVjc0NsdXN0ZXIsIHtcbiAgdHlwZSBFY3NDbHVzdGVyUHJvcHMsXG4gIFNjYWxpbmdUeXBlLFxuICB0eXBlIEVjc0NhcGFjaXR5UHJvdmlkZXIgYXMgRWNzQ2FwYWNpdHlQcm92aWRlclR5cGVcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3NcIjtcbmltcG9ydCB7IEVjMkluc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lYzJcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGFcIjtcbmltcG9ydCB7IHR5cGUgU2VjcmV0SW1wb3J0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc2VjcmV0c1wiO1xuXG5leHBvcnQgdHlwZSBDb21wdXRlVHlwZSA9IFwiZWNzXCIgfCBcImVjMlwiIHwgXCJsYW1iZGFcIjtcbmV4cG9ydCB0eXBlIEVjc0NhcGFjaXR5UHJvdmlkZXIgPSBcIkZBUkdBVEVcIiB8IFwiRkFSR0FURV9TUE9UXCIgfCBcIkVDMlwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZGVmYXVsdHMgZm9yIGVhY2ggY29tcHV0ZSB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVUeXBlQ29uZmlnIHtcbiAgLyoqIERlZmF1bHQgcG9ydCBmb3IgdGhlIGNvbXB1dGUgdHlwZS4gRUNTOiA4MCwgRUMyOiAyMiwgTGFtYmRhOiAwIChubyBwb3J0KSAqL1xuICBkZWZhdWx0UG9ydDogbnVtYmVyO1xuICAvKiogRGVmYXVsdCBzY2FsaW5nIGxpbWl0cyAqL1xuICBkZWZhdWx0U2NhbGluZzoge1xuICAgIG1pbkNhcGFjaXR5OiBudW1iZXI7XG4gICAgbWF4Q2FwYWNpdHk6IG51bWJlcjtcbiAgfTtcbiAgLyoqIFdoZXRoZXIgdGhpcyBjb21wdXRlIHR5cGUgc3VwcG9ydHMgc2VjdXJpdHkgZ3JvdXAgY29ubmVjdGlvbnMgKi9cbiAgc3VwcG9ydHNDb25uZWN0aW9uczogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBjb21wdXRlIHR5cGUgcmVxdWlyZXMgYSBWUEMgKi9cbiAgcmVxdWlyZXNWcGM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBDT01QVVRFX1RZUEVfQ09ORklHOiBSZWNvcmQ8Q29tcHV0ZVR5cGUsIENvbXB1dGVUeXBlQ29uZmlnPiA9IHtcbiAgZWNzOiB7XG4gICAgZGVmYXVsdFBvcnQ6IDgwLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAyLCBtYXhDYXBhY2l0eTogNSB9LFxuICAgIHN1cHBvcnRzQ29ubmVjdGlvbnM6IHRydWUsXG4gICAgcmVxdWlyZXNWcGM6IHRydWVcbiAgfSxcbiAgZWMyOiB7XG4gICAgZGVmYXVsdFBvcnQ6IDIyLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAyLCBtYXhDYXBhY2l0eTogMyB9LFxuICAgIHN1cHBvcnRzQ29ubmVjdGlvbnM6IHRydWUsXG4gICAgcmVxdWlyZXNWcGM6IHRydWVcbiAgfSxcbiAgbGFtYmRhOiB7XG4gICAgZGVmYXVsdFBvcnQ6IDAsXG4gICAgZGVmYXVsdFNjYWxpbmc6IHsgbWluQ2FwYWNpdHk6IDAsIG1heENhcGFjaXR5OiAxMDAgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiBmYWxzZSxcbiAgICByZXF1aXJlc1ZwYzogZmFsc2VcbiAgfVxufTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBFQ1MgY2FwYWNpdHkgcHJvdmlkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICAvKiogV2hldGhlciB0aGlzIHVzZXMgU3BvdCBwcmljaW5nICovXG4gIHVzZXNTcG90OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGlzIHJ1bnMgb24gRUMyIGluc3RhbmNlcyAodnMgc2VydmVybGVzcyBGYXJnYXRlKSAqL1xuICB1c2VzRWMySW5zdGFuY2VzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJRzogUmVjb3JkPFxuICBFY3NDYXBhY2l0eVByb3ZpZGVyLFxuICBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnXG4+ID0ge1xuICBGQVJHQVRFOiB7XG4gICAgdXNlc1Nwb3Q6IGZhbHNlLFxuICAgIHVzZXNFYzJJbnN0YW5jZXM6IGZhbHNlXG4gIH0sXG4gIEZBUkdBVEVfU1BPVDoge1xuICAgIHVzZXNTcG90OiB0cnVlLFxuICAgIHVzZXNFYzJJbnN0YW5jZXM6IGZhbHNlXG4gIH0sXG4gIEVDMjoge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiB0cnVlXG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wdXRlVHlwZUNvbmZpZyh0eXBlOiBDb21wdXRlVHlwZSk6IENvbXB1dGVUeXBlQ29uZmlnIHtcbiAgcmV0dXJuIENPTVBVVEVfVFlQRV9DT05GSUdbdHlwZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnKFxuICBwcm92aWRlcjogRWNzQ2FwYWNpdHlQcm92aWRlclxuKTogRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyB7XG4gIHJldHVybiBFQ1NfQ0FQQUNJVFlfUFJPVklERVJfQ09ORklHW3Byb3ZpZGVyXTtcbn1cblxuLy8gUmUtZXhwb3J0IExhbWJkYSB0eXBlcyBmcm9tIENESyBmb3IgdXNlciBjb252ZW5pZW5jZVxuZXhwb3J0IHtcbiAgSHR0cE1ldGhvZCxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBjb250YWluZXIgaW4gYW4gRUNTIHRhc2suXG4gKlxuICogRm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMsIGBuYW1lYCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gYCR7c2VydmljZU5hbWV9Q29udGFpbmVyYC5cbiAqIEZvciBtdWx0aS1jb250YWluZXIgdGFza3MsIHRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIGBwb3J0YCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gKiB0aGF0IHJlY2VpdmVzIGxvYWQgYmFsYW5jZXIgdHJhZmZpYy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIGNvbnRhaW5lciAobmFtZSBhdXRvLWdlbmVyYXRlZClcbiAqIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktY29udGFpbmVyIHdpdGggc2lkZWNhcnNcbiAqIGNvbnRhaW5lcnM6IFtcbiAqICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sICAgICAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IC0gcmVjZWl2ZXMgQUxCIHRyYWZmaWNcbiAqICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH0gICAgIC8vIFNpZGVjYXIgLSBtb25pdG9yaW5nXG4gKiBdXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqIENvbnRhaW5lciBuYW1lLiBPcHRpb25hbCBmb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcy4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZS4gT3B0aW9uczpcbiAgICogLSBPbWl0OiBVc2VzIGFwcCdzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnkgKHByaW1hcnkgY29udGFpbmVyIG9ubHkpXG4gICAqIC0gc3RyaW5nOiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIHB1YmxpYyBpbWFnZSBVUkxcbiAgICogLSBSZXBvc2l0b3J5OiBDREsgRUNSIFJlcG9zaXRvcnkgY29uc3RydWN0XG4gICAqL1xuICBpbWFnZT86IHN0cmluZyB8IFJlcG9zaXRvcnk7XG4gIC8qKlxuICAgKiBQb3J0IHRoZSBjb250YWluZXIgbGlzdGVucyBvbi5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBiZWNvbWVzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAgICogYW5kIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogU2VjcmV0cyBpbXBvcnRlZCBmcm9tIG90aGVyIHJlc291cmNlcyAqL1xuICBzZWNyZXRzSW1wb3J0PzogUmVjb3JkPHN0cmluZywgU2VjcmV0SW1wb3J0PjtcbiAgLyoqIENvbW1hbmQgdG8gcnVuIGluIHRoZSBjb250YWluZXIgKi9cbiAgY29tbWFuZD86IHN0cmluZ1tdO1xuICAvKiogRW50cnkgcG9pbnQgZm9yIHRoZSBjb250YWluZXIgKi9cbiAgZW50cnlQb2ludD86IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGNvbnRhaW5lciBpcyBlc3NlbnRpYWwuXG4gICAqIElmIGFuIGVzc2VudGlhbCBjb250YWluZXIgc3RvcHMsIGFsbCBjb250YWluZXJzIGluIHRoZSB0YXNrIHN0b3AuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIGVzc2VudGlhbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBIZWFsdGggY2hlY2sgY29uZmlndXJhdGlvbi5cbiAgICogRGVmYXVsdDogRm9yIHByaW1hcnkgY29udGFpbmVyIHdpdGggcG9ydCwgdXNlcyBjdXJsIGhlYWx0aCBjaGVjay5cbiAgICovXG4gIGhlYWx0aENoZWNrPzoge1xuICAgIGNvbW1hbmQ6IHN0cmluZ1tdO1xuICAgIGludGVydmFsPzogbnVtYmVyO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgcmV0cmllcz86IG51bWJlcjtcbiAgICBzdGFydFBlcmlvZD86IG51bWJlcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBFQ1Mgc2NhbGluZyBjb25maWd1cmF0aW9uLlxuICogLSBPbWl0OiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gKiAtIGB7IG1pbkNhcGFjaXR5OiAyLCBtYXhDYXBhY2l0eTogMTAgfWA6IGN1c3RvbSBzY2FsaW5nXG4gKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NTY2FsaW5nQ29uZmlnIHtcbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xuICBzY2FsaW5nVHlwZT86IFNjYWxpbmdUeXBlO1xufVxuXG4vKipcbiAqIEVDMiBjYXBhY2l0eSBjb25maWd1cmF0aW9uIGZvciBFQ1MgRUMyLWJhY2tlZCBjbHVzdGVycy5cbiAqIE9ubHkgdXNlZCB3aGVuIGNhcGFjaXR5UHJvdmlkZXIgaXMgXCJFQzJcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFYzJDYXBhY2l0eUNvbmZpZyB7XG4gIC8qKiBFQzIgaW5zdGFuY2UgdHlwZS4gRGVmYXVsdDogXCJ0My5taWNyb1wiICovXG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcbiAgLyoqIEFNSSBoYXJkd2FyZSB0eXBlLiBEZWZhdWx0OiBcIkFSTVwiIChHcmF2aXRvbiAtIGJldHRlciBjb3N0L3BlcmZvcm1hbmNlKSAqL1xuICBhbWlIYXJkd2FyZVR5cGU/OiBcIkFSTVwiIHwgXCJTVEFOREFSRFwiO1xuICAvKiogTWluaW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAxICovXG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAzICovXG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogRGVzaXJlZCBudW1iZXIgb2YgRUMyIGluc3RhbmNlcy4gRGVmYXVsdDogMiAoZm9yIGF2YWlsYWJpbGl0eSkgKi9cbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuICAvKiogTWVtb3J5IGxpbWl0IGluIE1pQiBmb3IgdGhlIGNvbnRhaW5lci4gRGVmYXVsdDogMTAyNCAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDbHVzdGVyLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDbHVzdGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERvbWFpbiBmb3IgSFRUUFMgYWNjZXNzLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBETlMgKCouZWxiLmFtYXpvbmF3cy5jb20pXG4gICAqIC0gU3BlY2lmaWVkOiBDcmVhdGVzIEFDTSBjZXJ0aWZpY2F0ZSArIFJvdXRlNTMgRE5TIEEgcmVjb3JkXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0IG9yIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICogLSBmYWxzZTogTm8gQUxCIChmb3Igd29ya2Vycy9iYWNrZ3JvdW5kIHByb2Nlc3NvcnMpXG4gICAqL1xuICBsb2FkQmFsYW5jZXI/OiBmYWxzZSB8IFwicHVibGljXCIgfCBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkaXJlY3QgRUMyIGFjY2VzcyB3aXRob3V0IEFMQi5cbiAgICogVXNlcyBob3N0IG5ldHdvcmsgbW9kZSBmb3IgcHJlZGljdGFibGUgcG9ydHMuXG4gICAqIEFjY2VzcyB2aWEgRUMyIHB1YmxpYyBJUCBhdCBjb250YWluZXIgcG9ydC5cbiAgICovXG4gIGRpcmVjdEFjY2Vzcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUm91dGluZyBjb25maWd1cmF0aW9uIGZvciBwYXRoL2hvc3QtYmFzZWQgcm91dGluZyBvbiB0aGUgQUxCLlxuICogUmVxdWlyZWQgd2hlbiBjbHVzdGVyIGhhcyBtdWx0aXBsZSBzZXJ2aWNlcyB3aXRoIHBvcnRzLlxuICogT3B0aW9uYWwgZm9yIHNpbmdsZSBzZXJ2aWNlIChnZXRzIGFsbCB0cmFmZmljIGF1dG9tYXRpY2FsbHkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1JvdXRpbmdDb25maWcge1xuICAvKipcbiAgICogUGF0aCBwYXR0ZXJuIGZvciByb3V0aW5nIChlLmcuLCBcIi9hcGkvKlwiLCBcIi91c2Vycy8qXCIpLlxuICAgKiBVc2VzIEFMQiBwYXRoLWJhc2VkIHJvdXRpbmcuXG4gICAqL1xuICBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3N0IGhlYWRlciBmb3Igcm91dGluZyAoZS5nLiwgXCJhcGkuZXhhbXBsZS5jb21cIikuXG4gICAqIFVzZXMgQUxCIGhvc3QtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IGZvciB0aGlzIHJvdXRpbmcgcnVsZSAoMS01MDAwMCkuXG4gICAqIExvd2VyIG51bWJlciA9IGhpZ2hlciBwcmlvcml0eS5cbiAgICogQXV0by1hc3NpZ25lZCBpZiBvbWl0dGVkLlxuICAgKi9cbiAgcHJpb3JpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhlYWx0aCBjaGVjayBwYXRoIGZvciB0aGlzIHNlcnZpY2UncyB0YXJnZXQgZ3JvdXAuXG4gICAqIERlZmF1bHQ6IFwiL1wiXG4gICAqL1xuICBoZWFsdGhDaGVja1BhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXJ2aWNlIGluIGFuIEVDUyBjbHVzdGVyLlxuICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIHNjYWxpbmcgY29uZmlnLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW1wbGUgc2VydmljZVxuICogeyBuYW1lOiBcImFwaVwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2VydmljZSB3aXRoIHJvdXRpbmcgKGZvciBtdWx0aS1zZXJ2aWNlIGNsdXN0ZXJzKVxuICogeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiLCBwcmlvcml0eTogMTAwIH0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggc2lkZWNhcnNcbiAqIHtcbiAqICAgbmFtZTogXCJhcGlcIixcbiAqICAgY29udGFpbmVyczogW1xuICogICAgIHsgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9LFxuICogICAgIHsgbmFtZTogXCJkYXRhZG9nXCIsIGltYWdlOiBcImRhdGFkb2cvYWdlbnRcIiB9XG4gKiAgIF1cbiAqIH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NTZXJ2aWNlQ29uZmlnIHtcbiAgLyoqIFNlcnZpY2UgbmFtZSAodW5pcXVlIHdpdGhpbiBjbHVzdGVyKSAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZSBmb3IgdGhpcyBzZXJ2aWNlIChhcHBsaWVzIHRvIGZpcnN0IGNvbnRhaW5lciB3aXRob3V0IGV4cGxpY2l0IGltYWdlKS5cbiAgICogLSBPbWl0OiBVc2VzIGFwcCdzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnlcbiAgICogLSBzdHJpbmc6IEVDUiByZXBvc2l0b3J5IG5hbWUgb3IgcHVibGljIGltYWdlIFVSTFxuICAgKiAtIFJlcG9zaXRvcnk6IENESyBFQ1IgUmVwb3NpdG9yeSBjb25zdHJ1Y3RcbiAgICovXG4gIGltYWdlPzogc3RyaW5nIHwgUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogQ29udGFpbmVyIGNvbmZpZ3VyYXRpb24ocykgZm9yIHRoaXMgc2VydmljZS5cbiAgICogRm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMsIGNvbnRhaW5lciBuYW1lIGlzIG9wdGlvbmFsIGFuZCBhdXRvLWdlbmVyYXRlZC5cbiAgICogRm9yIG11bHRpLWNvbnRhaW5lciBzZXJ2aWNlcywgdGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBpcyB0aGUgcHJpbWFyeSBjb250YWluZXIuXG4gICAqL1xuICBjb250YWluZXJzPzogRWNzQ29udGFpbmVyQ29uZmlnW107XG5cbiAgLyoqXG4gICAqIFJvdXRpbmcgcnVsZXMgZm9yIHRoaXMgc2VydmljZSBvbiB0aGUgY2x1c3RlcidzIEFMQi5cbiAgICogUmVxdWlyZWQgd2hlbiBjbHVzdGVyIGhhcyBtdWx0aXBsZSBzZXJ2aWNlcyB3aXRoIHBvcnRzLlxuICAgKiBPcHRpb25hbCBmb3Igc2luZ2xlIHNlcnZpY2UgKGdldHMgLyogYXV0b21hdGljYWxseSkuXG4gICAqL1xuICByb3V0aW5nPzogRWNzUm91dGluZ0NvbmZpZztcblxuICAvKiogQ1BVIHVuaXRzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrcyAoMjU2LTQwOTYpICovXG4gIGNwdT86IG51bWJlcjtcblxuICAvKiogTWVtb3J5IGluIE1pQiBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFza3MgKDUxMi0zMDcyMCkgKi9cbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG5cbiAgLyoqIERlc2lyZWQgbnVtYmVyIG9mIHRhc2tzLiBEZWZhdWx0OiAyICovXG4gIGRlc2lyZWRDb3VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogU2NhbGluZyBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9taXQ6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICAgKiAtIGZhbHNlOiBkaXNhYmxlZFxuICAgKi9cbiAgc2NhbGluZz86IEVjc1NjYWxpbmdDb25maWcgfCBmYWxzZTtcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyB0aGlzIHNlcnZpY2UncyBpbWFnZS5cbiAgICogTWV0YWRhdGEgZm9yIENMSSBidWlsZCBwcm9jZXNzLCBub3QgdXNlZCBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAgICovXG4gIGRvY2tlcmZpbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGlubGluZSBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqIFVzZSBmb3Igc2VydmljZS1zcGVjaWZpYyBBV1MgcGVybWlzc2lvbnMgKFMzLCBEeW5hbW9EQiwgU1FTLCBldGMuKS5cbiAgICovXG4gIHRhc2tSb2xlSW5saW5lUG9saWNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBQb2xpY3lEb2N1bWVudD47XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgbWFuYWdlZCBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqL1xuICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llcz86IElNYW5hZ2VkUG9saWN5W107XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGlzIHNlcnZpY2UgbmVlZHMgdG8gY29ubmVjdCB0byAoZS5nLiwgZGF0YWJhc2VzKS5cbiAgICogQ3JlYXRlcyBzZWN1cml0eSBncm91cCBydWxlcyB0byBhbGxvdyB0cmFmZmljIGZyb20gdGhpcyBzZXJ2aWNlLlxuICAgKiBGb2xsb3dzIGxlYXN0LXByaXZpbGVnZSAtIG9ubHkgdGhpcyBzZXJ2aWNlIGdldHMgYWNjZXNzLCBub3QgYWxsIHNlcnZpY2VzIGluIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBPbmx5IGJhY2tlbmQgc2VydmljZSBjb25uZWN0cyB0byBkYXRhYmFzZVxuICAgKiBzZXJ2aWNlczogW1xuICAgKiAgIHsgbmFtZTogXCJmcm9udGVuZFwiIH0sXG4gICAqICAgeyBuYW1lOiBcImJhY2tlbmRcIiwgY29ubmVjdGlvbnM6IFthcHBEYXRhYmFzZV0gfVxuICAgKiBdXG4gICAqL1xuICBjb25uZWN0aW9ucz86IElDb25uZWN0YWJsZVtdO1xufVxuXG4vKipcbiAqIFNTSCBhY2Nlc3MgY29uZmlndXJhdGlvbiBmb3IgRUMyIGluc3RhbmNlcy5cbiAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBhdXRvLWdlbmVyYXRlZCBrZXlcbiAqIC0gYHsga2V5TmFtZTogXCJteS1rZXlcIiB9YDogZW5hYmxlZCB3aXRoIGV4aXN0aW5nIGtleVxuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NoQ29uZmlnIHtcbiAgLyoqIFNTSCBrZXkgcGFpciBuYW1lICovXG4gIGtleU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBBbGxvd2VkIENJRFIgYmxvY2tzIGZvciBTU0ggYWNjZXNzICovXG4gIGFsbG93ZWRDaWRycz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIExhbWJkYSBmdW5jdGlvbiBVUkwgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBJQU0gYXV0aFxuICogLSBgeyBhdXRoVHlwZTogXCJOT05FXCIsIGNvcnM6IHsuLi59IH1gOiBwdWJsaWMgd2l0aCBDT1JTXG4gKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblVybENvbmZpZyB7XG4gIC8qKiBBdXRoZW50aWNhdGlvbiB0eXBlLiBEZWZhdWx0OiBBV1NfSUFNICovXG4gIGF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgLyoqIENPUlMgY29uZmlndXJhdGlvbiAqL1xuICBjb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcbn1cblxuaW50ZXJmYWNlIEJhc2VDb21wdXRlUHJvcHMge1xuICB2cGM/OiBJVnBjO1xufVxuXG4vKipcbiAqIEVDUyBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKiBDcmVhdGVzIGFuIEVDUyBjbHVzdGVyIHdpdGggb25lIG9yIG1vcmUgc2VydmljZXMgc2hhcmluZyBhIGxvYWQgYmFsYW5jZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBzZXJ2aWNlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldlYkFwcFwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwcC5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcIndlYlwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1dXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXNlcnZpY2UgY2x1c3RlciB3aXRoIHJvdXRpbmdcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpQ2x1c3RlclwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwaS5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJbnRlcm5hbCB3b3JrZXJzIChubyBBTEIpXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlcnNcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwicHJvY2Vzc29yXCIgfSwgeyBuYW1lOiBcImVtYWlsZXJcIiB9XVxuICogfSkpO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NvbXB1dGVQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImVjc1wiO1xuXG4gIC8qKlxuICAgKiBDbHVzdGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIENvbnRyb2xzIHRoZSBzaGFyZWQgQUxCIGZvciBhbGwgc2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBzZXR0aW5nc1xuICAgKiAtIGB7IGRvbWFpbjogXCIuLi5cIiB9YDogQUxCIHdpdGggSFRUUFMgKyBETlNcbiAgICogLSBgeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH1gOiBObyBBTEIgKGludGVybmFsIHdvcmtlcnMpXG4gICAqL1xuICBjbHVzdGVyPzogRWNzQ2x1c3RlckNvbmZpZztcblxuICAvKipcbiAgICogU2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLlxuICAgKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZywgYW5kIHRhcmdldCBncm91cC5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKi9cbiAgc2VydmljZXM6IEVjc1NlcnZpY2VDb25maWdbXTtcblxuICAvKipcbiAgICogQ2FwYWNpdHkgcHJvdmlkZXIgZGV0ZXJtaW5lcyBpbmZyYXN0cnVjdHVyZSB0eXBlLlxuICAgKiAtIFwiRkFSR0FURVwiOiBTZXJ2ZXJsZXNzIGNvbnRhaW5lcnMgKGRlZmF1bHQpXG4gICAqIC0gXCJGQVJHQVRFX1NQT1RcIjogU2VydmVybGVzcyB3aXRoIFNwb3QgcHJpY2luZ1xuICAgKiAtIFwiRUMyXCI6IEVDMi1iYWNrZWQgY29udGFpbmVyc1xuICAgKi9cbiAgY2FwYWNpdHlQcm92aWRlcj86IEVjc0NhcGFjaXR5UHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEVDMiBjYXBhY2l0eSBjb25maWd1cmF0aW9uLlxuICAgKiBPbmx5IHVzZWQgd2hlbiBjYXBhY2l0eVByb3ZpZGVyIGlzIFwiRUMyXCIuXG4gICAqL1xuICBlYzJDb25maWc/OiBFYzJDYXBhY2l0eUNvbmZpZztcblxuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgZm9yIGFsbCBzZXJ2aWNlcyAoZGVmYXVsdCBpbWFnZSkuXG4gICAqIEluZGl2aWR1YWwgc2VydmljZXMgY2FuIG92ZXJyaWRlIHdpdGggdGhlaXIgb3duIGBpbWFnZWAgcHJvcGVydHkuXG4gICAqL1xuICBlY3JSZXBvc2l0b3J5PzogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyBjdXN0b20gaW1hZ2UuXG4gICAqIE5vdGU6IFRoaXMgaXMgbWV0YWRhdGEgZm9yIHRoZSBDTEkgYnVpbGQgcHJvY2VzcyxcbiAgICogbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFYzJDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlYzJcIjtcblxuICAvKiogRUMyIGluc3RhbmNlIHR5cGUuIERlZmF1bHQ6IFwidDMubWljcm9cIiAqL1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNTSCBhY2Nlc3MgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0OiBkaXNhYmxlZCAoZGVmYXVsdClcbiAgICogLSBge31gOiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAgICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAqL1xuICBzc2g/OiBTc2hDb25maWcgfCBmYWxzZTtcbiAgLyoqIFVzZXIgZGF0YSBzY3JpcHQgKi9cbiAgdXNlckRhdGE/OiBVc2VyRGF0YTtcbiAgLyoqIE1hY2hpbmUgaW1hZ2UgKEFNSSkgKi9cbiAgbWFjaGluZUltYWdlPzogSU1hY2hpbmVJbWFnZTtcbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMSAqL1xuICBtaW5DYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMSAqL1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYXNlIExhbWJkYSBjb25maWd1cmF0aW9uIHNoYXJlZCBieSBib3RoIGNvbnRhaW5lciBhbmQgY29kZSBkZXBsb3ltZW50cy5cbiAqL1xuaW50ZXJmYWNlIEJhc2VMYW1iZGFQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImxhbWJkYVwiO1xuICAvKiogVGltZW91dCBpbiBzZWNvbmRzLiBEZWZhdWx0OiAzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgc2l6ZSBpbiBNQi4gRGVmYXVsdDogMTI4ICovXG4gIG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gZGVzY3JpcHRpb24gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBkZXNjcmlwdGlvbiAqL1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBJbmxpbmUgSUFNIHBvbGljeSBzdGF0ZW1lbnRzICovXG4gIGlubGluZVBvbGljeT86IFBvbGljeVN0YXRlbWVudFtdO1xuICAvKipcbiAgICogRnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIElBTSBhdXRoXG4gICAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiIH1gOiBwdWJsaWMgYWNjZXNzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb25Vcmw/OiBGdW5jdGlvblVybENvbmZpZyB8IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDb250YWluZXItYmFzZWQgTGFtYmRhIHVzaW5nIEVDUiBpbWFnZS5cbiAqXG4gKiBVc2VzIERvY2tlciBpbWFnZSBmcm9tIEVDUiByZXBvc2l0b3J5LiBIYW5kbGVyIGFuZCBydW50aW1lIGFyZVxuICogYXV0b21hdGljYWxseSBzZXQgdG8gRlJPTV9JTUFHRS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJJbWFnZUxhbWJkYVwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCIsXG4gKiAgIGVjclJlcG9zaXRvcnk6IGFwcC5nZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKVxuICogfSkpO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckxhbWJkYVByb3BzIGV4dGVuZHMgQmFzZUxhbWJkYVByb3BzIHtcbiAgLyoqIENvbnRhaW5lci1iYXNlZCBkZXBsb3ltZW50IHVzaW5nIEVDUiBpbWFnZSAqL1xuICBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiO1xuICAvKiogRUNSIHJlcG9zaXRvcnkgY29udGFpbmluZyB0aGUgTGFtYmRhIGNvbnRhaW5lciBpbWFnZSAqL1xuICBlY3JSZXBvc2l0b3J5OiBSZXBvc2l0b3J5IHwgUmVwb3NpdG9yeUltYWdlO1xufVxuXG4vKipcbiAqIENvZGUtYmFzZWQgTGFtYmRhIHVzaW5nIGlubGluZSBjb2RlIG9yIFMzLlxuICpcbiAqIFVzZXMgdHJhZGl0aW9uYWwgTGFtYmRhIGRlcGxveW1lbnQgd2l0aCBjb2RlLCBoYW5kbGVyLCBhbmQgcnVudGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJDb2RlTGFtYmRhXCIsIHtcbiAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAqICAgZGVwbG95bWVudDogXCJjb2RlXCIsXG4gKiAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KFwiLi9sYW1iZGFcIiksXG4gKiAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICogICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUxhbWJkYVByb3BzIGV4dGVuZHMgQmFzZUxhbWJkYVByb3BzIHtcbiAgLyoqIENvZGUtYmFzZWQgZGVwbG95bWVudCAqL1xuICBkZXBsb3ltZW50OiBcImNvZGVcIjtcbiAgLyoqIExhbWJkYSBjb2RlIChmcm9tIGFzc2V0LCBTMywgb3IgaW5saW5lKSAqL1xuICBjb2RlOiBDb2RlO1xuICAvKiogSGFuZGxlciBmdW5jdGlvbi4gRGVmYXVsdDogXCJpbmRleC5oYW5kbGVyXCIgKi9cbiAgaGFuZGxlcj86IHN0cmluZztcbiAgLyoqIExhbWJkYSBydW50aW1lLiBEZWZhdWx0OiBOT0RFSlNfMThfWCAqL1xuICBydW50aW1lPzogUnVudGltZTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgY29tcHV0ZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gZW5zdXJpbmcgdHlwZS1zYWZlIExhbWJkYSBjb25maWd1cmF0aW9uOlxuICogLSBgZGVwbG95bWVudDogXCJjb250YWluZXJcImAgcmVxdWlyZXMgYGVjclJlcG9zaXRvcnlgXG4gKiAtIGBkZXBsb3ltZW50OiBcImNvZGVcImAgcmVxdWlyZXMgYGNvZGVgIGFuZCBhbGxvd3MgYGhhbmRsZXJgL2BydW50aW1lYFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb250YWluZXItYmFzZWQgTGFtYmRhXG4gKiB7IHR5cGU6IFwibGFtYmRhXCIsIGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCIsIGVjclJlcG9zaXRvcnk6IGVjciB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvZGUtYmFzZWQgTGFtYmRhXG4gKiB7IHR5cGU6IFwibGFtYmRhXCIsIGRlcGxveW1lbnQ6IFwiY29kZVwiLCBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpIH1cbiAqL1xuZXhwb3J0IHR5cGUgTGFtYmRhQ29tcHV0ZVByb3BzID0gQ29udGFpbmVyTGFtYmRhUHJvcHMgfCBDb2RlTGFtYmRhUHJvcHM7XG5cbmV4cG9ydCB0eXBlIElDb21wdXRlUHJvcHMgPVxuICB8IEVjc0NvbXB1dGVQcm9wc1xuICB8IEVjMkNvbXB1dGVQcm9wc1xuICB8IExhbWJkYUNvbXB1dGVQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgY29tcHV0ZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBUaGVzZSBjaGVja3MgaGVscCBjYXRjaCBpc3N1ZXMgd2hlbiBwcm9wcyBjb21lIGZyb20gZHluYW1pYyBzb3VyY2VzIHdoZXJlXG4gKiBUeXBlU2NyaXB0J3MgY29tcGlsZS10aW1lIGNoZWNrcyBtYXkgbm90IGFwcGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbXB1dGVQcm9wcyhwcm9wczogSUNvbXB1dGVQcm9wcyk6IHZvaWQge1xuICBjb25zdCBwcm9wc0FueSA9IHByb3BzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gRUNTLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUVDUyBjb21wdXRlXG4gIGlmIChwcm9wcy50eXBlICE9PSBcImVjc1wiKSB7XG4gICAgaWYgKFxuICAgICAgXCJjYXBhY2l0eVByb3ZpZGVyXCIgaW4gcHJvcHNBbnkgJiZcbiAgICAgIHByb3BzQW55LmNhcGFjaXR5UHJvdmlkZXIgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnY2FwYWNpdHlQcm92aWRlcicgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIkNhcGFjaXR5IHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24gb25seSBhcHBsaWVzIHRvIEVDUyBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXCJlYzJDb25maWdcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5lYzJDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnZWMyQ29uZmlnJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiRUMyIGNhcGFjaXR5IGNvbmZpZ3VyYXRpb24gb25seSBhcHBsaWVzIHRvIEVDUyBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXCJzZXJ2aWNlc1wiIGluIHByb3BzQW55ICYmIHByb3BzQW55LnNlcnZpY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ3NlcnZpY2VzJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiU2VydmljZXMgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUNTIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcImNsdXN0ZXJcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5jbHVzdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ2NsdXN0ZXInIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJDbHVzdGVyIGNvbmZpZ3VyYXRpb24gb25seSBhcHBsaWVzIHRvIEVDUyBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIExhbWJkYS1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1MYW1iZGEgY29tcHV0ZVxuICBpZiAocHJvcHMudHlwZSAhPT0gXCJsYW1iZGFcIikge1xuICAgIGlmIChcImZ1bmN0aW9uVXJsXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkuZnVuY3Rpb25VcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnZnVuY3Rpb25VcmwnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJGdW5jdGlvbiBVUkwgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gTGFtYmRhIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcImhhbmRsZXJcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5oYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ2hhbmRsZXInIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJIYW5kbGVyIGNvbmZpZ3VyYXRpb24gb25seSBhcHBsaWVzIHRvIExhbWJkYSBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXCJydW50aW1lXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkucnVudGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdydW50aW1lJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiUnVudGltZSBjb25maWd1cmF0aW9uIG9ubHkgYXBwbGllcyB0byBMYW1iZGEgY29tcHV0ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBFQzItc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tRUMyIGNvbXB1dGVcbiAgaWYgKHByb3BzLnR5cGUgIT09IFwiZWMyXCIpIHtcbiAgICBpZiAoXCJzc2hcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5zc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnc3NoJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiU1NIIGNvbmZpZ3VyYXRpb24gb25seSBhcHBsaWVzIHRvIEVDMiBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXCJ1c2VyRGF0YVwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LnVzZXJEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ3VzZXJEYXRhJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiVXNlciBkYXRhIG9ubHkgYXBwbGllcyB0byBFQzIgY29tcHV0ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwibWFjaGluZUltYWdlXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkubWFjaGluZUltYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ21hY2hpbmVJbWFnZScgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIk1hY2hpbmUgaW1hZ2Ugb25seSBhcHBsaWVzIHRvIEVDMiBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVDUy1zcGVjaWZpYyB2YWxpZGF0aW9uXG4gIGlmIChwcm9wcy50eXBlID09PSBcImVjc1wiKSB7XG4gICAgdmFsaWRhdGVFY3NQcm9wcyhwcm9wcyBhcyBFY3NDb21wdXRlUHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIEVDUy1zcGVjaWZpYyBwcm9wcy5cbiAqIEV4dHJhY3RlZCBmb3IgY2xhcml0eSBhbmQgZGV0YWlsIHBhcml0eSB3aXRoIGRhdGFiYXNlL25ldHdvcmsgcGF0dGVybnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRWNzUHJvcHMocHJvcHM6IEVjc0NvbXB1dGVQcm9wcyk6IHZvaWQge1xuICAvLyBFQzIgY29uZmlnIHZhbGlkYXRpb25cbiAgaWYgKHByb3BzLmVjMkNvbmZpZyAmJiBwcm9wcy5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbRmphbGxdIFdhcm5pbmc6ICdlYzJDb25maWcnIGlzIGlnbm9yZWQgd2hlbiBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCAnRUMyJy4gXCIgK1xuICAgICAgICBcIlNldCBjYXBhY2l0eVByb3ZpZGVyIHRvICdFQzInIHRvIHVzZSBFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbi5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBzZXJ2aWNlcyBhcnJheSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eVxuICBpZiAoIXByb3BzLnNlcnZpY2VzIHx8IHByb3BzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQXQgbGVhc3Qgb25lIHNlcnZpY2UgbXVzdCBiZSBzcGVjaWZpZWQgaW4gJ3NlcnZpY2VzJyBhcnJheS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB1bmlxdWUgc2VydmljZSBuYW1lc1xuICBjb25zdCBzZXJ2aWNlTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5tYXAoKHMpID0+IHMubmFtZSk7XG4gIGNvbnN0IGR1cGxpY2F0ZU5hbWVzID0gc2VydmljZU5hbWVzLmZpbHRlcihcbiAgICAobmFtZSwgaW5kZXgpID0+IHNlcnZpY2VOYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpbmRleFxuICApO1xuICBpZiAoZHVwbGljYXRlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEdXBsaWNhdGUgc2VydmljZSBuYW1lczogJHtbLi4ubmV3IFNldChkdXBsaWNhdGVOYW1lcyldLmpvaW4oXCIsIFwiKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHNlcnZpY2UgbmFtZSBmb3JtYXRcbiAgY29uc3QgaW52YWxpZE5hbWVzID0gcHJvcHMuc2VydmljZXMuZmlsdGVyKFxuICAgIChzKSA9PiAhL15bYS16QS1aXVthLXpBLVowLTktXSokLy50ZXN0KHMubmFtZSlcbiAgKTtcbiAgaWYgKGludmFsaWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgc2VydmljZSBuYW1lczogJHtpbnZhbGlkTmFtZXMubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBcIlNlcnZpY2UgbmFtZXMgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGh5cGhlbnMuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgcm91dGluZyB3aGVuIG11bHRpcGxlIHNlcnZpY2VzIGhhdmUgcG9ydHNcbiAgY29uc3Qgc2VydmljZXNXaXRoUG9ydHMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgcy5jb250YWluZXJzPy5zb21lKChjKSA9PiBjLnBvcnQpXG4gICk7XG5cbiAgaWYgKHNlcnZpY2VzV2l0aFBvcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBtaXNzaW5nUm91dGluZyA9IHNlcnZpY2VzV2l0aFBvcnRzLmZpbHRlcihcbiAgICAgIChzKSA9PiAhcy5yb3V0aW5nPy5wYXRoICYmICFzLnJvdXRpbmc/Lmhvc3RcbiAgICApO1xuICAgIGlmIChtaXNzaW5nUm91dGluZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTZXJ2aWNlcyB3aXRoIHBvcnRzIHJlcXVpcmUgcm91dGluZyBjb25maWcgd2hlbiBjbHVzdGVyIGhhcyBtdWx0aXBsZSBzZXJ2aWNlczogYCArXG4gICAgICAgICAgYCR7bWlzc2luZ1JvdXRpbmcubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICAgIFwiQWRkIHJvdXRpbmc6IHsgcGF0aDogJy8uLi4nIH0gb3Igcm91dGluZzogeyBob3N0OiAnLi4uJyB9IHRvIGVhY2ggc2VydmljZS5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBlYWNoIHNlcnZpY2UncyBjb250YWluZXJzXG4gIGZvciAoY29uc3Qgc2VydmljZSBvZiBwcm9wcy5zZXJ2aWNlcykge1xuICAgIGlmIChzZXJ2aWNlLmNvbnRhaW5lcnMgJiYgc2VydmljZS5jb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzIHdpdGhpbiBzZXJ2aWNlIChvbmx5IG5hbWVkIGNvbnRhaW5lcnMpXG4gICAgICBjb25zdCBjb250YWluZXJOYW1lcyA9IHNlcnZpY2UuY29udGFpbmVyc1xuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLm5hbWUpXG4gICAgICAgIC5tYXAoKGMpID0+IGMubmFtZSk7XG4gICAgICBjb25zdCBkdXBsaWNhdGVDb250YWluZXJOYW1lcyA9IGNvbnRhaW5lck5hbWVzLmZpbHRlcihcbiAgICAgICAgKG5hbWUsIGluZGV4KSA9PiBjb250YWluZXJOYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpbmRleFxuICAgICAgKTtcbiAgICAgIGlmIChkdXBsaWNhdGVDb250YWluZXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JzogRHVwbGljYXRlIGNvbnRhaW5lciBuYW1lczogYCArXG4gICAgICAgICAgICBgJHtbLi4ubmV3IFNldChkdXBsaWNhdGVDb250YWluZXJOYW1lcyldLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgY29tcHV0ZSByZXNvdXJjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBzZXJ2aWNlIGNsdXN0ZXJcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV2ViQXBwXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBwLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfV1cbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktc2VydmljZSBjbHVzdGVyIHdpdGggcm91dGluZ1xuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJBcGlDbHVzdGVyXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBpLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFtcbiAqICAgICB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIgfSB9LFxuICogICAgIHsgbmFtZTogXCJvcmRlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMSB9XSwgcm91dGluZzogeyBwYXRoOiBcIi9vcmRlcnMvKlwiIH0gfVxuICogICBdXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdvcmtlciBjbHVzdGVyIChubyBBTEIpXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlcnNcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfSxcbiAqICAgc2VydmljZXM6IFtcbiAqICAgICB7IG5hbWU6IFwicHJvY2Vzc29yXCIsIGNvbnRhaW5lcnM6IFt7IGNvbW1hbmQ6IFtcIm5vZGVcIiwgXCJ3b3JrZXIuanNcIl0gfV0gfVxuICogICBdXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wdXRlRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpOiBDb21wdXRlID0+IHtcbiAgICAgIHZhbGlkYXRlQ29tcHV0ZVByb3BzKHByb3BzKTtcblxuICAgICAgY29uc3QgY29tcHV0ZVByb3BzOiBJQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBhcHAuZ2V0VnBjKCksXG4gICAgICAgICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gbmV3IENvbXB1dGUoc2NvcGUsIGlkLCBjb21wdXRlUHJvcHMpO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG5cbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIGNvbXB1dGU6IEVjc0NsdXN0ZXIgfCBFYzJJbnN0YW5jZSB8IExhbWJkYUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuXG4gICAgdGhpcy5hZGRDb21wdXRlKHByb3BzKTtcbiAgfVxuXG4gIGFkZENvbXB1dGUocHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBzd2l0Y2ggKHByb3BzLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlY3NcIjpcbiAgICAgICAgdGhpcy5hZGRFY3NDb21wdXRlKHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZWMyXCI6XG4gICAgICAgIHRoaXMuYWRkRWMyQ29tcHV0ZShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxhbWJkYVwiOlxuICAgICAgICB0aGlzLmFkZExhbWJkYUNvbXB1dGUocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEV4aGF1c3RpdmVuZXNzIGNoZWNrIC0gVHlwZVNjcmlwdCB3aWxsIGVycm9yIGlmIGEgY2FzZSBpcyBtaXNzaW5nXG4gICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IHByb3BzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbXB1dGUgdHlwZTogJHsoX2V4aGF1c3RpdmUgYXMgSUNvbXB1dGVQcm9wcykudHlwZX1gXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRFYzJDb21wdXRlKHByb3BzOiBFYzJDb21wdXRlUHJvcHMpIHtcbiAgICBjb25zdCBlbmFibGVTU0ggPSBwcm9wcy5zc2ggIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zc2ggIT09IGZhbHNlO1xuXG4gICAgY29uc3QgZWMyUHJvcHMgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogYCR7dGhpcy5pZH1TZXJ2aWNlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlIHx8IFwidDMubWljcm9cIixcbiAgICAgIGVuYWJsZVNTSCxcbiAgICAgIHVzZXJEYXRhOiBwcm9wcy51c2VyRGF0YSxcbiAgICAgIG1hY2hpbmVJbWFnZTogcHJvcHMubWFjaGluZUltYWdlLFxuICAgICAgbWluQ2FwYWNpdHk6IHByb3BzLm1pbkNhcGFjaXR5IHx8IDEsXG4gICAgICBtYXhDYXBhY2l0eTogcHJvcHMubWF4Q2FwYWNpdHkgfHwgMSxcbiAgICAgIHZwYzogcHJvcHMudnBjXG4gICAgfTtcblxuICAgIHRoaXMuY29tcHV0ZSA9IG5ldyBFYzJJbnN0YW5jZSh0aGlzLnNjb3BlLCBgJHt0aGlzLmlkfUVjMmAsIGVjMlByb3BzKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFY3NDb21wdXRlKHByb3BzOiBFY3NDb21wdXRlUHJvcHMpIHtcbiAgICBjb25zdCBjYXBhY2l0eVByb3ZpZGVyOiBFY3NDYXBhY2l0eVByb3ZpZGVyVHlwZSA9XG4gICAgICBwcm9wcy5jYXBhY2l0eVByb3ZpZGVyIHx8IFwiRkFSR0FURVwiO1xuXG4gICAgLy8gVHJhbnNmb3JtIEVjc1NlcnZpY2VDb25maWdbXSB0byBFY3NTZXJ2aWNlUHJvcHNbXSBmb3IgRWNzQ2x1c3RlclxuICAgIGNvbnN0IHNlcnZpY2VzOiBFY3NDbHVzdGVyUHJvcHNbXCJzZXJ2aWNlc1wiXSA9IHByb3BzLnNlcnZpY2VzLm1hcChcbiAgICAgIChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIC8vIEJ1aWxkIGNvbnRhaW5lciBjb25maWd1cmF0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlXG4gICAgICAgIGxldCBjb250YWluZXJzOiBFY3NDbHVzdGVyUHJvcHNbXCJzZXJ2aWNlc1wiXVtudW1iZXJdW1wiY29udGFpbmVyc1wiXTtcblxuICAgICAgICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gTWFwIGNvbnRhaW5lcnMsIGF1dG8tZ2VuZXJhdGluZyBuYW1lcyBpZiBub3QgcHJvdmlkZWRcbiAgICAgICAgICBjb250YWluZXJzID0gc2VydmljZS5jb250YWluZXJzLm1hcCgoYywgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBjLm5hbWUgfHwgYCR7c2VydmljZS5uYW1lfUNvbnRhaW5lciR7aW5kZXggPiAwID8gaW5kZXggOiBcIlwifWAsXG4gICAgICAgICAgICBpbWFnZTogYy5pbWFnZSxcbiAgICAgICAgICAgIHBvcnQ6IGMucG9ydCxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBjLmVudmlyb25tZW50LFxuICAgICAgICAgICAgc2VjcmV0c0ltcG9ydDogYy5zZWNyZXRzSW1wb3J0LFxuICAgICAgICAgICAgY29tbWFuZDogYy5jb21tYW5kLFxuICAgICAgICAgICAgZW50cnlQb2ludDogYy5lbnRyeVBvaW50LFxuICAgICAgICAgICAgZXNzZW50aWFsOiBjLmVzc2VudGlhbCxcbiAgICAgICAgICAgIGhlYWx0aENoZWNrOiBjLmhlYWx0aENoZWNrXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERlZmF1bHQgY29udGFpbmVyIChubyBwb3J0ID0gd29ya2VyKVxuICAgICAgICAgIGNvbnRhaW5lcnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBzY2FsaW5nIGNvbmZpZ1xuICAgICAgICBsZXQgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IG1heENhcGFjaXR5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHNlcnZpY2Uuc2NhbGluZyAhPT0gZmFsc2UgJiYgc2VydmljZS5zY2FsaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY2FsaW5nVHlwZSA9IHNlcnZpY2Uuc2NhbGluZy5zY2FsaW5nVHlwZSA/PyBTY2FsaW5nVHlwZS5DUFU7XG4gICAgICAgICAgbWluQ2FwYWNpdHkgPSBzZXJ2aWNlLnNjYWxpbmcubWluQ2FwYWNpdHk7XG4gICAgICAgICAgbWF4Q2FwYWNpdHkgPSBzZXJ2aWNlLnNjYWxpbmcubWF4Q2FwYWNpdHk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZS5zY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBEZWZhdWx0OiBlbmFibGUgc2NhbGluZyB3aXRoIENQVVxuICAgICAgICAgIHNjYWxpbmdUeXBlID0gU2NhbGluZ1R5cGUuQ1BVO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzZXJ2aWNlLm5hbWUsXG4gICAgICAgICAgaW1hZ2U6IHNlcnZpY2UuaW1hZ2UsXG4gICAgICAgICAgY29udGFpbmVycyxcbiAgICAgICAgICBjcHU6IHNlcnZpY2UuY3B1LFxuICAgICAgICAgIG1lbW9yeUxpbWl0TWlCOiBzZXJ2aWNlLm1lbW9yeUxpbWl0TWlCLFxuICAgICAgICAgIGRlc2lyZWRDb3VudDogc2VydmljZS5kZXNpcmVkQ291bnQsXG4gICAgICAgICAgc2NhbGluZ1R5cGUsXG4gICAgICAgICAgbWluQ2FwYWNpdHksXG4gICAgICAgICAgbWF4Q2FwYWNpdHksXG4gICAgICAgICAgcm91dGluZzogc2VydmljZS5yb3V0aW5nLFxuICAgICAgICAgIHRhc2tSb2xlSW5saW5lUG9saWNpZXM6IHNlcnZpY2UudGFza1JvbGVJbmxpbmVQb2xpY2llcyxcbiAgICAgICAgICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llczogc2VydmljZS50YXNrUm9sZU1hbmFnZWRQb2xpY2llcyxcbiAgICAgICAgICBjb25uZWN0aW9uczogc2VydmljZS5jb25uZWN0aW9uc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBCdWlsZCBjbHVzdGVyIGNvbmZpZ1xuICAgIGNvbnN0IGNsdXN0ZXI6IEVjc0NsdXN0ZXJQcm9wc1tcImNsdXN0ZXJcIl0gPSBwcm9wcy5jbHVzdGVyXG4gICAgICA/IHtcbiAgICAgICAgICBkb21haW46IHByb3BzLmNsdXN0ZXIuZG9tYWluLFxuICAgICAgICAgIGxvYWRCYWxhbmNlcjogcHJvcHMuY2x1c3Rlci5sb2FkQmFsYW5jZXIsXG4gICAgICAgICAgZGlyZWN0QWNjZXNzOiBwcm9wcy5jbHVzdGVyLmRpcmVjdEFjY2Vzc1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVjc1Byb3BzOiBFY3NDbHVzdGVyUHJvcHMgPSB7XG4gICAgICBjbHVzdGVyTmFtZTogYCR7dGhpcy5pZH1DbHVzdGVyYCxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZWNyUmVwb3NpdG9yeTogcHJvcHMuZWNyUmVwb3NpdG9yeSB8fCBcImFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVwiLFxuICAgICAgY2FwYWNpdHlQcm92aWRlcixcbiAgICAgIGVjMkNvbmZpZzogY2FwYWNpdHlQcm92aWRlciA9PT0gXCJFQzJcIiA/IHByb3BzLmVjMkNvbmZpZyA6IHVuZGVmaW5lZCxcbiAgICAgIGNsdXN0ZXIsXG4gICAgICBzZXJ2aWNlc1xuICAgIH07XG5cbiAgICB0aGlzLmNvbXB1dGUgPSBuZXcgRWNzQ2x1c3Rlcih0aGlzLnNjb3BlLCBgJHt0aGlzLmlkfUVjc2AsIGVjc1Byb3BzKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRMYW1iZGFDb21wdXRlKHByb3BzOiBMYW1iZGFDb21wdXRlUHJvcHMpIHtcbiAgICBsZXQgY29kZTogQ29kZTtcbiAgICBsZXQgaGFuZGxlcjogc3RyaW5nO1xuICAgIGxldCBydW50aW1lOiBSdW50aW1lO1xuXG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQgPT09IFwiY29udGFpbmVyXCIpIHtcbiAgICAgIC8vIENvbnRhaW5lci1iYXNlZCBMYW1iZGEgdXNpbmcgRUNSXG4gICAgICBpZiAocHJvcHMuZWNyUmVwb3NpdG9yeSBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHtcbiAgICAgICAgY29kZSA9IENvZGUuZnJvbUVjckltYWdlKHByb3BzLmVjclJlcG9zaXRvcnksIHtcbiAgICAgICAgICB0YWdPckRpZ2VzdDogXCJsYXRlc3RcIlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcImVjclJlcG9zaXRvcnkgbXVzdCBiZSBhIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDb250YWluZXIgTGFtYmRhIHJlcXVpcmVzIHRoZXNlIHNwZWNpYWwgdmFsdWVzXG4gICAgICBoYW5kbGVyID0gSGFuZGxlci5GUk9NX0lNQUdFO1xuICAgICAgcnVudGltZSA9IFJ1bnRpbWUuRlJPTV9JTUFHRTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29kZS1iYXNlZCBMYW1iZGEgLSBwcm9wcy5kZXBsb3ltZW50ID09PSBcImNvZGVcIlxuICAgICAgY29kZSA9IHByb3BzLmNvZGU7XG4gICAgICBoYW5kbGVyID0gcHJvcHMuaGFuZGxlciB8fCBcImluZGV4LmhhbmRsZXJcIjtcbiAgICAgIHJ1bnRpbWUgPSBwcm9wcy5ydW50aW1lIHx8IFJ1bnRpbWUuTk9ERUpTXzE4X1g7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBwcmVzZW5jZS1iYXNlZCBmdW5jdGlvblVybCBjb25maWcgdG8gbGVnYWN5IGJvb2xlYW4gZm9ybWF0XG4gICAgY29uc3QgZnVuY3Rpb25VcmxDb25maWcgPSBwcm9wcy5mdW5jdGlvblVybDtcbiAgICBjb25zdCBlbmFibGVGdW5jdGlvblVybCA9XG4gICAgICBmdW5jdGlvblVybENvbmZpZyAhPT0gdW5kZWZpbmVkICYmIGZ1bmN0aW9uVXJsQ29uZmlnICE9PSBmYWxzZTtcbiAgICBjb25zdCBmdW5jdGlvblVybEF1dGhUeXBlID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmF1dGhUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQ29ycyA9XG4gICAgICBlbmFibGVGdW5jdGlvblVybCAmJiB0eXBlb2YgZnVuY3Rpb25VcmxDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBmdW5jdGlvblVybENvbmZpZy5jb3JzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbGFtYmRhUHJvcHMgPSB7XG4gICAgICBjb2RlOiBjb2RlLFxuICAgICAgaGFuZGxlcixcbiAgICAgIHJ1bnRpbWUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogcHJvcHMucm9sZURlc2NyaXB0aW9uLFxuICAgICAgaW5saW5lUG9saWN5OiBwcm9wcy5pbmxpbmVQb2xpY3kgfHwgW10sXG4gICAgICBlbmFibGVGdW5jdGlvblVybCxcbiAgICAgIGZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gICAgICBmdW5jdGlvblVybENvcnMsXG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuZW52aXJvbm1lbnRcbiAgICB9O1xuXG4gICAgdGhpcy5jb21wdXRlID0gbmV3IExhbWJkYUZ1bmN0aW9uKFxuICAgICAgdGhpcy5zY29wZSxcbiAgICAgIGAke3RoaXMuaWR9TGFtYmRhYCxcbiAgICAgIGxhbWJkYVByb3BzXG4gICAgKTtcblxuICAgIC8vIExhbWJkYSBmdW5jdGlvbnMgZG9uJ3QgdXNlIHNlY3VyaXR5IGdyb3VwcyB1bmxlc3MgVlBDLWVuYWJsZWRcbiAgICAvLyBDcmVhdGUgZW1wdHkgY29ubmVjdGlvbnMgb2JqZWN0IGZvciBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoKTtcbiAgfVxufVxuIl19
|