@aws-cdk/aws-imagebuilder-alpha 2.229.1-alpha.0 → 2.231.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 +9966 -4578
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +221 -1
- package/README.md +796 -3
- package/awslint.json +1 -0
- package/lib/amazon-managed-image.d.ts +242 -0
- package/lib/amazon-managed-image.js +522 -0
- package/lib/base-image.d.ts +13 -0
- package/lib/base-image.js +39 -4
- package/lib/component.js +8 -8
- package/lib/container-recipe.js +4 -4
- package/lib/distribution-configuration.js +2 -2
- package/lib/image-pipeline.d.ts +465 -0
- package/lib/image-pipeline.js +469 -0
- package/lib/image-recipe.js +1 -1
- package/lib/image.d.ts +339 -0
- package/lib/image.js +357 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +5 -1
- package/lib/infrastructure-configuration.d.ts +1 -1
- package/lib/infrastructure-configuration.js +2 -2
- package/lib/lifecycle-policy.d.ts +409 -0
- package/lib/lifecycle-policy.js +459 -0
- package/lib/os-version.js +1 -1
- package/lib/private/constants.d.ts +7 -0
- package/lib/private/constants.js +11 -0
- package/lib/private/image-and-pipeline-props-helper.d.ts +26 -0
- package/lib/private/image-and-pipeline-props-helper.js +67 -0
- package/lib/private/policy-helper.d.ts +21 -0
- package/lib/private/policy-helper.js +420 -0
- package/lib/recipe-base.js +1 -1
- package/lib/workflow.d.ts +63 -0
- package/lib/workflow.js +51 -6
- package/package.json +6 -6
- package/rosetta/default.ts-fixture +41 -2
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
3
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
4
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
5
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
6
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
7
|
+
var _, done = false;
|
|
8
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
9
|
+
var context = {};
|
|
10
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
11
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
12
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
13
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
14
|
+
if (kind === "accessor") {
|
|
15
|
+
if (result === void 0) continue;
|
|
16
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
17
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
18
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
19
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
20
|
+
}
|
|
21
|
+
else if (_ = accept(result)) {
|
|
22
|
+
if (kind === "field") initializers.unshift(_);
|
|
23
|
+
else descriptor[key] = _;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
27
|
+
done = true;
|
|
28
|
+
};
|
|
29
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
30
|
+
var useValue = arguments.length > 2;
|
|
31
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
32
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
33
|
+
}
|
|
34
|
+
return useValue ? value : void 0;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.LifecyclePolicy = exports.LifecyclePolicyResourceType = exports.LifecyclePolicyStatus = exports.LifecyclePolicyActionType = 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 metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
44
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
45
|
+
const LIFECYCLE_POLICY_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.LifecyclePolicy');
|
|
46
|
+
/**
|
|
47
|
+
* The action to perform on the resources which the policy applies to
|
|
48
|
+
*/
|
|
49
|
+
var LifecyclePolicyActionType;
|
|
50
|
+
(function (LifecyclePolicyActionType) {
|
|
51
|
+
/**
|
|
52
|
+
* Indicates that the rule should delete the resource when it is applied
|
|
53
|
+
*/
|
|
54
|
+
LifecyclePolicyActionType["DELETE"] = "DELETE";
|
|
55
|
+
/**
|
|
56
|
+
* Indicates that the rule should deprecate the resource when it is applied
|
|
57
|
+
*/
|
|
58
|
+
LifecyclePolicyActionType["DEPRECATE"] = "DEPRECATE";
|
|
59
|
+
/**
|
|
60
|
+
* Indicates that the rule should disable the resource when it is applied
|
|
61
|
+
*/
|
|
62
|
+
LifecyclePolicyActionType["DISABLE"] = "DISABLE";
|
|
63
|
+
})(LifecyclePolicyActionType || (exports.LifecyclePolicyActionType = LifecyclePolicyActionType = {}));
|
|
64
|
+
/**
|
|
65
|
+
* The status of the lifecycle policy, indicating whether it will run
|
|
66
|
+
*/
|
|
67
|
+
var LifecyclePolicyStatus;
|
|
68
|
+
(function (LifecyclePolicyStatus) {
|
|
69
|
+
/**
|
|
70
|
+
* Indicates that the lifecycle policy should be enabled
|
|
71
|
+
*/
|
|
72
|
+
LifecyclePolicyStatus["ENABLED"] = "ENABLED";
|
|
73
|
+
/**
|
|
74
|
+
* Indicates that the lifecycle policy should be disabled
|
|
75
|
+
*/
|
|
76
|
+
LifecyclePolicyStatus["DISABLED"] = "DISABLED";
|
|
77
|
+
})(LifecyclePolicyStatus || (exports.LifecyclePolicyStatus = LifecyclePolicyStatus = {}));
|
|
78
|
+
/**
|
|
79
|
+
* The resource type which the lifecycle policy is applied to
|
|
80
|
+
*/
|
|
81
|
+
var LifecyclePolicyResourceType;
|
|
82
|
+
(function (LifecyclePolicyResourceType) {
|
|
83
|
+
/**
|
|
84
|
+
* Indicates the policy applies to AMI-based images
|
|
85
|
+
*/
|
|
86
|
+
LifecyclePolicyResourceType["AMI_IMAGE"] = "AMI_IMAGE";
|
|
87
|
+
/**
|
|
88
|
+
* Indicates the policy applies to container images
|
|
89
|
+
*/
|
|
90
|
+
LifecyclePolicyResourceType["CONTAINER_IMAGE"] = "CONTAINER_IMAGE";
|
|
91
|
+
})(LifecyclePolicyResourceType || (exports.LifecyclePolicyResourceType = LifecyclePolicyResourceType = {}));
|
|
92
|
+
class LifecyclePolicyBase extends cdk.Resource {
|
|
93
|
+
grant(grantee, ...actions) {
|
|
94
|
+
return iam.Grant.addToPrincipal({
|
|
95
|
+
grantee,
|
|
96
|
+
actions,
|
|
97
|
+
resourceArns: [this.lifecyclePolicyArn],
|
|
98
|
+
scope: this,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
grantRead(grantee) {
|
|
102
|
+
return this.grant(grantee, 'imagebuilder:GetLifecyclePolicy');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Represents an EC2 Image Builder Lifecycle Policy.
|
|
107
|
+
*
|
|
108
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-image-lifecycles.html
|
|
109
|
+
*/
|
|
110
|
+
let LifecyclePolicy = (() => {
|
|
111
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
112
|
+
let _classDescriptor;
|
|
113
|
+
let _classExtraInitializers = [];
|
|
114
|
+
let _classThis;
|
|
115
|
+
let _classSuper = LifecyclePolicyBase;
|
|
116
|
+
var LifecyclePolicy = class extends _classSuper {
|
|
117
|
+
static { _classThis = this; }
|
|
118
|
+
static {
|
|
119
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
120
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
121
|
+
LifecyclePolicy = _classThis = _classDescriptor.value;
|
|
122
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
123
|
+
}
|
|
124
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.LifecyclePolicy", version: "2.231.0-alpha.0" };
|
|
125
|
+
/** Uniquely identifies this class. */
|
|
126
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.LifecyclePolicy';
|
|
127
|
+
/**
|
|
128
|
+
* Import an existing lifecycle policy given its ARN.
|
|
129
|
+
*/
|
|
130
|
+
static fromLifecyclePolicyArn(scope, id, lifecyclePolicyArn) {
|
|
131
|
+
const lifecyclePolicyName = cdk.Stack.of(scope).splitArn(lifecyclePolicyArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
|
|
132
|
+
class Import extends LifecyclePolicyBase {
|
|
133
|
+
lifecyclePolicyArn = lifecyclePolicyArn;
|
|
134
|
+
lifecyclePolicyName = lifecyclePolicyName;
|
|
135
|
+
}
|
|
136
|
+
return new Import(scope, id);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Import an existing lifecycle policy given its name. If the name is a token representing a dynamic CloudFormation
|
|
140
|
+
* expression, you must ensure all alphabetic characters in the expression are already lowercased
|
|
141
|
+
*/
|
|
142
|
+
static fromLifecyclePolicyName(scope, id, lifecyclePolicyName) {
|
|
143
|
+
return LifecyclePolicy.fromLifecyclePolicyArn(scope, id, cdk.Stack.of(scope).formatArn({
|
|
144
|
+
service: 'imagebuilder',
|
|
145
|
+
resource: 'lifecycle-policy',
|
|
146
|
+
resourceName: lifecyclePolicyName,
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Return whether the given object is a LifecyclePolicy.
|
|
151
|
+
*/
|
|
152
|
+
static isLifecyclePolicy(x) {
|
|
153
|
+
return x !== null && typeof x === 'object' && LIFECYCLE_POLICY_SYMBOL in x;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The ARN of the lifecycle policy
|
|
157
|
+
*/
|
|
158
|
+
lifecyclePolicyArn;
|
|
159
|
+
/**
|
|
160
|
+
* The name of the lifecycle policy
|
|
161
|
+
*/
|
|
162
|
+
lifecyclePolicyName;
|
|
163
|
+
/**
|
|
164
|
+
* The execution role used for lifecycle policy executions
|
|
165
|
+
*/
|
|
166
|
+
executionRole;
|
|
167
|
+
constructor(scope, id, props) {
|
|
168
|
+
super(scope, id, {
|
|
169
|
+
physicalName: props.lifecyclePolicyName ??
|
|
170
|
+
cdk.Lazy.string({
|
|
171
|
+
produce: () => cdk.Names.uniqueResourceName(this, {
|
|
172
|
+
maxLength: 128,
|
|
173
|
+
separator: '-',
|
|
174
|
+
allowedSpecialCharacters: '-',
|
|
175
|
+
}).toLowerCase(),
|
|
176
|
+
}),
|
|
177
|
+
});
|
|
178
|
+
try {
|
|
179
|
+
jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_LifecyclePolicyProps(props);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
183
|
+
Error.captureStackTrace(error, LifecyclePolicy);
|
|
184
|
+
}
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
// Enhanced CDK Analytics Telemetry
|
|
188
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
189
|
+
Object.defineProperty(this, LIFECYCLE_POLICY_SYMBOL, { value: true });
|
|
190
|
+
this.validateLifecyclePolicyName();
|
|
191
|
+
this.validatePolicy(props);
|
|
192
|
+
this.executionRole =
|
|
193
|
+
props.executionRole ??
|
|
194
|
+
new iam.Role(this, 'ExecutionRole', {
|
|
195
|
+
assumedBy: new iam.ServicePrincipal('imagebuilder.amazonaws.com'),
|
|
196
|
+
managedPolicies: [
|
|
197
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/EC2ImageBuilderLifecycleExecutionPolicy'),
|
|
198
|
+
],
|
|
199
|
+
});
|
|
200
|
+
const lifecyclePolicy = new aws_imagebuilder_1.CfnLifecyclePolicy(this, 'Resource', {
|
|
201
|
+
name: this.physicalName,
|
|
202
|
+
description: props.description,
|
|
203
|
+
resourceType: props.resourceType,
|
|
204
|
+
executionRole: this.executionRole.roleArn,
|
|
205
|
+
policyDetails: this.buildPolicyDetails(props.resourceType, props.details),
|
|
206
|
+
resourceSelection: {
|
|
207
|
+
...(props.resourceSelection.recipes !== undefined && {
|
|
208
|
+
recipes: this.buildRecipes(props.resourceType, props.resourceSelection.recipes),
|
|
209
|
+
}),
|
|
210
|
+
tagMap: props.resourceSelection.tags,
|
|
211
|
+
},
|
|
212
|
+
status: props.status,
|
|
213
|
+
tags: props.tags,
|
|
214
|
+
});
|
|
215
|
+
this.lifecyclePolicyName = this.getResourceNameAttribute(lifecyclePolicy.ref);
|
|
216
|
+
this.lifecyclePolicyArn = this.getResourceArnAttribute(lifecyclePolicy.attrArn, {
|
|
217
|
+
service: 'imagebuilder',
|
|
218
|
+
resource: 'lifecycle-policy',
|
|
219
|
+
resourceName: this.physicalName,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Generates the policy details property into the `PolicyDetail` type in the CloudFormation L1 definition.
|
|
224
|
+
*
|
|
225
|
+
* @param resourceType The resource type of the lifecycle policy
|
|
226
|
+
* @param details The lifecycle policy rules
|
|
227
|
+
* @private
|
|
228
|
+
*/
|
|
229
|
+
buildPolicyDetails(resourceType, details) {
|
|
230
|
+
return details.map((detail) => {
|
|
231
|
+
const action = this.buildAction(resourceType, detail.action);
|
|
232
|
+
const exclusionRules = detail.exclusionRules !== undefined ? this.buildExclusionRules(detail.exclusionRules) : undefined;
|
|
233
|
+
this.validatePolicyDetailAction(resourceType, detail.action, exclusionRules?.amis);
|
|
234
|
+
this.validatePolicyDetailFilter(detail.filter);
|
|
235
|
+
return {
|
|
236
|
+
action: action,
|
|
237
|
+
filter: {
|
|
238
|
+
retainAtLeast: detail.filter.ageFilter?.retainAtLeast,
|
|
239
|
+
type: detail.filter.ageFilter !== undefined ? 'AGE' : 'COUNT',
|
|
240
|
+
...(detail.filter.ageFilter !== undefined
|
|
241
|
+
? this.convertDurationToTimeUnitValue(detail.filter.ageFilter.age)
|
|
242
|
+
: { value: detail.filter.countFilter.count }),
|
|
243
|
+
},
|
|
244
|
+
...(exclusionRules !== undefined && { exclusionRules }),
|
|
245
|
+
};
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Generates the recipes property in the resource selection into the `RecipeSelection` type in the CloudFormation L1
|
|
250
|
+
* definition.
|
|
251
|
+
*
|
|
252
|
+
* @param resourceType The resource type of the lifecycle policy
|
|
253
|
+
* @param recipes The recipes passed in the props
|
|
254
|
+
* @private
|
|
255
|
+
*/
|
|
256
|
+
buildRecipes(resourceType, recipes) {
|
|
257
|
+
return recipes?.map((recipe) => {
|
|
258
|
+
if (recipe._isImageRecipe()) {
|
|
259
|
+
if (resourceType === LifecyclePolicyResourceType.CONTAINER_IMAGE) {
|
|
260
|
+
throw new cdk.ValidationError(`recipes in the resource selection must all be container recipes for policy type ${LifecyclePolicyResourceType.CONTAINER_IMAGE}`, this);
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
name: recipe.imageRecipeName,
|
|
264
|
+
semanticVersion: recipe.imageRecipeVersion,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
if (recipe._isContainerRecipe()) {
|
|
268
|
+
if (resourceType === LifecyclePolicyResourceType.AMI_IMAGE) {
|
|
269
|
+
throw new cdk.ValidationError(`recipes in the resource selection must all be image recipes for policy type ${LifecyclePolicyResourceType.AMI_IMAGE}`, this);
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
name: recipe.containerRecipeName,
|
|
273
|
+
semanticVersion: recipe.containerRecipeVersion,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
throw new cdk.ValidationError('recipes in the resource selection must either be an IImageRecipe or IContainerRecipe', this);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Generates the exclusion rules property into the `ExclusionRules` type in the CloudFormation L1 definition.
|
|
281
|
+
*
|
|
282
|
+
* @param exclusionRules The exclusion rules for resources applied in the lifecycle policy rule
|
|
283
|
+
* @private
|
|
284
|
+
*/
|
|
285
|
+
buildExclusionRules(exclusionRules) {
|
|
286
|
+
const amiExclusionRules = {
|
|
287
|
+
...(exclusionRules.amiExclusionRules?.isPublic && { isPublic: exclusionRules.amiExclusionRules.isPublic }),
|
|
288
|
+
...(exclusionRules.amiExclusionRules?.lastLaunched !== undefined && {
|
|
289
|
+
lastLaunched: this.convertDurationToTimeUnitValue(exclusionRules.amiExclusionRules.lastLaunched, 365),
|
|
290
|
+
}),
|
|
291
|
+
...(exclusionRules.amiExclusionRules?.regions?.length && { regions: exclusionRules.amiExclusionRules.regions }),
|
|
292
|
+
...(exclusionRules.amiExclusionRules?.sharedAccounts?.length && {
|
|
293
|
+
sharedAccounts: exclusionRules.amiExclusionRules.sharedAccounts,
|
|
294
|
+
}),
|
|
295
|
+
...(exclusionRules.amiExclusionRules?.tags && { tagMap: exclusionRules.amiExclusionRules.tags }),
|
|
296
|
+
};
|
|
297
|
+
const cfnExclusionRules = {
|
|
298
|
+
...(Object.keys(amiExclusionRules).length && { amis: amiExclusionRules }),
|
|
299
|
+
...(exclusionRules.imageExclusionRules !== undefined && { tagMap: exclusionRules.imageExclusionRules.tags }),
|
|
300
|
+
};
|
|
301
|
+
return Object.keys(exclusionRules).length ? cfnExclusionRules : undefined;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Generates the action property into the `Action` type in the CloudFormation L1 definition.
|
|
305
|
+
*
|
|
306
|
+
* @param resourceType The resource type of the lifecycle policy
|
|
307
|
+
* @param action The action being taken in the lifecycle policy rule
|
|
308
|
+
* @private
|
|
309
|
+
*/
|
|
310
|
+
buildAction(resourceType, action) {
|
|
311
|
+
const isContainerPolicy = !cdk.Token.isUnresolved(resourceType) && resourceType === LifecyclePolicyResourceType.CONTAINER_IMAGE;
|
|
312
|
+
const isAmiPolicy = !cdk.Token.isUnresolved(resourceType) && resourceType === LifecyclePolicyResourceType.AMI_IMAGE;
|
|
313
|
+
const amis = action.includeAmis ?? (isAmiPolicy ? true : undefined);
|
|
314
|
+
const snapshots = action.includeSnapshots ?? (isAmiPolicy ? true : undefined);
|
|
315
|
+
const containers = action.includeContainers ?? (isContainerPolicy ? true : undefined);
|
|
316
|
+
const includeResources = {
|
|
317
|
+
...(amis !== undefined && { amis }),
|
|
318
|
+
...(snapshots !== undefined && { snapshots }),
|
|
319
|
+
...(containers !== undefined && { containers }),
|
|
320
|
+
};
|
|
321
|
+
return {
|
|
322
|
+
type: action.type,
|
|
323
|
+
...(Object.keys(includeResources).length && { includeResources }),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Validates the top-level properties of the policy
|
|
328
|
+
*
|
|
329
|
+
* @param props The props passed as input to the construct
|
|
330
|
+
* @private
|
|
331
|
+
*/
|
|
332
|
+
validatePolicy(props) {
|
|
333
|
+
if (props.resourceSelection.recipes?.length && Object.keys(props.resourceSelection.tags || {}).length) {
|
|
334
|
+
throw new cdk.ValidationError('resource selection cannot contain both recipes and tags', this);
|
|
335
|
+
}
|
|
336
|
+
if (!props.resourceSelection.recipes?.length && !Object.keys(props.resourceSelection.tags || {}).length) {
|
|
337
|
+
throw new cdk.ValidationError('resource selection must contain either recipes or tags', this);
|
|
338
|
+
}
|
|
339
|
+
if (props.details.length === 0) {
|
|
340
|
+
throw new cdk.ValidationError('a lifecycle policy must have at least 1 rule', this);
|
|
341
|
+
}
|
|
342
|
+
if (props.details.length > 3) {
|
|
343
|
+
throw new cdk.ValidationError('a lifecycle policy can only have up to 3 rules', this);
|
|
344
|
+
}
|
|
345
|
+
const actions = props.details.map((detail) => detail.action.type);
|
|
346
|
+
if (new Set(actions).size != actions.length) {
|
|
347
|
+
throw new cdk.ValidationError('lifecycle policy rules may not have duplicate actions', this);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Validates a policy detail filter within a lifecycle policy rule
|
|
352
|
+
*
|
|
353
|
+
* @param resourceType The resource type of the lifecycle policy
|
|
354
|
+
* @param action The action being taken in the lifecycle policy rule
|
|
355
|
+
* @param amiExclusionRules The AMI exclusion rules in the lifecycle policy rule
|
|
356
|
+
* @private
|
|
357
|
+
*/
|
|
358
|
+
validatePolicyDetailAction(resourceType, action, amiExclusionRules) {
|
|
359
|
+
if (!cdk.Token.isUnresolved(resourceType) && resourceType === LifecyclePolicyResourceType.CONTAINER_IMAGE) {
|
|
360
|
+
if (!cdk.Token.isUnresolved(action.type) && action.type !== LifecyclePolicyActionType.DELETE) {
|
|
361
|
+
throw new cdk.ValidationError('you may only specify DELETE rules for container policies', this);
|
|
362
|
+
}
|
|
363
|
+
if (action.includeAmis) {
|
|
364
|
+
throw new cdk.ValidationError('you cannot include AMIs in a container policy', this);
|
|
365
|
+
}
|
|
366
|
+
if (action.includeSnapshots) {
|
|
367
|
+
throw new cdk.ValidationError('you cannot include snapshots in a container policy', this);
|
|
368
|
+
}
|
|
369
|
+
if (amiExclusionRules !== undefined) {
|
|
370
|
+
throw new cdk.ValidationError('you cannot exclude AMIs in a container policy', this);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (!cdk.Token.isUnresolved(resourceType) &&
|
|
374
|
+
resourceType === LifecyclePolicyResourceType.AMI_IMAGE &&
|
|
375
|
+
action.includeContainers) {
|
|
376
|
+
throw new cdk.ValidationError('you cannot include containers in an AMI policy', this);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Validates a policy detail filter
|
|
381
|
+
*
|
|
382
|
+
* @param filter The lifecycle policy resource filter applied in the rule
|
|
383
|
+
* @private
|
|
384
|
+
*/
|
|
385
|
+
validatePolicyDetailFilter(filter) {
|
|
386
|
+
if (filter.ageFilter !== undefined && filter.countFilter !== undefined) {
|
|
387
|
+
throw new cdk.ValidationError('either age count can be specified in a policy filter, but not both', this);
|
|
388
|
+
}
|
|
389
|
+
if (filter.ageFilter === undefined && filter.countFilter === undefined) {
|
|
390
|
+
throw new cdk.ValidationError('you must provide an age or count filter in the policy', this);
|
|
391
|
+
}
|
|
392
|
+
const retainAtLeast = filter.ageFilter?.retainAtLeast;
|
|
393
|
+
if (retainAtLeast !== undefined) {
|
|
394
|
+
if (retainAtLeast < 1) {
|
|
395
|
+
throw new cdk.ValidationError('the retainAtLeast filter value must be at least 1', this);
|
|
396
|
+
}
|
|
397
|
+
if (retainAtLeast > 10) {
|
|
398
|
+
throw new cdk.ValidationError('the retainAtLeast filter value must be at most 10', this);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Converts a `cdk.Duration` into the value and unit which is accepted as filter age and last launched age in the
|
|
404
|
+
* lifecycle policy. The value is rounded up to the nearest whole number.
|
|
405
|
+
*
|
|
406
|
+
* @param duration The duration to convert
|
|
407
|
+
* @param valueLimit The maximum value that can be specified
|
|
408
|
+
* @private
|
|
409
|
+
*/
|
|
410
|
+
convertDurationToTimeUnitValue(duration, valueLimit = 1000) {
|
|
411
|
+
const DAYS_PER_WEEK = 7;
|
|
412
|
+
const DAYS_PER_MONTH = 30;
|
|
413
|
+
const DAYS_PER_YEAR = 365;
|
|
414
|
+
const valueInDays = Math.ceil(duration.toDays());
|
|
415
|
+
if (valueInDays < 1) {
|
|
416
|
+
throw new cdk.ValidationError('the provided duration must be at least 1 day', this);
|
|
417
|
+
}
|
|
418
|
+
if (valueInDays <= valueLimit) {
|
|
419
|
+
return { value: valueInDays, unit: 'DAYS' };
|
|
420
|
+
}
|
|
421
|
+
const valueInWeeks = Math.ceil(valueInDays / DAYS_PER_WEEK);
|
|
422
|
+
if (valueInWeeks <= valueLimit) {
|
|
423
|
+
return { value: valueInWeeks, unit: 'WEEKS' };
|
|
424
|
+
}
|
|
425
|
+
const valueInMonths = Math.ceil(valueInDays / DAYS_PER_MONTH);
|
|
426
|
+
if (valueInMonths <= valueLimit) {
|
|
427
|
+
return { value: valueInMonths, unit: 'MONTHS' };
|
|
428
|
+
}
|
|
429
|
+
const valueInYears = Math.ceil(valueInDays / DAYS_PER_YEAR);
|
|
430
|
+
if (valueInYears <= valueLimit) {
|
|
431
|
+
return { value: valueInYears, unit: 'YEARS' };
|
|
432
|
+
}
|
|
433
|
+
throw new cdk.ValidationError(`the provided duration must be less than ${valueLimit} years`, this);
|
|
434
|
+
}
|
|
435
|
+
validateLifecyclePolicyName() {
|
|
436
|
+
if (cdk.Token.isUnresolved(this.physicalName)) {
|
|
437
|
+
return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
|
|
438
|
+
}
|
|
439
|
+
if (this.physicalName.length > 128) {
|
|
440
|
+
throw new cdk.ValidationError('The lifecyclePolicyName cannot be longer than 128 characters', this);
|
|
441
|
+
}
|
|
442
|
+
if (this.physicalName.includes(' ')) {
|
|
443
|
+
throw new cdk.ValidationError('The lifecyclePolicyName cannot contain spaces', this);
|
|
444
|
+
}
|
|
445
|
+
if (this.physicalName.includes('_')) {
|
|
446
|
+
throw new cdk.ValidationError('The lifecyclePolicyName cannot contain underscores', this);
|
|
447
|
+
}
|
|
448
|
+
if (this.physicalName !== this.physicalName.toLowerCase()) {
|
|
449
|
+
throw new cdk.ValidationError('The lifecyclePolicyName must be lowercase', this);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
static {
|
|
453
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
return LifecyclePolicy = _classThis;
|
|
457
|
+
})();
|
|
458
|
+
exports.LifecyclePolicy = LifecyclePolicy;
|
|
459
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxpZmVjeWNsZS1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUMzQyxtRUFBa0U7QUFDbEUsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUkxRSxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztBQW9DOUY7O0dBRUc7QUFDSCxJQUFZLHlCQWFYO0FBYkQsV0FBWSx5QkFBeUI7SUFDbkM7O09BRUc7SUFDSCw4Q0FBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILG9EQUF1QixDQUFBO0lBQ3ZCOztPQUVHO0lBQ0gsZ0RBQW1CLENBQUE7QUFDckIsQ0FBQyxFQWJXLHlCQUF5Qix5Q0FBekIseUJBQXlCLFFBYXBDO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLHFCQVVYO0FBVkQsV0FBWSxxQkFBcUI7SUFDL0I7O09BRUc7SUFDSCw0Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILDhDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFWVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQVVoQztBQUVEOztHQUVHO0FBQ0gsSUFBWSwyQkFVWDtBQVZELFdBQVksMkJBQTJCO0lBQ3JDOztPQUVHO0lBQ0gsc0RBQXVCLENBQUE7SUFFdkI7O09BRUc7SUFDSCxrRUFBbUMsQ0FBQTtBQUNyQyxDQUFDLEVBVlcsMkJBQTJCLDJDQUEzQiwyQkFBMkIsUUFVdEM7QUF5UEQsTUFBZSxtQkFBb0IsU0FBUSxHQUFHLENBQUMsUUFBUTtJQUk5QyxLQUFLLENBQUMsT0FBdUIsRUFBRSxHQUFHLE9BQWlCO1FBQ3hELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDOUIsT0FBTztZQUNQLE9BQU87WUFDUCxZQUFZLEVBQUUsQ0FB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QUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNoRCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsMkNBQTJDLFVBQVUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BHO1FBRU8sMkJBQTJCO1lBQ2pDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyw2RkFBNkY7WUFDdkcsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLDhEQUE4RCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RHLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLCtDQUErQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLG9EQUFvRCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVGLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQywyQ0FBMkMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRixDQUFDO1NBQ0Y7O1lBM1pVLHVEQUFlOzs7OztBQUFmLDBDQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENmbkxpZmVjeWNsZVBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pbWFnZWJ1aWxkZXInO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJUmVjaXBlQmFzZSB9IGZyb20gJy4vcmVjaXBlLWJhc2UnO1xuXG5jb25zdCBMSUZFQ1lDTEVfUE9MSUNZX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0Bhd3MtY2RrL2F3cy1pbWFnZWJ1aWxkZXItYWxwaGEuTGlmZWN5Y2xlUG9saWN5Jyk7XG5cbi8qKlxuICogQW4gRUMyIEltYWdlIEJ1aWxkZXIgTGlmZWN5Y2xlIFBvbGljeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTGlmZWN5Y2xlUG9saWN5IGV4dGVuZHMgY2RrLklSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxpZmVjeWNsZVBvbGljeUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgLSBUaGUgbGlzdCBvZiBhY3Rpb25zXG4gICAqL1xuICBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBsaWZlY3ljbGUgcG9saWN5XG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIHByaW5jaXBhbFxuICAgKi9cbiAgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xufVxuXG4vKipcbiAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgcmVzb3VyY2VzIHdoaWNoIHRoZSBwb2xpY3kgYXBwbGllcyB0b1xuICovXG5leHBvcnQgZW51bSBMaWZlY3ljbGVQb2xpY3lBY3Rpb25UeXBlIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBydWxlIHNob3VsZCBkZWxldGUgdGhlIHJlc291cmNlIHdoZW4gaXQgaXMgYXBwbGllZFxuICAgKi9cbiAgREVMRVRFID0gJ0RFTEVURScsXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBzaG91bGQgZGVwcmVjYXRlIHRoZSByZXNvdXJjZSB3aGVuIGl0IGlzIGFwcGxpZWRcbiAgICovXG4gIERFUFJFQ0FURSA9ICdERVBSRUNBVEUnLFxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgc2hvdWxkIGRpc2FibGUgdGhlIHJlc291cmNlIHdoZW4gaXQgaXMgYXBwbGllZFxuICAgKi9cbiAgRElTQUJMRSA9ICdESVNBQkxFJyxcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5LCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgd2lsbCBydW5cbiAqL1xuZXhwb3J0IGVudW0gTGlmZWN5Y2xlUG9saWN5U3RhdHVzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBsaWZlY3ljbGUgcG9saWN5IHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBFTkFCTEVEID0gJ0VOQUJMRUQnLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICovXG4gIERJU0FCTEVEID0gJ0RJU0FCTEVEJyxcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgdHlwZSB3aGljaCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBpcyBhcHBsaWVkIHRvXG4gKi9cbmV4cG9ydCBlbnVtIExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZSB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHBvbGljeSBhcHBsaWVzIHRvIEFNSS1iYXNlZCBpbWFnZXNcbiAgICovXG4gIEFNSV9JTUFHRSA9ICdBTUlfSU1BR0UnLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHBvbGljeSBhcHBsaWVzIHRvIGNvbnRhaW5lciBpbWFnZXNcbiAgICovXG4gIENPTlRBSU5FUl9JTUFHRSA9ICdDT05UQUlORVJfSU1BR0UnLFxufVxuXG4vKipcbiAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5QWN0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgcmVzb3VyY2VzIHNlbGVjdGVkIGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IExpZmVjeWNsZVBvbGljeUFjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBBTUlzIGluIHRoZSBzY29wZSBvZiB0aGUgbGlmZWN5Y2xlIHJ1bGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlIGZvciBBTUktYmFzZWQgcG9saWNpZXMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUFtaXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGFpbmVycyBpbiB0aGUgc2NvcGUgb2YgdGhlIGxpZmVjeWNsZSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSBmb3IgY29udGFpbmVyLWJhc2VkIHBvbGljaWVzLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVDb250YWluZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHNuYXBzaG90cyBpbiB0aGUgc2NvcGUgb2YgdGhlIGxpZmVjeWNsZSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSBmb3IgQU1JLWJhc2VkIHBvbGljaWVzLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVTbmFwc2hvdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSByZXNvdXJjZSBmaWx0ZXJpbmcgdG8gYXBwbHkgaW4gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVBvbGljeUZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgYWdlIGZpbHRlciB0byBhcHBseSBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZSBpZiBhIGNvdW50IGZpbHRlciBpcyBwcm92aWRlZC4gT3RoZXJ3aXNlLCBhbiBhZ2UgZmlsdGVyIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWdlRmlsdGVyPzogTGlmZWN5Y2xlUG9saWN5QWdlRmlsdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgY291bnQgZmlsdGVyIHRvIGFwcGx5IGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIGFuIGFnZSBmaWx0ZXIgaXMgcHJvdmlkZWQuIE90aGVyd2lzZSwgYSBjb3VudCBmaWx0ZXIgaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZWFkb25seSBjb3VudEZpbHRlcj86IExpZmVjeWNsZVBvbGljeUNvdW50RmlsdGVyO1xufVxuXG4vKipcbiAqIFRoZSBjb3VudC1iYXNlZCBmaWx0ZXJpbmcgdG8gYXBwbHkgaW4gYSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVQb2xpY3lDb3VudEZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIGtlZXAgb24gaGFuZCBhcyBwYXJ0IG9mIHJlc291cmNlIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYWdlLWJhc2VkIGZpbHRlcmluZyB0byBhcHBseSBpbiBhIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVBvbGljeUFnZUZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhZ2Ugb2YgdGhlIHJlc291cmNlIHRvIGZpbHRlci4gVGhlIHByb3ZpZGVkIGR1cmF0aW9uIHdpbGwgYmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdFxuICAgKiBkYXkvd2Vlay9tb250aC95ZWFyIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWdlOiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEZvciBhZ2UtYmFzZWQgZmlsdGVycywgdGhlIG51bWJlciBvZiBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgdG8ga2VlcCBvbiBoYW5kIG9uY2UgdGhlIHJ1bGUgaXMgYXBwbGllZC4gVGhlIHZhbHVlXG4gICAqIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMC5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgcmV0YWluQXRMZWFzdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5SW1hZ2VFeGNsdXNpb25SdWxlcyB7XG4gIC8qKlxuICAgKiBFeGNsdWRlcyBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgd2l0aCBhbnkgb2YgdGhlIHByb3ZpZGVkIHRhZ3MgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqL1xuICByZWFkb25seSB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBydWxlcyB0byBhcHBseSBmb3IgZXhjbHVkaW5nIEFNSXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5QW1pRXhjbHVzaW9uUnVsZXMge1xuICAvKipcbiAgICogRXhjbHVkZXMgcHVibGljIEFNSXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlIGlmIHRydWVcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzUHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhjbHVkZXMgQU1JcyB3aGljaCB3ZXJlIGxhdW5jaGVkIGZyb20gd2l0aGluIHRoZSBwcm92aWRlZCBkdXJhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBsYXN0TGF1bmNoZWQ/OiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIEFNSXMgd2hpY2ggcmVzaWRlIGluIGFueSBvZiB0aGUgcHJvdmlkZWQgcmVnaW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSByZWdpb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIEFNSXMgd2hpY2ggYXJlIHNoYXJlZCB3aXRoIGFueSBvZiB0aGUgcHJvdmlkZWQgc2hhcmVkIGFjY291bnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHNoYXJlZEFjY291bnRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIEFNSXMgd2hpY2ggaGF2ZSBhbnkgb2YgdGhlIHByb3ZpZGVkIHRhZ3MgYXBwbGllZCB0byBpdFxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyByZXNvdXJjZXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5RXhjbHVzaW9uUnVsZXMge1xuICAvKipcbiAgICogVGhlIHJ1bGVzIHRvIGFwcGx5IGZvciBleGNsdWRpbmcgRUMyIEltYWdlIEJ1aWxkZXIgaW1hZ2VzIGZyb20gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4Y2x1c2lvbiBydWxlcyBhcmUgYXBwbGllZCBvbiB0aGUgaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlRXhjbHVzaW9uUnVsZXM/OiBMaWZlY3ljbGVQb2xpY3lJbWFnZUV4Y2x1c2lvblJ1bGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyBBTUlzIGZyb20gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4Y2x1c2lvbiBydWxlcyBhcmUgYXBwbGllZCBvbiB0aGUgQU1JXG4gICAqL1xuICByZWFkb25seSBhbWlFeGNsdXNpb25SdWxlcz86IExpZmVjeWNsZVBvbGljeUFtaUV4Y2x1c2lvblJ1bGVzO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVQb2xpY3lEZXRhaWwge1xuICAvKipcbiAgICogVGhlIGFjdGlvbiB0byBwZXJmb3JtIGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogTGlmZWN5Y2xlUG9saWN5QWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgZmlsdGVyaW5nIHRvIGFwcGx5IGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcjogTGlmZWN5Y2xlUG9saWN5RmlsdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyByZXNvdXJjZXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXhjbHVzaW9uIHJ1bGVzIGFyZSBhcHBsaWVkIG9uIGFueSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVzaW9uUnVsZXM/OiBMaWZlY3ljbGVQb2xpY3lFeGNsdXNpb25SdWxlcztcbn1cblxuLyoqXG4gKiBTZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBhcHBsaWVzIHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VTZWxlY3Rpb24ge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgaW1hZ2UgcmVjaXBlcyBvciBjb250YWluZXIgcmVjaXBlcyB0byBhcHBseSB0aGUgbGlmZWN5Y2xlIHBvbGljeSB0b1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgaWYgdGFnIHNlbGVjdGlvbnMgYXJlIHByb3ZpZGVkLiBPdGhlcndpc2UsIGF0IGxlYXN0IG9uZSByZWNpcGUgb3IgdGFnIHNlbGVjdGlvbiBtdXN0IGJlIHByb3ZpZGVkXG4gICAqL1xuICByZWFkb25seSByZWNpcGVzPzogSVJlY2lwZUJhc2VbXTtcblxuICAvKipcbiAgICogU2VsZWN0cyBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgY29udGFpbmluZyBhbnkgb2YgdGhlIHByb3ZpZGVkIHRhZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIHJlY2lwZSBzZWxlY3Rpb25zIGFyZSBwcm92aWRlZC4gT3RoZXJ3aXNlLCBhdCBsZWFzdCBvbmUgcmVjaXBlIG9yIHRhZyBzZWxlY3Rpb24gbXVzdCBiZSBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBMaWZlY3ljbGUgUG9saWN5IHJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5UHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgSW1hZ2UgQnVpbGRlciByZXNvdXJjZSB0aGF0IHRoZSBsaWZlY3ljbGUgcG9saWN5IGFwcGxpZXMgdG8uXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZVR5cGU6IExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZTtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGRldGFpbHM6IExpZmVjeWNsZVBvbGljeURldGFpbFtdO1xuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBhcHBsaWVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VTZWxlY3Rpb246IExpZmVjeWNsZVBvbGljeVJlc291cmNlU2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgaXMgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBMaWZlY3ljbGVQb2xpY3lTdGF0dXMuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogTGlmZWN5Y2xlUG9saWN5U3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0aW9uIHJvbGUgdGhhdCBncmFudHMgSW1hZ2UgQnVpbGRlciBhY2Nlc3MgdG8gcnVuIGxpZmVjeWNsZSBhY3Rpb25zLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhbiBleGVjdXRpb24gcm9sZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgbWluaW1hbCBwZXJtaXNzaW9ucyBuZWVkZWQgdG8gZXhlY3V0ZSB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKiBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFuIGV4ZWN1dGlvbiByb2xlIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFncyB0byBhcHBseSB0byB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5hYnN0cmFjdCBjbGFzcyBMaWZlY3ljbGVQb2xpY3lCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUxpZmVjeWNsZVBvbGljeSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGxpZmVjeWNsZVBvbGljeUFybjogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMubGlmZWN5Y2xlUG9saWN5QXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgJ2ltYWdlYnVpbGRlcjpHZXRMaWZlY3ljbGVQb2xpY3knKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gRUMyIEltYWdlIEJ1aWxkZXIgTGlmZWN5Y2xlIFBvbGljeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9tYW5hZ2UtaW1hZ2UtbGlmZWN5Y2xlcy5odG1sXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVQb2xpY3kgZXh0ZW5kcyBMaWZlY3ljbGVQb2xpY3lCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtaW1hZ2VidWlsZGVyLWFscGhhLkxpZmVjeWNsZVBvbGljeSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBsaWZlY3ljbGUgcG9saWN5IGdpdmVuIGl0cyBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21MaWZlY3ljbGVQb2xpY3lBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgbGlmZWN5Y2xlUG9saWN5QXJuOiBzdHJpbmcpOiBJTGlmZWN5Y2xlUG9saWN5IHtcbiAgICBjb25zdCBsaWZlY3ljbGVQb2xpY3lOYW1lID0gY2RrLlN0YWNrLm9mKHNjb3BlKS5zcGxpdEFybihcbiAgICAgIGxpZmVjeWNsZVBvbGljeUFybixcbiAgICAgIGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICApLnJlc291cmNlTmFtZSE7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBMaWZlY3ljbGVQb2xpY3lCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lBcm4gPSBsaWZlY3ljbGVQb2xpY3lBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbGlmZWN5Y2xlUG9saWN5TmFtZSA9IGxpZmVjeWNsZVBvbGljeU5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgbGlmZWN5Y2xlIHBvbGljeSBnaXZlbiBpdHMgbmFtZS4gSWYgdGhlIG5hbWUgaXMgYSB0b2tlbiByZXByZXNlbnRpbmcgYSBkeW5hbWljIENsb3VkRm9ybWF0aW9uXG4gICAqIGV4cHJlc3Npb24sIHlvdSBtdXN0IGVuc3VyZSBhbGwgYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIHRoZSBleHByZXNzaW9uIGFyZSBhbHJlYWR5IGxvd2VyY2FzZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUxpZmVjeWNsZVBvbGljeU5hbWUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgbGlmZWN5Y2xlUG9saWN5TmFtZTogc3RyaW5nKTogSUxpZmVjeWNsZVBvbGljeSB7XG4gICAgcmV0dXJuIExpZmVjeWNsZVBvbGljeS5mcm9tTGlmZWN5Y2xlUG9saWN5QXJuKFxuICAgICAgc2NvcGUsXG4gICAgICBpZCxcbiAgICAgIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICAgIHJlc291cmNlOiAnbGlmZWN5Y2xlLXBvbGljeScsXG4gICAgICAgIHJlc291cmNlTmFtZTogbGlmZWN5Y2xlUG9saWN5TmFtZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIExpZmVjeWNsZVBvbGljeS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNMaWZlY3ljbGVQb2xpY3koeDogYW55KTogeCBpcyBMaWZlY3ljbGVQb2xpY3kge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiBMSUZFQ1lDTEVfUE9MSUNZX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3lcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3lcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZSB1c2VkIGZvciBsaWZlY3ljbGUgcG9saWN5IGV4ZWN1dGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBleGVjdXRpb25Sb2xlOiBpYW0uSVJvbGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBMaWZlY3ljbGVQb2xpY3lQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOlxuICAgICAgICBwcm9wcy5saWZlY3ljbGVQb2xpY3lOYW1lID8/XG4gICAgICAgIGNkay5MYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIGNkay5OYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICAgICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgICAgICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgICAgICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy0nLFxuICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgfSksXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTElGRUNZQ0xFX1BPTElDWV9TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlTGlmZWN5Y2xlUG9saWN5TmFtZSgpO1xuICAgIHRoaXMudmFsaWRhdGVQb2xpY3kocHJvcHMpO1xuXG4gICAgdGhpcy5leGVjdXRpb25Sb2xlID1cbiAgICAgIHByb3BzLmV4ZWN1dGlvblJvbGUgPz9cbiAgICAgIG5ldyBpYW0uUm9sZSh0aGlzLCAnRXhlY3V0aW9uUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2ltYWdlYnVpbGRlci5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0VDMkltYWdlQnVpbGRlckxpZmVjeWNsZUV4ZWN1dGlvblBvbGljeScpLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCBsaWZlY3ljbGVQb2xpY3kgPSBuZXcgQ2ZuTGlmZWN5Y2xlUG9saWN5KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcmVzb3VyY2VUeXBlOiBwcm9wcy5yZXNvdXJjZVR5cGUsXG4gICAgICBleGVjdXRpb25Sb2xlOiB0aGlzLmV4ZWN1dGlvblJvbGUucm9sZUFybixcbiAgICAgIHBvbGljeURldGFpbHM6IHRoaXMuYnVpbGRQb2xpY3lEZXRhaWxzKHByb3BzLnJlc291cmNlVHlwZSwgcHJvcHMuZGV0YWlscyksXG4gICAgICByZXNvdXJjZVNlbGVjdGlvbjoge1xuICAgICAgICAuLi4ocHJvcHMucmVzb3VyY2VTZWxlY3Rpb24ucmVjaXBlcyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICByZWNpcGVzOiB0aGlzLmJ1aWxkUmVjaXBlcyhwcm9wcy5yZXNvdXJjZVR5cGUsIHByb3BzLnJlc291cmNlU2VsZWN0aW9uLnJlY2lwZXMpLFxuICAgICAgICB9KSxcbiAgICAgICAgdGFnTWFwOiBwcm9wcy5yZXNvdXJjZVNlbGVjdGlvbi50YWdzLFxuICAgICAgfSxcbiAgICAgIHN0YXR1czogcHJvcHMuc3RhdHVzLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICB9KTtcblxuICAgIHRoaXMubGlmZWN5Y2xlUG9saWN5TmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKGxpZmVjeWNsZVBvbGljeS5yZWYpO1xuICAgIHRoaXMubGlmZWN5Y2xlUG9saWN5QXJuID0gdGhpcy5nZXRSZXNvdXJjZUFybkF0dHJpYnV0ZShsaWZlY3ljbGVQb2xpY3kuYXR0ckFybiwge1xuICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICByZXNvdXJjZTogJ2xpZmVjeWNsZS1wb2xpY3knLFxuICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIHBvbGljeSBkZXRhaWxzIHByb3BlcnR5IGludG8gdGhlIGBQb2xpY3lEZXRhaWxgIHR5cGUgaW4gdGhlIENsb3VkRm9ybWF0aW9uIEwxIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3lcbiAgICogQHBhcmFtIGRldGFpbHMgVGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYnVpbGRQb2xpY3lEZXRhaWxzKFxuICAgIHJlc291cmNlVHlwZTogTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLFxuICAgIGRldGFpbHM6IExpZmVjeWNsZVBvbGljeURldGFpbFtdLFxuICApOiBDZm5MaWZlY3ljbGVQb2xpY3kuUG9saWN5RGV0YWlsUHJvcGVydHlbXSB7XG4gICAgcmV0dXJuIGRldGFpbHMubWFwKChkZXRhaWwpOiBDZm5MaWZlY3ljbGVQb2xpY3kuUG9saWN5RGV0YWlsUHJvcGVydHkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5idWlsZEFjdGlvbihyZXNvdXJjZVR5cGUsIGRldGFpbC5hY3Rpb24pO1xuICAgICAgY29uc3QgZXhjbHVzaW9uUnVsZXMgPVxuICAgICAgICBkZXRhaWwuZXhjbHVzaW9uUnVsZXMgIT09IHVuZGVmaW5lZCA/IHRoaXMuYnVpbGRFeGNsdXNpb25SdWxlcyhkZXRhaWwuZXhjbHVzaW9uUnVsZXMpIDogdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnZhbGlkYXRlUG9saWN5RGV0YWlsQWN0aW9uKHJlc291cmNlVHlwZSwgZGV0YWlsLmFjdGlvbiwgZXhjbHVzaW9uUnVsZXM/LmFtaXMpO1xuICAgICAgdGhpcy52YWxpZGF0ZVBvbGljeURldGFpbEZpbHRlcihkZXRhaWwuZmlsdGVyKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgIHJldGFpbkF0TGVhc3Q6IGRldGFpbC5maWx0ZXIuYWdlRmlsdGVyPy5yZXRhaW5BdExlYXN0LFxuICAgICAgICAgIHR5cGU6IGRldGFpbC5maWx0ZXIuYWdlRmlsdGVyICE9PSB1bmRlZmluZWQgPyAnQUdFJyA6ICdDT1VOVCcsXG4gICAgICAgICAgLi4uKGRldGFpbC5maWx0ZXIuYWdlRmlsdGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdGhpcy5jb252ZXJ0RHVyYXRpb25Ub1RpbWVVbml0VmFsdWUoZGV0YWlsLmZpbHRlci5hZ2VGaWx0ZXIuYWdlKVxuICAgICAgICAgICAgOiB7IHZhbHVlOiBkZXRhaWwuZmlsdGVyLmNvdW50RmlsdGVyIS5jb3VudCB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzICE9PSB1bmRlZmluZWQgJiYgeyBleGNsdXNpb25SdWxlcyB9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSByZWNpcGVzIHByb3BlcnR5IGluIHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gaW50byB0aGUgYFJlY2lwZVNlbGVjdGlvbmAgdHlwZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gTDFcbiAgICogZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKiBAcGFyYW0gcmVjaXBlcyBUaGUgcmVjaXBlcyBwYXNzZWQgaW4gdGhlIHByb3BzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUmVjaXBlcyhcbiAgICByZXNvdXJjZVR5cGU6IExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZSxcbiAgICByZWNpcGVzOiBJUmVjaXBlQmFzZVtdLFxuICApOiBDZm5MaWZlY3ljbGVQb2xpY3kuUmVjaXBlU2VsZWN0aW9uUHJvcGVydHlbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJlY2lwZXM/Lm1hcCgocmVjaXBlKTogQ2ZuTGlmZWN5Y2xlUG9saWN5LlJlY2lwZVNlbGVjdGlvblByb3BlcnR5ID0+IHtcbiAgICAgIGlmIChyZWNpcGUuX2lzSW1hZ2VSZWNpcGUoKSkge1xuICAgICAgICBpZiAocmVzb3VyY2VUeXBlID09PSBMaWZlY3ljbGVQb2xpY3lSZXNvdXJjZVR5cGUuQ09OVEFJTkVSX0lNQUdFKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBgcmVjaXBlcyBpbiB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIG11c3QgYWxsIGJlIGNvbnRhaW5lciByZWNpcGVzIGZvciBwb2xpY3kgdHlwZSAke0xpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZS5DT05UQUlORVJfSU1BR0V9YCxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcmVjaXBlLmltYWdlUmVjaXBlTmFtZSxcbiAgICAgICAgICBzZW1hbnRpY1ZlcnNpb246IHJlY2lwZS5pbWFnZVJlY2lwZVZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNpcGUuX2lzQ29udGFpbmVyUmVjaXBlKCkpIHtcbiAgICAgICAgaWYgKHJlc291cmNlVHlwZSA9PT0gTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLkFNSV9JTUFHRSkge1xuICAgICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYHJlY2lwZXMgaW4gdGhlIHJlc291cmNlIHNlbGVjdGlvbiBtdXN0IGFsbCBiZSBpbWFnZSByZWNpcGVzIGZvciBwb2xpY3kgdHlwZSAke0xpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZS5BTUlfSU1BR0V9YCxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcmVjaXBlLmNvbnRhaW5lclJlY2lwZU5hbWUsXG4gICAgICAgICAgc2VtYW50aWNWZXJzaW9uOiByZWNpcGUuY29udGFpbmVyUmVjaXBlVmVyc2lvbixcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdyZWNpcGVzIGluIHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gbXVzdCBlaXRoZXIgYmUgYW4gSUltYWdlUmVjaXBlIG9yIElDb250YWluZXJSZWNpcGUnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIGV4Y2x1c2lvbiBydWxlcyBwcm9wZXJ0eSBpbnRvIHRoZSBgRXhjbHVzaW9uUnVsZXNgIHR5cGUgaW4gdGhlIENsb3VkRm9ybWF0aW9uIEwxIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBleGNsdXNpb25SdWxlcyBUaGUgZXhjbHVzaW9uIHJ1bGVzIGZvciByZXNvdXJjZXMgYXBwbGllZCBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRXhjbHVzaW9uUnVsZXMoXG4gICAgZXhjbHVzaW9uUnVsZXM6IExpZmVjeWNsZVBvbGljeUV4Y2x1c2lvblJ1bGVzLFxuICApOiBDZm5MaWZlY3ljbGVQb2xpY3kuRXhjbHVzaW9uUnVsZXNQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYW1pRXhjbHVzaW9uUnVsZXM6IENmbkxpZmVjeWNsZVBvbGljeS5BbWlFeGNsdXNpb25SdWxlc1Byb3BlcnR5ID0ge1xuICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzPy5pc1B1YmxpYyAmJiB7IGlzUHVibGljOiBleGNsdXNpb25SdWxlcy5hbWlFeGNsdXNpb25SdWxlcy5pc1B1YmxpYyB9KSxcbiAgICAgIC4uLihleGNsdXNpb25SdWxlcy5hbWlFeGNsdXNpb25SdWxlcz8ubGFzdExhdW5jaGVkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBsYXN0TGF1bmNoZWQ6IHRoaXMuY29udmVydER1cmF0aW9uVG9UaW1lVW5pdFZhbHVlKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzLmxhc3RMYXVuY2hlZCwgMzY1KSxcbiAgICAgIH0pLFxuICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzPy5yZWdpb25zPy5sZW5ndGggJiYgeyByZWdpb25zOiBleGNsdXNpb25SdWxlcy5hbWlFeGNsdXNpb25SdWxlcy5yZWdpb25zIH0pLFxuICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzPy5zaGFyZWRBY2NvdW50cz8ubGVuZ3RoICYmIHtcbiAgICAgICAgc2hhcmVkQWNjb3VudHM6IGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzLnNoYXJlZEFjY291bnRzLFxuICAgICAgfSksXG4gICAgICAuLi4oZXhjbHVzaW9uUnVsZXMuYW1pRXhjbHVzaW9uUnVsZXM/LnRhZ3MgJiYgeyB0YWdNYXA6IGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzLnRhZ3MgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IGNmbkV4Y2x1c2lvblJ1bGVzOiBDZm5MaWZlY3ljbGVQb2xpY3kuRXhjbHVzaW9uUnVsZXNQcm9wZXJ0eSA9IHtcbiAgICAgIC4uLihPYmplY3Qua2V5cyhhbWlFeGNsdXNpb25SdWxlcykubGVuZ3RoICYmIHsgYW1pczogYW1pRXhjbHVzaW9uUnVsZXMgfSksXG4gICAgICAuLi4oZXhjbHVzaW9uUnVsZXMuaW1hZ2VFeGNsdXNpb25SdWxlcyAhPT0gdW5kZWZpbmVkICYmIHsgdGFnTWFwOiBleGNsdXNpb25SdWxlcy5pbWFnZUV4Y2x1c2lvblJ1bGVzLnRhZ3MgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhleGNsdXNpb25SdWxlcykubGVuZ3RoID8gY2ZuRXhjbHVzaW9uUnVsZXMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBhY3Rpb24gcHJvcGVydHkgaW50byB0aGUgYEFjdGlvbmAgdHlwZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gTDEgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gYmVpbmcgdGFrZW4gaW4gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFjdGlvbihcbiAgICByZXNvdXJjZVR5cGU6IExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZSxcbiAgICBhY3Rpb246IExpZmVjeWNsZVBvbGljeUFjdGlvbixcbiAgKTogQ2ZuTGlmZWN5Y2xlUG9saWN5LkFjdGlvblByb3BlcnR5IHtcbiAgICBjb25zdCBpc0NvbnRhaW5lclBvbGljeSA9XG4gICAgICAhY2RrLlRva2VuLmlzVW5yZXNvbHZlZChyZXNvdXJjZVR5cGUpICYmIHJlc291cmNlVHlwZSA9PT0gTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLkNPTlRBSU5FUl9JTUFHRTtcbiAgICBjb25zdCBpc0FtaVBvbGljeSA9ICFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHJlc291cmNlVHlwZSkgJiYgcmVzb3VyY2VUeXBlID09PSBMaWZlY3ljbGVQb2xpY3lSZXNvdXJjZVR5cGUuQU1JX0lNQUdFO1xuXG4gICAgY29uc3QgYW1pcyA9IGFjdGlvbi5pbmNsdWRlQW1pcyA/PyAoaXNBbWlQb2xpY3kgPyB0cnVlIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBzbmFwc2hvdHMgPSBhY3Rpb24uaW5jbHVkZVNuYXBzaG90cyA/PyAoaXNBbWlQb2xpY3kgPyB0cnVlIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb250YWluZXJzID0gYWN0aW9uLmluY2x1ZGVDb250YWluZXJzID8/IChpc0NvbnRhaW5lclBvbGljeSA/IHRydWUgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGluY2x1ZGVSZXNvdXJjZXM6IENmbkxpZmVjeWNsZVBvbGljeS5JbmNsdWRlUmVzb3VyY2VzUHJvcGVydHkgPSB7XG4gICAgICAuLi4oYW1pcyAhPT0gdW5kZWZpbmVkICYmIHsgYW1pcyB9KSxcbiAgICAgIC4uLihzbmFwc2hvdHMgIT09IHVuZGVmaW5lZCAmJiB7IHNuYXBzaG90cyB9KSxcbiAgICAgIC4uLihjb250YWluZXJzICE9PSB1bmRlZmluZWQgJiYgeyBjb250YWluZXJzIH0pLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogYWN0aW9uLnR5cGUsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoaW5jbHVkZVJlc291cmNlcykubGVuZ3RoICYmIHsgaW5jbHVkZVJlc291cmNlcyB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgb2YgdGhlIHBvbGljeVxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BzIHBhc3NlZCBhcyBpbnB1dCB0byB0aGUgY29uc3RydWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5KHByb3BzOiBMaWZlY3ljbGVQb2xpY3lQcm9wcyk6IHZvaWQge1xuICAgIGlmIChwcm9wcy5yZXNvdXJjZVNlbGVjdGlvbi5yZWNpcGVzPy5sZW5ndGggJiYgT2JqZWN0LmtleXMocHJvcHMucmVzb3VyY2VTZWxlY3Rpb24udGFncyB8fCB7fSkubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigncmVzb3VyY2Ugc2VsZWN0aW9uIGNhbm5vdCBjb250YWluIGJvdGggcmVjaXBlcyBhbmQgdGFncycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMucmVzb3VyY2VTZWxlY3Rpb24ucmVjaXBlcz8ubGVuZ3RoICYmICFPYmplY3Qua2V5cyhwcm9wcy5yZXNvdXJjZVNlbGVjdGlvbi50YWdzIHx8IHt9KS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdyZXNvdXJjZSBzZWxlY3Rpb24gbXVzdCBjb250YWluIGVpdGhlciByZWNpcGVzIG9yIHRhZ3MnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGV0YWlscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdhIGxpZmVjeWNsZSBwb2xpY3kgbXVzdCBoYXZlIGF0IGxlYXN0IDEgcnVsZScsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZXRhaWxzLmxlbmd0aCA+IDMpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdhIGxpZmVjeWNsZSBwb2xpY3kgY2FuIG9ubHkgaGF2ZSB1cCB0byAzIHJ1bGVzJywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9ucyA9IHByb3BzLmRldGFpbHMubWFwKChkZXRhaWwpID0+IGRldGFpbC5hY3Rpb24udHlwZSk7XG4gICAgaWYgKG5ldyBTZXQoYWN0aW9ucykuc2l6ZSAhPSBhY3Rpb25zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2xpZmVjeWNsZSBwb2xpY3kgcnVsZXMgbWF5IG5vdCBoYXZlIGR1cGxpY2F0ZSBhY3Rpb25zJywgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHBvbGljeSBkZXRhaWwgZmlsdGVyIHdpdGhpbiBhIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5XG4gICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiBiZWluZyB0YWtlbiBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBhbWlFeGNsdXNpb25SdWxlcyBUaGUgQU1JIGV4Y2x1c2lvbiBydWxlcyBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5RGV0YWlsQWN0aW9uKFxuICAgIHJlc291cmNlVHlwZTogTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLFxuICAgIGFjdGlvbjogTGlmZWN5Y2xlUG9saWN5QWN0aW9uLFxuICAgIGFtaUV4Y2x1c2lvblJ1bGVzOiBDZm5MaWZlY3ljbGVQb2xpY3kuQW1pRXhjbHVzaW9uUnVsZXNQcm9wZXJ0eSB8IGNkay5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHJlc291cmNlVHlwZSkgJiYgcmVzb3VyY2VUeXBlID09PSBMaWZlY3ljbGVQb2xpY3lSZXNvdXJjZVR5cGUuQ09OVEFJTkVSX0lNQUdFKSB7XG4gICAgICBpZiAoIWNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoYWN0aW9uLnR5cGUpICYmIGFjdGlvbi50eXBlICE9PSBMaWZlY3ljbGVQb2xpY3lBY3Rpb25UeXBlLkRFTEVURSkge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IG1heSBvbmx5IHNwZWNpZnkgREVMRVRFIHJ1bGVzIGZvciBjb250YWluZXIgcG9saWNpZXMnLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvbi5pbmNsdWRlQW1pcykge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IGNhbm5vdCBpbmNsdWRlIEFNSXMgaW4gYSBjb250YWluZXIgcG9saWN5JywgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3Rpb24uaW5jbHVkZVNuYXBzaG90cykge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IGNhbm5vdCBpbmNsdWRlIHNuYXBzaG90cyBpbiBhIGNvbnRhaW5lciBwb2xpY3knLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFtaUV4Y2x1c2lvblJ1bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ3lvdSBjYW5ub3QgZXhjbHVkZSBBTUlzIGluIGEgY29udGFpbmVyIHBvbGljeScsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHJlc291cmNlVHlwZSkgJiZcbiAgICAgIHJlc291cmNlVHlwZSA9PT0gTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLkFNSV9JTUFHRSAmJlxuICAgICAgYWN0aW9uLmluY2x1ZGVDb250YWluZXJzXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IGNhbm5vdCBpbmNsdWRlIGNvbnRhaW5lcnMgaW4gYW4gQU1JIHBvbGljeScsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBwb2xpY3kgZGV0YWlsIGZpbHRlclxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBsaWZlY3ljbGUgcG9saWN5IHJlc291cmNlIGZpbHRlciBhcHBsaWVkIGluIHRoZSBydWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5RGV0YWlsRmlsdGVyKGZpbHRlcjogTGlmZWN5Y2xlUG9saWN5RmlsdGVyKSB7XG4gICAgaWYgKGZpbHRlci5hZ2VGaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIuY291bnRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2VpdGhlciBhZ2UgY291bnQgY2FuIGJlIHNwZWNpZmllZCBpbiBhIHBvbGljeSBmaWx0ZXIsIGJ1dCBub3QgYm90aCcsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXIuYWdlRmlsdGVyID09PSB1bmRlZmluZWQgJiYgZmlsdGVyLmNvdW50RmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCd5b3UgbXVzdCBwcm92aWRlIGFuIGFnZSBvciBjb3VudCBmaWx0ZXIgaW4gdGhlIHBvbGljeScsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHJldGFpbkF0TGVhc3QgPSBmaWx0ZXIuYWdlRmlsdGVyPy5yZXRhaW5BdExlYXN0O1xuICAgIGlmIChyZXRhaW5BdExlYXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChyZXRhaW5BdExlYXN0IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHJldGFpbkF0TGVhc3QgZmlsdGVyIHZhbHVlIG11c3QgYmUgYXQgbGVhc3QgMScsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJldGFpbkF0TGVhc3QgPiAxMCkge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHJldGFpbkF0TGVhc3QgZmlsdGVyIHZhbHVlIG11c3QgYmUgYXQgbW9zdCAxMCcsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGBjZGsuRHVyYXRpb25gIGludG8gdGhlIHZhbHVlIGFuZCB1bml0IHdoaWNoIGlzIGFjY2VwdGVkIGFzIGZpbHRlciBhZ2UgYW5kIGxhc3QgbGF1bmNoZWQgYWdlIGluIHRoZVxuICAgKiBsaWZlY3ljbGUgcG9saWN5LiBUaGUgdmFsdWUgaXMgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCB3aG9sZSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gY29udmVydFxuICAgKiBAcGFyYW0gdmFsdWVMaW1pdCBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzcGVjaWZpZWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29udmVydER1cmF0aW9uVG9UaW1lVW5pdFZhbHVlKFxuICAgIGR1cmF0aW9uOiBjZGsuRHVyYXRpb24sXG4gICAgdmFsdWVMaW1pdDogbnVtYmVyID0gMTAwMCxcbiAgKTogeyB2YWx1ZTogbnVtYmVyOyB1bml0OiAnREFZUycgfCAnV0VFS1MnIHwgJ01PTlRIUycgfCAnWUVBUlMnIH0ge1xuICAgIGNvbnN0IERBWVNfUEVSX1dFRUsgPSA3O1xuICAgIGNvbnN0IERBWVNfUEVSX01PTlRIID0gMzA7XG4gICAgY29uc3QgREFZU19QRVJfWUVBUiA9IDM2NTtcblxuICAgIGNvbnN0IHZhbHVlSW5EYXlzID0gTWF0aC5jZWlsKGR1cmF0aW9uLnRvRGF5cygpKTtcbiAgICBpZiAodmFsdWVJbkRheXMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHByb3ZpZGVkIGR1cmF0aW9uIG11c3QgYmUgYXQgbGVhc3QgMSBkYXknLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVJbkRheXMgPD0gdmFsdWVMaW1pdCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlSW5EYXlzLCB1bml0OiAnREFZUycgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZUluV2Vla3MgPSBNYXRoLmNlaWwodmFsdWVJbkRheXMgLyBEQVlTX1BFUl9XRUVLKTtcbiAgICBpZiAodmFsdWVJbldlZWtzIDw9IHZhbHVlTGltaXQpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZUluV2Vla3MsIHVuaXQ6ICdXRUVLUycgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZUluTW9udGhzID0gTWF0aC5jZWlsKHZhbHVlSW5EYXlzIC8gREFZU19QRVJfTU9OVEgpO1xuICAgIGlmICh2YWx1ZUluTW9udGhzIDw9IHZhbHVlTGltaXQpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZUluTW9udGhzLCB1bml0OiAnTU9OVEhTJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlSW5ZZWFycyA9IE1hdGguY2VpbCh2YWx1ZUluRGF5cyAvIERBWVNfUEVSX1lFQVIpO1xuICAgIGlmICh2YWx1ZUluWWVhcnMgPD0gdmFsdWVMaW1pdCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlSW5ZZWFycywgdW5pdDogJ1lFQVJTJyB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgcHJvdmlkZWQgZHVyYXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gJHt2YWx1ZUxpbWl0fSB5ZWFyc2AsIHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUxpZmVjeWNsZVBvbGljeU5hbWUoKSB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpKSB7XG4gICAgICByZXR1cm47IC8vIENhbm5vdCB2YWxpZGF0ZSB1bnJlc29sdmVkIHRva2VucywgZ2l2ZW4gdGhlaXIgYWN0dWFsIHZhbHVlIGlzIHJlbmRlcmVkIGF0IGRlcGxveW1lbnQgdGltZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdUaGUgbGlmZWN5Y2xlUG9saWN5TmFtZSBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMTI4IGNoYXJhY3RlcnMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUuaW5jbHVkZXMoJyAnKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ1RoZSBsaWZlY3ljbGVQb2xpY3lOYW1lIGNhbm5vdCBjb250YWluIHNwYWNlcycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignVGhlIGxpZmVjeWNsZVBvbGljeU5hbWUgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdUaGUgbGlmZWN5Y2xlUG9saWN5TmFtZSBtdXN0IGJlIGxvd2VyY2FzZScsIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIl19
|
package/lib/os-version.js
CHANGED
|
@@ -25,7 +25,7 @@ var Platform;
|
|
|
25
25
|
* Represents an OS version for an EC2 Image Builder image
|
|
26
26
|
*/
|
|
27
27
|
class OSVersion {
|
|
28
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.OSVersion", version: "2.
|
|
28
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.OSVersion", version: "2.231.0-alpha.0" };
|
|
29
29
|
/**
|
|
30
30
|
* OS version for all Linux images
|
|
31
31
|
*/
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents the latest version of a resource. When using the resource, the latest version of it will be resolved
|
|
3
|
+
* when executing an image build.
|
|
4
|
+
*
|
|
5
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
|
|
6
|
+
*/
|
|
7
|
+
export declare const LATEST_VERSION = "x.x.x";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LATEST_VERSION = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Represents the latest version of a resource. When using the resource, the latest version of it will be resolved
|
|
6
|
+
* when executing an image build.
|
|
7
|
+
*
|
|
8
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
|
|
9
|
+
*/
|
|
10
|
+
exports.LATEST_VERSION = 'x.x.x';
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ1UsUUFBQSxjQUFjLEdBQUcsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIHJlc291cmNlLiBXaGVuIHVzaW5nIHRoZSByZXNvdXJjZSwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGl0IHdpbGwgYmUgcmVzb2x2ZWRcbiAqIHdoZW4gZXhlY3V0aW5nIGFuIGltYWdlIGJ1aWxkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL2liaG93LXNlbWFudGljLXZlcnNpb25pbmcuaHRtbFxuICovXG5leHBvcnQgY29uc3QgTEFURVNUX1ZFUlNJT04gPSAneC54LngnO1xuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CfnImage, CfnImagePipeline } from 'aws-cdk-lib/aws-imagebuilder';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { ImageProps } from '../image';
|
|
4
|
+
import { ImagePipelineProps } from '../image-pipeline';
|
|
5
|
+
/**
|
|
6
|
+
* Generates the image tests configuration property into the `ImageTestsConfiguration` type in the CloudFormation L1
|
|
7
|
+
* definition.
|
|
8
|
+
*
|
|
9
|
+
* @param props Props input for the construct
|
|
10
|
+
*/
|
|
11
|
+
export declare const buildImageTestsConfiguration: <PropsT extends ImagePipelineProps | ImageProps, OutputT extends CfnImagePipeline.ImageTestsConfigurationProperty | CfnImage.ImageTestsConfigurationProperty>(props: PropsT) => OutputT | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Generates the image scanning configuration property into the `ImageScanningConfiguration` type in the CloudFormation
|
|
14
|
+
* L1 definition.
|
|
15
|
+
*
|
|
16
|
+
* @param scope The construct scope
|
|
17
|
+
* @param props Props input for the construct
|
|
18
|
+
*/
|
|
19
|
+
export declare const buildImageScanningConfiguration: <PropsT extends ImagePipelineProps | ImageProps, OutputT extends CfnImagePipeline.ImageScanningConfigurationProperty | CfnImage.ImageScanningConfigurationProperty>(scope: Construct, props: PropsT) => OutputT | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Generates the workflows property into the `WorkflowConfiguration` type in the CloudFormation L1
|
|
22
|
+
* definition.
|
|
23
|
+
*
|
|
24
|
+
* @param props Props input for the construct
|
|
25
|
+
*/
|
|
26
|
+
export declare const buildWorkflows: <PropsT extends ImagePipelineProps | ImageProps, OutputT extends CfnImagePipeline.WorkflowConfigurationProperty[] | CfnImage.WorkflowConfigurationProperty[]>(props: PropsT) => OutputT | undefined;
|