@aws-cdk/aws-ec2-alpha 2.156.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 +8230 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +259 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +207 -0
- package/awslint.json +7 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +26 -0
- package/lib/ipam.d.ts +250 -0
- package/lib/ipam.js +255 -0
- package/lib/route.d.ts +390 -0
- package/lib/route.js +270 -0
- package/lib/subnet-v2.d.ts +152 -0
- package/lib/subnet-v2.js +272 -0
- package/lib/util.d.ts +157 -0
- package/lib/util.js +310 -0
- package/lib/vpc-v2-base.d.ts +132 -0
- package/lib/vpc-v2-base.js +264 -0
- package/lib/vpc-v2.d.ts +222 -0
- package/lib/vpc-v2.js +303 -0
- package/package.json +110 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +15 -0
package/lib/vpc-v2.js
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.VpcV2 = exports.IpAddresses = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
8
|
+
const core_1 = require("aws-cdk-lib/core");
|
|
9
|
+
const constructs_1 = require("constructs");
|
|
10
|
+
const vpc_v2_base_1 = require("./vpc-v2-base");
|
|
11
|
+
/**
|
|
12
|
+
* IpAddress options to define VPC V2
|
|
13
|
+
*/
|
|
14
|
+
class IpAddresses {
|
|
15
|
+
/**
|
|
16
|
+
* An IPv4 CIDR Range
|
|
17
|
+
*/
|
|
18
|
+
static ipv4(ipv4Cidr, props) {
|
|
19
|
+
try {
|
|
20
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_SecondaryAddressProps(props);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
24
|
+
Error.captureStackTrace(error, this.ipv4);
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
return new ipv4CidrAllocation(ipv4Cidr, props);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* An Ipv4 Ipam Pool
|
|
32
|
+
*/
|
|
33
|
+
static ipv4Ipam(ipv4IpamOptions) {
|
|
34
|
+
try {
|
|
35
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_IpamOptions(ipv4IpamOptions);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
39
|
+
Error.captureStackTrace(error, this.ipv4Ipam);
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
return new IpamIpv4(ipv4IpamOptions);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* An Ipv6 Ipam Pool
|
|
47
|
+
*/
|
|
48
|
+
static ipv6Ipam(ipv6IpamOptions) {
|
|
49
|
+
try {
|
|
50
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_IpamOptions(ipv6IpamOptions);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
54
|
+
Error.captureStackTrace(error, this.ipv6Ipam);
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
return new IpamIpv6(ipv6IpamOptions);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Amazon Provided Ipv6 range
|
|
62
|
+
*/
|
|
63
|
+
static amazonProvidedIpv6(props) {
|
|
64
|
+
try {
|
|
65
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_SecondaryAddressProps(props);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
69
|
+
Error.captureStackTrace(error, this.amazonProvidedIpv6);
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
return new AmazonProvided(props);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.IpAddresses = IpAddresses;
|
|
77
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
78
|
+
IpAddresses[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.IpAddresses", version: "2.156.0-alpha.0" };
|
|
79
|
+
/**
|
|
80
|
+
* This class provides a foundation for creating and configuring a VPC with advanced features such as IPAM (IP Address Management) and IPv6 support.
|
|
81
|
+
*
|
|
82
|
+
* For more information, see the {@link https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html|AWS CDK Documentation on VPCs}.
|
|
83
|
+
*
|
|
84
|
+
* @resource AWS::EC2::VPC
|
|
85
|
+
*/
|
|
86
|
+
class VpcV2 extends vpc_v2_base_1.VpcV2Base {
|
|
87
|
+
constructor(scope, id, props = {}) {
|
|
88
|
+
super(scope, id, {
|
|
89
|
+
physicalName: props.vpcName ?? core_1.Lazy.string({
|
|
90
|
+
produce: () => core_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '_' }),
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
93
|
+
/**
|
|
94
|
+
* To define dependency on internet connectivity
|
|
95
|
+
*/
|
|
96
|
+
this._internetConnectivityEstablished = new constructs_1.DependencyGroup();
|
|
97
|
+
/**
|
|
98
|
+
* reference to all secondary blocks attached
|
|
99
|
+
*/
|
|
100
|
+
this.secondaryCidrBlock = new Array;
|
|
101
|
+
/**
|
|
102
|
+
* For validation to define IPv6 subnets, set to true in case of
|
|
103
|
+
* Amazon Provided IPv6 cidr range
|
|
104
|
+
* IPv6 addresses can be attached to the subnets
|
|
105
|
+
* @default false
|
|
106
|
+
*/
|
|
107
|
+
this.useIpv6 = false;
|
|
108
|
+
this.ipv4CidrBlock = '';
|
|
109
|
+
try {
|
|
110
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VpcV2Props(props);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
114
|
+
Error.captureStackTrace(error, VpcV2);
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
this.ipAddresses = props.primaryAddressBlock ?? IpAddresses.ipv4('10.0.0.0/16');
|
|
119
|
+
const vpcOptions = this.ipAddresses.allocateVpcCidr();
|
|
120
|
+
this.dnsHostnamesEnabled = props.enableDnsHostnames == null ? true : props.enableDnsHostnames;
|
|
121
|
+
this.dnsSupportEnabled = props.enableDnsSupport == null ? true : props.enableDnsSupport;
|
|
122
|
+
const instanceTenancy = props.defaultInstanceTenancy || 'default';
|
|
123
|
+
this.resource = new aws_ec2_1.CfnVPC(this, 'Resource', {
|
|
124
|
+
cidrBlock: vpcOptions.ipv4CidrBlock, //for Ipv4 addresses CIDR block
|
|
125
|
+
enableDnsHostnames: this.dnsHostnamesEnabled,
|
|
126
|
+
enableDnsSupport: this.dnsSupportEnabled,
|
|
127
|
+
ipv4IpamPoolId: vpcOptions.ipv4IpamPool?.ipamPoolId, // for Ipv4 ipam option
|
|
128
|
+
ipv4NetmaskLength: vpcOptions.ipv4NetmaskLength, // for Ipv4 ipam option
|
|
129
|
+
instanceTenancy: instanceTenancy,
|
|
130
|
+
});
|
|
131
|
+
this.node.defaultChild = this.resource;
|
|
132
|
+
this.vpcCidrBlock = this.resource.attrCidrBlock;
|
|
133
|
+
if (vpcOptions.ipv4CidrBlock) {
|
|
134
|
+
this.ipv4CidrBlock = vpcOptions.ipv4CidrBlock;
|
|
135
|
+
}
|
|
136
|
+
this.ipv6CidrBlocks = this.resource.attrIpv6CidrBlocks;
|
|
137
|
+
this.vpcId = this.resource.attrVpcId;
|
|
138
|
+
this.vpcArn = core_1.Arn.format({
|
|
139
|
+
service: 'ec2',
|
|
140
|
+
resource: 'vpc',
|
|
141
|
+
resourceName: this.vpcId,
|
|
142
|
+
}, this.stack);
|
|
143
|
+
if (props.secondaryAddressBlocks) {
|
|
144
|
+
const secondaryAddressBlocks = props.secondaryAddressBlocks;
|
|
145
|
+
for (const secondaryAddressBlock of secondaryAddressBlocks) {
|
|
146
|
+
const secondaryVpcOptions = secondaryAddressBlock.allocateVpcCidr();
|
|
147
|
+
if (!secondaryVpcOptions.cidrBlockName) {
|
|
148
|
+
throw new Error('Cidr Block Name is required to create secondary IP address');
|
|
149
|
+
}
|
|
150
|
+
if (secondaryVpcOptions.amazonProvided || secondaryVpcOptions.ipv6IpamPool) {
|
|
151
|
+
this.useIpv6 = true;
|
|
152
|
+
}
|
|
153
|
+
//validate CIDR ranges per RFC 1918
|
|
154
|
+
if (secondaryVpcOptions.ipv4CidrBlock) {
|
|
155
|
+
const ret = validateIpv4address(secondaryVpcOptions.ipv4CidrBlock, this.resource.cidrBlock);
|
|
156
|
+
if (ret === false) {
|
|
157
|
+
throw new Error('CIDR block should be in the same RFC 1918 range in the VPC');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const cfnVpcCidrBlock = new aws_ec2_1.CfnVPCCidrBlock(this, secondaryVpcOptions.cidrBlockName, {
|
|
161
|
+
vpcId: this.vpcId,
|
|
162
|
+
cidrBlock: secondaryVpcOptions.ipv4CidrBlock,
|
|
163
|
+
ipv4IpamPoolId: secondaryVpcOptions.ipv4IpamPool?.ipamPoolId,
|
|
164
|
+
ipv4NetmaskLength: secondaryVpcOptions.ipv4NetmaskLength,
|
|
165
|
+
ipv6NetmaskLength: secondaryVpcOptions.ipv6NetmaskLength,
|
|
166
|
+
ipv6IpamPoolId: secondaryVpcOptions.ipv6IpamPool?.ipamPoolId,
|
|
167
|
+
amazonProvidedIpv6CidrBlock: secondaryVpcOptions.amazonProvided,
|
|
168
|
+
});
|
|
169
|
+
if (secondaryVpcOptions.dependencies) {
|
|
170
|
+
for (const dep of secondaryVpcOptions.dependencies) {
|
|
171
|
+
cfnVpcCidrBlock.addDependency(dep);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//Create secondary blocks for Ipv4 and Ipv6
|
|
175
|
+
this.secondaryCidrBlock.push(cfnVpcCidrBlock);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Empty array for isolated subnets
|
|
180
|
+
*/
|
|
181
|
+
this.isolatedSubnets = new Array;
|
|
182
|
+
/**
|
|
183
|
+
* Empty array for public subnets
|
|
184
|
+
*/
|
|
185
|
+
this.publicSubnets = new Array;
|
|
186
|
+
/**
|
|
187
|
+
* Empty array for private subnets
|
|
188
|
+
*/
|
|
189
|
+
this.privateSubnets = new Array;
|
|
190
|
+
/**
|
|
191
|
+
* Dependable that can be depended upon to force internet connectivity established on the VPC
|
|
192
|
+
* Add igw to this if its a public subnet
|
|
193
|
+
*/
|
|
194
|
+
this.internetConnectivityEstablished = this._internetConnectivityEstablished;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.VpcV2 = VpcV2;
|
|
198
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
199
|
+
VpcV2[_b] = { fqn: "@aws-cdk/aws-ec2-alpha.VpcV2", version: "2.156.0-alpha.0" };
|
|
200
|
+
/**
|
|
201
|
+
* Supports assigning IPv4 address to VPC
|
|
202
|
+
*/
|
|
203
|
+
class ipv4CidrAllocation {
|
|
204
|
+
constructor(cidrBlock, props) {
|
|
205
|
+
this.cidrBlock = cidrBlock;
|
|
206
|
+
this.props = props;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* @returns CIDR block provided by the user to set IPv4
|
|
210
|
+
*/
|
|
211
|
+
allocateVpcCidr() {
|
|
212
|
+
return {
|
|
213
|
+
ipv4CidrBlock: this.cidrBlock,
|
|
214
|
+
cidrBlockName: this.props?.cidrBlockName,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Supports Amazon Provided Ipv6 ranges
|
|
220
|
+
*/
|
|
221
|
+
class AmazonProvided {
|
|
222
|
+
/**
|
|
223
|
+
* Represents an Amazon-provided IPv6 CIDR range for a VPC.
|
|
224
|
+
*
|
|
225
|
+
* This class implements the IIpAddresses interface and is used to allocate an Amazon-provided
|
|
226
|
+
* IPv6 CIDR range for a VPC. When an instance of this class is used to allocate the VPC CIDR,
|
|
227
|
+
* Amazon will automatically assign an IPv6 CIDR range from its pool of available addresses.
|
|
228
|
+
*/
|
|
229
|
+
constructor(props) {
|
|
230
|
+
this.props = props;
|
|
231
|
+
}
|
|
232
|
+
;
|
|
233
|
+
allocateVpcCidr() {
|
|
234
|
+
return {
|
|
235
|
+
amazonProvided: true,
|
|
236
|
+
cidrBlockName: this.props.cidrBlockName,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Represents an IPv4 address range managed by AWS IP Address Manager (IPAM).
|
|
242
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html
|
|
243
|
+
*/
|
|
244
|
+
class IpamIpv6 {
|
|
245
|
+
constructor(props) {
|
|
246
|
+
this.props = props;
|
|
247
|
+
}
|
|
248
|
+
allocateVpcCidr() {
|
|
249
|
+
return {
|
|
250
|
+
ipv6NetmaskLength: this.props.netmaskLength,
|
|
251
|
+
ipv6IpamPool: this.props.ipamPool,
|
|
252
|
+
dependencies: this.props.ipamPool?.ipamCidrs.map(c => c),
|
|
253
|
+
cidrBlockName: this.props.cidrBlockName,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Represents an IPv4 address range managed by AWS IP Address Manager (IPAM).
|
|
259
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html
|
|
260
|
+
*/
|
|
261
|
+
class IpamIpv4 {
|
|
262
|
+
constructor(props) {
|
|
263
|
+
this.props = props;
|
|
264
|
+
}
|
|
265
|
+
allocateVpcCidr() {
|
|
266
|
+
return {
|
|
267
|
+
ipv4NetmaskLength: this.props.netmaskLength,
|
|
268
|
+
ipv4IpamPool: this.props.ipamPool,
|
|
269
|
+
cidrBlockName: this.props?.cidrBlockName,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Validates whether a secondary IPv4 address is within the same private IP address range as the primary IPv4 address.
|
|
275
|
+
*
|
|
276
|
+
* @param cidr1 The secondary IPv4 CIDR block to be validated.
|
|
277
|
+
* @param cidr2 The primary IPv4 CIDR block to validate against.
|
|
278
|
+
* @returns True if the secondary IPv4 CIDR block is within the same private IP address range as the primary IPv4 CIDR block, false otherwise.
|
|
279
|
+
* @internal
|
|
280
|
+
* The private IP address ranges are defined by RFC 1918 as 10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16.
|
|
281
|
+
*/
|
|
282
|
+
function validateIpv4address(cidr1, cidr2) {
|
|
283
|
+
if (!cidr1 || !cidr2) {
|
|
284
|
+
return false; // Handle cases where CIDR ranges are not provided
|
|
285
|
+
}
|
|
286
|
+
const octetsCidr1 = cidr1.split('.').map(octet => parseInt(octet, 10));
|
|
287
|
+
const octetsCidr2 = cidr2.split('.').map(octet => parseInt(octet, 10));
|
|
288
|
+
if (octetsCidr1.length !== 4 || octetsCidr2.length !== 4) {
|
|
289
|
+
return false; // Handle invalid CIDR ranges
|
|
290
|
+
}
|
|
291
|
+
const ip1 = {
|
|
292
|
+
octet1: octetsCidr1[0],
|
|
293
|
+
octet2: octetsCidr1[1],
|
|
294
|
+
};
|
|
295
|
+
const ip2 = {
|
|
296
|
+
octet1: octetsCidr2[0],
|
|
297
|
+
octet2: octetsCidr2[1],
|
|
298
|
+
};
|
|
299
|
+
return (ip1.octet1 === 10 && ip2.octet1 === 10) ||
|
|
300
|
+
(ip1.octet1 === 192 && ip1.octet2 === 168 && ip2.octet1 === 192 && ip2.octet2 === 168) ||
|
|
301
|
+
(ip1.octet1 === 172 && ip1.octet2 === 16 && ip2.octet1 === 172 && ip2.octet2 === 16); // CIDR ranges belong to same private IP address ranges
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidnBjLXYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlEQUErRjtBQUMvRiwyQ0FBaUU7QUFDakUsMkNBQXFFO0FBRXJFLCtDQUEwQztBQWExQzs7R0FFRztBQUNILE1BQWEsV0FBVztJQUV0Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBZ0IsRUFBRSxLQUE2Qjs7Ozs7Ozs7OztRQUNoRSxPQUFPLElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQTRCOzs7Ozs7Ozs7O1FBQ2pELE9BQU8sSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDdEM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBNEI7Ozs7Ozs7Ozs7UUFDakQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUN0QztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQTRCOzs7Ozs7Ozs7O1FBQzNELE9BQU8sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbEM7O0FBNUJILGtDQTZCQzs7O0FBb0lEOzs7Ozs7R0FNRztBQUNILE1BQWEsS0FBTSxTQUFRLHVCQUFTO0lBbUZsQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQW9CLEVBQUU7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxXQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxFQUFF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LENBQUMsQ0FBQyxDQUFDO0tBQ3ZCLENBQUM7SUFFRixNQUFNLEdBQUcsR0FBb0I7UUFDM0IsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDdkIsQ0FBQztJQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQztRQUM3QyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDO1FBQ3RGLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVEQUF1RDtBQUNqSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuVlBDLCBDZm5WUENDaWRyQmxvY2ssIERlZmF1bHRJbnN0YW5jZVRlbmFuY3ksIElTdWJuZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IEFybiwgQ2ZuUmVzb3VyY2UsIExhenksIE5hbWVzIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIERlcGVuZGVuY3lHcm91cCwgSURlcGVuZGFibGUgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IElwYW1PcHRpb25zLCBJSXBhbVBvb2wgfSBmcm9tICcuL2lwYW0nO1xuaW1wb3J0IHsgVnBjVjJCYXNlIH0gZnJvbSAnLi92cGMtdjItYmFzZSc7XG5cbi8qKlxuICogQWRkaXRpb25hbCBwcm9wcyBuZWVkZWQgZm9yIHNlY29uZGFyeSBBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vjb25kYXJ5QWRkcmVzc1Byb3BzIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIHRvIHNldCBTZWNvbmRhcnkgY2lkciBibG9jayByZXNvdXJjZSBuYW1lXG4gICAqIGluIG9yZGVyIHRvIGdlbmVyYXRlIHVuaXF1ZSBsb2dpY2FsIGlkIGZvciB0aGUgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBjaWRyQmxvY2tOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSXBBZGRyZXNzIG9wdGlvbnMgdG8gZGVmaW5lIFZQQyBWMlxuICovXG5leHBvcnQgY2xhc3MgSXBBZGRyZXNzZXMge1xuXG4gIC8qKlxuICAgKiBBbiBJUHY0IENJRFIgUmFuZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXB2NChpcHY0Q2lkcjogc3RyaW5nLCBwcm9wcz86IFNlY29uZGFyeUFkZHJlc3NQcm9wcyk6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBpcHY0Q2lkckFsbG9jYXRpb24oaXB2NENpZHIsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBJcHY0IElwYW0gUG9vbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpcHY0SXBhbShpcHY0SXBhbU9wdGlvbnM6IElwYW1PcHRpb25zKTogSUlwQWRkcmVzc2VzIHtcbiAgICByZXR1cm4gbmV3IElwYW1JcHY0KGlwdjRJcGFtT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQW4gSXB2NiBJcGFtIFBvb2xcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXB2NklwYW0oaXB2NklwYW1PcHRpb25zOiBJcGFtT3B0aW9ucyk6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBJcGFtSXB2NihpcHY2SXBhbU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFtYXpvbiBQcm92aWRlZCBJcHY2IHJhbmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFtYXpvblByb3ZpZGVkSXB2Nihwcm9wczogU2Vjb25kYXJ5QWRkcmVzc1Byb3BzKSA6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBBbWF6b25Qcm92aWRlZChwcm9wcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25zb2xpZGF0ZWQgcmV0dXJuIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBWUEMgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjQ2lkck9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBJUHY0IENJRFIgQmxvY2tcbiAgICogQGRlZmF1bHQgLSAnMTAuMC4wLjAvMTYnXG4gICAqL1xuICByZWFkb25seSBpcHY0Q2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDSURSIE1hc2sgZm9yIFZwY1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE9ubHkgcmVxdWlyZWQgd2hlbiB1c2luZyBJUEFNIElwdjRcbiAgICovXG4gIHJlYWRvbmx5IGlwdjROZXRtYXNrTGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJcHY0IElQQU0gUG9vbFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE9ubHkgcmVxdWlyZWQgd2hlbiB1c2luZyBJUEFNIElwdjRcbiAgICovXG4gIHJlYWRvbmx5IGlwdjRJcGFtUG9vbD86IElJcGFtUG9vbDtcblxuICAvKipcbiAgICogSW1wbGVtZW50aW5nIElwdjZcbiAgICogQGRlZmF1bHQgLSBObyBpcHY2IGFkZHJlc3NcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENJRFIgTWFzayBmb3IgVnBjXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gT25seSByZXF1aXJlZCB3aGVuIHVzaW5nIEFXUyBJcGFtXG4gICAqL1xuICByZWFkb25seSBpcHY2TmV0bWFza0xlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSXB2NiBJUEFNIHBvb2wgaWQgZm9yIFZQQyByYW5nZSwgY2FuIG9ubHkgYmUgZGVmaW5lZFxuICAgKiB1bmRlciBwdWJsaWMgc2NvcGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwb29sIGlkXG4gICAqL1xuICByZWFkb25seSBpcHY2SXBhbVBvb2w/OiBJSXBhbVBvb2w7XG5cbiAgLyoqXG4gICAqIFVzZSBhbWF6b24gcHJvdmlkZWQgSVAgcmFuZ2VcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFtYXpvblByb3ZpZGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVwZW5kZW5jeSB0byBhc3NvY2lhdGUgSXB2NiBDSURSIGJsb2NrXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVwZW5kZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzPzogQ2ZuUmVzb3VyY2VbXTtcblxuICAvKipcbiAgICogUmVxdWlyZWQgdG8gc2V0IFNlY29uZGFyeSBjaWRyIGJsb2NrIHJlc291cmNlIG5hbWVcbiAgICogaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdW5pcXVlIGxvZ2ljYWwgaWQgZm9yIHRoZSByZXNvdXJjZS5cbiAgICogQGRlZmF1bHQgOiBubyBuYW1lIGZvciBwcmltYXJ5IGFkZHJlc3Nlc1xuICAgKi9cbiAgcmVhZG9ubHkgY2lkckJsb2NrTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGlwIGFkZHJlc3MgYWxsb2NhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIElQQWRyZXNzIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXBBZGRyZXNzZXMge1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZGVmaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyBvZlxuICAgKiBJUCBhZGRyZXNzIGFsbG9jYXRpb25cbiAgICovXG4gIGFsbG9jYXRlVnBjQ2lkcigpIDogVnBjQ2lkck9wdGlvbnM7XG5cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBWUENcbiAqIFtkaXNhYmxlLWF3c2xpbnQ6ZnJvbS1tZXRob2RdXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjVjJQcm9wcyB7XG5cbiAgLyoqIEEgbXVzdCBJUHY0IENJRFIgYmxvY2sgZm9yIHRoZSBWUENcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1jaWRyLWJsb2Nrcy5odG1sXG4gICAqIEBkZWZhdWx0IC0gSXB2NCBDSURSIEJsb2NrICgnMTAuMC4wLjAvMTYnKVxuICAqL1xuICByZWFkb25seSBwcmltYXJ5QWRkcmVzc0Jsb2NrPzogSUlwQWRkcmVzc2VzO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kYXJ5IENJRFIgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVlBDLlxuICAgKiBDYW4gYmUgIElQdjQgb3IgSVB2NiwgdHdvIElQdjQgcmFuZ2VzIG11c3QgZm9sbG93IFJGQyMxOTE4IGNvbnZlbnRpb25cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtY2lkci1ibG9ja3MuaHRtbCN2cGMtcmVzaXplfS5cbiAgICogQGRlZmF1bHQgLSBObyBzZWNvbmRhcnkgSVAgYWRkcmVzc1xuICAqL1xuICByZWFkb25seSBzZWNvbmRhcnlBZGRyZXNzQmxvY2tzPzogSUlwQWRkcmVzc2VzW107XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZXMgbGF1bmNoZWQgaW4gdGhlIFZQQyBnZXQgRE5TIGhvc3RuYW1lc1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVEbnNIb3N0bmFtZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRE5TIHJlc29sdXRpb24gaXMgc3VwcG9ydGVkIGZvciB0aGUgVlBDLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVEbnNTdXBwb3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdGVuYW5jeSBvZiBpbnN0YW5jZXMgbGF1bmNoZWQgaW50byB0aGUgVlBDLlxuICAgKlxuICAgKiBCeSBzZXR0aW5nIHRoaXMgdG8gZGVkaWNhdGVkIHRlbmFuY3ksIGluc3RhbmNlcyB3aWxsIGJlIGxhdW5jaGVkIG9uXG4gICAqIGhhcmR3YXJlIGRlZGljYXRlZCB0byBhIHNpbmdsZSBBV1MgY3VzdG9tZXIsIHVubGVzcyBzcGVjaWZpY2FsbHkgc3BlY2lmaWVkXG4gICAqIGF0IGluc3RhbmNlIGxhdW5jaCB0aW1lLiBQbGVhc2Ugbm90ZSwgbm90IGFsbCBpbnN0YW5jZSB0eXBlcyBhcmUgdXNhYmxlXG4gICAqIHdpdGggRGVkaWNhdGVkIHRlbmFuY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IERlZmF1bHRJbnN0YW5jZVRlbmFuY3kuRGVmYXVsdCAoc2hhcmVkKSB0ZW5hbmN5XG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0SW5zdGFuY2VUZW5hbmN5PzogRGVmYXVsdEluc3RhbmNlVGVuYW5jeTtcblxuICAvKipcbiAgICogUGh5c2ljYWwgbmFtZSBmb3IgdGhlIFZQQ1xuICAgKiBAZGVmYXVsdDogYXV0b2dlbmVyYXRlZCBieSBDREtcbiAgICovXG4gIHJlYWRvbmx5IHZwY05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGZvdW5kYXRpb24gZm9yIGNyZWF0aW5nIGFuZCBjb25maWd1cmluZyBhIFZQQyB3aXRoIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2ggYXMgSVBBTSAoSVAgQWRkcmVzcyBNYW5hZ2VtZW50KSBhbmQgSVB2NiBzdXBwb3J0LlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2FwaS92Mi9kb2NzL2F3cy1jZGstbGliLmF3c19lYzIuVnBjLmh0bWx8QVdTIENESyBEb2N1bWVudGF0aW9uIG9uIFZQQ3N9LlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6VlBDXG4gKi9cbmV4cG9ydCBjbGFzcyBWcGNWMiBleHRlbmRzIFZwY1YyQmFzZSB7XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjSWQ6IHN0cmluZztcblxuICAvKipcbiAgKiBAYXR0cmlidXRlXG4gICovXG4gIHB1YmxpYyByZWFkb25seSB2cGNBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZVxuICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjQ2lkckJsb2NrOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgSVB2NiBDSURSIGJsb2NrcyBmb3IgdGhlIFZQQy5cbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItdnBjLmh0bWwjYXdzLXJlc291cmNlLWVjMi12cGMtcmV0dXJuLXZhbHVlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2tzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIG9mIGlwdjQgYWRkcmVzc2VzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXBBZGRyZXNzZXM6IElJcEFkZHJlc3NlcztcblxuICAvKipcbiAgICogVGhlIEFXUyBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIFZQQy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ2ZuVlBDO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFuY2VzIGxhdW5jaGVkIGluIHRoaXMgVlBDIHdpbGwgaGF2ZSBwdWJsaWMgRE5TIGhvc3RuYW1lcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkbnNIb3N0bmFtZXNFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAqIEluZGljYXRlcyBpZiBETlMgc3VwcG9ydCBpcyBlbmFibGVkIGZvciB0aGlzIFZQQy5cbiAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRuc1N1cHBvcnRFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJc29sYXRlZCBTdWJuZXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBWUEMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNvbGF0ZWRTdWJuZXRzOiBJU3VibmV0W107XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBTdWJuZXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBWUEMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljU3VibmV0czogSVN1Ym5ldFtdO1xuXG4gIC8qKlxuICAgKiBQYnVsaWMgU3VibmV0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgVlBDLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzOiBJU3VibmV0W107XG5cbiAgLyoqXG4gICAqIFRvIGRlZmluZSBkZXBlbmRlbmN5IG9uIGludGVybmV0IGNvbm5lY3Rpdml0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ6IElEZXBlbmRhYmxlO1xuXG4gIC8qKlxuICAgKiBUbyBkZWZpbmUgZGVwZW5kZW5jeSBvbiBpbnRlcm5ldCBjb25uZWN0aXZpdHlcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQgPSBuZXcgRGVwZW5kZW5jeUdyb3VwKCk7XG5cbiAgLyoqXG4gKiByZWZlcmVuY2UgdG8gYWxsIHNlY29uZGFyeSBibG9ja3MgYXR0YWNoZWRcbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vjb25kYXJ5Q2lkckJsb2NrID0gbmV3IEFycmF5PENmblZQQ0NpZHJCbG9jaz47XG5cbiAgLyoqXG4gICAqIEZvciB2YWxpZGF0aW9uIHRvIGRlZmluZSBJUHY2IHN1Ym5ldHMsIHNldCB0byB0cnVlIGluIGNhc2Ugb2ZcbiAgICogQW1hem9uIFByb3ZpZGVkIElQdjYgY2lkciByYW5nZVxuICAgKiBJUHY2IGFkZHJlc3NlcyBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIHN1Ym5ldHNcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VJcHY2OiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWcGNWMlByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudnBjTmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogMTI4LCBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICdfJyB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pcEFkZHJlc3NlcyA9IHByb3BzLnByaW1hcnlBZGRyZXNzQmxvY2sgPz8gSXBBZGRyZXNzZXMuaXB2NCgnMTAuMC4wLjAvMTYnKTtcbiAgICBjb25zdCB2cGNPcHRpb25zID0gdGhpcy5pcEFkZHJlc3Nlcy5hbGxvY2F0ZVZwY0NpZHIoKTtcblxuICAgIHRoaXMuZG5zSG9zdG5hbWVzRW5hYmxlZCA9IHByb3BzLmVuYWJsZURuc0hvc3RuYW1lcyA9PSBudWxsID8gdHJ1ZSA6IHByb3BzLmVuYWJsZURuc0hvc3RuYW1lcztcbiAgICB0aGlzLmRuc1N1cHBvcnRFbmFibGVkID0gcHJvcHMuZW5hYmxlRG5zU3VwcG9ydCA9PSBudWxsID8gdHJ1ZSA6IHByb3BzLmVuYWJsZURuc1N1cHBvcnQ7XG4gICAgY29uc3QgaW5zdGFuY2VUZW5hbmN5ID0gcHJvcHMuZGVmYXVsdEluc3RhbmNlVGVuYW5jeSB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5WUEModGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgY2lkckJsb2NrOiB2cGNPcHRpb25zLmlwdjRDaWRyQmxvY2ssIC8vZm9yIElwdjQgYWRkcmVzc2VzIENJRFIgYmxvY2tcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdGhpcy5kbnNIb3N0bmFtZXNFbmFibGVkLFxuICAgICAgZW5hYmxlRG5zU3VwcG9ydDogdGhpcy5kbnNTdXBwb3J0RW5hYmxlZCxcbiAgICAgIGlwdjRJcGFtUG9vbElkOiB2cGNPcHRpb25zLmlwdjRJcGFtUG9vbD8uaXBhbVBvb2xJZCwgLy8gZm9yIElwdjQgaXBhbSBvcHRpb25cbiAgICAgIGlwdjROZXRtYXNrTGVuZ3RoOiB2cGNPcHRpb25zLmlwdjROZXRtYXNrTGVuZ3RoLCAvLyBmb3IgSXB2NCBpcGFtIG9wdGlvblxuICAgICAgaW5zdGFuY2VUZW5hbmN5OiBpbnN0YW5jZVRlbmFuY3ksXG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgICB0aGlzLnZwY0NpZHJCbG9jayA9IHRoaXMucmVzb3VyY2UuYXR0ckNpZHJCbG9jaztcbiAgICBpZiAodnBjT3B0aW9ucy5pcHY0Q2lkckJsb2NrKSB7XG4gICAgICB0aGlzLmlwdjRDaWRyQmxvY2sgPSB2cGNPcHRpb25zLmlwdjRDaWRyQmxvY2s7XG4gICAgfVxuICAgIHRoaXMuaXB2NkNpZHJCbG9ja3MgPSB0aGlzLnJlc291cmNlLmF0dHJJcHY2Q2lkckJsb2NrcztcbiAgICB0aGlzLnZwY0lkID0gdGhpcy5yZXNvdXJjZS5hdHRyVnBjSWQ7XG4gICAgdGhpcy52cGNBcm4gPSBBcm4uZm9ybWF0KHtcbiAgICAgIHNlcnZpY2U6ICdlYzInLFxuICAgICAgcmVzb3VyY2U6ICd2cGMnLFxuICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLnZwY0lkLFxuICAgIH0sIHRoaXMuc3RhY2spO1xuXG4gICAgaWYgKHByb3BzLnNlY29uZGFyeUFkZHJlc3NCbG9ja3MpIHtcbiAgICAgIGNvbnN0IHNlY29uZGFyeUFkZHJlc3NCbG9ja3M6IElJcEFkZHJlc3Nlc1tdID0gcHJvcHMuc2Vjb25kYXJ5QWRkcmVzc0Jsb2NrcztcblxuICAgICAgZm9yIChjb25zdCBzZWNvbmRhcnlBZGRyZXNzQmxvY2sgb2Ygc2Vjb25kYXJ5QWRkcmVzc0Jsb2Nrcykge1xuXG4gICAgICAgIGNvbnN0IHNlY29uZGFyeVZwY09wdGlvbnM6IFZwY0NpZHJPcHRpb25zID0gc2Vjb25kYXJ5QWRkcmVzc0Jsb2NrLmFsbG9jYXRlVnBjQ2lkcigpO1xuICAgICAgICBpZiAoIXNlY29uZGFyeVZwY09wdGlvbnMuY2lkckJsb2NrTmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2lkciBCbG9jayBOYW1lIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBzZWNvbmRhcnkgSVAgYWRkcmVzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlY29uZGFyeVZwY09wdGlvbnMuYW1hem9uUHJvdmlkZWQgfHwgc2Vjb25kYXJ5VnBjT3B0aW9ucy5pcHY2SXBhbVBvb2wpIHtcbiAgICAgICAgICB0aGlzLnVzZUlwdjYgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vdmFsaWRhdGUgQ0lEUiByYW5nZXMgcGVyIFJGQyAxOTE4XG4gICAgICAgIGlmIChzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRDaWRyQmxvY2shKSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gdmFsaWRhdGVJcHY0YWRkcmVzcyhzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRDaWRyQmxvY2ssIHRoaXMucmVzb3VyY2UuY2lkckJsb2NrKTtcbiAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDSURSIGJsb2NrIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBSRkMgMTkxOCByYW5nZSBpbiB0aGUgVlBDJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNmblZwY0NpZHJCbG9jayA9IG5ldyBDZm5WUENDaWRyQmxvY2sodGhpcywgc2Vjb25kYXJ5VnBjT3B0aW9ucy5jaWRyQmxvY2tOYW1lLCB7XG4gICAgICAgICAgdnBjSWQ6IHRoaXMudnBjSWQsXG4gICAgICAgICAgY2lkckJsb2NrOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRDaWRyQmxvY2ssXG4gICAgICAgICAgaXB2NElwYW1Qb29sSWQ6IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2NElwYW1Qb29sPy5pcGFtUG9vbElkLFxuICAgICAgICAgIGlwdjROZXRtYXNrTGVuZ3RoOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjROZXRtYXNrTGVuZ3RoLFxuICAgICAgICAgIGlwdjZOZXRtYXNrTGVuZ3RoOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjZOZXRtYXNrTGVuZ3RoLFxuICAgICAgICAgIGlwdjZJcGFtUG9vbElkOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjZJcGFtUG9vbD8uaXBhbVBvb2xJZCxcbiAgICAgICAgICBhbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2s6IHNlY29uZGFyeVZwY09wdGlvbnMuYW1hem9uUHJvdmlkZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2Vjb25kYXJ5VnBjT3B0aW9ucy5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBzZWNvbmRhcnlWcGNPcHRpb25zLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgY2ZuVnBjQ2lkckJsb2NrLmFkZERlcGVuZGVuY3koZGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9DcmVhdGUgc2Vjb25kYXJ5IGJsb2NrcyBmb3IgSXB2NCBhbmQgSXB2NlxuICAgICAgICB0aGlzLnNlY29uZGFyeUNpZHJCbG9jay5wdXNoKGNmblZwY0NpZHJCbG9jayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1wdHkgYXJyYXkgZm9yIGlzb2xhdGVkIHN1Ym5ldHNcbiAgICAgKi9cbiAgICB0aGlzLmlzb2xhdGVkU3VibmV0cyA9IG5ldyBBcnJheTxJU3VibmV0PjtcblxuICAgIC8qKlxuICAgICAqIEVtcHR5IGFycmF5IGZvciBwdWJsaWMgc3VibmV0c1xuICAgICAqL1xuICAgIHRoaXMucHVibGljU3VibmV0cyA9IG5ldyBBcnJheTxJU3VibmV0PjtcblxuICAgIC8qKlxuICAgICAqIEVtcHR5IGFycmF5IGZvciBwcml2YXRlIHN1Ym5ldHNcbiAgICAgKi9cbiAgICB0aGlzLnByaXZhdGVTdWJuZXRzID0gbmV3IEFycmF5PElTdWJuZXQ+O1xuXG4gICAgLyoqXG4gICAgICogRGVwZW5kYWJsZSB0aGF0IGNhbiBiZSBkZXBlbmRlZCB1cG9uIHRvIGZvcmNlIGludGVybmV0IGNvbm5lY3Rpdml0eSBlc3RhYmxpc2hlZCBvbiB0aGUgVlBDXG4gICAgICogQWRkIGlndyB0byB0aGlzIGlmIGl0cyBhIHB1YmxpYyBzdWJuZXRcbiAgICAgKi9cbiAgICB0aGlzLmludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQgPSB0aGlzLl9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkO1xuICB9XG59XG4vKipcbiAqIFN1cHBvcnRzIGFzc2lnbmluZyBJUHY0IGFkZHJlc3MgdG8gVlBDXG4gKi9cbmNsYXNzIGlwdjRDaWRyQWxsb2NhdGlvbiBpbXBsZW1lbnRzIElJcEFkZHJlc3NlcyB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjaWRyQmxvY2s6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBwcm9wcz86IHsgY2lkckJsb2NrTmFtZTogc3RyaW5nfSkge1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIENJRFIgYmxvY2sgcHJvdmlkZWQgYnkgdGhlIHVzZXIgdG8gc2V0IElQdjRcbiAgICovXG4gIGFsbG9jYXRlVnBjQ2lkcigpOiBWcGNDaWRyT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlwdjRDaWRyQmxvY2s6IHRoaXMuY2lkckJsb2NrLFxuICAgICAgY2lkckJsb2NrTmFtZTogdGhpcy5wcm9wcz8uY2lkckJsb2NrTmFtZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU3VwcG9ydHMgQW1hem9uIFByb3ZpZGVkIElwdjYgcmFuZ2VzXG4gKi9cbmNsYXNzIEFtYXpvblByb3ZpZGVkIGltcGxlbWVudHMgSUlwQWRkcmVzc2VzIHtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYW4gQW1hem9uLXByb3ZpZGVkIElQdjYgQ0lEUiByYW5nZSBmb3IgYSBWUEMuXG4gICAqXG4gICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgSUlwQWRkcmVzc2VzIGludGVyZmFjZSBhbmQgaXMgdXNlZCB0byBhbGxvY2F0ZSBhbiBBbWF6b24tcHJvdmlkZWRcbiAgICogSVB2NiBDSURSIHJhbmdlIGZvciBhIFZQQy4gV2hlbiBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8gYWxsb2NhdGUgdGhlIFZQQyBDSURSLFxuICAgKiBBbWF6b24gd2lsbCBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhbiBJUHY2IENJRFIgcmFuZ2UgZnJvbSBpdHMgcG9vbCBvZiBhdmFpbGFibGUgYWRkcmVzc2VzLlxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiB7IGNpZHJCbG9ja05hbWU6IHN0cmluZ30pIHt9O1xuXG4gIGFsbG9jYXRlVnBjQ2lkcigpOiBWcGNDaWRyT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFtYXpvblByb3ZpZGVkOiB0cnVlLFxuICAgICAgY2lkckJsb2NrTmFtZTogdGhpcy5wcm9wcy5jaWRyQmxvY2tOYW1lLFxuICAgIH07XG4gIH1cblxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSVB2NCBhZGRyZXNzIHJhbmdlIG1hbmFnZWQgYnkgQVdTIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbS5odG1sXG4gKi9cbmNsYXNzIElwYW1JcHY2IGltcGxlbWVudHMgSUlwQWRkcmVzc2VzIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBJcGFtT3B0aW9ucykge1xuICB9XG5cbiAgYWxsb2NhdGVWcGNDaWRyKCk6IFZwY0NpZHJPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXB2Nk5ldG1hc2tMZW5ndGg6IHRoaXMucHJvcHMubmV0bWFza0xlbmd0aCxcbiAgICAgIGlwdjZJcGFtUG9vbDogdGhpcy5wcm9wcy5pcGFtUG9vbCxcbiAgICAgIGRlcGVuZGVuY2llczogdGhpcy5wcm9wcy5pcGFtUG9vbD8uaXBhbUNpZHJzLm1hcChjID0+IGMgYXMgQ2ZuUmVzb3VyY2UpLFxuICAgICAgY2lkckJsb2NrTmFtZTogdGhpcy5wcm9wcy5jaWRyQmxvY2tOYW1lLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyByYW5nZSBtYW5hZ2VkIGJ5IEFXUyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW0uaHRtbFxuICovXG5jbGFzcyBJcGFtSXB2NCBpbXBsZW1lbnRzIElJcEFkZHJlc3NlcyB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogSXBhbU9wdGlvbnMpIHtcbiAgfVxuICBhbGxvY2F0ZVZwY0NpZHIoKTogVnBjQ2lkck9wdGlvbnMge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlwdjROZXRtYXNrTGVuZ3RoOiB0aGlzLnByb3BzLm5ldG1hc2tMZW5ndGgsXG4gICAgICBpcHY0SXBhbVBvb2w6IHRoaXMucHJvcHMuaXBhbVBvb2wsXG4gICAgICBjaWRyQmxvY2tOYW1lOiB0aGlzLnByb3BzPy5jaWRyQmxvY2tOYW1lLFxuICAgIH07XG4gIH1cbn1cblxuLy9AaW50ZXJuYWwgRmlyc3QgdHdvIE9jdGV0IHRvIHZlcmlmeSBSRkMgMTkxOFxuaW50ZXJmYWNlIElQYWRkcmVzc0NvbmZpZyB7XG4gIG9jdGV0MTogbnVtYmVyO1xuICBvY3RldDI6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciBhIHNlY29uZGFyeSBJUHY0IGFkZHJlc3MgaXMgd2l0aGluIHRoZSBzYW1lIHByaXZhdGUgSVAgYWRkcmVzcyByYW5nZSBhcyB0aGUgcHJpbWFyeSBJUHY0IGFkZHJlc3MuXG4gKlxuICogQHBhcmFtIGNpZHIxIFRoZSBzZWNvbmRhcnkgSVB2NCBDSURSIGJsb2NrIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSBjaWRyMiBUaGUgcHJpbWFyeSBJUHY0IENJRFIgYmxvY2sgdG8gdmFsaWRhdGUgYWdhaW5zdC5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHNlY29uZGFyeSBJUHY0IENJRFIgYmxvY2sgaXMgd2l0aGluIHRoZSBzYW1lIHByaXZhdGUgSVAgYWRkcmVzcyByYW5nZSBhcyB0aGUgcHJpbWFyeSBJUHY0IENJRFIgYmxvY2ssIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBpbnRlcm5hbFxuICogVGhlIHByaXZhdGUgSVAgYWRkcmVzcyByYW5nZXMgYXJlIGRlZmluZWQgYnkgUkZDIDE5MTggYXMgMTAuMC4wLjAvOCwgMTcyLjE2LjAuMC8xMiwgYW5kIDE5Mi4xNjguMC4wLzE2LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUlwdjRhZGRyZXNzKGNpZHIxPzogc3RyaW5nLCBjaWRyMj86IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNpZHIxIHx8ICFjaWRyMikge1xuICAgIHJldHVybiBmYWxzZTsgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIENJRFIgcmFuZ2VzIGFyZSBub3QgcHJvdmlkZWRcbiAgfVxuXG4gIGNvbnN0IG9jdGV0c0NpZHIxOiBudW1iZXJbXSA9IGNpZHIxLnNwbGl0KCcuJykubWFwKG9jdGV0ID0+IHBhcnNlSW50KG9jdGV0LCAxMCkpO1xuICBjb25zdCBvY3RldHNDaWRyMjogbnVtYmVyW10gPSBjaWRyMi5zcGxpdCgnLicpLm1hcChvY3RldCA9PiBwYXJzZUludChvY3RldCwgMTApKTtcblxuICBpZiAob2N0ZXRzQ2lkcjEubGVuZ3RoICE9PSA0IHx8IG9jdGV0c0NpZHIyLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gSGFuZGxlIGludmFsaWQgQ0lEUiByYW5nZXNcbiAgfVxuXG4gIGNvbnN0IGlwMTogSVBhZGRyZXNzQ29uZmlnID0ge1xuICAgIG9jdGV0MTogb2N0ZXRzQ2lkcjFbMF0sXG4gICAgb2N0ZXQyOiBvY3RldHNDaWRyMVsxXSxcbiAgfTtcblxuICBjb25zdCBpcDI6IElQYWRkcmVzc0NvbmZpZyA9IHtcbiAgICBvY3RldDE6IG9jdGV0c0NpZHIyWzBdLFxuICAgIG9jdGV0Mjogb2N0ZXRzQ2lkcjJbMV0sXG4gIH07XG5cbiAgcmV0dXJuIChpcDEub2N0ZXQxID09PSAxMCAmJiBpcDIub2N0ZXQxID09PSAxMCkgfHxcbiAgICAoaXAxLm9jdGV0MSA9PT0gMTkyICYmIGlwMS5vY3RldDIgPT09IDE2OCAmJiBpcDIub2N0ZXQxID09PSAxOTIgJiYgaXAyLm9jdGV0MiA9PT0gMTY4KSB8fFxuICAgIChpcDEub2N0ZXQxID09PSAxNzIgJiYgaXAxLm9jdGV0MiA9PT0gMTYgJiYgaXAyLm9jdGV0MSA9PT0gMTcyICYmIGlwMi5vY3RldDIgPT09IDE2KTsgLy8gQ0lEUiByYW5nZXMgYmVsb25nIHRvIHNhbWUgcHJpdmF0ZSBJUCBhZGRyZXNzIHJhbmdlc1xufSJdfQ==
|
package/package.json
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aws-cdk/aws-ec2-alpha",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "2.156.0-alpha.0",
|
|
5
|
+
"description": "The CDK construct library for VPC V2",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"jsii": {
|
|
9
|
+
"outdir": "dist",
|
|
10
|
+
"targets": {
|
|
11
|
+
"java": {
|
|
12
|
+
"package": "software.amazon.awscdk.services.ec2.alpha",
|
|
13
|
+
"maven": {
|
|
14
|
+
"groupId": "software.amazon.awscdk",
|
|
15
|
+
"artifactId": "ec2-alpha"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"dotnet": {
|
|
19
|
+
"namespace": "Amazon.CDK.AWS.ec2.Alpha",
|
|
20
|
+
"packageId": "Amazon.CDK.AWS.ec2.Alpha",
|
|
21
|
+
"iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/main/logo/default-256-dark.png"
|
|
22
|
+
},
|
|
23
|
+
"python": {
|
|
24
|
+
"distName": "aws-cdk.aws-ec2-alpha",
|
|
25
|
+
"module": "aws_cdk.aws_ec2_alpha",
|
|
26
|
+
"classifiers": [
|
|
27
|
+
"Framework :: AWS CDK",
|
|
28
|
+
"Framework :: AWS CDK :: 2"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
"go": {
|
|
32
|
+
"moduleName": "github.com/aws/aws-cdk-go",
|
|
33
|
+
"packageName": "awsec2alpha"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"projectReferences": true,
|
|
37
|
+
"metadata": {
|
|
38
|
+
"jsii": {
|
|
39
|
+
"rosetta": {
|
|
40
|
+
"strict": true
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/aws/aws-cdk.git",
|
|
48
|
+
"directory": "packages/@aws-cdk/aws-ec2-alpha"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "cdk-build",
|
|
52
|
+
"watch": "cdk-watch",
|
|
53
|
+
"lint": "cdk-lint",
|
|
54
|
+
"test": "cdk-test",
|
|
55
|
+
"integ": "integ-runner --language javascript",
|
|
56
|
+
"pkglint": "pkglint -f",
|
|
57
|
+
"awslint": "cdk-awslint",
|
|
58
|
+
"package": "cdk-package",
|
|
59
|
+
"build+test": "yarn build && yarn test",
|
|
60
|
+
"build+test+package": "yarn build+test && yarn package",
|
|
61
|
+
"compat": "cdk-compat",
|
|
62
|
+
"rosetta:extract": "yarn --silent jsii-rosetta extract",
|
|
63
|
+
"build+extract": "yarn build && yarn rosetta:extract",
|
|
64
|
+
"build+test+extract": "yarn build+test && yarn rosetta:extract"
|
|
65
|
+
},
|
|
66
|
+
"keywords": [
|
|
67
|
+
"aws",
|
|
68
|
+
"cdk",
|
|
69
|
+
"example",
|
|
70
|
+
"construct",
|
|
71
|
+
"library"
|
|
72
|
+
],
|
|
73
|
+
"author": {
|
|
74
|
+
"name": "Amazon Web Services",
|
|
75
|
+
"url": "https://aws.amazon.com",
|
|
76
|
+
"organization": true
|
|
77
|
+
},
|
|
78
|
+
"license": "Apache-2.0",
|
|
79
|
+
"devDependencies": {
|
|
80
|
+
"@aws-cdk/cdk-build-tools": "2.156.0-alpha.0",
|
|
81
|
+
"@aws-cdk/integ-runner": "2.156.0-alpha.0",
|
|
82
|
+
"@aws-cdk/integ-tests-alpha": "^2.156.0-alpha.0",
|
|
83
|
+
"@aws-cdk/pkglint": "2.156.0-alpha.0",
|
|
84
|
+
"@types/jest": "^29.5.12",
|
|
85
|
+
"aws-cdk-lib": "2.156.0",
|
|
86
|
+
"jest": "^29.7.0"
|
|
87
|
+
},
|
|
88
|
+
"homepage": "https://github.com/aws/aws-cdk",
|
|
89
|
+
"peerDependencies": {
|
|
90
|
+
"aws-cdk-lib": "^2.156.0",
|
|
91
|
+
"constructs": "^10.0.0"
|
|
92
|
+
},
|
|
93
|
+
"separate-module": false,
|
|
94
|
+
"engines": {
|
|
95
|
+
"node": ">= 14.15.0"
|
|
96
|
+
},
|
|
97
|
+
"stability": "experimental",
|
|
98
|
+
"maturity": "experimental",
|
|
99
|
+
"awscdkio": {
|
|
100
|
+
"announce": false
|
|
101
|
+
},
|
|
102
|
+
"cdk-build": {
|
|
103
|
+
"env": {
|
|
104
|
+
"AWSLINT_BASE_CONSTRUCT": true
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"publishConfig": {
|
|
108
|
+
"tag": "latest"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Fixture with packages imported, but nothing else
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { Stack, App, Fn } from 'aws-cdk-lib';
|
|
4
|
+
import * as vpc_v2 from '@aws-cdk/aws-ec2-alpha';
|
|
5
|
+
import { Ipam, AwsServiceName, IpCidr } from '@aws-cdk/aws-ec2-alpha';
|
|
6
|
+
import { NatConnectivityType } from '@aws-cdk/aws-ec2-alpha'
|
|
7
|
+
import * as ec2 from 'aws-cdk-lib/aws-ec2';
|
|
8
|
+
|
|
9
|
+
class Fixture extends Stack {
|
|
10
|
+
constructor(scope: Construct, id: string) {
|
|
11
|
+
super(scope, id);
|
|
12
|
+
|
|
13
|
+
/// here
|
|
14
|
+
}
|
|
15
|
+
}
|