@aws-cdk/aws-imagebuilder-alpha 2.227.0-alpha.0 → 2.229.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +7485 -2916
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +157 -1
- package/README.md +603 -8
- package/awslint.json +6 -1
- package/lib/base-image.d.ts +119 -0
- package/lib/base-image.js +160 -0
- package/lib/component.js +8 -8
- package/lib/container-recipe.d.ts +337 -0
- package/lib/container-recipe.js +451 -0
- package/lib/distribution-configuration.d.ts +11 -0
- package/lib/distribution-configuration.js +14 -3
- package/lib/image-recipe.d.ts +238 -0
- package/lib/image-recipe.js +335 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +6 -1
- package/lib/infrastructure-configuration.js +1 -1
- package/lib/os-version.js +1 -1
- package/lib/recipe-base.d.ts +69 -0
- package/lib/recipe-base.js +27 -0
- package/lib/workflow.d.ts +491 -0
- package/lib/workflow.js +597 -0
- package/package.json +7 -7
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ContainerRecipe = exports.ContainerRecipeBase = exports.S3DockerfileData = exports.DockerfileData = exports.ContainerType = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
const cdk = require("aws-cdk-lib");
|
|
41
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
42
|
+
const aws_imagebuilder_1 = require("aws-cdk-lib/aws-imagebuilder");
|
|
43
|
+
const s3assets = require("aws-cdk-lib/aws-s3-assets");
|
|
44
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
45
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
46
|
+
const CONTAINER_RECIPE_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.ContainerRecipe');
|
|
47
|
+
/**
|
|
48
|
+
* Represents the latest version of a container recipe. When using the recipe in a pipeline, the pipeline will use the
|
|
49
|
+
* latest recipe at the time of execution.
|
|
50
|
+
*
|
|
51
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
|
|
52
|
+
*/
|
|
53
|
+
const LATEST_VERSION = 'x.x.x';
|
|
54
|
+
/**
|
|
55
|
+
* The default version to use in the container recipe. When the recipe is updated, the `x` will be incremented off from
|
|
56
|
+
* the latest recipe version that exists.
|
|
57
|
+
*
|
|
58
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html
|
|
59
|
+
*/
|
|
60
|
+
const DEFAULT_RECIPE_VERSION = '1.0.x';
|
|
61
|
+
/**
|
|
62
|
+
* The type of the container being used in the container recipe
|
|
63
|
+
*/
|
|
64
|
+
var ContainerType;
|
|
65
|
+
(function (ContainerType) {
|
|
66
|
+
/**
|
|
67
|
+
* Indicates the container recipe uses a Docker container
|
|
68
|
+
*/
|
|
69
|
+
ContainerType["DOCKER"] = "DOCKER";
|
|
70
|
+
})(ContainerType || (exports.ContainerType = ContainerType = {}));
|
|
71
|
+
/**
|
|
72
|
+
* Helper class for referencing and uploading dockerfile data for the container recipe
|
|
73
|
+
*/
|
|
74
|
+
class DockerfileData {
|
|
75
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.DockerfileData", version: "2.229.0-alpha.0" };
|
|
76
|
+
/**
|
|
77
|
+
* Uploads dockerfile data from a local file to S3 to use as the dockerfile data
|
|
78
|
+
*
|
|
79
|
+
* @param scope The construct scope
|
|
80
|
+
* @param id Identifier of the construct
|
|
81
|
+
* @param path The local path to the dockerfile data file
|
|
82
|
+
* @param options S3 asset upload options
|
|
83
|
+
*/
|
|
84
|
+
static fromAsset(scope, id, path, options = {}) {
|
|
85
|
+
const asset = new s3assets.Asset(scope, id, { ...options, path });
|
|
86
|
+
return new S3DockerfileDataFromAsset(asset);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* References dockerfile data from a pre-existing S3 object
|
|
90
|
+
*
|
|
91
|
+
* @param bucket The S3 bucket where the dockerfile data is stored
|
|
92
|
+
* @param key The S3 key of the dockerfile data file
|
|
93
|
+
*/
|
|
94
|
+
static fromS3(bucket, key) {
|
|
95
|
+
return new S3DockerfileDataFromBucketKey(bucket, key);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Uses an inline string as the dockerfile data
|
|
99
|
+
*
|
|
100
|
+
* @param data An inline string representing the dockerfile data
|
|
101
|
+
*/
|
|
102
|
+
static fromInline(data) {
|
|
103
|
+
return new InlineDockerfileData(data);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.DockerfileData = DockerfileData;
|
|
107
|
+
/**
|
|
108
|
+
* Helper class for S3-based dockerfile data references, containing additional permission grant methods on the S3 object
|
|
109
|
+
*/
|
|
110
|
+
class S3DockerfileData extends DockerfileData {
|
|
111
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.S3DockerfileData", version: "2.229.0-alpha.0" };
|
|
112
|
+
bucket;
|
|
113
|
+
key;
|
|
114
|
+
constructor(bucket, key) {
|
|
115
|
+
super();
|
|
116
|
+
this.bucket = bucket;
|
|
117
|
+
this.key = key;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The rendered Dockerfile S3 URL, for use in CloudFormation
|
|
121
|
+
*/
|
|
122
|
+
render() {
|
|
123
|
+
return { dockerfileTemplateUri: this.bucket.s3UrlForObject(this.key) };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Grant put permissions to the given grantee for the dockerfile data in S3
|
|
127
|
+
*
|
|
128
|
+
* @param grantee The principal
|
|
129
|
+
*/
|
|
130
|
+
grantPut(grantee) {
|
|
131
|
+
return this.bucket.grantPut(grantee, this.key);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Grant read permissions to the given grantee for the dockerfile data in S3
|
|
135
|
+
*
|
|
136
|
+
* @param grantee The principal
|
|
137
|
+
*/
|
|
138
|
+
grantRead(grantee) {
|
|
139
|
+
return this.bucket.grantRead(grantee, this.key);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.S3DockerfileData = S3DockerfileData;
|
|
143
|
+
class InlineDockerfileData extends DockerfileData {
|
|
144
|
+
data;
|
|
145
|
+
constructor(data) {
|
|
146
|
+
super();
|
|
147
|
+
this.data = data;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The rendered Dockerfile text, for use in CloudFormation
|
|
151
|
+
*/
|
|
152
|
+
render() {
|
|
153
|
+
return { dockerfileTemplateData: this.data };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
class S3DockerfileDataFromBucketKey extends S3DockerfileData {
|
|
157
|
+
constructor(bucket, key) {
|
|
158
|
+
super(bucket, key);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
class S3DockerfileDataFromAsset extends S3DockerfileData {
|
|
162
|
+
constructor(asset) {
|
|
163
|
+
super(asset.bucket, asset.s3ObjectKey);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* A new or imported Container Recipe
|
|
168
|
+
*/
|
|
169
|
+
class ContainerRecipeBase extends cdk.Resource {
|
|
170
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ContainerRecipeBase", version: "2.229.0-alpha.0" };
|
|
171
|
+
/**
|
|
172
|
+
* Grant custom actions to the given grantee for the container recipe
|
|
173
|
+
*
|
|
174
|
+
* @param grantee The principal
|
|
175
|
+
* @param actions The list of actions
|
|
176
|
+
*/
|
|
177
|
+
grant(grantee, ...actions) {
|
|
178
|
+
return iam.Grant.addToPrincipal({
|
|
179
|
+
grantee,
|
|
180
|
+
actions,
|
|
181
|
+
resourceArns: [this.containerRecipeArn],
|
|
182
|
+
scope: this,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Grant read permissions to the given grantee for the container recipe
|
|
187
|
+
*
|
|
188
|
+
* @param grantee The principal
|
|
189
|
+
*/
|
|
190
|
+
grantRead(grantee) {
|
|
191
|
+
return this.grant(grantee, 'imagebuilder:GetContainerRecipe');
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Indicates whether the recipe is a Container Recipe
|
|
195
|
+
*
|
|
196
|
+
* @internal
|
|
197
|
+
*/
|
|
198
|
+
_isContainerRecipe() {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Indicates whether the recipe is an Image Recipe
|
|
203
|
+
*
|
|
204
|
+
* @internal
|
|
205
|
+
*/
|
|
206
|
+
_isImageRecipe() {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.ContainerRecipeBase = ContainerRecipeBase;
|
|
211
|
+
/**
|
|
212
|
+
* Represents an EC2 Image Builder Container Recipe.
|
|
213
|
+
*
|
|
214
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-recipes.html
|
|
215
|
+
*/
|
|
216
|
+
let ContainerRecipe = (() => {
|
|
217
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
218
|
+
let _classDescriptor;
|
|
219
|
+
let _classExtraInitializers = [];
|
|
220
|
+
let _classThis;
|
|
221
|
+
let _classSuper = ContainerRecipeBase;
|
|
222
|
+
let _instanceExtraInitializers = [];
|
|
223
|
+
let _addInstanceBlockDevice_decorators;
|
|
224
|
+
var ContainerRecipe = class extends _classSuper {
|
|
225
|
+
static { _classThis = this; }
|
|
226
|
+
static {
|
|
227
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
228
|
+
_addInstanceBlockDevice_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
229
|
+
__esDecorate(this, null, _addInstanceBlockDevice_decorators, { kind: "method", name: "addInstanceBlockDevice", static: false, private: false, access: { has: obj => "addInstanceBlockDevice" in obj, get: obj => obj.addInstanceBlockDevice }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
230
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
231
|
+
ContainerRecipe = _classThis = _classDescriptor.value;
|
|
232
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
233
|
+
}
|
|
234
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ContainerRecipe", version: "2.229.0-alpha.0" };
|
|
235
|
+
/** Uniquely identifies this class. */
|
|
236
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.ContainerRecipe';
|
|
237
|
+
/**
|
|
238
|
+
* Import an existing container recipe given its ARN.
|
|
239
|
+
*/
|
|
240
|
+
static fromContainerRecipeArn(scope, id, containerRecipeArn) {
|
|
241
|
+
return this.fromContainerRecipeAttributes(scope, id, { containerRecipeArn });
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Import the latest version of an existing container recipe given its name. The provided name must be normalized by
|
|
245
|
+
* converting all alphabetical characters to lowercase, and replacing all spaces and underscores with hyphens.
|
|
246
|
+
*/
|
|
247
|
+
static fromContainerRecipeName(scope, id, containerRecipeName) {
|
|
248
|
+
return this.fromContainerRecipeAttributes(scope, id, { containerRecipeName });
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Import an existing container recipe by providing its attributes. If the container recipe name is provided as an
|
|
252
|
+
* attribute, it must be normalized by converting all alphabetical characters to lowercase, and replacing all spaces
|
|
253
|
+
* and underscores with hyphens.
|
|
254
|
+
*/
|
|
255
|
+
static fromContainerRecipeAttributes(scope, id, attrs) {
|
|
256
|
+
try {
|
|
257
|
+
jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ContainerRecipeAttributes(attrs);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
261
|
+
Error.captureStackTrace(error, this.fromContainerRecipeAttributes);
|
|
262
|
+
}
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
if (!attrs.containerRecipeArn && !attrs.containerRecipeName) {
|
|
266
|
+
throw new cdk.ValidationError('either either containerRecipeArn or containerRecipeName must be provided to import a container recipe', scope);
|
|
267
|
+
}
|
|
268
|
+
const containerRecipeArn = attrs.containerRecipeArn ??
|
|
269
|
+
cdk.Stack.of(scope).formatArn({
|
|
270
|
+
service: 'imagebuilder',
|
|
271
|
+
resource: 'container-recipe',
|
|
272
|
+
resourceName: `${attrs.containerRecipeName}/${attrs.containerRecipeVersion ?? LATEST_VERSION}`,
|
|
273
|
+
});
|
|
274
|
+
const [containerRecipeName, containerRecipeVersion] = (() => {
|
|
275
|
+
if (attrs.containerRecipeName) {
|
|
276
|
+
return [attrs.containerRecipeName, attrs.containerRecipeVersion ?? LATEST_VERSION];
|
|
277
|
+
}
|
|
278
|
+
const containerRecipeNameVersion = cdk.Stack.of(scope).splitArn(containerRecipeArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
|
|
279
|
+
const containerRecipeNameVersionSplit = cdk.Fn.split('/', containerRecipeNameVersion);
|
|
280
|
+
return [cdk.Fn.select(0, containerRecipeNameVersionSplit), cdk.Fn.select(1, containerRecipeNameVersionSplit)];
|
|
281
|
+
})();
|
|
282
|
+
class Import extends ContainerRecipeBase {
|
|
283
|
+
containerRecipeArn = containerRecipeArn;
|
|
284
|
+
containerRecipeName = containerRecipeName;
|
|
285
|
+
containerRecipeVersion = containerRecipeVersion;
|
|
286
|
+
}
|
|
287
|
+
return new Import(scope, id);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Return whether the given object is a ContainerRecipe.
|
|
291
|
+
*/
|
|
292
|
+
static isContainerRecipe(x) {
|
|
293
|
+
return x !== null && typeof x === 'object' && CONTAINER_RECIPE_SYMBOL in x;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* The ARN of the container recipe
|
|
297
|
+
*/
|
|
298
|
+
containerRecipeArn = __runInitializers(this, _instanceExtraInitializers);
|
|
299
|
+
/**
|
|
300
|
+
* The name of the container recipe
|
|
301
|
+
*/
|
|
302
|
+
containerRecipeName;
|
|
303
|
+
/**
|
|
304
|
+
* The version of the container recipe
|
|
305
|
+
*/
|
|
306
|
+
containerRecipeVersion;
|
|
307
|
+
instanceBlockDevices = [];
|
|
308
|
+
constructor(scope, id, props) {
|
|
309
|
+
super(scope, id, {
|
|
310
|
+
physicalName: props.containerRecipeName ??
|
|
311
|
+
cdk.Lazy.string({
|
|
312
|
+
produce: () => cdk.Names.uniqueResourceName(this, {
|
|
313
|
+
maxLength: 128,
|
|
314
|
+
separator: '-',
|
|
315
|
+
allowedSpecialCharacters: '-',
|
|
316
|
+
}).toLowerCase(), // Enforce lowercase for the auto-generated fallback
|
|
317
|
+
}),
|
|
318
|
+
});
|
|
319
|
+
try {
|
|
320
|
+
jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ContainerRecipeProps(props);
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
324
|
+
Error.captureStackTrace(error, ContainerRecipe);
|
|
325
|
+
}
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
// Enhanced CDK Analytics Telemetry
|
|
329
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
330
|
+
Object.defineProperty(this, CONTAINER_RECIPE_SYMBOL, { value: true });
|
|
331
|
+
this.validateContainerRecipeName();
|
|
332
|
+
this.addInstanceBlockDevice(...(props.instanceBlockDevices ?? []));
|
|
333
|
+
const components = props.components?.map((component) => ({
|
|
334
|
+
componentArn: component.component.componentArn,
|
|
335
|
+
...(component.parameters && {
|
|
336
|
+
parameters: Object.entries(component.parameters).map(([name, param]) => ({
|
|
337
|
+
name,
|
|
338
|
+
value: param.value,
|
|
339
|
+
})),
|
|
340
|
+
}),
|
|
341
|
+
}));
|
|
342
|
+
const dockerfile = props.dockerfile ??
|
|
343
|
+
DockerfileData.fromInline('FROM {{{ imagebuilder:parentImage }}}\n{{{ imagebuilder:environments }}}\n{{{ imagebuilder:components }}}');
|
|
344
|
+
const containerRecipeVersion = props.containerRecipeVersion ?? DEFAULT_RECIPE_VERSION;
|
|
345
|
+
const containerRecipe = new aws_imagebuilder_1.CfnContainerRecipe(this, 'Resource', {
|
|
346
|
+
name: this.physicalName,
|
|
347
|
+
version: containerRecipeVersion,
|
|
348
|
+
description: props.description,
|
|
349
|
+
parentImage: props.baseImage.image,
|
|
350
|
+
containerType: ContainerType.DOCKER,
|
|
351
|
+
targetRepository: {
|
|
352
|
+
repositoryName: props.targetRepository.repositoryName,
|
|
353
|
+
service: props.targetRepository.service,
|
|
354
|
+
},
|
|
355
|
+
platformOverride: props.osVersion?.platform,
|
|
356
|
+
imageOsVersionOverride: props.osVersion?.osVersion,
|
|
357
|
+
kmsKeyId: props.kmsKey?.keyArn,
|
|
358
|
+
instanceConfiguration: cdk.Lazy.any({ produce: () => this.buildInstanceConfiguration(props) }),
|
|
359
|
+
workingDirectory: props.workingDirectory,
|
|
360
|
+
tags: props.tags,
|
|
361
|
+
...dockerfile.render(),
|
|
362
|
+
...(components?.length && { components }),
|
|
363
|
+
});
|
|
364
|
+
this.containerRecipeName = this.getResourceNameAttribute(containerRecipe.attrName);
|
|
365
|
+
this.containerRecipeArn = this.getResourceArnAttribute(containerRecipe.attrArn, {
|
|
366
|
+
service: 'imagebuilder',
|
|
367
|
+
resource: 'container-recipe',
|
|
368
|
+
resourceName: `${this.physicalName}/${containerRecipeVersion}`,
|
|
369
|
+
});
|
|
370
|
+
this.containerRecipeVersion = containerRecipe.getAtt('Version').toString();
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Adds block devices to attach to the instance used for building, testing, and distributing the container image.
|
|
374
|
+
*
|
|
375
|
+
* @param instanceBlockDevices - The list of block devices to attach
|
|
376
|
+
*/
|
|
377
|
+
addInstanceBlockDevice(...instanceBlockDevices) {
|
|
378
|
+
this.instanceBlockDevices.push(...instanceBlockDevices);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Renders the block devices provided as input to the construct, into the block device mapping structure that
|
|
382
|
+
* CfnContainerRecipe expects to receive.
|
|
383
|
+
*
|
|
384
|
+
* This is rendered at synthesis time, as users can add additional block devices with `addInstanceBlockDevice`, after
|
|
385
|
+
* the construct has been instantiated.
|
|
386
|
+
*
|
|
387
|
+
* @private
|
|
388
|
+
*/
|
|
389
|
+
renderBlockDevices() {
|
|
390
|
+
const blockDevices = this.instanceBlockDevices.map((blockDevice) => {
|
|
391
|
+
const ebsDevice = blockDevice.volume.ebsDevice;
|
|
392
|
+
const ebs = {
|
|
393
|
+
...(ebsDevice?.deleteOnTermination !== undefined && { deleteOnTermination: ebsDevice.deleteOnTermination }),
|
|
394
|
+
...(ebsDevice?.encrypted !== undefined && { encrypted: ebsDevice.encrypted }),
|
|
395
|
+
...(ebsDevice?.iops !== undefined && { iops: ebsDevice.iops }),
|
|
396
|
+
...(ebsDevice?.kmsKey !== undefined && { kmsKeyId: ebsDevice.kmsKey.keyArn }),
|
|
397
|
+
...(ebsDevice?.snapshotId !== undefined && { snapshotId: ebsDevice.snapshotId }),
|
|
398
|
+
...(ebsDevice?.throughput !== undefined && { throughput: ebsDevice.throughput }),
|
|
399
|
+
...(ebsDevice?.volumeSize !== undefined && { volumeSize: ebsDevice.volumeSize }),
|
|
400
|
+
...(ebsDevice?.volumeType !== undefined && { volumeType: ebsDevice.volumeType }),
|
|
401
|
+
};
|
|
402
|
+
const mappingEnabled = blockDevice.mappingEnabled ?? true;
|
|
403
|
+
return {
|
|
404
|
+
deviceName: blockDevice.deviceName,
|
|
405
|
+
virtualName: blockDevice.volume.virtualName,
|
|
406
|
+
...(!mappingEnabled && { noDevice: '' }),
|
|
407
|
+
...(Object.keys(ebs).length && { ebs }),
|
|
408
|
+
};
|
|
409
|
+
});
|
|
410
|
+
return blockDevices.length ? blockDevices : undefined;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Generates the instance configuration property into the `InstanceConfiguration` type in the CloudFormation L1
|
|
414
|
+
* definition.
|
|
415
|
+
*
|
|
416
|
+
* @param props The props passed as input to the construct
|
|
417
|
+
* @private
|
|
418
|
+
*/
|
|
419
|
+
buildInstanceConfiguration(props) {
|
|
420
|
+
const blockDevices = this.renderBlockDevices();
|
|
421
|
+
const instanceConfiguration = {
|
|
422
|
+
...(blockDevices?.length && { blockDeviceMappings: blockDevices }),
|
|
423
|
+
...(props.instanceImage !== undefined && { image: props.instanceImage.image }),
|
|
424
|
+
};
|
|
425
|
+
return Object.keys(instanceConfiguration).length ? instanceConfiguration : undefined;
|
|
426
|
+
}
|
|
427
|
+
validateContainerRecipeName() {
|
|
428
|
+
if (cdk.Token.isUnresolved(this.physicalName)) {
|
|
429
|
+
return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
|
|
430
|
+
}
|
|
431
|
+
if (this.physicalName.length > 128) {
|
|
432
|
+
throw new cdk.ValidationError(`the containerRecipeName cannot be longer than 128 characters, got: '${this.physicalName}'`, this);
|
|
433
|
+
}
|
|
434
|
+
if (this.physicalName.includes(' ')) {
|
|
435
|
+
throw new cdk.ValidationError(`the containerRecipeName cannot contain spaces, got: '${this.physicalName}'`, this);
|
|
436
|
+
}
|
|
437
|
+
if (this.physicalName.includes('_')) {
|
|
438
|
+
throw new cdk.ValidationError(`the containerRecipeName cannot contain underscores, got: '${this.physicalName}'`, this);
|
|
439
|
+
}
|
|
440
|
+
if (this.physicalName !== this.physicalName.toLowerCase()) {
|
|
441
|
+
throw new cdk.ValidationError(`the containerRecipeName must be lowercase, got: '${this.physicalName}'`, this);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
static {
|
|
445
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
return ContainerRecipe = _classThis;
|
|
449
|
+
})();
|
|
450
|
+
exports.ContainerRecipe = ContainerRecipe;
|
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLXJlY2lwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRhaW5lci1yZWNpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1DO0FBRW5DLDJDQUEyQztBQUMzQyxtRUFBa0U7QUFHbEUsc0RBQXNEO0FBQ3RELDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFRMUUsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7QUFFOUY7Ozs7O0dBS0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFFL0I7Ozs7O0dBS0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQztBQTJIdkM7O0dBRUc7QUFDSCxJQUFZLGFBS1g7QUFMRCxXQUFZLGFBQWE7SUFDdkI7O09BRUc7SUFDSCxrQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBTFcsYUFBYSw2QkFBYixhQUFhLFFBS3hCO0FBdUJEOztHQUVHO0FBQ0gsTUFBc0IsY0FBYzs7SUFDbEM7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQ3JCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixJQUFZLEVBQ1osVUFBaUMsRUFBRTtRQUVuQyxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzdDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQWtCLEVBQUUsR0FBVztRQUNsRCxPQUFPLElBQUksNkJBQTZCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0s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SUFBSSxDQUNMLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsb0RBQW9ELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoSCxDQUFDO1NBQ0Y7O1lBaFFVLHVEQUFlOzs7OztBQUFmLDBDQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENmbkNvbnRhaW5lclJlY2lwZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pbWFnZWJ1aWxkZXInO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzYXNzZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUNvbnRhaW5lckltYWdlLCBDb250YWluZXJJbnN0YW5jZUltYWdlIH0gZnJvbSAnLi9iYXNlLWltYWdlJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICcuL2Rpc3RyaWJ1dGlvbi1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IElJbWFnZVJlY2lwZSB9IGZyb20gJy4vaW1hZ2UtcmVjaXBlJztcbmltcG9ydCB7IE9TVmVyc2lvbiB9IGZyb20gJy4vb3MtdmVyc2lvbic7XG5pbXBvcnQgeyBDb21wb25lbnRDb25maWd1cmF0aW9uLCBJUmVjaXBlQmFzZSB9IGZyb20gJy4vcmVjaXBlLWJhc2UnO1xuXG5jb25zdCBDT05UQUlORVJfUkVDSVBFX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0Bhd3MtY2RrL2F3cy1pbWFnZWJ1aWxkZXItYWxwaGEuQ29udGFpbmVyUmVjaXBlJyk7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYSBjb250YWluZXIgcmVjaXBlLiBXaGVuIHVzaW5nIHRoZSByZWNpcGUgaW4gYSBwaXBlbGluZSwgdGhlIHBpcGVsaW5lIHdpbGwgdXNlIHRoZVxuICogbGF0ZXN0IHJlY2lwZSBhdCB0aGUgdGltZSBvZiBleGVjdXRpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW1hZ2VidWlsZGVyL2xhdGVzdC91c2VyZ3VpZGUvaWJob3ctc2VtYW50aWMtdmVyc2lvbmluZy5odG1sXG4gKi9cbmNvbnN0IExBVEVTVF9WRVJTSU9OID0gJ3gueC54JztcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB2ZXJzaW9uIHRvIHVzZSBpbiB0aGUgY29udGFpbmVyIHJlY2lwZS4gV2hlbiB0aGUgcmVjaXBlIGlzIHVwZGF0ZWQsIHRoZSBgeGAgd2lsbCBiZSBpbmNyZW1lbnRlZCBvZmYgZnJvbVxuICogdGhlIGxhdGVzdCByZWNpcGUgdmVyc2lvbiB0aGF0IGV4aXN0cy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9jcmVhdGUtaW1hZ2UtcmVjaXBlcy5odG1sXG4gKi9cbmNvbnN0IERFRkFVTFRfUkVDSVBFX1ZFUlNJT04gPSAnMS4wLngnO1xuXG4vKipcbiAqIEFuIEVDMiBJbWFnZSBCdWlsZGVyIENvbnRhaW5lciBSZWNpcGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRhaW5lclJlY2lwZSBleHRlbmRzIElSZWNpcGVCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlVmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgQ29udGFpbmVyIFJlY2lwZSByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclJlY2lwZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltYWdlIGZvciBjdXN0b21pemF0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIGNvbnRhaW5lciByZWNpcGUuXG4gICAqL1xuICByZWFkb25seSBiYXNlSW1hZ2U6IEJhc2VDb250YWluZXJJbWFnZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lciByZXBvc2l0b3J5IHdoZXJlIHRoZSBvdXRwdXQgY29udGFpbmVyIGltYWdlIGlzIHN0b3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFJlcG9zaXRvcnk6IFJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgcmVjaXBlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhIG5hbWUgaXMgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJSZWNpcGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgY29udGFpbmVyIHJlY2lwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMS4wLnhcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGFpbmVyIHJlY2lwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2NrZXJmaWxlIHRlbXBsYXRlIHVzZWQgdG8gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHN0YW5kYXJkIGRvY2tlcmZpbGUgdGVtcGxhdGUgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gcHVsbCB0aGUgYmFzZSBpbWFnZSwgcGVyZm9ybSBlbnZpcm9ubWVudCBzZXR1cCwgYW5kXG4gICAqIHJ1biBhbGwgY29tcG9uZW50cyBpbiB0aGUgcmVjaXBlXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJmaWxlPzogRG9ja2VyZmlsZURhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyB0byBhcHBseSBpbiB0aGUgaW1hZ2UgYnVpbGQuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudHM/OiBDb21wb25lbnRDb25maWd1cmF0aW9uW107XG5cbiAgLyoqXG4gICAqIFRoZSBLTVMga2V5IHVzZWQgdG8gZW5jcnlwdCB0aGUgZG9ja2VyZmlsZSB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkga21zS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdXNlIGR1cmluZyBidWlsZCBhbmQgdGVzdCB3b3JrZmxvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIEltYWdlIEJ1aWxkZXIgZGVmYXVsdCB3b3JraW5nIGRpcmVjdG9yeSBpcyB1c2VkLiBGb3IgTGludXggYW5kIG1hY09TIGJ1aWxkcywgdGhpcyB3b3VsZCBiZSAvdG1wLiBGb3JcbiAgICogV2luZG93cyBidWlsZHMsIHRoaXMgd291bGQgYmUgQzovXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSAoT1MpIHZlcnNpb24gb2YgdGhlIGJhc2UgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSW1hZ2UgQnVpbGRlciB3aWxsIGRldGVybWluZSB0aGUgT1MgdmVyc2lvbiBvZiB0aGUgYmFzZSBpbWFnZSwgaWYgc291cmNlZCBmcm9tIGEgdGhpcmQtcGFydHkgY29udGFpbmVyXG4gICAqIHJlZ2lzdHJ5LiBPdGhlcndpc2UsIHRoZSBPUyB2ZXJzaW9uIG9mIHRoZSBiYXNlIGltYWdlIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3NWZXJzaW9uPzogT1NWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgZGV2aWNlcyB0byBhdHRhY2ggdG8gdGhlIGluc3RhbmNlIHVzZWQgZm9yIGJ1aWxkaW5nLCB0ZXN0aW5nLCBhbmQgZGlzdHJpYnV0aW5nIHRoZSBjb250YWluZXIgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBibG9jayBkZXZpY2VzIG9mIHRoZSBpbnN0YW5jZSBpbWFnZSB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlQmxvY2tEZXZpY2VzPzogZWMyLkJsb2NrRGV2aWNlW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB0byB1c2UgdG8gbGF1bmNoIHRoZSBpbnN0YW5jZSB1c2VkIGZvciBidWlsZGluZywgdGVzdGluZywgYW5kIGRpc3RyaWJ1dGluZyB0aGUgY29udGFpbmVyIGltYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBJbWFnZSBCdWlsZGVyIHdpbGwgdXNlIHRoZSBhcHByb3ByaWF0ZSBFQ1Mtb3B0aW1pemVkIEFNSVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VJbWFnZT86IENvbnRhaW5lckluc3RhbmNlSW1hZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIHRvIGFwcGx5IHRvIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgYmVpbmcgdXNlZCBpbiB0aGUgY29udGFpbmVyIHJlY2lwZVxuICovXG5leHBvcnQgZW51bSBDb250YWluZXJUeXBlIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgY29udGFpbmVyIHJlY2lwZSB1c2VzIGEgRG9ja2VyIGNvbnRhaW5lclxuICAgKi9cbiAgRE9DS0VSID0gJ0RPQ0tFUicsXG59XG5cbi8qKlxuICogVGhlIHJlbmRlcmVkIERvY2tlcmZpbGUgdmFsdWUsIGZvciB1c2UgaW4gQ2xvdWRGb3JtYXRpb24uXG4gKiAtIEZvciBpbmxpbmUgZG9ja2VyZmlsZXMsIGRvY2tlcmZpbGVUZW1wbGF0ZURhdGEgaXMgdGhlIERvY2tlcmZpbGUgdGVtcGxhdGUgdGV4dFxuICogLSBGb3IgUzMtYmFja2VkIGRvY2tlcmZpbGVzLCBkb2NrZXJmaWxlVGVtcGxhdGVVcmkgaXMgdGhlIFMzIFVSTFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlcmZpbGVUZW1wbGF0ZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgRG9ja2VyZmlsZSBkYXRhLCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZSBpZiBkb2NrZXJmaWxlVGVtcGxhdGVVcmkgaXMgc2V0XG4gICAqL1xuICByZWFkb25seSBkb2NrZXJmaWxlVGVtcGxhdGVEYXRhPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgRG9ja2VyZmlsZSBVUkksIGZvciB1c2UgaW4gQ2xvdWRGb3JtYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIGRvY2tlcmZpbGVUZW1wbGF0ZURhdGEgaXMgc2V0XG4gICAqL1xuICByZWFkb25seSBkb2NrZXJmaWxlVGVtcGxhdGVVcmk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciByZWZlcmVuY2luZyBhbmQgdXBsb2FkaW5nIGRvY2tlcmZpbGUgZGF0YSBmb3IgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERvY2tlcmZpbGVEYXRhIHtcbiAgLyoqXG4gICAqIFVwbG9hZHMgZG9ja2VyZmlsZSBkYXRhIGZyb20gYSBsb2NhbCBmaWxlIHRvIFMzIHRvIHVzZSBhcyB0aGUgZG9ja2VyZmlsZSBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIHBhdGggVGhlIGxvY2FsIHBhdGggdG8gdGhlIGRvY2tlcmZpbGUgZGF0YSBmaWxlXG4gICAqIEBwYXJhbSBvcHRpb25zIFMzIGFzc2V0IHVwbG9hZCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Bc3NldChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHMzYXNzZXRzLkFzc2V0T3B0aW9ucyA9IHt9LFxuICApOiBTM0RvY2tlcmZpbGVEYXRhIHtcbiAgICBjb25zdCBhc3NldCA9IG5ldyBzM2Fzc2V0cy5Bc3NldChzY29wZSwgaWQsIHsgLi4ub3B0aW9ucywgcGF0aCB9KTtcbiAgICByZXR1cm4gbmV3IFMzRG9ja2VyZmlsZURhdGFGcm9tQXNzZXQoYXNzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZXMgZG9ja2VyZmlsZSBkYXRhIGZyb20gYSBwcmUtZXhpc3RpbmcgUzMgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSBidWNrZXQgVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgZG9ja2VyZmlsZSBkYXRhIGlzIHN0b3JlZFxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIGRvY2tlcmZpbGUgZGF0YSBmaWxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TMyhidWNrZXQ6IHMzLklCdWNrZXQsIGtleTogc3RyaW5nKTogUzNEb2NrZXJmaWxlRGF0YSB7XG4gICAgcmV0dXJuIG5ldyBTM0RvY2tlcmZpbGVEYXRhRnJvbUJ1Y2tldEtleShidWNrZXQsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlcyBhbiBpbmxpbmUgc3RyaW5nIGFzIHRoZSBkb2NrZXJmaWxlIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgQW4gaW5saW5lIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRvY2tlcmZpbGUgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lKGRhdGE6IHN0cmluZyk6IERvY2tlcmZpbGVEYXRhIHtcbiAgICByZXR1cm4gbmV3IElubGluZURvY2tlcmZpbGVEYXRhKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCBEb2NrZXJmaWxlIHZhbHVlLCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uLlxuICAgKiAtIEZvciBpbmxpbmUgZG9ja2VyZmlsZXMsIGRvY2tlcmZpbGVUZW1wbGF0ZURhdGEgaXMgdGhlIERvY2tlcmZpbGUgdGVtcGxhdGUgdGV4dFxuICAgKiAtIEZvciBTMy1iYWNrZWQgZG9ja2VyZmlsZXMsIGRvY2tlcmZpbGVUZW1wbGF0ZVVyaSBpcyB0aGUgUzMgVVJMXG4gICAqL1xuICBhYnN0cmFjdCByZW5kZXIoKTogRG9ja2VyZmlsZVRlbXBsYXRlQ29uZmlnO1xufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3IgUzMtYmFzZWQgZG9ja2VyZmlsZSBkYXRhIHJlZmVyZW5jZXMsIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBwZXJtaXNzaW9uIGdyYW50IG1ldGhvZHMgb24gdGhlIFMzIG9iamVjdFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUzNEb2NrZXJmaWxlRGF0YSBleHRlbmRzIERvY2tlcmZpbGVEYXRhIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihidWNrZXQ6IHMzLklCdWNrZXQsIGtleTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuYnVja2V0ID0gYnVja2V0O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCBEb2NrZXJmaWxlIFMzIFVSTCwgZm9yIHVzZSBpbiBDbG91ZEZvcm1hdGlvblxuICAgKi9cbiAgcHVibGljIHJlbmRlcigpOiBEb2NrZXJmaWxlVGVtcGxhdGVDb25maWcge1xuICAgIHJldHVybiB7IGRvY2tlcmZpbGVUZW1wbGF0ZVVyaTogdGhpcy5idWNrZXQuczNVcmxGb3JPYmplY3QodGhpcy5rZXkpIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcHV0IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgZG9ja2VyZmlsZSBkYXRhIGluIFMzXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFB1dChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UHV0KGdyYW50ZWUsIHRoaXMua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgZG9ja2VyZmlsZSBkYXRhIGluIFMzXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFJlYWQoZ3JhbnRlZSwgdGhpcy5rZXkpO1xuICB9XG59XG5cbmNsYXNzIElubGluZURvY2tlcmZpbGVEYXRhIGV4dGVuZHMgRG9ja2VyZmlsZURhdGEge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgRG9ja2VyZmlsZSB0ZXh0LCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IERvY2tlcmZpbGVUZW1wbGF0ZUNvbmZpZyB7XG4gICAgcmV0dXJuIHsgZG9ja2VyZmlsZVRlbXBsYXRlRGF0YTogdGhpcy5kYXRhIH07XG4gIH1cbn1cblxuY2xhc3MgUzNEb2NrZXJmaWxlRGF0YUZyb21CdWNrZXRLZXkgZXh0ZW5kcyBTM0RvY2tlcmZpbGVEYXRhIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGJ1Y2tldDogczMuSUJ1Y2tldCwga2V5OiBzdHJpbmcpIHtcbiAgICBzdXBlcihidWNrZXQsIGtleSk7XG4gIH1cbn1cblxuY2xhc3MgUzNEb2NrZXJmaWxlRGF0YUZyb21Bc3NldCBleHRlbmRzIFMzRG9ja2VyZmlsZURhdGEge1xuICBwdWJsaWMgY29uc3RydWN0b3IoYXNzZXQ6IHMzYXNzZXRzLkFzc2V0KSB7XG4gICAgc3VwZXIoYXNzZXQuYnVja2V0LCBhc3NldC5zM09iamVjdEtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhbiBFQzIgSW1hZ2UgQnVpbGRlciBjb250YWluZXIgcmVjaXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyUmVjaXBlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVyaXZlZCBmcm9tIGNvbnRhaW5lclJlY2lwZU5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXJpdmVkIGZyb20gY29udGFpbmVyUmVjaXBlQXJuXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJSZWNpcGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgY29udGFpbmVyIHJlY2lwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlcml2ZWQgZnJvbSBjb250YWluZXJSZWNpcGVBcm4uIGlmIGEgY29udGFpbmVyUmVjaXBlTmFtZSBpcyBwcm92aWRlZCwgdGhlIGxhdGVzdCB2ZXJzaW9uLCB4LngueCwgd2lsbFxuICAgKiBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlVmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5ldyBvciBpbXBvcnRlZCBDb250YWluZXIgUmVjaXBlXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250YWluZXJSZWNpcGVCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUNvbnRhaW5lclJlY2lwZSB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSBjb250YWluZXJSZWNpcGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgY3VzdG9tIGFjdGlvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuY29udGFpbmVyUmVjaXBlQXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsICdpbWFnZWJ1aWxkZXI6R2V0Q29udGFpbmVyUmVjaXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlY2lwZSBpcyBhIENvbnRhaW5lciBSZWNpcGVcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2lzQ29udGFpbmVyUmVjaXBlKCk6IHRoaXMgaXMgSUNvbnRhaW5lclJlY2lwZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlY2lwZSBpcyBhbiBJbWFnZSBSZWNpcGVcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2lzSW1hZ2VSZWNpcGUoKTogdGhpcyBpcyBJSW1hZ2VSZWNpcGUge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gRUMyIEltYWdlIEJ1aWxkZXIgQ29udGFpbmVyIFJlY2lwZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9tYW5hZ2UtcmVjaXBlcy5odG1sXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBDb250YWluZXJSZWNpcGUgZXh0ZW5kcyBDb250YWluZXJSZWNpcGVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtaW1hZ2VidWlsZGVyLWFscGhhLkNvbnRhaW5lclJlY2lwZSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBjb250YWluZXIgcmVjaXBlIGdpdmVuIGl0cyBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Db250YWluZXJSZWNpcGVBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29udGFpbmVyUmVjaXBlQXJuOiBzdHJpbmcpOiBJQ29udGFpbmVyUmVjaXBlIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQ29udGFpbmVyUmVjaXBlQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgY29udGFpbmVyUmVjaXBlQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYW4gZXhpc3RpbmcgY29udGFpbmVyIHJlY2lwZSBnaXZlbiBpdHMgbmFtZS4gVGhlIHByb3ZpZGVkIG5hbWUgbXVzdCBiZSBub3JtYWxpemVkIGJ5XG4gICAqIGNvbnZlcnRpbmcgYWxsIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXJzIHRvIGxvd2VyY2FzZSwgYW5kIHJlcGxhY2luZyBhbGwgc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Db250YWluZXJSZWNpcGVOYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbnRhaW5lclJlY2lwZU5hbWU6IHN0cmluZyk6IElDb250YWluZXJSZWNpcGUge1xuICAgIHJldHVybiB0aGlzLmZyb21Db250YWluZXJSZWNpcGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyBjb250YWluZXJSZWNpcGVOYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBjb250YWluZXIgcmVjaXBlIGJ5IHByb3ZpZGluZyBpdHMgYXR0cmlidXRlcy4gSWYgdGhlIGNvbnRhaW5lciByZWNpcGUgbmFtZSBpcyBwcm92aWRlZCBhcyBhblxuICAgKiBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgbm9ybWFsaXplZCBieSBjb252ZXJ0aW5nIGFsbCBhbHBoYWJldGljYWwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UsIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlc1xuICAgKiBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29udGFpbmVyUmVjaXBlQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IENvbnRhaW5lclJlY2lwZUF0dHJpYnV0ZXMsXG4gICk6IElDb250YWluZXJSZWNpcGUge1xuICAgIGlmICghYXR0cnMuY29udGFpbmVyUmVjaXBlQXJuICYmICFhdHRycy5jb250YWluZXJSZWNpcGVOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ2VpdGhlciBlaXRoZXIgY29udGFpbmVyUmVjaXBlQXJuIG9yIGNvbnRhaW5lclJlY2lwZU5hbWUgbXVzdCBiZSBwcm92aWRlZCB0byBpbXBvcnQgYSBjb250YWluZXIgcmVjaXBlJyxcbiAgICAgICAgc2NvcGUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lclJlY2lwZUFybiA9XG4gICAgICBhdHRycy5jb250YWluZXJSZWNpcGVBcm4gPz9cbiAgICAgIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICAgIHJlc291cmNlOiAnY29udGFpbmVyLXJlY2lwZScsXG4gICAgICAgIHJlc291cmNlTmFtZTogYCR7YXR0cnMuY29udGFpbmVyUmVjaXBlTmFtZX0vJHthdHRycy5jb250YWluZXJSZWNpcGVWZXJzaW9uID8/IExBVEVTVF9WRVJTSU9OfWAsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IFtjb250YWluZXJSZWNpcGVOYW1lLCBjb250YWluZXJSZWNpcGVWZXJzaW9uXSA9ICgoKSA9PiB7XG4gICAgICBpZiAoYXR0cnMuY29udGFpbmVyUmVjaXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gW2F0dHJzLmNvbnRhaW5lclJlY2lwZU5hbWUsIGF0dHJzLmNvbnRhaW5lclJlY2lwZVZlcnNpb24gPz8gTEFURVNUX1ZFUlNJT05dO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXJSZWNpcGVOYW1lVmVyc2lvbiA9IGNkay5TdGFjay5vZihzY29wZSkuc3BsaXRBcm4oXG4gICAgICAgIGNvbnRhaW5lclJlY2lwZUFybixcbiAgICAgICAgY2RrLkFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICAgKS5yZXNvdXJjZU5hbWUhO1xuXG4gICAgICBjb25zdCBjb250YWluZXJSZWNpcGVOYW1lVmVyc2lvblNwbGl0ID0gY2RrLkZuLnNwbGl0KCcvJywgY29udGFpbmVyUmVjaXBlTmFtZVZlcnNpb24pO1xuICAgICAgcmV0dXJuIFtjZGsuRm4uc2VsZWN0KDAsIGNvbnRhaW5lclJlY2lwZU5hbWVWZXJzaW9uU3BsaXQpLCBjZGsuRm4uc2VsZWN0KDEsIGNvbnRhaW5lclJlY2lwZU5hbWVWZXJzaW9uU3BsaXQpXTtcbiAgICB9KSgpO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQ29udGFpbmVyUmVjaXBlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlQXJuID0gY29udGFpbmVyUmVjaXBlQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZU5hbWUgPSBjb250YWluZXJSZWNpcGVOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZVZlcnNpb24gPSBjb250YWluZXJSZWNpcGVWZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIENvbnRhaW5lclJlY2lwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb250YWluZXJSZWNpcGUoeDogYW55KTogeCBpcyBDb250YWluZXJSZWNpcGUge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiBDT05UQUlORVJfUkVDSVBFX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJSZWNpcGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJSZWNpcGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlVmVyc2lvbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VCbG9ja0RldmljZXM6IGVjMi5CbG9ja0RldmljZVtdID0gW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb250YWluZXJSZWNpcGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOlxuICAgICAgICBwcm9wcy5jb250YWluZXJSZWNpcGVOYW1lID8/XG4gICAgICAgIGNkay5MYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIGNkay5OYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICAgICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgICAgICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgICAgICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy0nLFxuICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKSwgLy8gRW5mb3JjZSBsb3dlcmNhc2UgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBmYWxsYmFja1xuICAgICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBDT05UQUlORVJfUkVDSVBFX1NZTUJPTCwgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMudmFsaWRhdGVDb250YWluZXJSZWNpcGVOYW1lKCk7XG5cbiAgICB0aGlzLmFkZEluc3RhbmNlQmxvY2tEZXZpY2UoLi4uKHByb3BzLmluc3RhbmNlQmxvY2tEZXZpY2VzID8/IFtdKSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRzOiBDZm5Db250YWluZXJSZWNpcGUuQ29tcG9uZW50Q29uZmlndXJhdGlvblByb3BlcnR5W10gfCB1bmRlZmluZWQgPSBwcm9wcy5jb21wb25lbnRzPy5tYXAoXG4gICAgICAoY29tcG9uZW50KSA9PiAoe1xuICAgICAgICBjb21wb25lbnRBcm46IGNvbXBvbmVudC5jb21wb25lbnQuY29tcG9uZW50QXJuLFxuICAgICAgICAuLi4oY29tcG9uZW50LnBhcmFtZXRlcnMgJiYge1xuICAgICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudC5wYXJhbWV0ZXJzKS5tYXAoXG4gICAgICAgICAgICAoW25hbWUsIHBhcmFtXSk6IENmbkNvbnRhaW5lclJlY2lwZS5Db21wb25lbnRQYXJhbWV0ZXJQcm9wZXJ0eSA9PiAoe1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTogcGFyYW0udmFsdWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBkb2NrZXJmaWxlID1cbiAgICAgIHByb3BzLmRvY2tlcmZpbGUgPz9cbiAgICAgIERvY2tlcmZpbGVEYXRhLmZyb21JbmxpbmUoXG4gICAgICAgICdGUk9NIHt7eyBpbWFnZWJ1aWxkZXI6cGFyZW50SW1hZ2UgfX19XFxue3t7IGltYWdlYnVpbGRlcjplbnZpcm9ubWVudHMgfX19XFxue3t7IGltYWdlYnVpbGRlcjpjb21wb25lbnRzIH19fScsXG4gICAgICApO1xuXG4gICAgY29uc3QgY29udGFpbmVyUmVjaXBlVmVyc2lvbiA9IHByb3BzLmNvbnRhaW5lclJlY2lwZVZlcnNpb24gPz8gREVGQVVMVF9SRUNJUEVfVkVSU0lPTjtcbiAgICBjb25zdCBjb250YWluZXJSZWNpcGUgPSBuZXcgQ2ZuQ29udGFpbmVyUmVjaXBlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgdmVyc2lvbjogY29udGFpbmVyUmVjaXBlVmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudEltYWdlOiBwcm9wcy5iYXNlSW1hZ2UuaW1hZ2UsXG4gICAgICBjb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlLkRPQ0tFUixcbiAgICAgIHRhcmdldFJlcG9zaXRvcnk6IHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHByb3BzLnRhcmdldFJlcG9zaXRvcnkucmVwb3NpdG9yeU5hbWUsXG4gICAgICAgIHNlcnZpY2U6IHByb3BzLnRhcmdldFJlcG9zaXRvcnkuc2VydmljZSxcbiAgICAgIH0sXG4gICAgICBwbGF0Zm9ybU92ZXJyaWRlOiBwcm9wcy5vc1ZlcnNpb24/LnBsYXRmb3JtLFxuICAgICAgaW1hZ2VPc1ZlcnNpb25PdmVycmlkZTogcHJvcHMub3NWZXJzaW9uPy5vc1ZlcnNpb24sXG4gICAgICBrbXNLZXlJZDogcHJvcHMua21zS2V5Py5rZXlBcm4sXG4gICAgICBpbnN0YW5jZUNvbmZpZ3VyYXRpb246IGNkay5MYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuYnVpbGRJbnN0YW5jZUNvbmZpZ3VyYXRpb24ocHJvcHMpIH0pLFxuICAgICAgd29ya2luZ0RpcmVjdG9yeTogcHJvcHMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICAuLi5kb2NrZXJmaWxlLnJlbmRlcigpLFxuICAgICAgLi4uKGNvbXBvbmVudHM/Lmxlbmd0aCAmJiB7IGNvbXBvbmVudHMgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lclJlY2lwZU5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShjb250YWluZXJSZWNpcGUuYXR0ck5hbWUpO1xuICAgIHRoaXMuY29udGFpbmVyUmVjaXBlQXJuID0gdGhpcy5nZXRSZXNvdXJjZUFybkF0dHJpYnV0ZShjb250YWluZXJSZWNpcGUuYXR0ckFybiwge1xuICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICByZXNvdXJjZTogJ2NvbnRhaW5lci1yZWNpcGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLnBoeXNpY2FsTmFtZX0vJHtjb250YWluZXJSZWNpcGVWZXJzaW9ufWAsXG4gICAgfSk7XG4gICAgdGhpcy5jb250YWluZXJSZWNpcGVWZXJzaW9uID0gY29udGFpbmVyUmVjaXBlLmdldEF0dCgnVmVyc2lvbicpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBibG9jayBkZXZpY2VzIHRvIGF0dGFjaCB0byB0aGUgaW5zdGFuY2UgdXNlZCBmb3IgYnVpbGRpbmcsIHRlc3RpbmcsIGFuZCBkaXN0cmlidXRpbmcgdGhlIGNvbnRhaW5lciBpbWFnZS5cbiAgICpcbiAgICogQHBhcmFtIGluc3RhbmNlQmxvY2tEZXZpY2VzIC0gVGhlIGxpc3Qgb2YgYmxvY2sgZGV2aWNlcyB0byBhdHRhY2hcbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBhZGRJbnN0YW5jZUJsb2NrRGV2aWNlKC4uLmluc3RhbmNlQmxvY2tEZXZpY2VzOiBlYzIuQmxvY2tEZXZpY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuaW5zdGFuY2VCbG9ja0RldmljZXMucHVzaCguLi5pbnN0YW5jZUJsb2NrRGV2aWNlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmxvY2sgZGV2aWNlcyBwcm92aWRlZCBhcyBpbnB1dCB0byB0aGUgY29uc3RydWN0LCBpbnRvIHRoZSBibG9jayBkZXZpY2UgbWFwcGluZyBzdHJ1Y3R1cmUgdGhhdFxuICAgKiBDZm5Db250YWluZXJSZWNpcGUgZXhwZWN0cyB0byByZWNlaXZlLlxuICAgKlxuICAgKiBUaGlzIGlzIHJlbmRlcmVkIGF0IHN5bnRoZXNpcyB0aW1lLCBhcyB1c2VycyBjYW4gYWRkIGFkZGl0aW9uYWwgYmxvY2sgZGV2aWNlcyB3aXRoIGBhZGRJbnN0YW5jZUJsb2NrRGV2aWNlYCwgYWZ0ZXJcbiAgICogdGhlIGNvbnN0cnVjdCBoYXMgYmVlbiBpbnN0YW50aWF0ZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckJsb2NrRGV2aWNlcygpOiBDZm5Db250YWluZXJSZWNpcGUuSW5zdGFuY2VCbG9ja0RldmljZU1hcHBpbmdQcm9wZXJ0eVtdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBibG9ja0RldmljZXMgPSB0aGlzLmluc3RhbmNlQmxvY2tEZXZpY2VzLm1hcChcbiAgICAgIChibG9ja0RldmljZSk6IENmbkNvbnRhaW5lclJlY2lwZS5JbnN0YW5jZUJsb2NrRGV2aWNlTWFwcGluZ1Byb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3QgZWJzRGV2aWNlID0gYmxvY2tEZXZpY2Uudm9sdW1lLmVic0RldmljZTtcbiAgICAgICAgY29uc3QgZWJzOiBDZm5Db250YWluZXJSZWNpcGUuRWJzSW5zdGFuY2VCbG9ja0RldmljZVNwZWNpZmljYXRpb25Qcm9wZXJ0eSA9IHtcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5kZWxldGVPblRlcm1pbmF0aW9uICE9PSB1bmRlZmluZWQgJiYgeyBkZWxldGVPblRlcm1pbmF0aW9uOiBlYnNEZXZpY2UuZGVsZXRlT25UZXJtaW5hdGlvbiB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5lbmNyeXB0ZWQgIT09IHVuZGVmaW5lZCAmJiB7IGVuY3J5cHRlZDogZWJzRGV2aWNlLmVuY3J5cHRlZCB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5pb3BzICE9PSB1bmRlZmluZWQgJiYgeyBpb3BzOiBlYnNEZXZpY2UuaW9wcyB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5rbXNLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGttc0tleUlkOiBlYnNEZXZpY2Uua21zS2V5LmtleUFybiB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5zbmFwc2hvdElkICE9PSB1bmRlZmluZWQgJiYgeyBzbmFwc2hvdElkOiBlYnNEZXZpY2Uuc25hcHNob3RJZCB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy50aHJvdWdocHV0ICE9PSB1bmRlZmluZWQgJiYgeyB0aHJvdWdocHV0OiBlYnNEZXZpY2UudGhyb3VnaHB1dCB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy52b2x1bWVTaXplICE9PSB1bmRlZmluZWQgJiYgeyB2b2x1bWVTaXplOiBlYnNEZXZpY2Uudm9sdW1lU2l6ZSB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy52b2x1bWVUeXBlICE9PSB1bmRlZmluZWQgJiYgeyB2b2x1bWVUeXBlOiBlYnNEZXZpY2Uudm9sdW1lVHlwZSB9KSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtYXBwaW5nRW5hYmxlZCA9IGJsb2NrRGV2aWNlLm1hcHBpbmdFbmFibGVkID8/IHRydWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGV2aWNlTmFtZTogYmxvY2tEZXZpY2UuZGV2aWNlTmFtZSxcbiAgICAgICAgICB2aXJ0dWFsTmFtZTogYmxvY2tEZXZpY2Uudm9sdW1lLnZpcnR1YWxOYW1lLFxuICAgICAgICAgIC4uLighbWFwcGluZ0VuYWJsZWQgJiYgeyBub0RldmljZTogJycgfSksXG4gICAgICAgICAgLi4uKE9iamVjdC5rZXlzKGVicykubGVuZ3RoICYmIHsgZWJzIH0pLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGJsb2NrRGV2aWNlcy5sZW5ndGggPyBibG9ja0RldmljZXMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBpbnN0YW5jZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGludG8gdGhlIGBJbnN0YW5jZUNvbmZpZ3VyYXRpb25gIHR5cGUgaW4gdGhlICBDbG91ZEZvcm1hdGlvbiBMMVxuICAgKiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BzIHBhc3NlZCBhcyBpbnB1dCB0byB0aGUgY29uc3RydWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkSW5zdGFuY2VDb25maWd1cmF0aW9uKFxuICAgIHByb3BzOiBDb250YWluZXJSZWNpcGVQcm9wcyxcbiAgKTogQ2ZuQ29udGFpbmVyUmVjaXBlLkluc3RhbmNlQ29uZmlndXJhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBibG9ja0RldmljZXMgPSB0aGlzLnJlbmRlckJsb2NrRGV2aWNlcygpO1xuXG4gICAgY29uc3QgaW5zdGFuY2VDb25maWd1cmF0aW9uOiBDZm5Db250YWluZXJSZWNpcGUuSW5zdGFuY2VDb25maWd1cmF0aW9uUHJvcGVydHkgPSB7XG4gICAgICAuLi4oYmxvY2tEZXZpY2VzPy5sZW5ndGggJiYgeyBibG9ja0RldmljZU1hcHBpbmdzOiBibG9ja0RldmljZXMgfSksXG4gICAgICAuLi4ocHJvcHMuaW5zdGFuY2VJbWFnZSAhPT0gdW5kZWZpbmVkICYmIHsgaW1hZ2U6IHByb3BzLmluc3RhbmNlSW1hZ2UuaW1hZ2UgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhpbnN0YW5jZUNvbmZpZ3VyYXRpb24pLmxlbmd0aCA/IGluc3RhbmNlQ29uZmlndXJhdGlvbiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVDb250YWluZXJSZWNpcGVOYW1lKCkge1xuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMucGh5c2ljYWxOYW1lKSkge1xuICAgICAgcmV0dXJuOyAvLyBDYW5ub3QgdmFsaWRhdGUgdW5yZXNvbHZlZCB0b2tlbnMsIGdpdmVuIHRoZWlyIGFjdHVhbCB2YWx1ZSBpcyByZW5kZXJlZCBhdCBkZXBsb3ltZW50IHRpbWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUubGVuZ3RoID4gMTI4KSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYHRoZSBjb250YWluZXJSZWNpcGVOYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMjggY2hhcmFjdGVycywgZ290OiAnJHt0aGlzLnBoeXNpY2FsTmFtZX0nYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGh5c2ljYWxOYW1lLmluY2x1ZGVzKCcgJykpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgY29udGFpbmVyUmVjaXBlTmFtZSBjYW5ub3QgY29udGFpbiBzcGFjZXMsIGdvdDogJyR7dGhpcy5waHlzaWNhbE5hbWV9J2AsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYHRoZSBjb250YWluZXJSZWNpcGVOYW1lIGNhbm5vdCBjb250YWluIHVuZGVyc2NvcmVzLCBnb3Q6ICcke3RoaXMucGh5c2ljYWxOYW1lfSdgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgY29udGFpbmVyUmVjaXBlTmFtZSBtdXN0IGJlIGxvd2VyY2FzZSwgZ290OiAnJHt0aGlzLnBoeXNpY2FsTmFtZX0nYCwgdGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -398,6 +398,17 @@ export declare class DistributionConfiguration extends DistributionConfiguration
|
|
|
398
398
|
*/
|
|
399
399
|
addContainerDistributions(...containerDistributions: ContainerDistribution[]): void;
|
|
400
400
|
private validateDistributionConfigurationName;
|
|
401
|
+
/**
|
|
402
|
+
* Renders the AMI and container distributions provided as input to the construct, into the `Distribution[]` structure
|
|
403
|
+
* that CfnDistributionConfiguration expects to receive. Distributions provided to CfnDistributionConfiguration must
|
|
404
|
+
* map to a unique region per entry in the list - this render function also handles combining AMI and container
|
|
405
|
+
* distributions in the same region into a single entry.
|
|
406
|
+
*
|
|
407
|
+
* This is rendered at synthesis time, as users can add additional AMI and container distributions with
|
|
408
|
+
* `addAmiDistributions` and `addContainerDistributions`, after the construct has been instantiated.
|
|
409
|
+
*
|
|
410
|
+
* @private
|
|
411
|
+
*/
|
|
401
412
|
private renderDistributions;
|
|
402
413
|
private buildAmiDistribution;
|
|
403
414
|
private buildContainerDistribution;
|