@aws-cdk/aws-ec2-alpha 2.218.0-alpha.0 → 2.220.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 +3 -3
- package/.jsii.tabl.json.gz +0 -0
- package/lib/ipam.js +291 -155
- package/lib/route.js +647 -371
- package/lib/subnet-v2.js +249 -177
- package/lib/transit-gateway-route-table-association.js +78 -33
- package/lib/transit-gateway-route-table-propagation.js +78 -33
- package/lib/transit-gateway-route-table.js +79 -33
- package/lib/transit-gateway-route.js +127 -64
- package/lib/transit-gateway-vpc-attachment.js +126 -80
- package/lib/transit-gateway.js +135 -52
- package/lib/util.js +29 -2
- package/lib/vpc-v2-base.js +40 -30
- package/lib/vpc-v2.js +370 -220
- package/package.json +9 -8
package/lib/route.js
CHANGED
|
@@ -1,11 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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;
|
|
7
35
|
};
|
|
8
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
9
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
37
|
exports.RouteTable = exports.Route = exports.RouteTargetType = exports.VPCPeeringConnection = exports.NatGateway = exports.VPNGatewayV2 = exports.InternetGateway = exports.EgressOnlyInternetGateway = exports.NatConnectivityType = void 0;
|
|
11
38
|
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
@@ -40,298 +67,481 @@ const NAME_TAG = 'Name';
|
|
|
40
67
|
* Creates an egress-only internet gateway
|
|
41
68
|
* @resource AWS::EC2::EgressOnlyInternetGateway
|
|
42
69
|
*/
|
|
43
|
-
let EgressOnlyInternetGateway =
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
70
|
+
let EgressOnlyInternetGateway = (() => {
|
|
71
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
72
|
+
let _classDescriptor;
|
|
73
|
+
let _classExtraInitializers = [];
|
|
74
|
+
let _classThis;
|
|
75
|
+
let _classSuper = core_1.Resource;
|
|
76
|
+
var EgressOnlyInternetGateway = class extends _classSuper {
|
|
77
|
+
static { _classThis = this; }
|
|
78
|
+
static {
|
|
79
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
80
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
81
|
+
EgressOnlyInternetGateway = _classThis = _classDescriptor.value;
|
|
82
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
83
|
+
}
|
|
84
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.EgressOnlyInternetGateway", version: "2.220.0-alpha.0" };
|
|
85
|
+
/** Uniquely identifies this class. */
|
|
86
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.EgressOnlyInternetGateway';
|
|
87
|
+
/**
|
|
88
|
+
* The type of router used in the route.
|
|
89
|
+
*/
|
|
90
|
+
routerType;
|
|
91
|
+
/**
|
|
92
|
+
* The ID of the route target.
|
|
93
|
+
*/
|
|
94
|
+
routerTargetId;
|
|
95
|
+
/**
|
|
96
|
+
* The egress-only internet gateway CFN resource.
|
|
97
|
+
*/
|
|
98
|
+
resource;
|
|
99
|
+
constructor(scope, id, props) {
|
|
100
|
+
super(scope, id);
|
|
101
|
+
try {
|
|
102
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_EgressOnlyInternetGatewayProps(props);
|
|
52
103
|
}
|
|
53
|
-
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
106
|
+
Error.captureStackTrace(error, EgressOnlyInternetGateway);
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
// Enhanced CDK Analytics Telemetry
|
|
111
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
112
|
+
if (props.egressOnlyInternetGatewayName) {
|
|
113
|
+
core_1.Tags.of(this).add(NAME_TAG, props.egressOnlyInternetGatewayName);
|
|
114
|
+
}
|
|
115
|
+
this.routerType = aws_ec2_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY;
|
|
116
|
+
this.resource = new aws_ec2_1.CfnEgressOnlyInternetGateway(this, 'EIGW', {
|
|
117
|
+
vpcId: props.vpc.vpcId,
|
|
118
|
+
});
|
|
119
|
+
this.node.defaultChild = this.resource;
|
|
120
|
+
this.routerTargetId = this.resource.attrId;
|
|
54
121
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (props.egressOnlyInternetGatewayName) {
|
|
58
|
-
core_1.Tags.of(this).add(NAME_TAG, props.egressOnlyInternetGatewayName);
|
|
122
|
+
static {
|
|
123
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
59
124
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
});
|
|
64
|
-
this.node.defaultChild = this.resource;
|
|
65
|
-
this.routerTargetId = this.resource.attrId;
|
|
66
|
-
}
|
|
67
|
-
};
|
|
125
|
+
};
|
|
126
|
+
return EgressOnlyInternetGateway = _classThis;
|
|
127
|
+
})();
|
|
68
128
|
exports.EgressOnlyInternetGateway = EgressOnlyInternetGateway;
|
|
69
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
70
|
-
EgressOnlyInternetGateway[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.EgressOnlyInternetGateway", version: "2.218.0-alpha.0" };
|
|
71
|
-
/** Uniquely identifies this class. */
|
|
72
|
-
EgressOnlyInternetGateway.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.EgressOnlyInternetGateway';
|
|
73
|
-
exports.EgressOnlyInternetGateway = EgressOnlyInternetGateway = __decorate([
|
|
74
|
-
prop_injectable_1.propertyInjectable
|
|
75
|
-
], EgressOnlyInternetGateway);
|
|
76
129
|
/**
|
|
77
130
|
* Creates an internet gateway
|
|
78
131
|
* @resource AWS::EC2::InternetGateway
|
|
79
132
|
*/
|
|
80
|
-
let InternetGateway =
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
133
|
+
let InternetGateway = (() => {
|
|
134
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
135
|
+
let _classDescriptor;
|
|
136
|
+
let _classExtraInitializers = [];
|
|
137
|
+
let _classThis;
|
|
138
|
+
let _classSuper = core_1.Resource;
|
|
139
|
+
var InternetGateway = class extends _classSuper {
|
|
140
|
+
static { _classThis = this; }
|
|
141
|
+
static {
|
|
142
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
143
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
144
|
+
InternetGateway = _classThis = _classDescriptor.value;
|
|
145
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
146
|
+
}
|
|
147
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.InternetGateway", version: "2.220.0-alpha.0" };
|
|
148
|
+
/** Uniquely identifies this class. */
|
|
149
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.InternetGateway';
|
|
150
|
+
/**
|
|
151
|
+
* The type of router used in the route.
|
|
152
|
+
*/
|
|
153
|
+
routerType;
|
|
154
|
+
/**
|
|
155
|
+
* The ID of the route target.
|
|
156
|
+
*/
|
|
157
|
+
routerTargetId;
|
|
158
|
+
/**
|
|
159
|
+
* The ID of the VPC for which to create the internet gateway.
|
|
160
|
+
*/
|
|
161
|
+
vpcId;
|
|
162
|
+
/**
|
|
163
|
+
* The internet gateway CFN resource.
|
|
164
|
+
*/
|
|
165
|
+
resource;
|
|
166
|
+
constructor(scope, id, props) {
|
|
167
|
+
super(scope, id);
|
|
168
|
+
try {
|
|
169
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_InternetGatewayProps(props);
|
|
89
170
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
core_1.
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
173
|
+
Error.captureStackTrace(error, InternetGateway);
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
// Enhanced CDK Analytics Telemetry
|
|
178
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
179
|
+
this.routerType = aws_ec2_1.RouterType.GATEWAY;
|
|
180
|
+
this.resource = new aws_ec2_1.CfnInternetGateway(this, 'IGW', {});
|
|
181
|
+
this.node.defaultChild = this.resource;
|
|
182
|
+
this.routerTargetId = core_1.FeatureFlags.of(this).isEnabled(aws_cdk_lib_1.cx_api.USE_RESOURCEID_FOR_VPCV2_MIGRATION) ?
|
|
183
|
+
this.resource.ref : this.resource.attrInternetGatewayId;
|
|
184
|
+
this.vpcId = props.vpc.vpcId;
|
|
185
|
+
if (props.internetGatewayName) {
|
|
186
|
+
core_1.Tags.of(this).add(NAME_TAG, props.internetGatewayName);
|
|
187
|
+
}
|
|
188
|
+
if (props.vpc.vpcName) {
|
|
189
|
+
core_1.Tags.of(this).add('Name', props.vpc.vpcName);
|
|
190
|
+
}
|
|
191
|
+
new aws_ec2_1.CfnVPCGatewayAttachment(this, 'GWAttachment', {
|
|
192
|
+
vpcId: this.vpcId,
|
|
193
|
+
internetGatewayId: this.routerTargetId,
|
|
194
|
+
});
|
|
102
195
|
}
|
|
103
|
-
|
|
104
|
-
|
|
196
|
+
static {
|
|
197
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
105
198
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
};
|
|
199
|
+
};
|
|
200
|
+
return InternetGateway = _classThis;
|
|
201
|
+
})();
|
|
112
202
|
exports.InternetGateway = InternetGateway;
|
|
113
|
-
_b = JSII_RTTI_SYMBOL_1;
|
|
114
|
-
InternetGateway[_b] = { fqn: "@aws-cdk/aws-ec2-alpha.InternetGateway", version: "2.218.0-alpha.0" };
|
|
115
|
-
/** Uniquely identifies this class. */
|
|
116
|
-
InternetGateway.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.InternetGateway';
|
|
117
|
-
exports.InternetGateway = InternetGateway = __decorate([
|
|
118
|
-
prop_injectable_1.propertyInjectable
|
|
119
|
-
], InternetGateway);
|
|
120
203
|
/**
|
|
121
204
|
* Creates a virtual private gateway
|
|
122
205
|
* @resource AWS::EC2::VPNGateway
|
|
123
206
|
*/
|
|
124
|
-
let VPNGatewayV2 =
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
207
|
+
let VPNGatewayV2 = (() => {
|
|
208
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
209
|
+
let _classDescriptor;
|
|
210
|
+
let _classExtraInitializers = [];
|
|
211
|
+
let _classThis;
|
|
212
|
+
let _classSuper = core_1.Resource;
|
|
213
|
+
var VPNGatewayV2 = class extends _classSuper {
|
|
214
|
+
static { _classThis = this; }
|
|
215
|
+
static {
|
|
216
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
217
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
218
|
+
VPNGatewayV2 = _classThis = _classDescriptor.value;
|
|
219
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
220
|
+
}
|
|
221
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.VPNGatewayV2", version: "2.220.0-alpha.0" };
|
|
222
|
+
/** Uniquely identifies this class. */
|
|
223
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VPNGatewayV2';
|
|
224
|
+
/**
|
|
225
|
+
* The type of router used in the route.
|
|
226
|
+
*/
|
|
227
|
+
routerType;
|
|
228
|
+
/**
|
|
229
|
+
* The ID of the route target.
|
|
230
|
+
*/
|
|
231
|
+
routerTargetId;
|
|
232
|
+
/**
|
|
233
|
+
* The ID of the VPC for which to create the VPN gateway.
|
|
234
|
+
*/
|
|
235
|
+
vpcId;
|
|
236
|
+
/**
|
|
237
|
+
* The VPN gateway CFN resource.
|
|
238
|
+
*/
|
|
239
|
+
resource;
|
|
240
|
+
/**
|
|
241
|
+
* The VPN Gateway Attachment
|
|
242
|
+
*/
|
|
243
|
+
_attachment;
|
|
244
|
+
/**
|
|
245
|
+
* The VPN Gateway Route Propagation
|
|
246
|
+
*/
|
|
247
|
+
_routePropagation;
|
|
248
|
+
constructor(scope, id, props) {
|
|
249
|
+
super(scope, id, {
|
|
250
|
+
physicalName: props.vpnGatewayName,
|
|
251
|
+
});
|
|
252
|
+
try {
|
|
253
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VPNGatewayV2Props(props);
|
|
135
254
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
257
|
+
Error.captureStackTrace(error, VPNGatewayV2);
|
|
258
|
+
}
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
261
|
+
// Enhanced CDK Analytics Telemetry
|
|
262
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
263
|
+
this.routerType = aws_ec2_1.RouterType.GATEWAY;
|
|
264
|
+
this.resource = new aws_ec2_1.CfnVPNGateway(this, 'IGW', {
|
|
265
|
+
type: props.type,
|
|
266
|
+
amazonSideAsn: props.amazonSideAsn,
|
|
267
|
+
});
|
|
268
|
+
this.node.defaultChild = this.resource;
|
|
269
|
+
this.routerTargetId = this.resource.attrVpnGatewayId;
|
|
270
|
+
this.vpcId = props.vpc.vpcId;
|
|
271
|
+
this._attachment = new aws_ec2_1.CfnVPCGatewayAttachment(this, 'VPCVPNGW', {
|
|
272
|
+
vpcId: this.vpcId,
|
|
273
|
+
vpnGatewayId: this.resource.attrVpnGatewayId,
|
|
274
|
+
});
|
|
275
|
+
if (props.vpnGatewayName) {
|
|
276
|
+
core_1.Tags.of(this).add(NAME_TAG, props.vpnGatewayName);
|
|
277
|
+
}
|
|
278
|
+
// Propagate routes on route tables associated with the right subnets
|
|
279
|
+
const vpnRoutePropagation = props.vpnRoutePropagation ?? [];
|
|
280
|
+
const subnets = vpnRoutePropagation.map(s => props.vpc.selectSubnets(s).subnets).flat();
|
|
281
|
+
const routeTableIds = (0, util_1.allRouteTableIds)(subnets);
|
|
282
|
+
if (routeTableIds.length === 0) {
|
|
283
|
+
core_1.Annotations.of(scope).addWarningV2('@aws-cdk:aws-ec2-elpha:enableVpnGatewayV2', `No subnets matching selection: '${JSON.stringify(vpnRoutePropagation)}'. Select other subnets to add routes to.`);
|
|
284
|
+
}
|
|
285
|
+
this._routePropagation = new aws_ec2_1.CfnVPNGatewayRoutePropagation(this, 'RoutePropagation', {
|
|
286
|
+
routeTableIds,
|
|
287
|
+
vpnGatewayId: this.routerTargetId,
|
|
288
|
+
});
|
|
289
|
+
// The AWS::EC2::VPNGatewayRoutePropagation resource cannot use the VPN gateway
|
|
290
|
+
// until it has successfully attached to the VPC.
|
|
291
|
+
// See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html
|
|
292
|
+
this._routePropagation.node.addDependency(this._attachment);
|
|
154
293
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const subnets = vpnRoutePropagation.map(s => props.vpc.selectSubnets(s).subnets).flat();
|
|
158
|
-
const routeTableIds = (0, util_1.allRouteTableIds)(subnets);
|
|
159
|
-
if (routeTableIds.length === 0) {
|
|
160
|
-
core_1.Annotations.of(scope).addWarningV2('@aws-cdk:aws-ec2-elpha:enableVpnGatewayV2', `No subnets matching selection: '${JSON.stringify(vpnRoutePropagation)}'. Select other subnets to add routes to.`);
|
|
294
|
+
static {
|
|
295
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
161
296
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
});
|
|
166
|
-
// The AWS::EC2::VPNGatewayRoutePropagation resource cannot use the VPN gateway
|
|
167
|
-
// until it has successfully attached to the VPC.
|
|
168
|
-
// See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html
|
|
169
|
-
this._routePropagation.node.addDependency(this._attachment);
|
|
170
|
-
}
|
|
171
|
-
};
|
|
297
|
+
};
|
|
298
|
+
return VPNGatewayV2 = _classThis;
|
|
299
|
+
})();
|
|
172
300
|
exports.VPNGatewayV2 = VPNGatewayV2;
|
|
173
|
-
_c = JSII_RTTI_SYMBOL_1;
|
|
174
|
-
VPNGatewayV2[_c] = { fqn: "@aws-cdk/aws-ec2-alpha.VPNGatewayV2", version: "2.218.0-alpha.0" };
|
|
175
|
-
/** Uniquely identifies this class. */
|
|
176
|
-
VPNGatewayV2.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VPNGatewayV2';
|
|
177
|
-
exports.VPNGatewayV2 = VPNGatewayV2 = __decorate([
|
|
178
|
-
prop_injectable_1.propertyInjectable
|
|
179
|
-
], VPNGatewayV2);
|
|
180
301
|
/**
|
|
181
302
|
* Creates a network address translation (NAT) gateway
|
|
182
303
|
* @resource AWS::EC2::NatGateway
|
|
183
304
|
*/
|
|
184
|
-
let NatGateway =
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
305
|
+
let NatGateway = (() => {
|
|
306
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
307
|
+
let _classDescriptor;
|
|
308
|
+
let _classExtraInitializers = [];
|
|
309
|
+
let _classThis;
|
|
310
|
+
let _classSuper = core_1.Resource;
|
|
311
|
+
var NatGateway = class extends _classSuper {
|
|
312
|
+
static { _classThis = this; }
|
|
313
|
+
static {
|
|
314
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
315
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
316
|
+
NatGateway = _classThis = _classDescriptor.value;
|
|
317
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
318
|
+
}
|
|
319
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.NatGateway", version: "2.220.0-alpha.0" };
|
|
320
|
+
/** Uniquely identifies this class. */
|
|
321
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.NatGateway';
|
|
322
|
+
/**
|
|
323
|
+
* Id of the NatGateway
|
|
324
|
+
* @attribute
|
|
325
|
+
*/
|
|
326
|
+
natGatewayId;
|
|
327
|
+
/**
|
|
328
|
+
* The type of router used in the route.
|
|
329
|
+
*/
|
|
330
|
+
routerType;
|
|
331
|
+
/**
|
|
332
|
+
* The ID of the route target.
|
|
333
|
+
*/
|
|
334
|
+
routerTargetId;
|
|
335
|
+
/**
|
|
336
|
+
* Indicates whether the NAT gateway supports public or private connectivity.
|
|
337
|
+
*
|
|
338
|
+
* @default public
|
|
339
|
+
*/
|
|
340
|
+
connectivityType;
|
|
341
|
+
/**
|
|
342
|
+
* The maximum amount of time to wait before forcibly releasing the
|
|
343
|
+
* IP addresses if connections are still in progress.
|
|
344
|
+
*
|
|
345
|
+
* @default '350 seconds'
|
|
346
|
+
*/
|
|
347
|
+
maxDrainDuration;
|
|
348
|
+
/**
|
|
349
|
+
* The NAT gateway CFN resource.
|
|
350
|
+
*/
|
|
351
|
+
resource;
|
|
352
|
+
/**
|
|
353
|
+
* Elastic IP created for allocation
|
|
354
|
+
*/
|
|
355
|
+
eip;
|
|
356
|
+
constructor(scope, id, props) {
|
|
357
|
+
super(scope, id);
|
|
358
|
+
try {
|
|
359
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_NatGatewayProps(props);
|
|
193
360
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
this.connectivityType = props.connectivityType || NatConnectivityType.PUBLIC;
|
|
200
|
-
this.maxDrainDuration = props.maxDrainDuration || core_1.Duration.seconds(350);
|
|
201
|
-
if (this.connectivityType === NatConnectivityType.PUBLIC) {
|
|
202
|
-
if (!props.vpc && !props.allocationId) {
|
|
203
|
-
throw new core_1.ValidationError('Either provide vpc or allocationId', this);
|
|
361
|
+
catch (error) {
|
|
362
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
363
|
+
Error.captureStackTrace(error, NatGateway);
|
|
364
|
+
}
|
|
365
|
+
throw error;
|
|
204
366
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
domain: 'vpc',
|
|
215
|
-
});
|
|
216
|
-
aId = this.eip.attrAllocationId;
|
|
367
|
+
// Enhanced CDK Analytics Telemetry
|
|
368
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
369
|
+
this.routerType = aws_ec2_1.RouterType.NAT_GATEWAY;
|
|
370
|
+
this.connectivityType = props.connectivityType || NatConnectivityType.PUBLIC;
|
|
371
|
+
this.maxDrainDuration = props.maxDrainDuration || core_1.Duration.seconds(350);
|
|
372
|
+
if (this.connectivityType === NatConnectivityType.PUBLIC) {
|
|
373
|
+
if (!props.vpc && !props.allocationId) {
|
|
374
|
+
throw new core_1.ValidationError('Either provide vpc or allocationId', this);
|
|
375
|
+
}
|
|
217
376
|
}
|
|
218
|
-
|
|
219
|
-
|
|
377
|
+
if (props.natGatewayName) {
|
|
378
|
+
core_1.Tags.of(this).add(NAME_TAG, props?.natGatewayName);
|
|
220
379
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
380
|
+
// If user does not provide EIP, generate one for them
|
|
381
|
+
var aId;
|
|
382
|
+
if (this.connectivityType === NatConnectivityType.PUBLIC) {
|
|
383
|
+
if (!props.allocationId) {
|
|
384
|
+
this.eip = new aws_ec2_1.CfnEIP(this, 'EIP', {
|
|
385
|
+
domain: 'vpc',
|
|
386
|
+
});
|
|
387
|
+
aId = this.eip.attrAllocationId;
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
aId = props.allocationId;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
this.resource = new aws_ec2_1.CfnNatGateway(this, 'NATGateway', {
|
|
394
|
+
subnetId: props.subnet.subnetId,
|
|
395
|
+
allocationId: aId,
|
|
396
|
+
maxDrainDurationSeconds: props.maxDrainDuration?.toSeconds(),
|
|
397
|
+
secondaryAllocationIds: props.secondaryAllocationIds,
|
|
398
|
+
...props,
|
|
399
|
+
});
|
|
400
|
+
this.natGatewayId = core_1.FeatureFlags.of(this).isEnabled(aws_cdk_lib_1.cx_api.USE_RESOURCEID_FOR_VPCV2_MIGRATION) ?
|
|
401
|
+
this.resource.ref : this.resource.attrNatGatewayId;
|
|
402
|
+
this.routerTargetId = core_1.FeatureFlags.of(this).isEnabled(aws_cdk_lib_1.cx_api.USE_RESOURCEID_FOR_VPCV2_MIGRATION) ?
|
|
403
|
+
this.resource.ref : this.resource.attrNatGatewayId;
|
|
404
|
+
this.node.defaultChild = this.resource;
|
|
405
|
+
this.resource.node.addDependency(props.subnet.internetConnectivityEstablished);
|
|
406
|
+
}
|
|
407
|
+
static {
|
|
408
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
return NatGateway = _classThis;
|
|
412
|
+
})();
|
|
237
413
|
exports.NatGateway = NatGateway;
|
|
238
|
-
_d = JSII_RTTI_SYMBOL_1;
|
|
239
|
-
NatGateway[_d] = { fqn: "@aws-cdk/aws-ec2-alpha.NatGateway", version: "2.218.0-alpha.0" };
|
|
240
|
-
/** Uniquely identifies this class. */
|
|
241
|
-
NatGateway.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.NatGateway';
|
|
242
|
-
exports.NatGateway = NatGateway = __decorate([
|
|
243
|
-
prop_injectable_1.propertyInjectable
|
|
244
|
-
], NatGateway);
|
|
245
414
|
/**
|
|
246
415
|
* Creates a peering connection between two VPCs
|
|
247
416
|
* @resource AWS::EC2::VPCPeeringConnection
|
|
248
417
|
*/
|
|
249
|
-
let VPCPeeringConnection =
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
418
|
+
let VPCPeeringConnection = (() => {
|
|
419
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
420
|
+
let _classDescriptor;
|
|
421
|
+
let _classExtraInitializers = [];
|
|
422
|
+
let _classThis;
|
|
423
|
+
let _classSuper = core_1.Resource;
|
|
424
|
+
var VPCPeeringConnection = class extends _classSuper {
|
|
425
|
+
static { _classThis = this; }
|
|
426
|
+
static {
|
|
427
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
428
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
429
|
+
VPCPeeringConnection = _classThis = _classDescriptor.value;
|
|
430
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
431
|
+
}
|
|
432
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.VPCPeeringConnection", version: "2.220.0-alpha.0" };
|
|
433
|
+
/** Uniquely identifies this class. */
|
|
434
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VPCPeeringConnection';
|
|
435
|
+
/**
|
|
436
|
+
* The type of router used in the route.
|
|
437
|
+
*/
|
|
438
|
+
routerType;
|
|
439
|
+
/**
|
|
440
|
+
* The ID of the route target.
|
|
441
|
+
*/
|
|
442
|
+
routerTargetId;
|
|
443
|
+
/**
|
|
444
|
+
* The VPC peering connection CFN resource.
|
|
445
|
+
*/
|
|
446
|
+
resource;
|
|
447
|
+
constructor(scope, id, props) {
|
|
448
|
+
super(scope, id);
|
|
449
|
+
try {
|
|
450
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VPCPeeringConnectionProps(props);
|
|
258
451
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
263
|
-
this.routerType = aws_ec2_1.RouterType.VPC_PEERING_CONNECTION;
|
|
264
|
-
const isCrossAccount = props.requestorVpc.ownerAccountId !== props.acceptorVpc.ownerAccountId;
|
|
265
|
-
if (!isCrossAccount && props.peerRoleArn) {
|
|
266
|
-
throw new core_1.ValidationError('peerRoleArn is not needed for same account peering', this);
|
|
267
|
-
}
|
|
268
|
-
if (isCrossAccount && !props.peerRoleArn) {
|
|
269
|
-
throw new core_1.ValidationError('Cross account VPC peering requires peerRoleArn', this);
|
|
270
|
-
}
|
|
271
|
-
const overlap = this.validateVpcCidrOverlap(props.requestorVpc, props.acceptorVpc);
|
|
272
|
-
if (overlap) {
|
|
273
|
-
throw new core_1.ValidationError('CIDR block should not overlap with each other for establishing a peering connection', this);
|
|
274
|
-
}
|
|
275
|
-
if (props.vpcPeeringConnectionName) {
|
|
276
|
-
core_1.Tags.of(this).add(NAME_TAG, props.vpcPeeringConnectionName);
|
|
277
|
-
}
|
|
278
|
-
this.resource = new aws_ec2_1.CfnVPCPeeringConnection(this, 'VPCPeeringConnection', {
|
|
279
|
-
vpcId: props.requestorVpc.vpcId,
|
|
280
|
-
peerVpcId: props.acceptorVpc.vpcId,
|
|
281
|
-
peerOwnerId: props.acceptorVpc.ownerAccountId,
|
|
282
|
-
peerRegion: props.acceptorVpc.region,
|
|
283
|
-
peerRoleArn: isCrossAccount ? props.peerRoleArn : undefined,
|
|
284
|
-
});
|
|
285
|
-
this.routerTargetId = this.resource.attrId;
|
|
286
|
-
this.node.defaultChild = this.resource;
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Validates if the provided IPv4 CIDR block overlaps with existing subnet CIDR blocks within the given VPC.
|
|
290
|
-
*
|
|
291
|
-
* @param requestorVpc The VPC of the requestor.
|
|
292
|
-
* @param acceptorVpc The VPC of the acceptor.
|
|
293
|
-
* @returns True if the IPv4 CIDR block overlaps with each other for two VPCs, false otherwise.
|
|
294
|
-
* @internal
|
|
295
|
-
*/
|
|
296
|
-
validateVpcCidrOverlap(requestorVpc, acceptorVpc) {
|
|
297
|
-
const requestorCidrs = [requestorVpc.ipv4CidrBlock];
|
|
298
|
-
const acceptorCidrs = [acceptorVpc.ipv4CidrBlock];
|
|
299
|
-
if (requestorVpc.secondaryCidrBlock) {
|
|
300
|
-
requestorCidrs.push(...requestorVpc.secondaryCidrBlock
|
|
301
|
-
.map(block => block.cidrBlock)
|
|
302
|
-
.filter((cidr) => cidr !== undefined));
|
|
303
|
-
}
|
|
304
|
-
if (acceptorVpc.secondaryCidrBlock) {
|
|
305
|
-
acceptorCidrs.push(...acceptorVpc.secondaryCidrBlock
|
|
306
|
-
.map(block => block.cidrBlock)
|
|
307
|
-
.filter((cidr) => cidr !== undefined));
|
|
308
|
-
}
|
|
309
|
-
for (const requestorCidr of requestorCidrs) {
|
|
310
|
-
const requestorRange = new util_1.CidrBlock(requestorCidr);
|
|
311
|
-
const requestorIpRange = [requestorRange.minIp(), requestorRange.maxIp()];
|
|
312
|
-
for (const acceptorCidr of acceptorCidrs) {
|
|
313
|
-
const acceptorRange = new util_1.CidrBlock(acceptorCidr);
|
|
314
|
-
const acceptorIpRange = [acceptorRange.minIp(), acceptorRange.maxIp()];
|
|
315
|
-
if (requestorRange.rangesOverlap(acceptorIpRange, requestorIpRange)) {
|
|
316
|
-
return true;
|
|
452
|
+
catch (error) {
|
|
453
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
454
|
+
Error.captureStackTrace(error, VPCPeeringConnection);
|
|
317
455
|
}
|
|
456
|
+
throw error;
|
|
318
457
|
}
|
|
458
|
+
// Enhanced CDK Analytics Telemetry
|
|
459
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
460
|
+
this.routerType = aws_ec2_1.RouterType.VPC_PEERING_CONNECTION;
|
|
461
|
+
const isCrossAccount = props.requestorVpc.ownerAccountId !== props.acceptorVpc.ownerAccountId;
|
|
462
|
+
if (!isCrossAccount && props.peerRoleArn) {
|
|
463
|
+
throw new core_1.ValidationError('peerRoleArn is not needed for same account peering', this);
|
|
464
|
+
}
|
|
465
|
+
if (isCrossAccount && !props.peerRoleArn) {
|
|
466
|
+
throw new core_1.ValidationError('Cross account VPC peering requires peerRoleArn', this);
|
|
467
|
+
}
|
|
468
|
+
const overlap = this.validateVpcCidrOverlap(props.requestorVpc, props.acceptorVpc);
|
|
469
|
+
if (overlap) {
|
|
470
|
+
throw new core_1.ValidationError('CIDR block should not overlap with each other for establishing a peering connection', this);
|
|
471
|
+
}
|
|
472
|
+
if (props.vpcPeeringConnectionName) {
|
|
473
|
+
core_1.Tags.of(this).add(NAME_TAG, props.vpcPeeringConnectionName);
|
|
474
|
+
}
|
|
475
|
+
this.resource = new aws_ec2_1.CfnVPCPeeringConnection(this, 'VPCPeeringConnection', {
|
|
476
|
+
vpcId: props.requestorVpc.vpcId,
|
|
477
|
+
peerVpcId: props.acceptorVpc.vpcId,
|
|
478
|
+
peerOwnerId: props.acceptorVpc.ownerAccountId,
|
|
479
|
+
peerRegion: props.acceptorVpc.region,
|
|
480
|
+
peerRoleArn: isCrossAccount ? props.peerRoleArn : undefined,
|
|
481
|
+
});
|
|
482
|
+
this.routerTargetId = this.resource.attrId;
|
|
483
|
+
this.node.defaultChild = this.resource;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Validates if the provided IPv4 CIDR block overlaps with existing subnet CIDR blocks within the given VPC.
|
|
487
|
+
*
|
|
488
|
+
* @param requestorVpc The VPC of the requestor.
|
|
489
|
+
* @param acceptorVpc The VPC of the acceptor.
|
|
490
|
+
* @returns True if the IPv4 CIDR block overlaps with each other for two VPCs, false otherwise.
|
|
491
|
+
* @internal
|
|
492
|
+
*/
|
|
493
|
+
validateVpcCidrOverlap(requestorVpc, acceptorVpc) {
|
|
494
|
+
const requestorCidrs = [requestorVpc.ipv4CidrBlock];
|
|
495
|
+
const acceptorCidrs = [acceptorVpc.ipv4CidrBlock];
|
|
496
|
+
if (requestorVpc.secondaryCidrBlock) {
|
|
497
|
+
requestorCidrs.push(...requestorVpc.secondaryCidrBlock
|
|
498
|
+
.map(block => block.cidrBlock)
|
|
499
|
+
.filter((cidr) => cidr !== undefined));
|
|
500
|
+
}
|
|
501
|
+
if (acceptorVpc.secondaryCidrBlock) {
|
|
502
|
+
acceptorCidrs.push(...acceptorVpc.secondaryCidrBlock
|
|
503
|
+
.map(block => block.cidrBlock)
|
|
504
|
+
.filter((cidr) => cidr !== undefined));
|
|
505
|
+
}
|
|
506
|
+
for (const requestorCidr of requestorCidrs) {
|
|
507
|
+
const requestorRange = new util_1.CidrBlock(requestorCidr);
|
|
508
|
+
const requestorIpRange = [requestorRange.minIp(), requestorRange.maxIp()];
|
|
509
|
+
for (const acceptorCidr of acceptorCidrs) {
|
|
510
|
+
const acceptorRange = new util_1.CidrBlock(acceptorCidr);
|
|
511
|
+
const acceptorIpRange = [acceptorRange.minIp(), acceptorRange.maxIp()];
|
|
512
|
+
if (requestorRange.rangesOverlap(acceptorIpRange, requestorIpRange)) {
|
|
513
|
+
return true;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return false;
|
|
319
518
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
}
|
|
519
|
+
static {
|
|
520
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
return VPCPeeringConnection = _classThis;
|
|
524
|
+
})();
|
|
323
525
|
exports.VPCPeeringConnection = VPCPeeringConnection;
|
|
324
|
-
_e = JSII_RTTI_SYMBOL_1;
|
|
325
|
-
VPCPeeringConnection[_e] = { fqn: "@aws-cdk/aws-ec2-alpha.VPCPeeringConnection", version: "2.218.0-alpha.0" };
|
|
326
|
-
/** Uniquely identifies this class. */
|
|
327
|
-
VPCPeeringConnection.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VPCPeeringConnection';
|
|
328
|
-
exports.VPCPeeringConnection = VPCPeeringConnection = __decorate([
|
|
329
|
-
prop_injectable_1.propertyInjectable
|
|
330
|
-
], VPCPeeringConnection);
|
|
331
526
|
/**
|
|
332
527
|
* The gateway or endpoint targeted by the route.
|
|
333
528
|
*/
|
|
334
529
|
class RouteTargetType {
|
|
530
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTargetType", version: "2.220.0-alpha.0" };
|
|
531
|
+
/**
|
|
532
|
+
* The gateway route target. This is used for targets such as
|
|
533
|
+
* egress-only internet gateway or VPC peering connection.
|
|
534
|
+
*
|
|
535
|
+
* @default - target is not set to a gateway, in this case an endpoint is needed.
|
|
536
|
+
*/
|
|
537
|
+
gateway;
|
|
538
|
+
/**
|
|
539
|
+
* The endpoint route target. This is used for targets such as
|
|
540
|
+
* VPC endpoints.
|
|
541
|
+
*
|
|
542
|
+
* @default - target is not set to an endpoint, in this case a gateway is needed.
|
|
543
|
+
*/
|
|
544
|
+
endpoint;
|
|
335
545
|
constructor(props) {
|
|
336
546
|
try {
|
|
337
547
|
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteTargetProps(props);
|
|
@@ -347,136 +557,202 @@ class RouteTargetType {
|
|
|
347
557
|
}
|
|
348
558
|
}
|
|
349
559
|
exports.RouteTargetType = RouteTargetType;
|
|
350
|
-
_f = JSII_RTTI_SYMBOL_1;
|
|
351
|
-
RouteTargetType[_f] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTargetType", version: "2.218.0-alpha.0" };
|
|
352
560
|
/**
|
|
353
561
|
* Creates a new route with added functionality.
|
|
354
562
|
* @resource AWS::EC2::Route
|
|
355
563
|
*/
|
|
356
|
-
let Route =
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
564
|
+
let Route = (() => {
|
|
565
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
566
|
+
let _classDescriptor;
|
|
567
|
+
let _classExtraInitializers = [];
|
|
568
|
+
let _classThis;
|
|
569
|
+
let _classSuper = core_1.Resource;
|
|
570
|
+
var Route = class extends _classSuper {
|
|
571
|
+
static { _classThis = this; }
|
|
572
|
+
static {
|
|
573
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
574
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
575
|
+
Route = _classThis = _classDescriptor.value;
|
|
576
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
577
|
+
}
|
|
578
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.Route", version: "2.220.0-alpha.0" };
|
|
579
|
+
/** Uniquely identifies this class. */
|
|
580
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.Route';
|
|
581
|
+
/**
|
|
582
|
+
* The IPv4 or IPv6 CIDR block used for the destination match.
|
|
583
|
+
*
|
|
584
|
+
* Routing decisions are based on the most specific match.
|
|
585
|
+
*/
|
|
586
|
+
destination;
|
|
587
|
+
/**
|
|
588
|
+
* The gateway or endpoint targeted by the route.
|
|
589
|
+
*/
|
|
590
|
+
target;
|
|
591
|
+
/**
|
|
592
|
+
* The route table for the route.
|
|
593
|
+
* @attribute routeTable
|
|
594
|
+
*/
|
|
595
|
+
routeTable;
|
|
596
|
+
/**
|
|
597
|
+
* The type of router the route is targeting
|
|
598
|
+
*/
|
|
599
|
+
targetRouterType;
|
|
600
|
+
/**
|
|
601
|
+
* The route CFN resource.
|
|
602
|
+
*/
|
|
603
|
+
resource;
|
|
604
|
+
/**
|
|
605
|
+
* Destination cidr block for ipv6
|
|
606
|
+
*/
|
|
607
|
+
destinationIpv6Cidr;
|
|
608
|
+
/**
|
|
609
|
+
* Destination cidr block for ipv4
|
|
610
|
+
*/
|
|
611
|
+
destinationIpv4Cidr;
|
|
612
|
+
constructor(scope, id, props) {
|
|
613
|
+
super(scope, id);
|
|
614
|
+
try {
|
|
615
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteProps(props);
|
|
616
|
+
}
|
|
617
|
+
catch (error) {
|
|
618
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
619
|
+
Error.captureStackTrace(error, Route);
|
|
620
|
+
}
|
|
621
|
+
throw error;
|
|
622
|
+
}
|
|
623
|
+
// Enhanced CDK Analytics Telemetry
|
|
624
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
625
|
+
this.target = props.target;
|
|
626
|
+
this.routeTable = props.routeTable;
|
|
627
|
+
this.destination = props.destination;
|
|
628
|
+
const isDestinationIpv4 = util_1.NetworkUtils.validIp(props.destination);
|
|
629
|
+
if (!isDestinationIpv4) {
|
|
630
|
+
// TODO Validate for IPv6 CIDR range
|
|
631
|
+
this.destinationIpv6Cidr = props.destination;
|
|
632
|
+
}
|
|
633
|
+
else {
|
|
634
|
+
this.destinationIpv4Cidr = props.destination;
|
|
635
|
+
}
|
|
636
|
+
if (this.target.gateway?.routerType === aws_ec2_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY && isDestinationIpv4) {
|
|
637
|
+
throw new core_1.ValidationError('Egress only internet gateway does not support IPv4 routing', this);
|
|
638
|
+
}
|
|
639
|
+
if ((props.target.gateway && props.target.endpoint) || (!props.target.gateway && !props.target.endpoint)) {
|
|
640
|
+
throw new core_1.ValidationError('Exactly one of `gateway` or `endpoint` must be specified.', this);
|
|
641
|
+
}
|
|
642
|
+
this.targetRouterType = this.target.gateway ? this.target.gateway.routerType : aws_ec2_1.RouterType.VPC_ENDPOINT;
|
|
643
|
+
// Gateway generates route automatically via its RouteTable, thus we don't need to generate the resource for it
|
|
644
|
+
if (!(this.target.endpoint instanceof aws_ec2_1.GatewayVpcEndpoint)) {
|
|
645
|
+
this.resource = new aws_ec2_1.CfnRoute(this, 'Route', {
|
|
646
|
+
routeTableId: this.routeTable.routeTableId,
|
|
647
|
+
destinationCidrBlock: this.destinationIpv4Cidr,
|
|
648
|
+
destinationIpv6CidrBlock: this.destinationIpv6Cidr,
|
|
649
|
+
[routerTypeToPropName(this.targetRouterType)]: this.target.gateway ? this.target.gateway.routerTargetId :
|
|
650
|
+
this.target.endpoint ? this.target.endpoint.vpcEndpointId : null,
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
this.node.defaultChild = this.resource;
|
|
654
|
+
// Create a route only after target gateway or endpoint is created
|
|
655
|
+
if (this.target.gateway) {
|
|
656
|
+
this.node.addDependency(this.target.gateway);
|
|
657
|
+
}
|
|
658
|
+
if (this.target.endpoint) {
|
|
659
|
+
this.node.addDependency(this.target.endpoint);
|
|
365
660
|
}
|
|
366
|
-
throw error;
|
|
367
|
-
}
|
|
368
|
-
// Enhanced CDK Analytics Telemetry
|
|
369
|
-
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
370
|
-
this.target = props.target;
|
|
371
|
-
this.routeTable = props.routeTable;
|
|
372
|
-
this.destination = props.destination;
|
|
373
|
-
const isDestinationIpv4 = util_1.NetworkUtils.validIp(props.destination);
|
|
374
|
-
if (!isDestinationIpv4) {
|
|
375
|
-
// TODO Validate for IPv6 CIDR range
|
|
376
|
-
this.destinationIpv6Cidr = props.destination;
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
this.destinationIpv4Cidr = props.destination;
|
|
380
|
-
}
|
|
381
|
-
if (this.target.gateway?.routerType === aws_ec2_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY && isDestinationIpv4) {
|
|
382
|
-
throw new core_1.ValidationError('Egress only internet gateway does not support IPv4 routing', this);
|
|
383
|
-
}
|
|
384
|
-
if ((props.target.gateway && props.target.endpoint) || (!props.target.gateway && !props.target.endpoint)) {
|
|
385
|
-
throw new core_1.ValidationError('Exactly one of `gateway` or `endpoint` must be specified.', this);
|
|
386
|
-
}
|
|
387
|
-
this.targetRouterType = this.target.gateway ? this.target.gateway.routerType : aws_ec2_1.RouterType.VPC_ENDPOINT;
|
|
388
|
-
// Gateway generates route automatically via its RouteTable, thus we don't need to generate the resource for it
|
|
389
|
-
if (!(this.target.endpoint instanceof aws_ec2_1.GatewayVpcEndpoint)) {
|
|
390
|
-
this.resource = new aws_ec2_1.CfnRoute(this, 'Route', {
|
|
391
|
-
routeTableId: this.routeTable.routeTableId,
|
|
392
|
-
destinationCidrBlock: this.destinationIpv4Cidr,
|
|
393
|
-
destinationIpv6CidrBlock: this.destinationIpv6Cidr,
|
|
394
|
-
[routerTypeToPropName(this.targetRouterType)]: this.target.gateway ? this.target.gateway.routerTargetId :
|
|
395
|
-
this.target.endpoint ? this.target.endpoint.vpcEndpointId : null,
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
this.node.defaultChild = this.resource;
|
|
399
|
-
// Create a route only after target gateway or endpoint is created
|
|
400
|
-
if (this.target.gateway) {
|
|
401
|
-
this.node.addDependency(this.target.gateway);
|
|
402
661
|
}
|
|
403
|
-
|
|
404
|
-
|
|
662
|
+
static {
|
|
663
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
405
664
|
}
|
|
406
|
-
}
|
|
407
|
-
|
|
665
|
+
};
|
|
666
|
+
return Route = _classThis;
|
|
667
|
+
})();
|
|
408
668
|
exports.Route = Route;
|
|
409
|
-
_g = JSII_RTTI_SYMBOL_1;
|
|
410
|
-
Route[_g] = { fqn: "@aws-cdk/aws-ec2-alpha.Route", version: "2.218.0-alpha.0" };
|
|
411
|
-
/** Uniquely identifies this class. */
|
|
412
|
-
Route.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.Route';
|
|
413
|
-
exports.Route = Route = __decorate([
|
|
414
|
-
prop_injectable_1.propertyInjectable
|
|
415
|
-
], Route);
|
|
416
669
|
/**
|
|
417
670
|
* Creates a route table for the specified VPC
|
|
418
671
|
* @resource AWS::EC2::RouteTable
|
|
419
672
|
*/
|
|
420
|
-
let RouteTable =
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
673
|
+
let RouteTable = (() => {
|
|
674
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
675
|
+
let _classDescriptor;
|
|
676
|
+
let _classExtraInitializers = [];
|
|
677
|
+
let _classThis;
|
|
678
|
+
let _classSuper = core_1.Resource;
|
|
679
|
+
let _instanceExtraInitializers = [];
|
|
680
|
+
let _addRoute_decorators;
|
|
681
|
+
var RouteTable = class extends _classSuper {
|
|
682
|
+
static { _classThis = this; }
|
|
683
|
+
static {
|
|
684
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
685
|
+
_addRoute_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
686
|
+
__esDecorate(this, null, _addRoute_decorators, { kind: "method", name: "addRoute", static: false, private: false, access: { has: obj => "addRoute" in obj, get: obj => obj.addRoute }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
687
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
688
|
+
RouteTable = _classThis = _classDescriptor.value;
|
|
689
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
690
|
+
}
|
|
691
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTable", version: "2.220.0-alpha.0" };
|
|
692
|
+
/** Uniquely identifies this class. */
|
|
693
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.RouteTable';
|
|
694
|
+
/**
|
|
695
|
+
* The ID of the route table.
|
|
696
|
+
*/
|
|
697
|
+
routeTableId = __runInitializers(this, _instanceExtraInitializers);
|
|
698
|
+
/**
|
|
699
|
+
* The route table CFN resource.
|
|
700
|
+
*/
|
|
701
|
+
resource;
|
|
702
|
+
constructor(scope, id, props) {
|
|
703
|
+
super(scope, id);
|
|
704
|
+
try {
|
|
705
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteTableProps(props);
|
|
429
706
|
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
vpcId: props.vpc.vpcId,
|
|
436
|
-
});
|
|
437
|
-
if (props.routeTableName) {
|
|
438
|
-
core_1.Tags.of(this).add(NAME_TAG, props.routeTableName);
|
|
439
|
-
}
|
|
440
|
-
this.node.defaultChild = this.resource;
|
|
441
|
-
this.routeTableId = core_1.FeatureFlags.of(this).isEnabled(aws_cdk_lib_1.cx_api.USE_RESOURCEID_FOR_VPCV2_MIGRATION) ?
|
|
442
|
-
this.resource.ref : this.resource.attrRouteTableId;
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Adds a new custom route to the route table.
|
|
446
|
-
*
|
|
447
|
-
* @param destination The IPv4 or IPv6 CIDR block used for the destination match.
|
|
448
|
-
* @param target The gateway or endpoint targeted by the route.
|
|
449
|
-
* @param routeName The resource name of the route.
|
|
450
|
-
*/
|
|
451
|
-
addRoute(id, destination, target, routeName) {
|
|
452
|
-
try {
|
|
453
|
-
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteTargetType(target);
|
|
454
|
-
}
|
|
455
|
-
catch (error) {
|
|
456
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
457
|
-
Error.captureStackTrace(error, this.addRoute);
|
|
707
|
+
catch (error) {
|
|
708
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
709
|
+
Error.captureStackTrace(error, RouteTable);
|
|
710
|
+
}
|
|
711
|
+
throw error;
|
|
458
712
|
}
|
|
459
|
-
|
|
713
|
+
// Enhanced CDK Analytics Telemetry
|
|
714
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
715
|
+
this.resource = new aws_ec2_1.CfnRouteTable(this, 'RouteTable', {
|
|
716
|
+
vpcId: props.vpc.vpcId,
|
|
717
|
+
});
|
|
718
|
+
if (props.routeTableName) {
|
|
719
|
+
core_1.Tags.of(this).add(NAME_TAG, props.routeTableName);
|
|
720
|
+
}
|
|
721
|
+
this.node.defaultChild = this.resource;
|
|
722
|
+
this.routeTableId = core_1.FeatureFlags.of(this).isEnabled(aws_cdk_lib_1.cx_api.USE_RESOURCEID_FOR_VPCV2_MIGRATION) ?
|
|
723
|
+
this.resource.ref : this.resource.attrRouteTableId;
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Adds a new custom route to the route table.
|
|
727
|
+
*
|
|
728
|
+
* @param destination The IPv4 or IPv6 CIDR block used for the destination match.
|
|
729
|
+
* @param target The gateway or endpoint targeted by the route.
|
|
730
|
+
* @param routeName The resource name of the route.
|
|
731
|
+
*/
|
|
732
|
+
addRoute(id, destination, target, routeName) {
|
|
733
|
+
try {
|
|
734
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteTargetType(target);
|
|
735
|
+
}
|
|
736
|
+
catch (error) {
|
|
737
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
738
|
+
Error.captureStackTrace(error, this.addRoute);
|
|
739
|
+
}
|
|
740
|
+
throw error;
|
|
741
|
+
}
|
|
742
|
+
new Route(this, id, {
|
|
743
|
+
routeTable: this,
|
|
744
|
+
destination: destination,
|
|
745
|
+
target: target,
|
|
746
|
+
routeName: routeName,
|
|
747
|
+
});
|
|
460
748
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
468
|
-
};
|
|
749
|
+
static {
|
|
750
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
751
|
+
}
|
|
752
|
+
};
|
|
753
|
+
return RouteTable = _classThis;
|
|
754
|
+
})();
|
|
469
755
|
exports.RouteTable = RouteTable;
|
|
470
|
-
_h = JSII_RTTI_SYMBOL_1;
|
|
471
|
-
RouteTable[_h] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTable", version: "2.218.0-alpha.0" };
|
|
472
|
-
/** Uniquely identifies this class. */
|
|
473
|
-
RouteTable.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.RouteTable';
|
|
474
|
-
__decorate([
|
|
475
|
-
(0, metadata_resource_1.MethodMetadata)()
|
|
476
|
-
], RouteTable.prototype, "addRoute", null);
|
|
477
|
-
exports.RouteTable = RouteTable = __decorate([
|
|
478
|
-
prop_injectable_1.propertyInjectable
|
|
479
|
-
], RouteTable);
|
|
480
756
|
function routerTypeToPropName(routerType) {
|
|
481
757
|
return ({
|
|
482
758
|
[aws_ec2_1.RouterType.CARRIER_GATEWAY]: 'carrierGatewayId',
|
|
@@ -491,4 +767,4 @@ function routerTypeToPropName(routerType) {
|
|
|
491
767
|
[aws_ec2_1.RouterType.VPC_ENDPOINT]: 'vpcEndpointId',
|
|
492
768
|
})[routerType];
|
|
493
769
|
}
|
|
494
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxpREFBa1M7QUFFbFMsMkNBQW1IO0FBRW5ILGlDQUFtRTtBQUVuRSw4RUFBOEY7QUFDOUYsNkNBQXFDO0FBQ3JDLDBFQUEwRTtBQUUxRTs7OztHQUlHO0FBQ0gsSUFBWSxtQkFTWDtBQVRELFdBQVksbUJBQW1CO0lBQzdCOztPQUVHO0lBQ0gsd0NBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCwwQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBVFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFTOUI7QUE4TEQ7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBVyxNQUFNLENBQUM7QUFFaEM7OztHQUdHO0FBRUksSUFBTSx5QkFBeUIsR0FBL0IsTUFBTSx5QkFBMEIsU0FBUSxlQUFRO0lBa0JyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Ozs7OzsrQ0FuQlIseUJBQXlCOzs7O1FBb0JsQyxtQ0FBbUM7UUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztZQUN4QyxXQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQVUsQ0FBQyw0QkFBNEIsQ0FBQztRQUUxRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksc0NBQTRCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUM3RCxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLO1NBQ3ZCLENBQUMsQ0FBQztR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QUFxQixHQUFXLG1DQUFtQyxBQUE5QyxDQUErQztBQW9DcEY7SUFETixJQUFBLGtDQUFjLEdBQUU7MENBUWhCO3FCQTdDVSxVQUFVO0lBRHRCLG9DQUFrQjtHQUNOLFVBQVUsQ0E4Q3RCO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxVQUFzQjtJQUNsRCxPQUFPLENBQUM7UUFDTixDQUFDLG9CQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsa0JBQWtCO1FBQ2hELENBQUMsb0JBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLDZCQUE2QjtRQUN4RSxDQUFDLG9CQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVztRQUNqQyxDQUFDLG9CQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWTtRQUNuQyxDQUFDLG9CQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsZ0JBQWdCO1FBQzVDLENBQUMsb0JBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxjQUFjO1FBQ3hDLENBQUMsb0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLG9CQUFvQjtRQUNwRCxDQUFDLG9CQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsa0JBQWtCO1FBQ2hELENBQUMsb0JBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLHdCQUF3QjtRQUM3RCxDQUFDLG9CQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsZUFBZTtLQUMzQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbkVJUCwgQ2ZuRWdyZXNzT25seUludGVybmV0R2F0ZXdheSwgQ2ZuSW50ZXJuZXRHYXRld2F5LCBDZm5OYXRHYXRld2F5LCBDZm5WUENQZWVyaW5nQ29ubmVjdGlvbiwgQ2ZuUm91dGUsIENmblJvdXRlVGFibGUsIENmblZQQ0dhdGV3YXlBdHRhY2htZW50LCBDZm5WUE5HYXRld2F5LCBDZm5WUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbiwgR2F0ZXdheVZwY0VuZHBvaW50LCBJUm91dGVUYWJsZSwgSVZwY0VuZHBvaW50LCBSb3V0ZXJUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElEZXBlbmRhYmxlIH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgRHVyYXRpb24sIEZlYXR1cmVGbGFncywgSVJlc291cmNlLCBSZXNvdXJjZSwgVGFncywgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBJVnBjVjIsIFZQTkdhdGV3YXlWMk9wdGlvbnMgfSBmcm9tICcuL3ZwYy12Mi1iYXNlJztcbmltcG9ydCB7IE5ldHdvcmtVdGlscywgYWxsUm91dGVUYWJsZUlkcywgQ2lkckJsb2NrIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IElTdWJuZXRWMiB9IGZyb20gJy4vc3VibmV0LXYyJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IGN4X2FwaSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAqIFRoZSBkZWZhdWx0IGlzIHB1YmxpYyBjb25uZWN0aXZpdHkuXG4gKiBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItbmF0Z2F0ZXdheS5odG1sI2Nmbi1lYzItbmF0Z2F0ZXdheS1jb25uZWN0aXZpdHl0eXBlXG4gKi9cbmV4cG9ydCBlbnVtIE5hdENvbm5lY3Rpdml0eVR5cGUge1xuICAvKipcbiAgICogU2V0cyBDb25uZWN0aXZpdHkgdHlwZSB0byBQVUJMSUNcbiAgICovXG4gIFBVQkxJQyA9ICdwdWJsaWMnLFxuICAvKipcbiAgICogU2V0cyBDb25uZWN0aXZpdHkgdHlwZSB0byBQUklWQVRFXG4gICAqL1xuICBQUklWQVRFID0gJ3ByaXZhdGUnLFxufVxuXG4vKipcbiAqIEludGVyZmFjZSB0byBkZWZpbmUgYSByb3V0aW5nIHRhcmdldCwgc3VjaCBhcyBhblxuICogZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheSBvciBWUEMgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJvdXRlVGFyZ2V0IGV4dGVuZHMgSURlcGVuZGFibGUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHVzZWQgaW4gdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUYXJnZXRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGFuIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWdyZXNzT25seUludGVybmV0R2F0ZXdheVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgVlBDIGZvciB3aGljaCB0byBjcmVhdGUgdGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlzaW9uZWQgd2l0aG91dCBhIHJlc291cmNlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGFuIGludGVybmV0IGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuZXRHYXRld2F5UHJvcHMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcm92aXNpb25lZCB3aXRob3V0IGEgcmVzb3VyY2UgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJuZXRHYXRld2F5TmFtZT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGEgVlBOIGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlBOR2F0ZXdheVYyUHJvcHMgZXh0ZW5kcyBWUE5HYXRld2F5VjJPcHRpb25zIHtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgVlBOIGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGRlZmluZSBhIE5BVCBnYXRld2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdEdhdGV3YXlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgaW4gd2hpY2ggdGhlIE5BVCBnYXRld2F5IGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXQ6IElTdWJuZXRWMjtcblxuICAvKipcbiAgICogQWxsb2NhdGlvbklEIG9mIEVsYXN0aWMgSVAgYWRkcmVzcyB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBOQVQgZ2F0ZXdheS4gVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZCBmb3IgYSBwdWJsaWMgTkFUXG4gICAqIGdhdGV3YXkgYW5kIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCBhIHByaXZhdGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXR0ci5hbGxvY2F0aW9uSUQgb2YgYSBuZXcgRWxhc3RpYyBJUCBjcmVhdGVkIGJ5IGRlZmF1bHRcbiAgICogLy9UT0RPOiBBREQgTDIgZm9yIGVsYXN0aWMgaXBcbiAgICovXG4gIHJlYWRvbmx5IGFsbG9jYXRpb25JZD86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgTmF0Q29ubmVjdGl2aXR5VHlwZS5QdWJsaWNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpdml0eVR5cGU/OiBOYXRDb25uZWN0aXZpdHlUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJlZm9yZSBmb3JjaWJseSByZWxlYXNpbmcgdGhlXG4gICAqIElQIGFkZHJlc3NlcyBpZiBjb25uZWN0aW9ucyBhcmUgc3RpbGwgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IDM1MHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IG1heERyYWluRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgSVB2NCBhZGRyZXNzIHRvIGFzc2lnbiB0byB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgeW91IGRvbid0IHByb3ZpZGUgYW4gYWRkcmVzcywgYSBwcml2YXRlIElQdjQgYWRkcmVzcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlSXBBZGRyZXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgRUlQIGFsbG9jYXRpb24gSURzLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtbmF0LWdhdGV3YXkuaHRtbCNuYXQtZ2F0ZXdheS1jcmVhdGluZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNlY29uZGFyeSBhbGxvY2F0aW9uIElEcyBhdHRhY2hlZCB0byBOQVRHV1xuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5QWxsb2NhdGlvbklkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZGFyeSBwcml2YXRlIElQdjQgYWRkcmVzc2VzIHlvdVxuICAgKiB3YW50IHRvIGFzc2lnbiB0byB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIGBTZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzQ291bnRgIGFuZCBgU2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc2VzYCBjYW5ub3QgYmVcbiAgICogc2V0IGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1uYXQtZ2F0ZXdheS5odG1sI25hdC1nYXRld2F5LWNyZWF0aW5nXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc2Vjb25kYXJ5IGFsbG9jYXRpb24gSURzIGFzc29jaWF0ZWQgd2l0aCBOQVRHV1xuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc0NvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgcHJpdmF0ZSBJUHY0IGFkZHJlc3Nlcy5cbiAgICpcbiAgICogYFNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3NDb3VudGAgYW5kIGBTZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzZXNgIGNhbm5vdCBiZVxuICAgKiBzZXQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLW5hdC1nYXRld2F5Lmh0bWwjbmF0LWdhdGV3YXktY3JlYXRpbmdcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzZWNvbmRhcnkgcHJpdmF0ZSBJcEFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggTkFUR1dcbiAgICovXG4gIHJlYWRvbmx5IHNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTkFUR1cgcHJvdmlzaW9uZWQgd2l0aG91dCBhbnkgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmF0R2F0ZXdheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSBOQVQgZ2F0ZXdheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRHYXRld2F5UHJvcHMgZXh0ZW5kcyBOYXRHYXRld2F5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQyBpbiB3aGljaCB0aGUgTkFUIGdhdGV3YXkgaXMgbG9jYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbGFzdGljIGlwIGFzc29jaWF0ZWQsIHJlcXVpcmVkIGluIGNhc2Ugb2YgcHVibGljIGNvbm5lY3Rpdml0eSBpZiBgQWxsb2NhdGlvbklkYCBpcyBub3QgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwY1YyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gZGVmaW5lIGEgVlBDIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWUENQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFZQQyB0aGF0IGlzIGFjY2VwdGluZyB0aGUgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXB0b3JWcGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHJvbGUgYXJuIGNyZWF0ZWQgaW4gdGhlIGFjY2VwdG9yIGFjY291bnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGVlclJvbGVBcm4gbmVlZGVkIGlmIG5vdCBjcm9zcyBhY2NvdW50IGNvbm5lY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHBlZXJSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBlZXJpbmcgY29ubmVjdGlvbiBwcm92aXNpb25lZCB3aXRob3V0IGFueSBuYW1lXG4gICAqL1xuICByZWFkb25seSB2cGNQZWVyaW5nQ29ubmVjdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSBWUEMgcGVlcmluZyBjb25uZWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZQQ1BlZXJpbmdDb25uZWN0aW9uUHJvcHMgZXh0ZW5kcyBWUENQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFZQQyB0aGF0IGlzIHJlcXVlc3RpbmcgdGhlIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RvclZwYzogSVZwY1YyO1xufVxuXG4vKipcbiAqIE5hbWUgdGFnIGNvbnN0YW50XG4gKi9cbmNvbnN0IE5BTUVfVEFHOiBzdHJpbmcgPSAnTmFtZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElSb3V0ZVRhcmdldCB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWVjMi1hbHBoYS5FZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5JztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkgQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5FZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlOYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMuZWdyZXNzT25seUludGVybmV0R2F0ZXdheU5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLkVHUkVTU19PTkxZX0lOVEVSTkVUX0dBVEVXQVk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmbkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkodGhpcywgJ0VJR1cnLCB7XG4gICAgICB2cGNJZDogcHJvcHMudnBjLnZwY0lkLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuYXR0cklkO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBpbnRlcm5ldCBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OkludGVybmV0R2F0ZXdheVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgSW50ZXJuZXRHYXRld2F5IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJUm91dGVUYXJnZXQge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1lYzItYWxwaGEuSW50ZXJuZXRHYXRld2F5JztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuZXQgZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmbkludGVybmV0R2F0ZXdheTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSW50ZXJuZXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5yb3V0ZXJUeXBlID0gUm91dGVyVHlwZS5HQVRFV0FZO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5JbnRlcm5ldEdhdGV3YXkodGhpcywgJ0lHVycsIHt9KTtcbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcblxuICAgIHRoaXMucm91dGVyVGFyZ2V0SWQgPSBGZWF0dXJlRmxhZ3Mub2YodGhpcykuaXNFbmFibGVkKGN4X2FwaS5VU0VfUkVTT1VSQ0VJRF9GT1JfVlBDVjJfTUlHUkFUSU9OKSA/XG4gICAgICB0aGlzLnJlc291cmNlLnJlZiA6IHRoaXMucmVzb3VyY2UuYXR0ckludGVybmV0R2F0ZXdheUlkO1xuICAgIHRoaXMudnBjSWQgPSBwcm9wcy52cGMudnBjSWQ7XG5cbiAgICBpZiAocHJvcHMuaW50ZXJuZXRHYXRld2F5TmFtZSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoTkFNRV9UQUcsIHByb3BzLmludGVybmV0R2F0ZXdheU5hbWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52cGMudnBjTmFtZSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoJ05hbWUnLCBwcm9wcy52cGMudnBjTmFtZSk7XG4gICAgfVxuXG4gICAgbmV3IENmblZQQ0dhdGV3YXlBdHRhY2htZW50KHRoaXMsICdHV0F0dGFjaG1lbnQnLCB7XG4gICAgICB2cGNJZDogdGhpcy52cGNJZCxcbiAgICAgIGludGVybmV0R2F0ZXdheUlkOiB0aGlzLnJvdXRlclRhcmdldElkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHZpcnR1YWwgcHJpdmF0ZSBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OlZQTkdhdGV3YXlcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFZQTkdhdGV3YXlWMiBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlZQTkdhdGV3YXlWMic7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByb3V0ZXIgdXNlZCBpbiB0aGUgcm91dGUuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclRhcmdldElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgVlBDIGZvciB3aGljaCB0byBjcmVhdGUgdGhlIFZQTiBnYXRld2F5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUE4gZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmblZQTkdhdGV3YXk7XG5cbiAgLyoqXG4gICAqIFRoZSBWUE4gR2F0ZXdheSBBdHRhY2htZW50XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRhY2htZW50OiBDZm5WUENHYXRld2F5QXR0YWNobWVudDtcblxuICAvKipcbiAgICogVGhlIFZQTiBHYXRld2F5IFJvdXRlIFByb3BhZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZVByb3BhZ2F0aW9uOiBDZm5WUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVlBOR2F0ZXdheVYyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudnBuR2F0ZXdheU5hbWUsXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLkdBVEVXQVk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmblZQTkdhdGV3YXkodGhpcywgJ0lHVycsIHtcbiAgICAgIHR5cGU6IHByb3BzLnR5cGUsXG4gICAgICBhbWF6b25TaWRlQXNuOiBwcm9wcy5hbWF6b25TaWRlQXNuLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuYXR0clZwbkdhdGV3YXlJZDtcblxuICAgIHRoaXMudnBjSWQgPSBwcm9wcy52cGMudnBjSWQ7XG4gICAgdGhpcy5fYXR0YWNobWVudCA9IG5ldyBDZm5WUENHYXRld2F5QXR0YWNobWVudCh0aGlzLCAnVlBDVlBOR1cnLCB7XG4gICAgICB2cGNJZDogdGhpcy52cGNJZCxcbiAgICAgIHZwbkdhdGV3YXlJZDogdGhpcy5yZXNvdXJjZS5hdHRyVnBuR2F0ZXdheUlkLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLnZwbkdhdGV3YXlOYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMudnBuR2F0ZXdheU5hbWUpO1xuICAgIH1cblxuICAgIC8vIFByb3BhZ2F0ZSByb3V0ZXMgb24gcm91dGUgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlnaHQgc3VibmV0c1xuICAgIGNvbnN0IHZwblJvdXRlUHJvcGFnYXRpb24gPSBwcm9wcy52cG5Sb3V0ZVByb3BhZ2F0aW9uID8/IFtdO1xuICAgIGNvbnN0IHN1Ym5ldHMgPSB2cG5Sb3V0ZVByb3BhZ2F0aW9uLm1hcChzID0+IHByb3BzLnZwYy5zZWxlY3RTdWJuZXRzKHMpLnN1Ym5ldHMpLmZsYXQoKTtcbiAgICBjb25zdCByb3V0ZVRhYmxlSWRzID0gYWxsUm91dGVUYWJsZUlkcyhzdWJuZXRzKTtcblxuICAgIGlmIChyb3V0ZVRhYmxlSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmdWMignQGF3cy1jZGs6YXdzLWVjMi1lbHBoYTplbmFibGVWcG5HYXRld2F5VjInLCBgTm8gc3VibmV0cyBtYXRjaGluZyBzZWxlY3Rpb246ICcke0pTT04uc3RyaW5naWZ5KHZwblJvdXRlUHJvcGFnYXRpb24pfScuIFNlbGVjdCBvdGhlciBzdWJuZXRzIHRvIGFkZCByb3V0ZXMgdG8uYCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcm91dGVQcm9wYWdhdGlvbiA9IG5ldyBDZm5WUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbih0aGlzLCAnUm91dGVQcm9wYWdhdGlvbicsIHtcbiAgICAgIHJvdXRlVGFibGVJZHMsXG4gICAgICB2cG5HYXRld2F5SWQ6IHRoaXMucm91dGVyVGFyZ2V0SWQsXG4gICAgfSk7XG4gICAgLy8gVGhlIEFXUzo6RUMyOjpWUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbiByZXNvdXJjZSBjYW5ub3QgdXNlIHRoZSBWUE4gZ2F0ZXdheVxuICAgIC8vIHVudGlsIGl0IGhhcyBzdWNjZXNzZnVsbHkgYXR0YWNoZWQgdG8gdGhlIFZQQy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi12cG4tZ2F0ZXdheXJvdXRlcHJvcC5odG1sXG4gICAgdGhpcy5fcm91dGVQcm9wYWdhdGlvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5fYXR0YWNobWVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV0d29yayBhZGRyZXNzIHRyYW5zbGF0aW9uIChOQVQpIGdhdGV3YXlcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6TmF0R2F0ZXdheVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgTmF0R2F0ZXdheSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLk5hdEdhdGV3YXknO1xuICAvKipcbiAgICogSWQgb2YgdGhlIE5hdEdhdGV3YXlcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hdEdhdGV3YXlJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByb3V0ZXIgdXNlZCBpbiB0aGUgcm91dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgcHVibGljXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGl2aXR5VHlwZT86IE5hdENvbm5lY3Rpdml0eVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIGZvcmNpYmx5IHJlbGVhc2luZyB0aGVcbiAgICogSVAgYWRkcmVzc2VzIGlmIGNvbm5lY3Rpb25zIGFyZSBzdGlsbCBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgJzM1MCBzZWNvbmRzJ1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heERyYWluRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIE5BVCBnYXRld2F5IENGTiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ2ZuTmF0R2F0ZXdheTtcblxuICAvKipcbiAgICogRWxhc3RpYyBJUCBjcmVhdGVkIGZvciBhbGxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWlwPzogQ2ZuRUlQO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOYXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5yb3V0ZXJUeXBlID0gUm91dGVyVHlwZS5OQVRfR0FURVdBWTtcblxuICAgIHRoaXMuY29ubmVjdGl2aXR5VHlwZSA9IHByb3BzLmNvbm5lY3Rpdml0eVR5cGUgfHwgTmF0Q29ubmVjdGl2aXR5VHlwZS5QVUJMSUM7XG4gICAgdGhpcy5tYXhEcmFpbkR1cmF0aW9uID0gcHJvcHMubWF4RHJhaW5EdXJhdGlvbiB8fCBEdXJhdGlvbi5zZWNvbmRzKDM1MCk7XG5cbiAgICBpZiAodGhpcy5jb25uZWN0aXZpdHlUeXBlID09PSBOYXRDb25uZWN0aXZpdHlUeXBlLlBVQkxJQykge1xuICAgICAgaWYgKCFwcm9wcy52cGMgJiYgIXByb3BzLmFsbG9jYXRpb25JZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdFaXRoZXIgcHJvdmlkZSB2cGMgb3IgYWxsb2NhdGlvbklkJywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm5hdEdhdGV3YXlOYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHM/Lm5hdEdhdGV3YXlOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBJZiB1c2VyIGRvZXMgbm90IHByb3ZpZGUgRUlQLCBnZW5lcmF0ZSBvbmUgZm9yIHRoZW1cbiAgICB2YXIgYUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuY29ubmVjdGl2aXR5VHlwZSA9PT0gTmF0Q29ubmVjdGl2aXR5VHlwZS5QVUJMSUMpIHtcbiAgICAgIGlmICghcHJvcHMuYWxsb2NhdGlvbklkKSB7XG4gICAgICAgIHRoaXMuZWlwID0gbmV3IENmbkVJUCh0aGlzLCAnRUlQJywge1xuICAgICAgICAgIGRvbWFpbjogJ3ZwYycsXG4gICAgICAgIH0pO1xuICAgICAgICBhSWQgPSB0aGlzLmVpcC5hdHRyQWxsb2NhdGlvbklkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYUlkID0gcHJvcHMuYWxsb2NhdGlvbklkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuTmF0R2F0ZXdheSh0aGlzLCAnTkFUR2F0ZXdheScsIHtcbiAgICAgIHN1Ym5ldElkOiBwcm9wcy5zdWJuZXQuc3VibmV0SWQsXG4gICAgICBhbGxvY2F0aW9uSWQ6IGFJZCxcbiAgICAgIG1heERyYWluRHVyYXRpb25TZWNvbmRzOiBwcm9wcy5tYXhEcmFpbkR1cmF0aW9uPy50b1NlY29uZHMoKSxcbiAgICAgIHNlY29uZGFyeUFsbG9jYXRpb25JZHM6IHByb3BzLnNlY29uZGFyeUFsbG9jYXRpb25JZHMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgICB0aGlzLm5hdEdhdGV3YXlJZCA9IEZlYXR1cmVGbGFncy5vZih0aGlzKS5pc0VuYWJsZWQoY3hfYXBpLlVTRV9SRVNPVVJDRUlEX0ZPUl9WUENWMl9NSUdSQVRJT04pID9cbiAgICAgIHRoaXMucmVzb3VyY2UucmVmIDogdGhpcy5yZXNvdXJjZS5hdHRyTmF0R2F0ZXdheUlkO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IEZlYXR1cmVGbGFncy5vZih0aGlzKS5pc0VuYWJsZWQoY3hfYXBpLlVTRV9SRVNPVVJDRUlEX0ZPUl9WUENWMl9NSUdSQVRJT04pID9cbiAgICAgIHRoaXMucmVzb3VyY2UucmVmIDogdGhpcy5yZXNvdXJjZS5hdHRyTmF0R2F0ZXdheUlkO1xuXG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy5yZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMuc3VibmV0LmludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHBlZXJpbmcgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBWUENzXG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OlZQQ1BlZXJpbmdDb25uZWN0aW9uXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBWUENQZWVyaW5nQ29ubmVjdGlvbiBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlZQQ1BlZXJpbmdDb25uZWN0aW9uJztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24gQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5WUENQZWVyaW5nQ29ubmVjdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVlBDUGVlcmluZ0Nvbm5lY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLlZQQ19QRUVSSU5HX0NPTk5FQ1RJT047XG5cbiAgICBjb25zdCBpc0Nyb3NzQWNjb3VudCA9IHByb3BzLnJlcXVlc3RvclZwYy5vd25lckFjY291bnRJZCAhPT0gcHJvcHMuYWNjZXB0b3JWcGMub3duZXJBY2NvdW50SWQ7XG5cbiAgICBpZiAoIWlzQ3Jvc3NBY2NvdW50ICYmIHByb3BzLnBlZXJSb2xlQXJuKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdwZWVyUm9sZUFybiBpcyBub3QgbmVlZGVkIGZvciBzYW1lIGFjY291bnQgcGVlcmluZycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChpc0Nyb3NzQWNjb3VudCAmJiAhcHJvcHMucGVlclJvbGVBcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0Nyb3NzIGFjY291bnQgVlBDIHBlZXJpbmcgcmVxdWlyZXMgcGVlclJvbGVBcm4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGFwID0gdGhpcy52YWxpZGF0ZVZwY0NpZHJPdmVybGFwKHByb3BzLnJlcXVlc3RvclZwYywgcHJvcHMuYWNjZXB0b3JWcGMpO1xuICAgIGlmIChvdmVybGFwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdDSURSIGJsb2NrIHNob3VsZCBub3Qgb3ZlcmxhcCB3aXRoIGVhY2ggb3RoZXIgZm9yIGVzdGFibGlzaGluZyBhIHBlZXJpbmcgY29ubmVjdGlvbicsIHRoaXMpO1xuICAgIH1cbiAgICBpZiAocHJvcHMudnBjUGVlcmluZ0Nvbm5lY3Rpb25OYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMudnBjUGVlcmluZ0Nvbm5lY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmblZQQ1BlZXJpbmdDb25uZWN0aW9uKHRoaXMsICdWUENQZWVyaW5nQ29ubmVjdGlvbicsIHtcbiAgICAgIHZwY0lkOiBwcm9wcy5yZXF1ZXN0b3JWcGMudnBjSWQsXG4gICAgICBwZWVyVnBjSWQ6IHByb3BzLmFjY2VwdG9yVnBjLnZwY0lkLFxuICAgICAgcGVlck93bmVySWQ6IHByb3BzLmFjY2VwdG9yVnBjLm93bmVyQWNjb3VudElkLFxuICAgICAgcGVlclJlZ2lvbjogcHJvcHMuYWNjZXB0b3JWcGMucmVnaW9uLFxuICAgICAgcGVlclJvbGVBcm46IGlzQ3Jvc3NBY2NvdW50ID8gcHJvcHMucGVlclJvbGVBcm4gOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlclRhcmdldElkID0gdGhpcy5yZXNvdXJjZS5hdHRySWQ7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBwcm92aWRlZCBJUHY0IENJRFIgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBzdWJuZXQgQ0lEUiBibG9ja3Mgd2l0aGluIHRoZSBnaXZlbiBWUEMuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0b3JWcGMgVGhlIFZQQyBvZiB0aGUgcmVxdWVzdG9yLlxuICAgKiBAcGFyYW0gYWNjZXB0b3JWcGMgVGhlIFZQQyBvZiB0aGUgYWNjZXB0b3IuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIElQdjQgQ0lEUiBibG9jayBvdmVybGFwcyB3aXRoIGVhY2ggb3RoZXIgZm9yIHR3byBWUENzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZwY0NpZHJPdmVybGFwKHJlcXVlc3RvclZwYzogSVZwY1YyLCBhY2NlcHRvclZwYzogSVZwY1YyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVxdWVzdG9yQ2lkcnMgPSBbcmVxdWVzdG9yVnBjLmlwdjRDaWRyQmxvY2tdO1xuICAgIGNvbnN0IGFjY2VwdG9yQ2lkcnMgPSBbYWNjZXB0b3JWcGMuaXB2NENpZHJCbG9ja107XG5cbiAgICBpZiAocmVxdWVzdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgICAgcmVxdWVzdG9yQ2lkcnMucHVzaCguLi5yZXF1ZXN0b3JWcGMuc2Vjb25kYXJ5Q2lkckJsb2NrXG4gICAgICAgIC5tYXAoYmxvY2sgPT4gYmxvY2suY2lkckJsb2NrKVxuICAgICAgICAuZmlsdGVyKChjaWRyKTogY2lkciBpcyBzdHJpbmcgPT4gY2lkciAhPT0gdW5kZWZpbmVkKSk7XG4gICAgfVxuXG4gICAgaWYgKGFjY2VwdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgICAgYWNjZXB0b3JDaWRycy5wdXNoKC4uLmFjY2VwdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9ja1xuICAgICAgICAubWFwKGJsb2NrID0+IGJsb2NrLmNpZHJCbG9jaylcbiAgICAgICAgLmZpbHRlcigoY2lkcik6IGNpZHIgaXMgc3RyaW5nID0+IGNpZHIgIT09IHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVxdWVzdG9yQ2lkciBvZiByZXF1ZXN0b3JDaWRycykge1xuICAgICAgY29uc3QgcmVxdWVzdG9yUmFuZ2UgPSBuZXcgQ2lkckJsb2NrKHJlcXVlc3RvckNpZHIpO1xuICAgICAgY29uc3QgcmVxdWVzdG9ySXBSYW5nZTogW3N0cmluZywgc3RyaW5nXSA9IFtyZXF1ZXN0b3JSYW5nZS5taW5JcCgpLCByZXF1ZXN0b3JSYW5nZS5tYXhJcCgpXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NlcHRvckNpZHIgb2YgYWNjZXB0b3JDaWRycykge1xuICAgICAgICBjb25zdCBhY2NlcHRvclJhbmdlID0gbmV3IENpZHJCbG9jayhhY2NlcHRvckNpZHIpO1xuICAgICAgICBjb25zdCBhY2NlcHRvcklwUmFuZ2U6IFtzdHJpbmcsIHN0cmluZ10gPSBbYWNjZXB0b3JSYW5nZS5taW5JcCgpLCBhY2NlcHRvclJhbmdlLm1heElwKCldO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0b3JSYW5nZS5yYW5nZXNPdmVybGFwKGFjY2VwdG9ySXBSYW5nZSwgcmVxdWVzdG9ySXBSYW5nZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGVuZHBvaW50IG9yIGdhdGV3YXkgYmVpbmcgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlVGFyZ2V0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgcm91dGUgdGFyZ2V0LiBUaGlzIGlzIHVzZWQgZm9yIHRhcmdldHMgc3VjaCBhc1xuICAgKiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IG9yIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0IGlzIG5vdCBzZXQgdG8gYSBnYXRld2F5LCBpbiB0aGlzIGNhc2UgYW4gZW5kcG9pbnQgaXMgbmVlZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheT86IElSb3V0ZVRhcmdldDtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHJvdXRlIHRhcmdldC4gVGhpcyBpcyB1c2VkIGZvciB0YXJnZXRzIHN1Y2ggYXNcbiAgICogVlBDIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0YXJnZXQgaXMgbm90IHNldCB0byBhbiBlbmRwb2ludCwgaW4gdGhpcyBjYXNlIGEgZ2F0ZXdheSBpcyBuZWVkZWQuXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludD86IElWcGNFbmRwb2ludDtcbn1cblxuLyoqXG4gKiBUaGUgZ2F0ZXdheSBvciBlbmRwb2ludCB0YXJnZXRlZCBieSB0aGUgcm91dGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZVRhcmdldFR5cGUge1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgcm91dGUgdGFyZ2V0LiBUaGlzIGlzIHVzZWQgZm9yIHRhcmdldHMgc3VjaCBhc1xuICAgKiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IG9yIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0IGlzIG5vdCBzZXQgdG8gYSBnYXRld2F5LCBpbiB0aGlzIGNhc2UgYW4gZW5kcG9pbnQgaXMgbmVlZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheT86IElSb3V0ZVRhcmdldDtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHJvdXRlIHRhcmdldC4gVGhpcyBpcyB1c2VkIGZvciB0YXJnZXRzIHN1Y2ggYXNcbiAgICogVlBDIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0YXJnZXQgaXMgbm90IHNldCB0byBhbiBlbmRwb2ludCwgaW4gdGhpcyBjYXNlIGEgZ2F0ZXdheSBpcyBuZWVkZWQuXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludD86IElWcGNFbmRwb2ludDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUm91dGVUYXJnZXRQcm9wcykge1xuICAgIHRoaXMuZ2F0ZXdheSA9IHByb3BzLmdhdGV3YXk7XG4gICAgdGhpcy5lbmRwb2ludCA9IHByb3BzLmVuZHBvaW50O1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSBhIHJvdXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZVYyIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICogQGF0dHJpYnV0ZSByb3V0ZVRhYmxlXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIElQdjQgb3IgSVB2NiBDSURSIGJsb2NrIHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBtYXRjaC5cbiAgICpcbiAgICogUm91dGluZyBkZWNpc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBtb3N0IHNwZWNpZmljIG1hdGNoLlxuICAgKiBUT0RPOiBMb29rIGZvciBzdHJvbmcgSVAgdHlwZSBpbXBsZW1lbnRhdGlvbiBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSByb3V0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZSByb3V0ZVRhYmxlXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIElQdjQgb3IgSVB2NiBDSURSIGJsb2NrIHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBtYXRjaC5cbiAgICpcbiAgICogUm91dGluZyBkZWNpc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBtb3N0IHNwZWNpZmljIG1hdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcm92aXNpb25lZCB3aXRob3V0IGEgcm91dGUgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcm91dGUgd2l0aCBhZGRlZCBmdW5jdGlvbmFsaXR5LlxuICogQHJlc291cmNlIEFXUzo6RUMyOjpSb3V0ZVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUm91dGUgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElSb3V0ZVYyIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlJvdXRlJztcbiAgLyoqXG4gICAqIFRoZSBJUHY0IG9yIElQdjYgQ0lEUiBibG9jayB1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gbWF0Y2guXG4gICAqXG4gICAqIFJvdXRpbmcgZGVjaXNpb25zIGFyZSBiYXNlZCBvbiB0aGUgbW9zdCBzcGVjaWZpYyBtYXRjaC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXN0aW5hdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2F0ZXdheSBvciBlbmRwb2ludCB0YXJnZXRlZCBieSB0aGUgcm91dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByb3V0ZSB0YWJsZSBmb3IgdGhlIHJvdXRlLlxuICAgKiBAYXR0cmlidXRlIHJvdXRlVGFibGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHRoZSByb3V0ZSBpcyB0YXJnZXRpbmdcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRSb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcm91dGUgQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlPzogQ2ZuUm91dGU7XG5cbiAgLyoqXG4gICAqIERlc3RpbmF0aW9uIGNpZHIgYmxvY2sgZm9yIGlwdjZcbiAgICovXG4gIHByaXZhdGUgZGVzdGluYXRpb25JcHY2Q2lkcj86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzdGluYXRpb24gY2lkciBibG9jayBmb3IgaXB2NFxuICAgKi9cbiAgcHJpdmF0ZSBkZXN0aW5hdGlvbklwdjRDaWRyPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb3V0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIHRoaXMudGFyZ2V0ID0gcHJvcHMudGFyZ2V0O1xuICAgIHRoaXMucm91dGVUYWJsZSA9IHByb3BzLnJvdXRlVGFibGU7XG4gICAgdGhpcy5kZXN0aW5hdGlvbiA9IHByb3BzLmRlc3RpbmF0aW9uO1xuICAgIGNvbnN0IGlzRGVzdGluYXRpb25JcHY0ID0gTmV0d29ya1V0aWxzLnZhbGlkSXAocHJvcHMuZGVzdGluYXRpb24pO1xuICAgIGlmICghaXNEZXN0aW5hdGlvbklwdjQpIHtcbiAgICAgIC8vIFRPRE8gVmFsaWRhdGUgZm9yIElQdjYgQ0lEUiByYW5nZVxuICAgICAgdGhpcy5kZXN0aW5hdGlvbklwdjZDaWRyID0gcHJvcHMuZGVzdGluYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdGluYXRpb25JcHY0Q2lkciA9IHByb3BzLmRlc3RpbmF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldC5nYXRld2F5Py5yb3V0ZXJUeXBlID09PSBSb3V0ZXJUeXBlLkVHUkVTU19PTkxZX0lOVEVSTkVUX0dBVEVXQVkgJiYgaXNEZXN0aW5hdGlvbklwdjQpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0VncmVzcyBvbmx5IGludGVybmV0IGdhdGV3YXkgZG9lcyBub3Qgc3VwcG9ydCBJUHY0IHJvdXRpbmcnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoKHByb3BzLnRhcmdldC5nYXRld2F5ICYmIHByb3BzLnRhcmdldC5lbmRwb2ludCkgfHwgKCFwcm9wcy50YXJnZXQuZ2F0ZXdheSAmJiAhcHJvcHMudGFyZ2V0LmVuZHBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignRXhhY3RseSBvbmUgb2YgYGdhdGV3YXlgIG9yIGBlbmRwb2ludGAgbXVzdCBiZSBzcGVjaWZpZWQuJywgdGhpcyk7XG4gICAgfVxuICAgIHRoaXMudGFyZ2V0Um91dGVyVHlwZSA9IHRoaXMudGFyZ2V0LmdhdGV3YXkgPyB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclR5cGUgOiBSb3V0ZXJUeXBlLlZQQ19FTkRQT0lOVDtcbiAgICAvLyBHYXRld2F5IGdlbmVyYXRlcyByb3V0ZSBhdXRvbWF0aWNhbGx5IHZpYSBpdHMgUm91dGVUYWJsZSwgdGh1cyB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIHRoZSByZXNvdXJjZSBmb3IgaXRcbiAgICBpZiAoISh0aGlzLnRhcmdldC5lbmRwb2ludCBpbnN0YW5jZW9mIEdhdGV3YXlWcGNFbmRwb2ludCkpIHtcbiAgICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuUm91dGUodGhpcywgJ1JvdXRlJywge1xuICAgICAgICByb3V0ZVRhYmxlSWQ6IHRoaXMucm91dGVUYWJsZS5yb3V0ZVRhYmxlSWQsXG4gICAgICAgIGRlc3RpbmF0aW9uQ2lkckJsb2NrOiB0aGlzLmRlc3RpbmF0aW9uSXB2NENpZHIsXG4gICAgICAgIGRlc3RpbmF0aW9uSXB2NkNpZHJCbG9jazogdGhpcy5kZXN0aW5hdGlvbklwdjZDaWRyLFxuICAgICAgICBbcm91dGVyVHlwZVRvUHJvcE5hbWUodGhpcy50YXJnZXRSb3V0ZXJUeXBlKV06IHRoaXMudGFyZ2V0LmdhdGV3YXkgPyB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclRhcmdldElkIDpcbiAgICAgICAgICB0aGlzLnRhcmdldC5lbmRwb2ludCA/IHRoaXMudGFyZ2V0LmVuZHBvaW50LnZwY0VuZHBvaW50SWQgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgLy8gQ3JlYXRlIGEgcm91dGUgb25seSBhZnRlciB0YXJnZXQgZ2F0ZXdheSBvciBlbmRwb2ludCBpcyBjcmVhdGVkXG4gICAgaWYgKHRoaXMudGFyZ2V0LmdhdGV3YXkpIHtcbiAgICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMudGFyZ2V0LmdhdGV3YXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXQuZW5kcG9pbnQpIHtcbiAgICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMudGFyZ2V0LmVuZHBvaW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBhIHJvdXRlIHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlVGFibGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcm91dGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlzaW9uZWQgd2l0aG91dCBhIHJvdXRlIHRhYmxlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlVGFibGVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBWUENcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6Um91dGVUYWJsZVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUm91dGVUYWJsZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFibGUge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1lYzItYWxwaGEuUm91dGVUYWJsZSc7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvdXRlVGFibGVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm91dGUgdGFibGUgQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5Sb3V0ZVRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb3V0ZVRhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5Sb3V0ZVRhYmxlKHRoaXMsICdSb3V0ZVRhYmxlJywge1xuICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZCxcbiAgICB9KTtcbiAgICBpZiAocHJvcHMucm91dGVUYWJsZU5hbWUpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKE5BTUVfVEFHLCBwcm9wcy5yb3V0ZVRhYmxlTmFtZSk7XG4gICAgfVxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZVRhYmxlSWQgPSBGZWF0dXJlRmxhZ3Mub2YodGhpcykuaXNFbmFibGVkKGN4X2FwaS5VU0VfUkVTT1VSQ0VJRF9GT1JfVlBDVjJfTUlHUkFUSU9OKSA/XG4gICAgICB0aGlzLnJlc291cmNlLnJlZiA6IHRoaXMucmVzb3VyY2UuYXR0clJvdXRlVGFibGVJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGN1c3RvbSByb3V0ZSB0byB0aGUgcm91dGUgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgSVB2NCBvciBJUHY2IENJRFIgYmxvY2sgdXNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uIG1hdGNoLlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBnYXRld2F5IG9yIGVuZHBvaW50IHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAgICogQHBhcmFtIHJvdXRlTmFtZSBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcm91dGUuXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkUm91dGUoaWQ6IHN0cmluZywgZGVzdGluYXRpb246IHN0cmluZywgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGUsIHJvdXRlTmFtZT86IHN0cmluZykge1xuICAgIG5ldyBSb3V0ZSh0aGlzLCBpZCwge1xuICAgICAgcm91dGVUYWJsZTogdGhpcyxcbiAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcm91dGVOYW1lOiByb3V0ZU5hbWUsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcm91dGVyVHlwZVRvUHJvcE5hbWUocm91dGVyVHlwZTogUm91dGVyVHlwZSkge1xuICByZXR1cm4gKHtcbiAgICBbUm91dGVyVHlwZS5DQVJSSUVSX0dBVEVXQVldOiAnY2FycmllckdhdGV3YXlJZCcsXG4gICAgW1JvdXRlclR5cGUuRUdSRVNTX09OTFlfSU5URVJORVRfR0FURVdBWV06ICdlZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLkdBVEVXQVldOiAnZ2F0ZXdheUlkJyxcbiAgICBbUm91dGVyVHlwZS5JTlNUQU5DRV06ICdpbnN0YW5jZUlkJyxcbiAgICBbUm91dGVyVHlwZS5MT0NBTF9HQVRFV0FZXTogJ2xvY2FsR2F0ZXdheUlkJyxcbiAgICBbUm91dGVyVHlwZS5OQVRfR0FURVdBWV06ICduYXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLk5FVFdPUktfSU5URVJGQUNFXTogJ25ldHdvcmtJbnRlcmZhY2VJZCcsXG4gICAgW1JvdXRlclR5cGUuVFJBTlNJVF9HQVRFV0FZXTogJ3RyYW5zaXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLlZQQ19QRUVSSU5HX0NPTk5FQ1RJT05dOiAndnBjUGVlcmluZ0Nvbm5lY3Rpb25JZCcsXG4gICAgW1JvdXRlclR5cGUuVlBDX0VORFBPSU5UXTogJ3ZwY0VuZHBvaW50SWQnLFxuICB9KVtyb3V0ZXJUeXBlXTtcbn1cbiJdfQ==
|
|
770
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBa1M7QUFFbFMsMkNBQW1IO0FBRW5ILGlDQUFtRTtBQUVuRSw4RUFBOEY7QUFDOUYsNkNBQXFDO0FBQ3JDLDBFQUEwRTtBQUUxRTs7OztHQUlHO0FBQ0gsSUFBWSxtQkFTWDtBQVRELFdBQVksbUJBQW1CO0lBQzdCOztPQUVHO0lBQ0gsd0NBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCwwQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBVFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFTOUI7QUE4TEQ7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBVyxNQUFNLENBQUM7QUFFaEM7OztHQUdHO0lBRVUseUJBQXlCOzRCQURyQyxvQ0FBa0I7Ozs7c0JBQzRCLGVBQVE7eUNBQWhCLFNBQVEsV0FBUTs7OztZQUF2RCw2S0FtQ0M7Ozs7O1FBbENDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsa0RBQWtELENBQUM7UUFDMUc7O1dBRUc7UUFDTSxVQUFVLENBQWE7UUFFaEM7O1dBRUc7UUFDTSxjQUFjLENBQVM7UUFFaEM7O1dBRUc7UUFDYSxRQUFRLENBQStCO1FBRXZELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUM7WUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzs7Ozs7O21EQW5CUix5QkFBeUI7Ozs7WUFvQmxDLG1DQUFtQztZQUNuQyxJQUFBLHdDQUFvQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVsQyxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUN4QyxXQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLDZC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Q2ZuRWdyZXNzT25seUludGVybmV0R2F0ZXdheSwgQ2ZuSW50ZXJuZXRHYXRld2F5LCBDZm5OYXRHYXRld2F5LCBDZm5WUENQZWVyaW5nQ29ubmVjdGlvbiwgQ2ZuUm91dGUsIENmblJvdXRlVGFibGUsIENmblZQQ0dhdGV3YXlBdHRhY2htZW50LCBDZm5WUE5HYXRld2F5LCBDZm5WUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbiwgR2F0ZXdheVZwY0VuZHBvaW50LCBJUm91dGVUYWJsZSwgSVZwY0VuZHBvaW50LCBSb3V0ZXJUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElEZXBlbmRhYmxlIH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgRHVyYXRpb24sIEZlYXR1cmVGbGFncywgSVJlc291cmNlLCBSZXNvdXJjZSwgVGFncywgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBJVnBjVjIsIFZQTkdhdGV3YXlWMk9wdGlvbnMgfSBmcm9tICcuL3ZwYy12Mi1iYXNlJztcbmltcG9ydCB7IE5ldHdvcmtVdGlscywgYWxsUm91dGVUYWJsZUlkcywgQ2lkckJsb2NrIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IElTdWJuZXRWMiB9IGZyb20gJy4vc3VibmV0LXYyJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IGN4X2FwaSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAqIFRoZSBkZWZhdWx0IGlzIHB1YmxpYyBjb25uZWN0aXZpdHkuXG4gKiBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItbmF0Z2F0ZXdheS5odG1sI2Nmbi1lYzItbmF0Z2F0ZXdheS1jb25uZWN0aXZpdHl0eXBlXG4gKi9cbmV4cG9ydCBlbnVtIE5hdENvbm5lY3Rpdml0eVR5cGUge1xuICAvKipcbiAgICogU2V0cyBDb25uZWN0aXZpdHkgdHlwZSB0byBQVUJMSUNcbiAgICovXG4gIFBVQkxJQyA9ICdwdWJsaWMnLFxuICAvKipcbiAgICogU2V0cyBDb25uZWN0aXZpdHkgdHlwZSB0byBQUklWQVRFXG4gICAqL1xuICBQUklWQVRFID0gJ3ByaXZhdGUnLFxufVxuXG4vKipcbiAqIEludGVyZmFjZSB0byBkZWZpbmUgYSByb3V0aW5nIHRhcmdldCwgc3VjaCBhcyBhblxuICogZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheSBvciBWUEMgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJvdXRlVGFyZ2V0IGV4dGVuZHMgSURlcGVuZGFibGUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHVzZWQgaW4gdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUYXJnZXRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGFuIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWdyZXNzT25seUludGVybmV0R2F0ZXdheVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgVlBDIGZvciB3aGljaCB0byBjcmVhdGUgdGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlzaW9uZWQgd2l0aG91dCBhIHJlc291cmNlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGFuIGludGVybmV0IGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuZXRHYXRld2F5UHJvcHMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcm92aXNpb25lZCB3aXRob3V0IGEgcmVzb3VyY2UgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJuZXRHYXRld2F5TmFtZT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGEgVlBOIGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlBOR2F0ZXdheVYyUHJvcHMgZXh0ZW5kcyBWUE5HYXRld2F5VjJPcHRpb25zIHtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgVlBOIGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGRlZmluZSBhIE5BVCBnYXRld2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdEdhdGV3YXlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgaW4gd2hpY2ggdGhlIE5BVCBnYXRld2F5IGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXQ6IElTdWJuZXRWMjtcblxuICAvKipcbiAgICogQWxsb2NhdGlvbklEIG9mIEVsYXN0aWMgSVAgYWRkcmVzcyB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBOQVQgZ2F0ZXdheS4gVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZCBmb3IgYSBwdWJsaWMgTkFUXG4gICAqIGdhdGV3YXkgYW5kIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCBhIHByaXZhdGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXR0ci5hbGxvY2F0aW9uSUQgb2YgYSBuZXcgRWxhc3RpYyBJUCBjcmVhdGVkIGJ5IGRlZmF1bHRcbiAgICogLy9UT0RPOiBBREQgTDIgZm9yIGVsYXN0aWMgaXBcbiAgICovXG4gIHJlYWRvbmx5IGFsbG9jYXRpb25JZD86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgTmF0Q29ubmVjdGl2aXR5VHlwZS5QdWJsaWNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpdml0eVR5cGU/OiBOYXRDb25uZWN0aXZpdHlUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJlZm9yZSBmb3JjaWJseSByZWxlYXNpbmcgdGhlXG4gICAqIElQIGFkZHJlc3NlcyBpZiBjb25uZWN0aW9ucyBhcmUgc3RpbGwgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IDM1MHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IG1heERyYWluRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgSVB2NCBhZGRyZXNzIHRvIGFzc2lnbiB0byB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgeW91IGRvbid0IHByb3ZpZGUgYW4gYWRkcmVzcywgYSBwcml2YXRlIElQdjQgYWRkcmVzcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlSXBBZGRyZXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgRUlQIGFsbG9jYXRpb24gSURzLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtbmF0LWdhdGV3YXkuaHRtbCNuYXQtZ2F0ZXdheS1jcmVhdGluZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNlY29uZGFyeSBhbGxvY2F0aW9uIElEcyBhdHRhY2hlZCB0byBOQVRHV1xuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5QWxsb2NhdGlvbklkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZGFyeSBwcml2YXRlIElQdjQgYWRkcmVzc2VzIHlvdVxuICAgKiB3YW50IHRvIGFzc2lnbiB0byB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIGBTZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzQ291bnRgIGFuZCBgU2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc2VzYCBjYW5ub3QgYmVcbiAgICogc2V0IGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1uYXQtZ2F0ZXdheS5odG1sI25hdC1nYXRld2F5LWNyZWF0aW5nXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc2Vjb25kYXJ5IGFsbG9jYXRpb24gSURzIGFzc29jaWF0ZWQgd2l0aCBOQVRHV1xuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc0NvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgcHJpdmF0ZSBJUHY0IGFkZHJlc3Nlcy5cbiAgICpcbiAgICogYFNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3NDb3VudGAgYW5kIGBTZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzZXNgIGNhbm5vdCBiZVxuICAgKiBzZXQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLW5hdC1nYXRld2F5Lmh0bWwjbmF0LWdhdGV3YXktY3JlYXRpbmdcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzZWNvbmRhcnkgcHJpdmF0ZSBJcEFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggTkFUR1dcbiAgICovXG4gIHJlYWRvbmx5IHNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTkFUR1cgcHJvdmlzaW9uZWQgd2l0aG91dCBhbnkgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmF0R2F0ZXdheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSBOQVQgZ2F0ZXdheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRHYXRld2F5UHJvcHMgZXh0ZW5kcyBOYXRHYXRld2F5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQyBpbiB3aGljaCB0aGUgTkFUIGdhdGV3YXkgaXMgbG9jYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbGFzdGljIGlwIGFzc29jaWF0ZWQsIHJlcXVpcmVkIGluIGNhc2Ugb2YgcHVibGljIGNvbm5lY3Rpdml0eSBpZiBgQWxsb2NhdGlvbklkYCBpcyBub3QgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwY1YyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gZGVmaW5lIGEgVlBDIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWUENQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFZQQyB0aGF0IGlzIGFjY2VwdGluZyB0aGUgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXB0b3JWcGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHJvbGUgYXJuIGNyZWF0ZWQgaW4gdGhlIGFjY2VwdG9yIGFjY291bnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGVlclJvbGVBcm4gbmVlZGVkIGlmIG5vdCBjcm9zcyBhY2NvdW50IGNvbm5lY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHBlZXJSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBlZXJpbmcgY29ubmVjdGlvbiBwcm92aXNpb25lZCB3aXRob3V0IGFueSBuYW1lXG4gICAqL1xuICByZWFkb25seSB2cGNQZWVyaW5nQ29ubmVjdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSBWUEMgcGVlcmluZyBjb25uZWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZQQ1BlZXJpbmdDb25uZWN0aW9uUHJvcHMgZXh0ZW5kcyBWUENQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFZQQyB0aGF0IGlzIHJlcXVlc3RpbmcgdGhlIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RvclZwYzogSVZwY1YyO1xufVxuXG4vKipcbiAqIE5hbWUgdGFnIGNvbnN0YW50XG4gKi9cbmNvbnN0IE5BTUVfVEFHOiBzdHJpbmcgPSAnTmFtZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElSb3V0ZVRhcmdldCB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWVjMi1hbHBoYS5FZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5JztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkgQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5FZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlOYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMuZWdyZXNzT25seUludGVybmV0R2F0ZXdheU5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLkVHUkVTU19PTkxZX0lOVEVSTkVUX0dBVEVXQVk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmbkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkodGhpcywgJ0VJR1cnLCB7XG4gICAgICB2cGNJZDogcHJvcHMudnBjLnZwY0lkLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuYXR0cklkO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBpbnRlcm5ldCBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OkludGVybmV0R2F0ZXdheVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgSW50ZXJuZXRHYXRld2F5IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJUm91dGVUYXJnZXQge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1lYzItYWxwaGEuSW50ZXJuZXRHYXRld2F5JztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuZXQgZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmbkludGVybmV0R2F0ZXdheTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSW50ZXJuZXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5yb3V0ZXJUeXBlID0gUm91dGVyVHlwZS5HQVRFV0FZO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5JbnRlcm5ldEdhdGV3YXkodGhpcywgJ0lHVycsIHt9KTtcbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcblxuICAgIHRoaXMucm91dGVyVGFyZ2V0SWQgPSBGZWF0dXJlRmxhZ3Mub2YodGhpcykuaXNFbmFibGVkKGN4X2FwaS5VU0VfUkVTT1VSQ0VJRF9GT1JfVlBDVjJfTUlHUkFUSU9OKSA/XG4gICAgICB0aGlzLnJlc291cmNlLnJlZiA6IHRoaXMucmVzb3VyY2UuYXR0ckludGVybmV0R2F0ZXdheUlkO1xuICAgIHRoaXMudnBjSWQgPSBwcm9wcy52cGMudnBjSWQ7XG5cbiAgICBpZiAocHJvcHMuaW50ZXJuZXRHYXRld2F5TmFtZSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoTkFNRV9UQUcsIHByb3BzLmludGVybmV0R2F0ZXdheU5hbWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52cGMudnBjTmFtZSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoJ05hbWUnLCBwcm9wcy52cGMudnBjTmFtZSk7XG4gICAgfVxuXG4gICAgbmV3IENmblZQQ0dhdGV3YXlBdHRhY2htZW50KHRoaXMsICdHV0F0dGFjaG1lbnQnLCB7XG4gICAgICB2cGNJZDogdGhpcy52cGNJZCxcbiAgICAgIGludGVybmV0R2F0ZXdheUlkOiB0aGlzLnJvdXRlclRhcmdldElkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHZpcnR1YWwgcHJpdmF0ZSBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OlZQTkdhdGV3YXlcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFZQTkdhdGV3YXlWMiBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlZQTkdhdGV3YXlWMic7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByb3V0ZXIgdXNlZCBpbiB0aGUgcm91dGUuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclRhcmdldElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgVlBDIGZvciB3aGljaCB0byBjcmVhdGUgdGhlIFZQTiBnYXRld2F5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUE4gZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmblZQTkdhdGV3YXk7XG5cbiAgLyoqXG4gICAqIFRoZSBWUE4gR2F0ZXdheSBBdHRhY2htZW50XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRhY2htZW50OiBDZm5WUENHYXRld2F5QXR0YWNobWVudDtcblxuICAvKipcbiAgICogVGhlIFZQTiBHYXRld2F5IFJvdXRlIFByb3BhZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZVByb3BhZ2F0aW9uOiBDZm5WUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVlBOR2F0ZXdheVYyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudnBuR2F0ZXdheU5hbWUsXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLkdBVEVXQVk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmblZQTkdhdGV3YXkodGhpcywgJ0lHVycsIHtcbiAgICAgIHR5cGU6IHByb3BzLnR5cGUsXG4gICAgICBhbWF6b25TaWRlQXNuOiBwcm9wcy5hbWF6b25TaWRlQXNuLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuYXR0clZwbkdhdGV3YXlJZDtcblxuICAgIHRoaXMudnBjSWQgPSBwcm9wcy52cGMudnBjSWQ7XG4gICAgdGhpcy5fYXR0YWNobWVudCA9IG5ldyBDZm5WUENHYXRld2F5QXR0YWNobWVudCh0aGlzLCAnVlBDVlBOR1cnLCB7XG4gICAgICB2cGNJZDogdGhpcy52cGNJZCxcbiAgICAgIHZwbkdhdGV3YXlJZDogdGhpcy5yZXNvdXJjZS5hdHRyVnBuR2F0ZXdheUlkLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLnZwbkdhdGV3YXlOYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMudnBuR2F0ZXdheU5hbWUpO1xuICAgIH1cblxuICAgIC8vIFByb3BhZ2F0ZSByb3V0ZXMgb24gcm91dGUgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlnaHQgc3VibmV0c1xuICAgIGNvbnN0IHZwblJvdXRlUHJvcGFnYXRpb24gPSBwcm9wcy52cG5Sb3V0ZVByb3BhZ2F0aW9uID8/IFtdO1xuICAgIGNvbnN0IHN1Ym5ldHMgPSB2cG5Sb3V0ZVByb3BhZ2F0aW9uLm1hcChzID0+IHByb3BzLnZwYy5zZWxlY3RTdWJuZXRzKHMpLnN1Ym5ldHMpLmZsYXQoKTtcbiAgICBjb25zdCByb3V0ZVRhYmxlSWRzID0gYWxsUm91dGVUYWJsZUlkcyhzdWJuZXRzKTtcblxuICAgIGlmIChyb3V0ZVRhYmxlSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmdWMignQGF3cy1jZGs6YXdzLWVjMi1lbHBoYTplbmFibGVWcG5HYXRld2F5VjInLCBgTm8gc3VibmV0cyBtYXRjaGluZyBzZWxlY3Rpb246ICcke0pTT04uc3RyaW5naWZ5KHZwblJvdXRlUHJvcGFnYXRpb24pfScuIFNlbGVjdCBvdGhlciBzdWJuZXRzIHRvIGFkZCByb3V0ZXMgdG8uYCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcm91dGVQcm9wYWdhdGlvbiA9IG5ldyBDZm5WUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbih0aGlzLCAnUm91dGVQcm9wYWdhdGlvbicsIHtcbiAgICAgIHJvdXRlVGFibGVJZHMsXG4gICAgICB2cG5HYXRld2F5SWQ6IHRoaXMucm91dGVyVGFyZ2V0SWQsXG4gICAgfSk7XG4gICAgLy8gVGhlIEFXUzo6RUMyOjpWUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbiByZXNvdXJjZSBjYW5ub3QgdXNlIHRoZSBWUE4gZ2F0ZXdheVxuICAgIC8vIHVudGlsIGl0IGhhcyBzdWNjZXNzZnVsbHkgYXR0YWNoZWQgdG8gdGhlIFZQQy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi12cG4tZ2F0ZXdheXJvdXRlcHJvcC5odG1sXG4gICAgdGhpcy5fcm91dGVQcm9wYWdhdGlvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5fYXR0YWNobWVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV0d29yayBhZGRyZXNzIHRyYW5zbGF0aW9uIChOQVQpIGdhdGV3YXlcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6TmF0R2F0ZXdheVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgTmF0R2F0ZXdheSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLk5hdEdhdGV3YXknO1xuICAvKipcbiAgICogSWQgb2YgdGhlIE5hdEdhdGV3YXlcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hdEdhdGV3YXlJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByb3V0ZXIgdXNlZCBpbiB0aGUgcm91dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgcHVibGljXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGl2aXR5VHlwZT86IE5hdENvbm5lY3Rpdml0eVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIGZvcmNpYmx5IHJlbGVhc2luZyB0aGVcbiAgICogSVAgYWRkcmVzc2VzIGlmIGNvbm5lY3Rpb25zIGFyZSBzdGlsbCBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgJzM1MCBzZWNvbmRzJ1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heERyYWluRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIE5BVCBnYXRld2F5IENGTiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ2ZuTmF0R2F0ZXdheTtcblxuICAvKipcbiAgICogRWxhc3RpYyBJUCBjcmVhdGVkIGZvciBhbGxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWlwPzogQ2ZuRUlQO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOYXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5yb3V0ZXJUeXBlID0gUm91dGVyVHlwZS5OQVRfR0FURVdBWTtcblxuICAgIHRoaXMuY29ubmVjdGl2aXR5VHlwZSA9IHByb3BzLmNvbm5lY3Rpdml0eVR5cGUgfHwgTmF0Q29ubmVjdGl2aXR5VHlwZS5QVUJMSUM7XG4gICAgdGhpcy5tYXhEcmFpbkR1cmF0aW9uID0gcHJvcHMubWF4RHJhaW5EdXJhdGlvbiB8fCBEdXJhdGlvbi5zZWNvbmRzKDM1MCk7XG5cbiAgICBpZiAodGhpcy5jb25uZWN0aXZpdHlUeXBlID09PSBOYXRDb25uZWN0aXZpdHlUeXBlLlBVQkxJQykge1xuICAgICAgaWYgKCFwcm9wcy52cGMgJiYgIXByb3BzLmFsbG9jYXRpb25JZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdFaXRoZXIgcHJvdmlkZSB2cGMgb3IgYWxsb2NhdGlvbklkJywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm5hdEdhdGV3YXlOYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHM/Lm5hdEdhdGV3YXlOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBJZiB1c2VyIGRvZXMgbm90IHByb3ZpZGUgRUlQLCBnZW5lcmF0ZSBvbmUgZm9yIHRoZW1cbiAgICB2YXIgYUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuY29ubmVjdGl2aXR5VHlwZSA9PT0gTmF0Q29ubmVjdGl2aXR5VHlwZS5QVUJMSUMpIHtcbiAgICAgIGlmICghcHJvcHMuYWxsb2NhdGlvbklkKSB7XG4gICAgICAgIHRoaXMuZWlwID0gbmV3IENmbkVJUCh0aGlzLCAnRUlQJywge1xuICAgICAgICAgIGRvbWFpbjogJ3ZwYycsXG4gICAgICAgIH0pO1xuICAgICAgICBhSWQgPSB0aGlzLmVpcC5hdHRyQWxsb2NhdGlvbklkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYUlkID0gcHJvcHMuYWxsb2NhdGlvbklkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuTmF0R2F0ZXdheSh0aGlzLCAnTkFUR2F0ZXdheScsIHtcbiAgICAgIHN1Ym5ldElkOiBwcm9wcy5zdWJuZXQuc3VibmV0SWQsXG4gICAgICBhbGxvY2F0aW9uSWQ6IGFJZCxcbiAgICAgIG1heERyYWluRHVyYXRpb25TZWNvbmRzOiBwcm9wcy5tYXhEcmFpbkR1cmF0aW9uPy50b1NlY29uZHMoKSxcbiAgICAgIHNlY29uZGFyeUFsbG9jYXRpb25JZHM6IHByb3BzLnNlY29uZGFyeUFsbG9jYXRpb25JZHMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgICB0aGlzLm5hdEdhdGV3YXlJZCA9IEZlYXR1cmVGbGFncy5vZih0aGlzKS5pc0VuYWJsZWQoY3hfYXBpLlVTRV9SRVNPVVJDRUlEX0ZPUl9WUENWMl9NSUdSQVRJT04pID9cbiAgICAgIHRoaXMucmVzb3VyY2UucmVmIDogdGhpcy5yZXNvdXJjZS5hdHRyTmF0R2F0ZXdheUlkO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IEZlYXR1cmVGbGFncy5vZih0aGlzKS5pc0VuYWJsZWQoY3hfYXBpLlVTRV9SRVNPVVJDRUlEX0ZPUl9WUENWMl9NSUdSQVRJT04pID9cbiAgICAgIHRoaXMucmVzb3VyY2UucmVmIDogdGhpcy5yZXNvdXJjZS5hdHRyTmF0R2F0ZXdheUlkO1xuXG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy5yZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMuc3VibmV0LmludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHBlZXJpbmcgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBWUENzXG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OlZQQ1BlZXJpbmdDb25uZWN0aW9uXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBWUENQZWVyaW5nQ29ubmVjdGlvbiBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlZQQ1BlZXJpbmdDb25uZWN0aW9uJztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24gQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5WUENQZWVyaW5nQ29ubmVjdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVlBDUGVlcmluZ0Nvbm5lY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLlZQQ19QRUVSSU5HX0NPTk5FQ1RJT047XG5cbiAgICBjb25zdCBpc0Nyb3NzQWNjb3VudCA9IHByb3BzLnJlcXVlc3RvclZwYy5vd25lckFjY291bnRJZCAhPT0gcHJvcHMuYWNjZXB0b3JWcGMub3duZXJBY2NvdW50SWQ7XG5cbiAgICBpZiAoIWlzQ3Jvc3NBY2NvdW50ICYmIHByb3BzLnBlZXJSb2xlQXJuKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdwZWVyUm9sZUFybiBpcyBub3QgbmVlZGVkIGZvciBzYW1lIGFjY291bnQgcGVlcmluZycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChpc0Nyb3NzQWNjb3VudCAmJiAhcHJvcHMucGVlclJvbGVBcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0Nyb3NzIGFjY291bnQgVlBDIHBlZXJpbmcgcmVxdWlyZXMgcGVlclJvbGVBcm4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGFwID0gdGhpcy52YWxpZGF0ZVZwY0NpZHJPdmVybGFwKHByb3BzLnJlcXVlc3RvclZwYywgcHJvcHMuYWNjZXB0b3JWcGMpO1xuICAgIGlmIChvdmVybGFwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdDSURSIGJsb2NrIHNob3VsZCBub3Qgb3ZlcmxhcCB3aXRoIGVhY2ggb3RoZXIgZm9yIGVzdGFibGlzaGluZyBhIHBlZXJpbmcgY29ubmVjdGlvbicsIHRoaXMpO1xuICAgIH1cbiAgICBpZiAocHJvcHMudnBjUGVlcmluZ0Nvbm5lY3Rpb25OYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMudnBjUGVlcmluZ0Nvbm5lY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmblZQQ1BlZXJpbmdDb25uZWN0aW9uKHRoaXMsICdWUENQZWVyaW5nQ29ubmVjdGlvbicsIHtcbiAgICAgIHZwY0lkOiBwcm9wcy5yZXF1ZXN0b3JWcGMudnBjSWQsXG4gICAgICBwZWVyVnBjSWQ6IHByb3BzLmFjY2VwdG9yVnBjLnZwY0lkLFxuICAgICAgcGVlck93bmVySWQ6IHByb3BzLmFjY2VwdG9yVnBjLm93bmVyQWNjb3VudElkLFxuICAgICAgcGVlclJlZ2lvbjogcHJvcHMuYWNjZXB0b3JWcGMucmVnaW9uLFxuICAgICAgcGVlclJvbGVBcm46IGlzQ3Jvc3NBY2NvdW50ID8gcHJvcHMucGVlclJvbGVBcm4gOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlclRhcmdldElkID0gdGhpcy5yZXNvdXJjZS5hdHRySWQ7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBwcm92aWRlZCBJUHY0IENJRFIgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBzdWJuZXQgQ0lEUiBibG9ja3Mgd2l0aGluIHRoZSBnaXZlbiBWUEMuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0b3JWcGMgVGhlIFZQQyBvZiB0aGUgcmVxdWVzdG9yLlxuICAgKiBAcGFyYW0gYWNjZXB0b3JWcGMgVGhlIFZQQyBvZiB0aGUgYWNjZXB0b3IuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIElQdjQgQ0lEUiBibG9jayBvdmVybGFwcyB3aXRoIGVhY2ggb3RoZXIgZm9yIHR3byBWUENzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZwY0NpZHJPdmVybGFwKHJlcXVlc3RvclZwYzogSVZwY1YyLCBhY2NlcHRvclZwYzogSVZwY1YyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVxdWVzdG9yQ2lkcnMgPSBbcmVxdWVzdG9yVnBjLmlwdjRDaWRyQmxvY2tdO1xuICAgIGNvbnN0IGFjY2VwdG9yQ2lkcnMgPSBbYWNjZXB0b3JWcGMuaXB2NENpZHJCbG9ja107XG5cbiAgICBpZiAocmVxdWVzdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgICAgcmVxdWVzdG9yQ2lkcnMucHVzaCguLi5yZXF1ZXN0b3JWcGMuc2Vjb25kYXJ5Q2lkckJsb2NrXG4gICAgICAgIC5tYXAoYmxvY2sgPT4gYmxvY2suY2lkckJsb2NrKVxuICAgICAgICAuZmlsdGVyKChjaWRyKTogY2lkciBpcyBzdHJpbmcgPT4gY2lkciAhPT0gdW5kZWZpbmVkKSk7XG4gICAgfVxuXG4gICAgaWYgKGFjY2VwdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgICAgYWNjZXB0b3JDaWRycy5wdXNoKC4uLmFjY2VwdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9ja1xuICAgICAgICAubWFwKGJsb2NrID0+IGJsb2NrLmNpZHJCbG9jaylcbiAgICAgICAgLmZpbHRlcigoY2lkcik6IGNpZHIgaXMgc3RyaW5nID0+IGNpZHIgIT09IHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVxdWVzdG9yQ2lkciBvZiByZXF1ZXN0b3JDaWRycykge1xuICAgICAgY29uc3QgcmVxdWVzdG9yUmFuZ2UgPSBuZXcgQ2lkckJsb2NrKHJlcXVlc3RvckNpZHIpO1xuICAgICAgY29uc3QgcmVxdWVzdG9ySXBSYW5nZTogW3N0cmluZywgc3RyaW5nXSA9IFtyZXF1ZXN0b3JSYW5nZS5taW5JcCgpLCByZXF1ZXN0b3JSYW5nZS5tYXhJcCgpXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NlcHRvckNpZHIgb2YgYWNjZXB0b3JDaWRycykge1xuICAgICAgICBjb25zdCBhY2NlcHRvclJhbmdlID0gbmV3IENpZHJCbG9jayhhY2NlcHRvckNpZHIpO1xuICAgICAgICBjb25zdCBhY2NlcHRvcklwUmFuZ2U6IFtzdHJpbmcsIHN0cmluZ10gPSBbYWNjZXB0b3JSYW5nZS5taW5JcCgpLCBhY2NlcHRvclJhbmdlLm1heElwKCldO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0b3JSYW5nZS5yYW5nZXNPdmVybGFwKGFjY2VwdG9ySXBSYW5nZSwgcmVxdWVzdG9ySXBSYW5nZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGVuZHBvaW50IG9yIGdhdGV3YXkgYmVpbmcgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlVGFyZ2V0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgcm91dGUgdGFyZ2V0LiBUaGlzIGlzIHVzZWQgZm9yIHRhcmdldHMgc3VjaCBhc1xuICAgKiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IG9yIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0IGlzIG5vdCBzZXQgdG8gYSBnYXRld2F5LCBpbiB0aGlzIGNhc2UgYW4gZW5kcG9pbnQgaXMgbmVlZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheT86IElSb3V0ZVRhcmdldDtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHJvdXRlIHRhcmdldC4gVGhpcyBpcyB1c2VkIGZvciB0YXJnZXRzIHN1Y2ggYXNcbiAgICogVlBDIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0YXJnZXQgaXMgbm90IHNldCB0byBhbiBlbmRwb2ludCwgaW4gdGhpcyBjYXNlIGEgZ2F0ZXdheSBpcyBuZWVkZWQuXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludD86IElWcGNFbmRwb2ludDtcbn1cblxuLyoqXG4gKiBUaGUgZ2F0ZXdheSBvciBlbmRwb2ludCB0YXJnZXRlZCBieSB0aGUgcm91dGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZVRhcmdldFR5cGUge1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgcm91dGUgdGFyZ2V0LiBUaGlzIGlzIHVzZWQgZm9yIHRhcmdldHMgc3VjaCBhc1xuICAgKiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IG9yIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0IGlzIG5vdCBzZXQgdG8gYSBnYXRld2F5LCBpbiB0aGlzIGNhc2UgYW4gZW5kcG9pbnQgaXMgbmVlZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheT86IElSb3V0ZVRhcmdldDtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHJvdXRlIHRhcmdldC4gVGhpcyBpcyB1c2VkIGZvciB0YXJnZXRzIHN1Y2ggYXNcbiAgICogVlBDIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0YXJnZXQgaXMgbm90IHNldCB0byBhbiBlbmRwb2ludCwgaW4gdGhpcyBjYXNlIGEgZ2F0ZXdheSBpcyBuZWVkZWQuXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludD86IElWcGNFbmRwb2ludDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUm91dGVUYXJnZXRQcm9wcykge1xuICAgIHRoaXMuZ2F0ZXdheSA9IHByb3BzLmdhdGV3YXk7XG4gICAgdGhpcy5lbmRwb2ludCA9IHByb3BzLmVuZHBvaW50O1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSBhIHJvdXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZVYyIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICogQGF0dHJpYnV0ZSByb3V0ZVRhYmxlXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIElQdjQgb3IgSVB2NiBDSURSIGJsb2NrIHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBtYXRjaC5cbiAgICpcbiAgICogUm91dGluZyBkZWNpc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBtb3N0IHNwZWNpZmljIG1hdGNoLlxuICAgKiBUT0RPOiBMb29rIGZvciBzdHJvbmcgSVAgdHlwZSBpbXBsZW1lbnRhdGlvbiBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSByb3V0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZSByb3V0ZVRhYmxlXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIElQdjQgb3IgSVB2NiBDSURSIGJsb2NrIHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBtYXRjaC5cbiAgICpcbiAgICogUm91dGluZyBkZWNpc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBtb3N0IHNwZWNpZmljIG1hdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcm92aXNpb25lZCB3aXRob3V0IGEgcm91dGUgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcm91dGUgd2l0aCBhZGRlZCBmdW5jdGlvbmFsaXR5LlxuICogQHJlc291cmNlIEFXUzo6RUMyOjpSb3V0ZVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUm91dGUgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElSb3V0ZVYyIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlJvdXRlJztcbiAgLyoqXG4gICAqIFRoZSBJUHY0IG9yIElQdjYgQ0lEUiBibG9jayB1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gbWF0Y2guXG4gICAqXG4gICAqIFJvdXRpbmcgZGVjaXNpb25zIGFyZSBiYXNlZCBvbiB0aGUgbW9zdCBzcGVjaWZpYyBtYXRjaC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXN0aW5hdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2F0ZXdheSBvciBlbmRwb2ludCB0YXJnZXRlZCBieSB0aGUgcm91dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByb3V0ZSB0YWJsZSBmb3IgdGhlIHJvdXRlLlxuICAgKiBAYXR0cmlidXRlIHJvdXRlVGFibGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHRoZSByb3V0ZSBpcyB0YXJnZXRpbmdcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRSb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcm91dGUgQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlPzogQ2ZuUm91dGU7XG5cbiAgLyoqXG4gICAqIERlc3RpbmF0aW9uIGNpZHIgYmxvY2sgZm9yIGlwdjZcbiAgICovXG4gIHByaXZhdGUgZGVzdGluYXRpb25JcHY2Q2lkcj86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzdGluYXRpb24gY2lkciBibG9jayBmb3IgaXB2NFxuICAgKi9cbiAgcHJpdmF0ZSBkZXN0aW5hdGlvbklwdjRDaWRyPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb3V0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIHRoaXMudGFyZ2V0ID0gcHJvcHMudGFyZ2V0O1xuICAgIHRoaXMucm91dGVUYWJsZSA9IHByb3BzLnJvdXRlVGFibGU7XG4gICAgdGhpcy5kZXN0aW5hdGlvbiA9IHByb3BzLmRlc3RpbmF0aW9uO1xuICAgIGNvbnN0IGlzRGVzdGluYXRpb25JcHY0ID0gTmV0d29ya1V0aWxzLnZhbGlkSXAocHJvcHMuZGVzdGluYXRpb24pO1xuICAgIGlmICghaXNEZXN0aW5hdGlvbklwdjQpIHtcbiAgICAgIC8vIFRPRE8gVmFsaWRhdGUgZm9yIElQdjYgQ0lEUiByYW5nZVxuICAgICAgdGhpcy5kZXN0aW5hdGlvbklwdjZDaWRyID0gcHJvcHMuZGVzdGluYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdGluYXRpb25JcHY0Q2lkciA9IHByb3BzLmRlc3RpbmF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldC5nYXRld2F5Py5yb3V0ZXJUeXBlID09PSBSb3V0ZXJUeXBlLkVHUkVTU19PTkxZX0lOVEVSTkVUX0dBVEVXQVkgJiYgaXNEZXN0aW5hdGlvbklwdjQpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0VncmVzcyBvbmx5IGludGVybmV0IGdhdGV3YXkgZG9lcyBub3Qgc3VwcG9ydCBJUHY0IHJvdXRpbmcnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoKHByb3BzLnRhcmdldC5nYXRld2F5ICYmIHByb3BzLnRhcmdldC5lbmRwb2ludCkgfHwgKCFwcm9wcy50YXJnZXQuZ2F0ZXdheSAmJiAhcHJvcHMudGFyZ2V0LmVuZHBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignRXhhY3RseSBvbmUgb2YgYGdhdGV3YXlgIG9yIGBlbmRwb2ludGAgbXVzdCBiZSBzcGVjaWZpZWQuJywgdGhpcyk7XG4gICAgfVxuICAgIHRoaXMudGFyZ2V0Um91dGVyVHlwZSA9IHRoaXMudGFyZ2V0LmdhdGV3YXkgPyB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclR5cGUgOiBSb3V0ZXJUeXBlLlZQQ19FTkRQT0lOVDtcbiAgICAvLyBHYXRld2F5IGdlbmVyYXRlcyByb3V0ZSBhdXRvbWF0aWNhbGx5IHZpYSBpdHMgUm91dGVUYWJsZSwgdGh1cyB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIHRoZSByZXNvdXJjZSBmb3IgaXRcbiAgICBpZiAoISh0aGlzLnRhcmdldC5lbmRwb2ludCBpbnN0YW5jZW9mIEdhdGV3YXlWcGNFbmRwb2ludCkpIHtcbiAgICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuUm91dGUodGhpcywgJ1JvdXRlJywge1xuICAgICAgICByb3V0ZVRhYmxlSWQ6IHRoaXMucm91dGVUYWJsZS5yb3V0ZVRhYmxlSWQsXG4gICAgICAgIGRlc3RpbmF0aW9uQ2lkckJsb2NrOiB0aGlzLmRlc3RpbmF0aW9uSXB2NENpZHIsXG4gICAgICAgIGRlc3RpbmF0aW9uSXB2NkNpZHJCbG9jazogdGhpcy5kZXN0aW5hdGlvbklwdjZDaWRyLFxuICAgICAgICBbcm91dGVyVHlwZVRvUHJvcE5hbWUodGhpcy50YXJnZXRSb3V0ZXJUeXBlKV06IHRoaXMudGFyZ2V0LmdhdGV3YXkgPyB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclRhcmdldElkIDpcbiAgICAgICAgICB0aGlzLnRhcmdldC5lbmRwb2ludCA/IHRoaXMudGFyZ2V0LmVuZHBvaW50LnZwY0VuZHBvaW50SWQgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgLy8gQ3JlYXRlIGEgcm91dGUgb25seSBhZnRlciB0YXJnZXQgZ2F0ZXdheSBvciBlbmRwb2ludCBpcyBjcmVhdGVkXG4gICAgaWYgKHRoaXMudGFyZ2V0LmdhdGV3YXkpIHtcbiAgICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMudGFyZ2V0LmdhdGV3YXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXQuZW5kcG9pbnQpIHtcbiAgICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMudGFyZ2V0LmVuZHBvaW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBhIHJvdXRlIHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlVGFibGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcm91dGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlzaW9uZWQgd2l0aG91dCBhIHJvdXRlIHRhYmxlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlVGFibGVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBWUENcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6Um91dGVUYWJsZVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUm91dGVUYWJsZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFibGUge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1lYzItYWxwaGEuUm91dGVUYWJsZSc7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvdXRlVGFibGVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm91dGUgdGFibGUgQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5Sb3V0ZVRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb3V0ZVRhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5Sb3V0ZVRhYmxlKHRoaXMsICdSb3V0ZVRhYmxlJywge1xuICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZCxcbiAgICB9KTtcbiAgICBpZiAocHJvcHMucm91dGVUYWJsZU5hbWUpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKE5BTUVfVEFHLCBwcm9wcy5yb3V0ZVRhYmxlTmFtZSk7XG4gICAgfVxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZVRhYmxlSWQgPSBGZWF0dXJlRmxhZ3Mub2YodGhpcykuaXNFbmFibGVkKGN4X2FwaS5VU0VfUkVTT1VSQ0VJRF9GT1JfVlBDVjJfTUlHUkFUSU9OKSA/XG4gICAgICB0aGlzLnJlc291cmNlLnJlZiA6IHRoaXMucmVzb3VyY2UuYXR0clJvdXRlVGFibGVJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGN1c3RvbSByb3V0ZSB0byB0aGUgcm91dGUgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgSVB2NCBvciBJUHY2IENJRFIgYmxvY2sgdXNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uIG1hdGNoLlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBnYXRld2F5IG9yIGVuZHBvaW50IHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAgICogQHBhcmFtIHJvdXRlTmFtZSBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcm91dGUuXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkUm91dGUoaWQ6IHN0cmluZywgZGVzdGluYXRpb246IHN0cmluZywgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGUsIHJvdXRlTmFtZT86IHN0cmluZykge1xuICAgIG5ldyBSb3V0ZSh0aGlzLCBpZCwge1xuICAgICAgcm91dGVUYWJsZTogdGhpcyxcbiAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcm91dGVOYW1lOiByb3V0ZU5hbWUsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcm91dGVyVHlwZVRvUHJvcE5hbWUocm91dGVyVHlwZTogUm91dGVyVHlwZSkge1xuICByZXR1cm4gKHtcbiAgICBbUm91dGVyVHlwZS5DQVJSSUVSX0dBVEVXQVldOiAnY2FycmllckdhdGV3YXlJZCcsXG4gICAgW1JvdXRlclR5cGUuRUdSRVNTX09OTFlfSU5URVJORVRfR0FURVdBWV06ICdlZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLkdBVEVXQVldOiAnZ2F0ZXdheUlkJyxcbiAgICBbUm91dGVyVHlwZS5JTlNUQU5DRV06ICdpbnN0YW5jZUlkJyxcbiAgICBbUm91dGVyVHlwZS5MT0NBTF9HQVRFV0FZXTogJ2xvY2FsR2F0ZXdheUlkJyxcbiAgICBbUm91dGVyVHlwZS5OQVRfR0FURVdBWV06ICduYXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLk5FVFdPUktfSU5URVJGQUNFXTogJ25ldHdvcmtJbnRlcmZhY2VJZCcsXG4gICAgW1JvdXRlclR5cGUuVFJBTlNJVF9HQVRFV0FZXTogJ3RyYW5zaXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLlZQQ19QRUVSSU5HX0NPTk5FQ1RJT05dOiAndnBjUGVlcmluZ0Nvbm5lY3Rpb25JZCcsXG4gICAgW1JvdXRlclR5cGUuVlBDX0VORFBPSU5UXTogJ3ZwY0VuZHBvaW50SWQnLFxuICB9KVtyb3V0ZXJUeXBlXTtcbn1cbiJdfQ==
|