@aws-cdk/aws-mediaconnect-alpha 2.263.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 +28415 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +592 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +1280 -0
- package/awslint.json +50 -0
- package/grants.json +42 -0
- package/lib/bridge-output.d.ts +54 -0
- package/lib/bridge-output.js +122 -0
- package/lib/bridge-source.d.ts +79 -0
- package/lib/bridge-source.js +217 -0
- package/lib/bridge.d.ts +419 -0
- package/lib/bridge.js +490 -0
- package/lib/flow-entitlement.d.ts +86 -0
- package/lib/flow-entitlement.js +152 -0
- package/lib/flow-output.d.ts +329 -0
- package/lib/flow-output.js +415 -0
- package/lib/flow-source-configuration.d.ts +558 -0
- package/lib/flow-source-configuration.js +595 -0
- package/lib/flow-source.d.ts +116 -0
- package/lib/flow-source.js +190 -0
- package/lib/flow.d.ts +975 -0
- package/lib/flow.js +1065 -0
- package/lib/gateway.d.ts +142 -0
- package/lib/gateway.js +236 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.js +31 -0
- package/lib/mediaconnect-grants.generated.d.ts +53 -0
- package/lib/mediaconnect-grants.generated.js +136 -0
- package/lib/router-input.d.ts +686 -0
- package/lib/router-input.js +1095 -0
- package/lib/router-network-interface.d.ts +153 -0
- package/lib/router-network-interface.js +245 -0
- package/lib/router-output.d.ts +557 -0
- package/lib/router-output.js +789 -0
- package/lib/shared.d.ts +548 -0
- package/lib/shared.js +668 -0
- package/package.json +118 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +68 -0
package/lib/shared.js
ADDED
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PixelAspectRatio = exports.Framerate = exports.EncryptionKeyType = exports.VpcInterface = exports.NetworkInterface = exports.MediaLivePipeline = exports.FailoverMode = exports.GatewayNetwork = exports.BridgeProtocol = exports.MaintenanceDay = exports.State = exports.KeyType = exports.EncryptionAlgorithm = void 0;
|
|
4
|
+
exports.renderTags = renderTags;
|
|
5
|
+
exports.toTitleCase = toTitleCase;
|
|
6
|
+
exports.validateMaintenanceTime = validateMaintenanceTime;
|
|
7
|
+
exports.resolveEncryptionRole = resolveEncryptionRole;
|
|
8
|
+
exports.renderStaticKeyEncryption = renderStaticKeyEncryption;
|
|
9
|
+
exports.renderSrtPasswordEncryption = renderSrtPasswordEncryption;
|
|
10
|
+
exports.renderRouterSrtEncryption = renderRouterSrtEncryption;
|
|
11
|
+
exports.renderTransitEncryption = renderTransitEncryption;
|
|
12
|
+
exports.resolveTransitEncryption = resolveTransitEncryption;
|
|
13
|
+
exports.resolveRouterSrtEncryption = resolveRouterSrtEncryption;
|
|
14
|
+
exports.exceedsRouterTierBitrate = exceedsRouterTierBitrate;
|
|
15
|
+
exports.isOpenCidr = isOpenCidr;
|
|
16
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
17
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
18
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
19
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
20
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
21
|
+
/**
|
|
22
|
+
* Encryption Algorithms used in AWS Elemental MediaConnect
|
|
23
|
+
*/
|
|
24
|
+
class EncryptionAlgorithm {
|
|
25
|
+
value;
|
|
26
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.EncryptionAlgorithm", version: "2.263.0-alpha.0" };
|
|
27
|
+
/**
|
|
28
|
+
* Option for AES128
|
|
29
|
+
*/
|
|
30
|
+
static AES128 = new EncryptionAlgorithm('aes128');
|
|
31
|
+
/**
|
|
32
|
+
* Option for AES192
|
|
33
|
+
*/
|
|
34
|
+
static AES192 = new EncryptionAlgorithm('aes192');
|
|
35
|
+
/**
|
|
36
|
+
* Option for AES256
|
|
37
|
+
*/
|
|
38
|
+
static AES256 = new EncryptionAlgorithm('aes256');
|
|
39
|
+
/**
|
|
40
|
+
* Use a custom encryption algorithm value
|
|
41
|
+
* @param value The encryption algorithm string value
|
|
42
|
+
*/
|
|
43
|
+
static of(value) {
|
|
44
|
+
return new EncryptionAlgorithm(value);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @param value The encryption algorithm string value
|
|
48
|
+
*/
|
|
49
|
+
constructor(value) {
|
|
50
|
+
this.value = value;
|
|
51
|
+
}
|
|
52
|
+
/** Returns the string value */
|
|
53
|
+
toString() {
|
|
54
|
+
return this.value;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.EncryptionAlgorithm = EncryptionAlgorithm;
|
|
58
|
+
/**
|
|
59
|
+
* Key types used across AWS Elemental MediaConnect
|
|
60
|
+
*/
|
|
61
|
+
class KeyType {
|
|
62
|
+
value;
|
|
63
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.KeyType", version: "2.263.0-alpha.0" };
|
|
64
|
+
/**
|
|
65
|
+
* Option for Static Key
|
|
66
|
+
*/
|
|
67
|
+
static STATIC_KEY = new KeyType('static-key');
|
|
68
|
+
/**
|
|
69
|
+
* Option for SRT Password
|
|
70
|
+
*/
|
|
71
|
+
static SRT_PASSWORD = new KeyType('srt-password');
|
|
72
|
+
/**
|
|
73
|
+
* Use a custom key type value
|
|
74
|
+
* @param value The key type string value
|
|
75
|
+
*/
|
|
76
|
+
static of(value) {
|
|
77
|
+
return new KeyType(value);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @param value The key type string value
|
|
81
|
+
*/
|
|
82
|
+
constructor(value) {
|
|
83
|
+
this.value = value;
|
|
84
|
+
}
|
|
85
|
+
/** Returns the string value */
|
|
86
|
+
toString() {
|
|
87
|
+
return this.value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.KeyType = KeyType;
|
|
91
|
+
/**
|
|
92
|
+
* State configuration used across AWS Elemental MediaConnect
|
|
93
|
+
*/
|
|
94
|
+
var State;
|
|
95
|
+
(function (State) {
|
|
96
|
+
/**
|
|
97
|
+
* Option for Enabled
|
|
98
|
+
*/
|
|
99
|
+
State["ENABLED"] = "ENABLED";
|
|
100
|
+
/**
|
|
101
|
+
* Option for Disabled
|
|
102
|
+
*/
|
|
103
|
+
State["DISABLED"] = "DISABLED";
|
|
104
|
+
})(State || (exports.State = State = {}));
|
|
105
|
+
/**
|
|
106
|
+
* Days of the week for scheduled maintenance windows.
|
|
107
|
+
*
|
|
108
|
+
* Used by both Flow and Router maintenance configurations.
|
|
109
|
+
*/
|
|
110
|
+
var MaintenanceDay;
|
|
111
|
+
(function (MaintenanceDay) {
|
|
112
|
+
/** Monday */
|
|
113
|
+
MaintenanceDay["MONDAY"] = "MONDAY";
|
|
114
|
+
/** Tuesday */
|
|
115
|
+
MaintenanceDay["TUESDAY"] = "TUESDAY";
|
|
116
|
+
/** Wednesday */
|
|
117
|
+
MaintenanceDay["WEDNESDAY"] = "WEDNESDAY";
|
|
118
|
+
/** Thursday */
|
|
119
|
+
MaintenanceDay["THURSDAY"] = "THURSDAY";
|
|
120
|
+
/** Friday */
|
|
121
|
+
MaintenanceDay["FRIDAY"] = "FRIDAY";
|
|
122
|
+
/** Saturday */
|
|
123
|
+
MaintenanceDay["SATURDAY"] = "SATURDAY";
|
|
124
|
+
/** Sunday */
|
|
125
|
+
MaintenanceDay["SUNDAY"] = "SUNDAY";
|
|
126
|
+
})(MaintenanceDay || (exports.MaintenanceDay = MaintenanceDay = {}));
|
|
127
|
+
/**
|
|
128
|
+
* Options for bridge network source and output protocols.
|
|
129
|
+
*/
|
|
130
|
+
class BridgeProtocol {
|
|
131
|
+
value;
|
|
132
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeProtocol", version: "2.263.0-alpha.0" };
|
|
133
|
+
/**
|
|
134
|
+
* Option for RTP-FEC
|
|
135
|
+
*/
|
|
136
|
+
static RTP_FEC = new BridgeProtocol('rtp-fec');
|
|
137
|
+
/**
|
|
138
|
+
* Option for RTP
|
|
139
|
+
*/
|
|
140
|
+
static RTP = new BridgeProtocol('rtp');
|
|
141
|
+
/**
|
|
142
|
+
* Option for UDP
|
|
143
|
+
*/
|
|
144
|
+
static UDP = new BridgeProtocol('udp');
|
|
145
|
+
/**
|
|
146
|
+
* Use a custom bridge protocol value
|
|
147
|
+
* @param value The bridge protocol string value
|
|
148
|
+
*/
|
|
149
|
+
static of(value) {
|
|
150
|
+
return new BridgeProtocol(value);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @param value The bridge protocol string value
|
|
154
|
+
*/
|
|
155
|
+
constructor(value) {
|
|
156
|
+
this.value = value;
|
|
157
|
+
}
|
|
158
|
+
/** Returns the string value */
|
|
159
|
+
toString() {
|
|
160
|
+
return this.value;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.BridgeProtocol = BridgeProtocol;
|
|
164
|
+
/**
|
|
165
|
+
* A network on a MediaConnect Gateway.
|
|
166
|
+
*
|
|
167
|
+
* Use {@link GatewayNetwork.define} to create a network and reference it from
|
|
168
|
+
* gateway, bridge source, and bridge output configurations.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
*
|
|
172
|
+
* const productionNetwork = GatewayNetwork.define({
|
|
173
|
+
* name: 'production',
|
|
174
|
+
* cidrBlock: '10.0.0.0/16',
|
|
175
|
+
* });
|
|
176
|
+
*/
|
|
177
|
+
class GatewayNetwork {
|
|
178
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.GatewayNetwork", version: "2.263.0-alpha.0" };
|
|
179
|
+
/**
|
|
180
|
+
* Define a new gateway network.
|
|
181
|
+
*
|
|
182
|
+
* @param props network properties
|
|
183
|
+
*/
|
|
184
|
+
static define(props) {
|
|
185
|
+
try {
|
|
186
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_GatewayNetworkDefineProps(props);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
190
|
+
Error.captureStackTrace(error, this.define);
|
|
191
|
+
}
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(props.name)) {
|
|
195
|
+
if (props.name.length < 1 || props.name.length > 64) {
|
|
196
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `GatewayNetworkNameLength`, `Gateway network name must be between 1 and 64 characters, got ${props.name.length}`);
|
|
197
|
+
}
|
|
198
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(props.name)) {
|
|
199
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `GatewayNetworkNameFormat`, `Gateway network name must contain only alphanumeric characters, hyphens, and underscores, got '${props.name}'`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return new GatewayNetwork(props.name, props.cidrBlock);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The name of the network.
|
|
206
|
+
*/
|
|
207
|
+
name;
|
|
208
|
+
/**
|
|
209
|
+
* A unique IP address range to use for this network in CIDR notation.
|
|
210
|
+
*/
|
|
211
|
+
cidrBlock;
|
|
212
|
+
constructor(name, cidrBlock) {
|
|
213
|
+
this.name = name;
|
|
214
|
+
this.cidrBlock = cidrBlock;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.GatewayNetwork = GatewayNetwork;
|
|
218
|
+
/**
|
|
219
|
+
* Failover Mode
|
|
220
|
+
*/
|
|
221
|
+
class FailoverMode {
|
|
222
|
+
value;
|
|
223
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FailoverMode", version: "2.263.0-alpha.0" };
|
|
224
|
+
/**
|
|
225
|
+
* MERGE combines the source streams into a single stream, allowing graceful
|
|
226
|
+
* recovery from any single-source loss.
|
|
227
|
+
*/
|
|
228
|
+
static MERGE = new FailoverMode('MERGE');
|
|
229
|
+
/**
|
|
230
|
+
* FAILOVER allows switching between different streams.
|
|
231
|
+
*/
|
|
232
|
+
static FAILOVER = new FailoverMode('FAILOVER');
|
|
233
|
+
/**
|
|
234
|
+
* Use a custom failover mode value
|
|
235
|
+
* @param value The failover mode string value
|
|
236
|
+
*/
|
|
237
|
+
static of(value) {
|
|
238
|
+
return new FailoverMode(value);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* @param value The failover mode string value
|
|
242
|
+
*/
|
|
243
|
+
constructor(value) {
|
|
244
|
+
this.value = value;
|
|
245
|
+
}
|
|
246
|
+
/** Returns the string value */
|
|
247
|
+
toString() {
|
|
248
|
+
return this.value;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.FailoverMode = FailoverMode;
|
|
252
|
+
/**
|
|
253
|
+
* Render tags for CloudFormation resources.
|
|
254
|
+
*
|
|
255
|
+
* @internal
|
|
256
|
+
*/
|
|
257
|
+
function renderTags(tags) {
|
|
258
|
+
return Object.entries(tags).map(([key, value]) => ({
|
|
259
|
+
key,
|
|
260
|
+
value,
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Convert an uppercase enum value to title case (e.g. 'MONDAY' → 'Monday').
|
|
265
|
+
* Used at CFN boundaries where the API expects title-cased day names.
|
|
266
|
+
*
|
|
267
|
+
* @internal
|
|
268
|
+
*/
|
|
269
|
+
function toTitleCase(day) {
|
|
270
|
+
return day.charAt(0) + day.slice(1).toLowerCase();
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Validate a maintenance start hour string is in HH:00 format (24-hour, minutes must be 00).
|
|
274
|
+
* @param time The time string to validate
|
|
275
|
+
* @throws UnscopedValidationError if the format is invalid
|
|
276
|
+
*
|
|
277
|
+
* @internal
|
|
278
|
+
*/
|
|
279
|
+
function validateMaintenanceTime(time) {
|
|
280
|
+
if (aws_cdk_lib_1.Token.isUnresolved(time)) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (!/^([01]\d|2[0-3]):00$/.test(time)) {
|
|
284
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MaintenanceTimeFormat`, `Maintenance time must be in HH:00 format (24-hour, minutes must be 00), got '${time}'`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* MediaLive pipeline options.
|
|
289
|
+
*/
|
|
290
|
+
var MediaLivePipeline;
|
|
291
|
+
(function (MediaLivePipeline) {
|
|
292
|
+
/** Pipeline 0 */
|
|
293
|
+
MediaLivePipeline["PIPELINE_0"] = "PIPELINE_0";
|
|
294
|
+
/** Pipeline 1 */
|
|
295
|
+
MediaLivePipeline["PIPELINE_1"] = "PIPELINE_1";
|
|
296
|
+
})(MediaLivePipeline || (exports.MediaLivePipeline = MediaLivePipeline = {}));
|
|
297
|
+
/**
|
|
298
|
+
* Network interface options
|
|
299
|
+
*/
|
|
300
|
+
class NetworkInterface {
|
|
301
|
+
value;
|
|
302
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.NetworkInterface", version: "2.263.0-alpha.0" };
|
|
303
|
+
/**
|
|
304
|
+
* Option for ENA
|
|
305
|
+
*/
|
|
306
|
+
static ENA = new NetworkInterface('ena');
|
|
307
|
+
/**
|
|
308
|
+
* Option for EFA.
|
|
309
|
+
* For CDI ensure you use EFA.
|
|
310
|
+
*/
|
|
311
|
+
static EFA = new NetworkInterface('efa');
|
|
312
|
+
/**
|
|
313
|
+
* Use a custom network interface value
|
|
314
|
+
* @param value The network interface string value
|
|
315
|
+
*/
|
|
316
|
+
static of(value) {
|
|
317
|
+
return new NetworkInterface(value);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* @param value The network interface string value
|
|
321
|
+
*/
|
|
322
|
+
constructor(value) {
|
|
323
|
+
this.value = value;
|
|
324
|
+
}
|
|
325
|
+
/** Returns the string value */
|
|
326
|
+
toString() {
|
|
327
|
+
return this.value;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
exports.NetworkInterface = NetworkInterface;
|
|
331
|
+
/**
|
|
332
|
+
* Factory class for creating VPC Interface configurations
|
|
333
|
+
*/
|
|
334
|
+
class VpcInterface {
|
|
335
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.VpcInterface", version: "2.263.0-alpha.0" };
|
|
336
|
+
/**
|
|
337
|
+
* Define a new VPC Interface configuration. MediaConnect will create network interfaces automatically.
|
|
338
|
+
*
|
|
339
|
+
* @param props VPC Interface properties
|
|
340
|
+
* @returns VpcInterfaceConfig configuration object
|
|
341
|
+
*/
|
|
342
|
+
static define(props) {
|
|
343
|
+
try {
|
|
344
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_VpcInterfaceDefineProps(props);
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
348
|
+
Error.captureStackTrace(error, this.define);
|
|
349
|
+
}
|
|
350
|
+
throw error;
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
name: props.vpcInterfaceName,
|
|
354
|
+
role: props.role,
|
|
355
|
+
securityGroups: props.securityGroups,
|
|
356
|
+
subnet: props.subnet,
|
|
357
|
+
networkInterfaceType: props.networkInterfaceType,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Create a VPC Interface configuration using existing network interfaces.
|
|
362
|
+
*
|
|
363
|
+
* @param props VPC Interface properties with existing network interface IDs
|
|
364
|
+
* @returns VpcInterfaceConfig configuration object
|
|
365
|
+
*/
|
|
366
|
+
static fromNetworkInterfaces(props) {
|
|
367
|
+
try {
|
|
368
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_VpcInterfaceFromNetworkInterfacesProps(props);
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
372
|
+
Error.captureStackTrace(error, this.fromNetworkInterfaces);
|
|
373
|
+
}
|
|
374
|
+
throw error;
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
name: props.vpcInterfaceName,
|
|
378
|
+
role: props.role,
|
|
379
|
+
securityGroups: props.securityGroups,
|
|
380
|
+
subnet: props.subnet,
|
|
381
|
+
networkInterfaceIds: props.networkInterfaceIds,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
exports.VpcInterface = VpcInterface;
|
|
386
|
+
/**
|
|
387
|
+
* Encryption key type for transit encryption
|
|
388
|
+
* @internal
|
|
389
|
+
*/
|
|
390
|
+
var EncryptionKeyType;
|
|
391
|
+
(function (EncryptionKeyType) {
|
|
392
|
+
EncryptionKeyType["SECRETS_MANAGER"] = "SECRETS_MANAGER";
|
|
393
|
+
EncryptionKeyType["AUTOMATIC"] = "AUTOMATIC";
|
|
394
|
+
})(EncryptionKeyType || (exports.EncryptionKeyType = EncryptionKeyType = {}));
|
|
395
|
+
/**
|
|
396
|
+
* Resolve an IAM role for MediaConnect to access a Secrets Manager secret. Returns the
|
|
397
|
+
* user-provided `role` if present, otherwise auto-creates a scoped role: inline secret read,
|
|
398
|
+
* `kms:Decrypt` when the secret has a CMK, and a trust policy with `aws:SourceAccount`
|
|
399
|
+
* (plus `aws:SourceArn` when `sourceArn` is given). The returned `grant` lets callers order
|
|
400
|
+
* the role's secret-read policy before the consuming resource — required for router I/O.
|
|
401
|
+
*
|
|
402
|
+
* A provided role is used as-is and is not granted secret access — the caller is
|
|
403
|
+
* responsible for ensuring it can read the secret (and decrypt its KMS key, if any).
|
|
404
|
+
*
|
|
405
|
+
* @see https://docs.aws.amazon.com/mediaconnect/latest/ug/cross-service-confused-deputy-prevention.html
|
|
406
|
+
* @internal
|
|
407
|
+
*/
|
|
408
|
+
function resolveEncryptionRole(scope, id, role, secret, sourceArn) {
|
|
409
|
+
if (role)
|
|
410
|
+
return { role };
|
|
411
|
+
const conditions = {
|
|
412
|
+
StringEquals: { 'aws:SourceAccount': aws_cdk_lib_1.Aws.ACCOUNT_ID },
|
|
413
|
+
};
|
|
414
|
+
if (sourceArn !== undefined) {
|
|
415
|
+
conditions.ArnLike = { 'aws:SourceArn': sourceArn };
|
|
416
|
+
}
|
|
417
|
+
const created = new aws_iam_1.Role(scope, id, {
|
|
418
|
+
assumedBy: new aws_iam_1.ServicePrincipal('mediaconnect.amazonaws.com', { conditions }),
|
|
419
|
+
description: 'Auto-generated MediaConnect role for accessing the encryption secret',
|
|
420
|
+
});
|
|
421
|
+
// Grant helper: adds secret read (GetSecretValue/DescribeSecret) plus kms:Decrypt
|
|
422
|
+
// (with a kms:ViaService condition) when the secret uses a customer-managed key.
|
|
423
|
+
const readGrant = secret.grantRead(created);
|
|
424
|
+
// grantRead covers 2 of the 4 secret-read actions MediaConnect's policy needs; add the
|
|
425
|
+
// other 2, scoped to the same secret. (Skipping the doc's `ListSecrets` — it needs
|
|
426
|
+
// `Resource: *` and isn't required to read a known secret.)
|
|
427
|
+
// https://docs.aws.amazon.com/mediaconnect/latest/ug/iam-policy-examples-asm-secrets.html
|
|
428
|
+
const extraGrant = aws_iam_1.Grant.addToPrincipal({
|
|
429
|
+
grantee: created,
|
|
430
|
+
actions: ['secretsmanager:GetResourcePolicy', 'secretsmanager:ListSecretVersionIds'],
|
|
431
|
+
resourceArns: [secret.secretArn],
|
|
432
|
+
});
|
|
433
|
+
return { role: created, grant: readGrant.combine(extraGrant) };
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Render the CFN static-key encryption block, auto-creating a role when none is supplied.
|
|
437
|
+
* @internal
|
|
438
|
+
*/
|
|
439
|
+
function renderStaticKeyEncryption(scope, encryption, sourceArn) {
|
|
440
|
+
const { role } = resolveEncryptionRole(scope, 'EncryptionRole', encryption.role, encryption.secret, sourceArn);
|
|
441
|
+
return {
|
|
442
|
+
keyType: KeyType.STATIC_KEY.value,
|
|
443
|
+
roleArn: role.roleArn,
|
|
444
|
+
secretArn: encryption.secret.secretArn,
|
|
445
|
+
algorithm: encryption.algorithm.value,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Render the CFN SRT-password encryption block, auto-creating a role when none is supplied.
|
|
450
|
+
* @internal
|
|
451
|
+
*/
|
|
452
|
+
function renderSrtPasswordEncryption(scope, encryption, sourceArn) {
|
|
453
|
+
const { role } = resolveEncryptionRole(scope, 'EncryptionRole', encryption.role, encryption.secret, sourceArn);
|
|
454
|
+
return {
|
|
455
|
+
keyType: KeyType.SRT_PASSWORD.value,
|
|
456
|
+
roleArn: role.roleArn,
|
|
457
|
+
secretArn: encryption.secret.secretArn,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Render the CFN router SRT encryption block (inner `encryptionKey` object),
|
|
462
|
+
* auto-creating a role when none is supplied.
|
|
463
|
+
* @internal
|
|
464
|
+
*/
|
|
465
|
+
function renderRouterSrtEncryption(scope, id, encryption, sourceArn) {
|
|
466
|
+
const { role } = resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn);
|
|
467
|
+
return {
|
|
468
|
+
encryptionKey: {
|
|
469
|
+
roleArn: role.roleArn,
|
|
470
|
+
secretArn: encryption.secret.secretArn,
|
|
471
|
+
},
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Render the CFN transit encryption block: SECRETS_MANAGER (auto-creating a role when
|
|
476
|
+
* none is supplied) when `encryption` is given, otherwise the AUTOMATIC default.
|
|
477
|
+
* @internal
|
|
478
|
+
*/
|
|
479
|
+
function renderTransitEncryption(scope, id, encryption, sourceArn) {
|
|
480
|
+
if (encryption) {
|
|
481
|
+
const { role } = resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn);
|
|
482
|
+
return {
|
|
483
|
+
encryptionKeyConfiguration: {
|
|
484
|
+
secretsManager: {
|
|
485
|
+
roleArn: role.roleArn,
|
|
486
|
+
secretArn: encryption.secret.secretArn,
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
encryptionKeyType: EncryptionKeyType.SECRETS_MANAGER,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
return {
|
|
493
|
+
encryptionKeyType: EncryptionKeyType.AUTOMATIC,
|
|
494
|
+
encryptionKeyConfiguration: {
|
|
495
|
+
automatic: {},
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Resolve transit encryption to its CFN config plus the auto-created role's secret-read
|
|
501
|
+
* grant (when a role was auto-created).
|
|
502
|
+
* @internal
|
|
503
|
+
*/
|
|
504
|
+
function resolveTransitEncryption(scope, id, encryption, sourceArn) {
|
|
505
|
+
const resolved = encryption
|
|
506
|
+
? resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn)
|
|
507
|
+
: undefined;
|
|
508
|
+
const config = renderTransitEncryption(scope, id, encryption && resolved ? { ...encryption, role: resolved.role } : encryption, sourceArn);
|
|
509
|
+
return { config, grant: resolved?.grant };
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Resolve router SRT encryption to its CFN config plus the auto-created role's secret-read
|
|
513
|
+
* grant (when a role was auto-created), so the consuming router I/O can order it before
|
|
514
|
+
* itself. See {@link resolveTransitEncryption} for why the ordering matters.
|
|
515
|
+
* @internal
|
|
516
|
+
*/
|
|
517
|
+
function resolveRouterSrtEncryption(scope, id, encryption, sourceArn) {
|
|
518
|
+
const resolved = resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn);
|
|
519
|
+
const config = renderRouterSrtEncryption(scope, id, { ...encryption, role: resolved.role }, sourceArn);
|
|
520
|
+
return { config, grant: resolved.grant };
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* A video frame rate expressed as a rational number (numerator/denominator).
|
|
524
|
+
*
|
|
525
|
+
* Use the predefined constants for standard rates, or {@link Framerate.of} for a custom rate.
|
|
526
|
+
*/
|
|
527
|
+
class Framerate {
|
|
528
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Framerate", version: "2.263.0-alpha.0" };
|
|
529
|
+
/** 24 fps (cinema) — `24/1`. */
|
|
530
|
+
static FPS_24 = new Framerate(24, 1);
|
|
531
|
+
/** 25 fps — `25/1`. */
|
|
532
|
+
static FPS_25 = new Framerate(25, 1);
|
|
533
|
+
/** 29.97 fps — `30000/1001`. */
|
|
534
|
+
static FPS_29_97 = new Framerate(30000, 1001);
|
|
535
|
+
/** 30 fps — `30/1`. */
|
|
536
|
+
static FPS_30 = new Framerate(30, 1);
|
|
537
|
+
/** 50 fps — `50/1`. */
|
|
538
|
+
static FPS_50 = new Framerate(50, 1);
|
|
539
|
+
/** 59.94 fps — `60000/1001`. */
|
|
540
|
+
static FPS_59_94 = new Framerate(60000, 1001);
|
|
541
|
+
/** 60 fps — `60/1`. */
|
|
542
|
+
static FPS_60 = new Framerate(60, 1);
|
|
543
|
+
/**
|
|
544
|
+
* Define a custom frame rate.
|
|
545
|
+
*
|
|
546
|
+
* @param numerator Numerator of the rate.
|
|
547
|
+
* @param denominator Denominator of the rate.
|
|
548
|
+
*/
|
|
549
|
+
static of(numerator, denominator) {
|
|
550
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(numerator) && (!Number.isInteger(numerator) || numerator <= 0)) {
|
|
551
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `FramerateNumerator`, `Frame rate numerator must be a positive integer, got ${numerator}`);
|
|
552
|
+
}
|
|
553
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(denominator) && (!Number.isInteger(denominator) || denominator <= 0)) {
|
|
554
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `FramerateDenominator`, `Frame rate denominator must be a positive integer, got ${denominator}`);
|
|
555
|
+
}
|
|
556
|
+
return new Framerate(numerator, denominator);
|
|
557
|
+
}
|
|
558
|
+
/** @internal */
|
|
559
|
+
_numeratorValue;
|
|
560
|
+
/** @internal */
|
|
561
|
+
_denominatorValue;
|
|
562
|
+
constructor(numerator, denominator) {
|
|
563
|
+
this._numeratorValue = numerator;
|
|
564
|
+
this._denominatorValue = denominator;
|
|
565
|
+
}
|
|
566
|
+
/** Returns the string value. */
|
|
567
|
+
toString() {
|
|
568
|
+
return `${this._numeratorValue}/${this._denominatorValue}`;
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Returns the number value.
|
|
572
|
+
* @internal
|
|
573
|
+
*/
|
|
574
|
+
_numerator() {
|
|
575
|
+
return this._numeratorValue;
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Returns the number value.
|
|
579
|
+
* @internal
|
|
580
|
+
*/
|
|
581
|
+
_denominator() {
|
|
582
|
+
return this._denominatorValue;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
exports.Framerate = Framerate;
|
|
586
|
+
/**
|
|
587
|
+
* The pixel aspect ratio (PAR) of the video.
|
|
588
|
+
*
|
|
589
|
+
* Use the predefined constants for standard ratios, or {@link PixelAspectRatio.of} for
|
|
590
|
+
* a custom ratio.
|
|
591
|
+
*/
|
|
592
|
+
class PixelAspectRatio {
|
|
593
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.PixelAspectRatio", version: "2.263.0-alpha.0" };
|
|
594
|
+
/** Square pixels (`1:1`). */
|
|
595
|
+
static SQUARE = new PixelAspectRatio(1, 1);
|
|
596
|
+
/**
|
|
597
|
+
* Define a pixel aspect ratio.
|
|
598
|
+
*
|
|
599
|
+
* @param numerator Numerator of the ratio.
|
|
600
|
+
* @param denominator Denominator of the ratio.
|
|
601
|
+
*/
|
|
602
|
+
static of(numerator, denominator) {
|
|
603
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(numerator) && (!Number.isInteger(numerator) || numerator <= 0)) {
|
|
604
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PixelAspectRatioNumerator`, `Pixel aspect ratio numerator must be a positive integer, got ${numerator}`);
|
|
605
|
+
}
|
|
606
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(denominator) && (!Number.isInteger(denominator) || denominator <= 0)) {
|
|
607
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PixelAspectRatioDenominator`, `Pixel aspect ratio denominator must be a positive integer, got ${denominator}`);
|
|
608
|
+
}
|
|
609
|
+
return new PixelAspectRatio(numerator, denominator);
|
|
610
|
+
}
|
|
611
|
+
/** @internal */
|
|
612
|
+
_numeratorValue;
|
|
613
|
+
/** @internal */
|
|
614
|
+
_denominatorValue;
|
|
615
|
+
/**
|
|
616
|
+
* @param numerator Numerator of the ratio.
|
|
617
|
+
* @param denominator Denominator of the ratio.
|
|
618
|
+
*/
|
|
619
|
+
constructor(numerator, denominator) {
|
|
620
|
+
this._numeratorValue = numerator;
|
|
621
|
+
this._denominatorValue = denominator;
|
|
622
|
+
}
|
|
623
|
+
/** Returns the string value in `numerator:denominator` form. */
|
|
624
|
+
toString() {
|
|
625
|
+
return `${this._numeratorValue}:${this._denominatorValue}`;
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* The numerator of the ratio.
|
|
629
|
+
* @internal
|
|
630
|
+
*/
|
|
631
|
+
_numerator() {
|
|
632
|
+
return this._numeratorValue;
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* The denominator of the ratio.
|
|
636
|
+
* @internal
|
|
637
|
+
*/
|
|
638
|
+
_denominator() {
|
|
639
|
+
return this._denominatorValue;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
exports.PixelAspectRatio = PixelAspectRatio;
|
|
643
|
+
/**
|
|
644
|
+
* Returns `true` when the given bitrate exceeds the specified tier's Mbps limit.
|
|
645
|
+
* Used by router input/output constructs to validate bitrate fits within the chosen tier.
|
|
646
|
+
*
|
|
647
|
+
* @param tierMbps The tier's bitrate limit in Mbps, or `undefined` for custom tiers.
|
|
648
|
+
* @param maximumBitrate The configured maximum bitrate.
|
|
649
|
+
* @returns `true` if the bitrate exceeds the tier limit; `false` otherwise (including custom tiers).
|
|
650
|
+
* @internal
|
|
651
|
+
*/
|
|
652
|
+
function exceedsRouterTierBitrate(tierMbps, maximumBitrate) {
|
|
653
|
+
if (tierMbps === undefined || maximumBitrate.isUnresolved())
|
|
654
|
+
return false;
|
|
655
|
+
return maximumBitrate.toBps() > tierMbps * 1_000_000;
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* Returns `true` when the given CIDR literal is a fully-open range — any `/0`
|
|
659
|
+
* prefix, covering both IPv4 (`0.0.0.0/0`) and IPv6 (`::/0`). Callers are
|
|
660
|
+
* expected to pre-check for token-encoded values, since an unresolved token
|
|
661
|
+
* cannot be inspected.
|
|
662
|
+
*
|
|
663
|
+
* @internal
|
|
664
|
+
*/
|
|
665
|
+
function isOpenCidr(cidr) {
|
|
666
|
+
return /\/0$/.test(cidr.trim());
|
|
667
|
+
}
|
|
668
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXFTQSxnQ0FLQztBQVFELGtDQUVDO0FBU0QsMERBVUM7QUFrVUQsc0RBb0NDO0FBTUQsOERBUUM7QUFNRCxrRUFPQztBQU9ELDhEQVFDO0FBT0QsMERBbUJDO0FBT0QsNERBV0M7QUFRRCxnRUFJQztBQThJRCw0REFHQztBQVVELGdDQUVDOzs7QUEzNkJELDZDQUFrRTtBQUVsRSxpREFBb0U7QUFHcEUsNEVBQTREO0FBRzVEOztHQUVHO0FBQ0gsTUFBYSxtQkFBbUI7SUF5Qk07O0lBeEJwQzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRTs7T0FFRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRTs7T0FFRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVsRTs7O09BR0c7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWE7UUFDNUIsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQ7O09BRUc7SUFDSCxZQUFvQyxLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtLQUFJO0lBRXJELCtCQUErQjtJQUN4QixRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ25COztBQTlCSCxrREErQkM7QUFFRDs7R0FFRztBQUNILE1BQWEsT0FBTztJQXFCa0I7O0lBcEJwQzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDOUQ7O09BRUc7SUFDSSxNQUFNLENBQVUsWUFBWSxHQUFHLElBQUksT0FBTyxDQUFDLGNB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R0c7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0tBQy9COztBQXJESCw0Q0FzREM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLFFBQTRCLEVBQUUsY0FBdUI7SUFDNUYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxZQUFZLEVBQUU7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRSxPQUFPLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLElBQVk7SUFDckMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJpdHJhdGUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBd3MsIFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSVNlY3VyaXR5R3JvdXAsIElTdWJuZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IEdyYW50LCBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSB7IElSb2xlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIEVuY3J5cHRpb24gQWxnb3JpdGhtcyB1c2VkIGluIEFXUyBFbGVtZW50YWwgTWVkaWFDb25uZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBFbmNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQUVTMTI4XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzEyOCA9IG5ldyBFbmNyeXB0aW9uQWxnb3JpdGhtKCdhZXMxMjgnKTtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQUVTMTkyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzE5MiA9IG5ldyBFbmNyeXB0aW9uQWxnb3JpdGhtKCdhZXMxOTInKTtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQUVTMjU2XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzI1NiA9IG5ldyBFbmNyeXB0aW9uQWxnb3JpdGhtKCdhZXMyNTYnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIGVuY3J5cHRpb24gYWxnb3JpdGhtIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBFbmNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gbmV3IEVuY3J5cHRpb25BbGdvcml0aG0odmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBLZXkgdHlwZXMgdXNlZCBhY3Jvc3MgQVdTIEVsZW1lbnRhbCBNZWRpYUNvbm5lY3RcbiAqL1xuZXhwb3J0IGNsYXNzIEtleVR5cGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBTdGF0aWMgS2V5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNUQVRJQ19LRVkgPSBuZXcgS2V5VHlwZSgnc3RhdGljLWtleScpO1xuICAvKipcbiAgICogT3B0aW9uIGZvciBTUlQgUGFzc3dvcmRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1JUX1BBU1NXT1JEID0gbmV3IEtleVR5cGUoJ3NydC1wYXNzd29yZCcpO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBjdXN0b20ga2V5IHR5cGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBrZXkgdHlwZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEtleVR5cGUge1xuICAgIHJldHVybiBuZXcgS2V5VHlwZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBrZXkgdHlwZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFN0YXRlIGNvbmZpZ3VyYXRpb24gdXNlZCBhY3Jvc3MgQVdTIEVsZW1lbnRhbCBNZWRpYUNvbm5lY3RcbiAqL1xuZXhwb3J0IGVudW0gU3RhdGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBFbmFibGVkXG4gICAqL1xuICBFTkFCTEVEPSdFTkFCTEVEJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRGlzYWJsZWRcbiAgICovXG4gIERJU0FCTEVEPSdESVNBQkxFRCcsXG59XG5cbi8qKlxuICogRGF5cyBvZiB0aGUgd2VlayBmb3Igc2NoZWR1bGVkIG1haW50ZW5hbmNlIHdpbmRvd3MuXG4gKlxuICogVXNlZCBieSBib3RoIEZsb3cgYW5kIFJvdXRlciBtYWludGVuYW5jZSBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gTWFpbnRlbmFuY2VEYXkge1xuICAvKiogTW9uZGF5ICovXG4gIE1PTkRBWT0nTU9OREFZJyxcbiAgLyoqIFR1ZXNkYXkgKi9cbiAgVFVFU0RBWT0nVFVFU0RBWScsXG4gIC8qKiBXZWRuZXNkYXkgKi9cbiAgV0VETkVTREFZPSdXRURORVNEQVknLFxuICAvKiogVGh1cnNkYXkgKi9cbiAgVEhVUlNEQVk9J1RIVVJTREFZJyxcbiAgLyoqIEZyaWRheSAqL1xuICBGUklEQVk9J0ZSSURBWScsXG4gIC8qKiBTYXR1cmRheSAqL1xuICBTQVRVUkRBWT0nU0FUVVJEQVknLFxuICAvKiogU3VuZGF5ICovXG4gIFNVTkRBWT0nU1VOREFZJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBicmlkZ2UgbmV0d29yayBzb3VyY2UgYW5kIG91dHB1dCBwcm90b2NvbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCcmlkZ2VQcm90b2NvbCB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFJUUC1GRUNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUlRQX0ZFQyA9IG5ldyBCcmlkZ2VQcm90b2NvbCgncnRwLWZlYycpO1xuICAvKipcbiAgICogT3B0aW9uIGZvciBSVFBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUlRQID0gbmV3IEJyaWRnZVByb3RvY29sKCdydHAnKTtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgVURQXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFVEUCA9IG5ldyBCcmlkZ2VQcm90b2NvbCgndWRwJyk7XG5cbiAgLyoqXG4gICAqIFVzZSBhIGN1c3RvbSBicmlkZ2UgcHJvdG9jb2wgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgcHJvdG9jb2wgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBCcmlkZ2VQcm90b2NvbCB7XG4gICAgcmV0dXJuIG5ldyBCcmlkZ2VQcm90b2NvbCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgcHJvdG9jb2wgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIEdhdGV3YXkgbmV0d29yay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHYXRld2F5TmV0d29ya0RlZmluZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrLiBVc2VkIHRvIHJlZmVyZW5jZSB0aGlzIG5ldHdvcmsgZnJvbSBicmlkZ2Ugc291cmNlc1xuICAgKiBhbmQgb3V0cHV0cywgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBuZXR3b3JrcyBvbiB0aGUgZ2F0ZXdheS5cbiAgICpcbiAgICogTWF4aW11bSA2NCBjaGFyYWN0ZXJzOyBhbHBoYW51bWVyaWMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBvbmx5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogQSB1bmlxdWUgSVAgYWRkcmVzcyByYW5nZSB0byB1c2UgZm9yIHRoaXMgbmV0d29yay4gTXVzdCBiZSBpbiBDSURSIG5vdGF0aW9uXG4gICAqIChmb3IgZXhhbXBsZSwgYDEwLjAuMC4wLzE2YCkuXG4gICAqL1xuICByZWFkb25seSBjaWRyQmxvY2s6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5ldHdvcmsgb24gYSBNZWRpYUNvbm5lY3QgR2F0ZXdheS5cbiAqXG4gKiBVc2Uge0BsaW5rIEdhdGV3YXlOZXR3b3JrLmRlZmluZX0gdG8gY3JlYXRlIGEgbmV0d29yayBhbmQgcmVmZXJlbmNlIGl0IGZyb21cbiAqIGdhdGV3YXksIGJyaWRnZSBzb3VyY2UsIGFuZCBicmlkZ2Ugb3V0cHV0IGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3QgcHJvZHVjdGlvbk5ldHdvcmsgPSBHYXRld2F5TmV0d29yay5kZWZpbmUoe1xuICogICAgICBuYW1lOiAncHJvZHVjdGlvbicsXG4gKiAgICAgIGNpZHJCbG9jazogJzEwLjAuMC4wLzE2JyxcbiAqICAgIH0pO1xuICovXG5leHBvcnQgY2xhc3MgR2F0ZXdheU5ldHdvcmsge1xuICAvKipcbiAgICogRGVmaW5lIGEgbmV3IGdhdGV3YXkgbmV0d29yay5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIG5ldHdvcmsgcHJvcGVydGllc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmUocHJvcHM6IEdhdGV3YXlOZXR3b3JrRGVmaW5lUHJvcHMpOiBHYXRld2F5TmV0d29yayB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubmFtZSkpIHtcbiAgICAgIGlmIChwcm9wcy5uYW1lLmxlbmd0aCA8IDEgfHwgcHJvcHMubmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEdhdGV3YXlOZXR3b3JrTmFtZUxlbmd0aGAsXG4gICAgICAgICAgYEdhdGV3YXkgbmV0d29yayBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLCBnb3QgJHtwcm9wcy5uYW1lLmxlbmd0aH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCEvXlthLXpBLVowLTlfLV0rJC8udGVzdChwcm9wcy5uYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEdhdGV3YXlOZXR3b3JrTmFtZUZvcm1hdGAsXG4gICAgICAgICAgYEdhdGV3YXkgbmV0d29yayBuYW1lIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMsIGdvdCAnJHtwcm9wcy5uYW1lfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgR2F0ZXdheU5ldHdvcmsocHJvcHMubmFtZSwgcHJvcHMuY2lkckJsb2NrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbmV0d29yay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIElQIGFkZHJlc3MgcmFuZ2UgdG8gdXNlIGZvciB0aGlzIG5ldHdvcmsgaW4gQ0lEUiBub3RhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaWRyQmxvY2s6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY2lkckJsb2NrOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY2lkckJsb2NrID0gY2lkckJsb2NrO1xuICB9XG59XG5cbi8qKlxuICogQnJpZGdlIG5ldHdvcmsgc291cmNlIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VOZXR3b3JrU291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIHNvdXJjZSBtdWx0aWNhc3QgSVAuXG4gICAqXG4gICAqIE11c3QgYmUgYSB2YWxpZCBNdWx0aWNhc3QgSVAgYWRkcmVzcy5cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpY2FzdElwOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZyByZWxhdGVkIHRvIHRoZSBtdWx0aWNhc3Qgc291cmNlLlxuICAgKlxuICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgc291cmNlIGZvciBzb3VyY2Utc3BlY2lmaWMgbXVsdGljYXN0IChTU00pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG11bHRpY2FzdCBzb3VyY2UgSVBcbiAgICovXG4gIHJlYWRvbmx5IG11bHRpY2FzdFNvdXJjZUlwPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgbmV0d29yayB0aGlzIHNvdXJjZSBsaXN0ZW5zIG9uLlxuICAgKlxuICAgKiBVc2Uge0BsaW5rIEdhdGV3YXlOZXR3b3JrLmRlZmluZX0gdG8gY3JlYXRlIHRoZSBuZXR3b3JrIGFuZCBwYXNzIHRoZSBzYW1lXG4gICAqIGluc3RhbmNlIHRvIHRoZSBnYXRld2F5IGFuZCB0byBlYWNoIHNvdXJjZSB0aGF0IHVzZXMgaXQuXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrOiBHYXRld2F5TmV0d29yaztcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIHNvdXJjZSBwb3J0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5ldHdvcmsgc291cmNlIHByb3RvY29sLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w6IEJyaWRnZVByb3RvY29sO1xufVxuXG4vKipcbiAqIEZhaWxvdmVyIE1vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIEZhaWxvdmVyTW9kZSB7XG4gIC8qKlxuICAgKiBNRVJHRSBjb21iaW5lcyB0aGUgc291cmNlIHN0cmVhbXMgaW50byBhIHNpbmdsZSBzdHJlYW0sIGFsbG93aW5nIGdyYWNlZnVsXG4gICAqIHJlY292ZXJ5IGZyb20gYW55IHNpbmdsZS1zb3VyY2UgbG9zcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVSR0UgPSBuZXcgRmFpbG92ZXJNb2RlKCdNRVJHRScpO1xuICAvKipcbiAgICogRkFJTE9WRVIgYWxsb3dzIHN3aXRjaGluZyBiZXR3ZWVuIGRpZmZlcmVudCBzdHJlYW1zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGQUlMT1ZFUiA9IG5ldyBGYWlsb3Zlck1vZGUoJ0ZBSUxPVkVSJyk7XG5cbiAgLyoqXG4gICAqIFVzZSBhIGN1c3RvbSBmYWlsb3ZlciBtb2RlIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmFpbG92ZXIgbW9kZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEZhaWxvdmVyTW9kZSB7XG4gICAgcmV0dXJuIG5ldyBGYWlsb3Zlck1vZGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmFpbG92ZXIgbW9kZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBSZW5kZXIgdGFncyBmb3IgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2VzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh0YWdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIHVwcGVyY2FzZSBlbnVtIHZhbHVlIHRvIHRpdGxlIGNhc2UgKGUuZy4gJ01PTkRBWScg4oaSICdNb25kYXknKS5cbiAqIFVzZWQgYXQgQ0ZOIGJvdW5kYXJpZXMgd2hlcmUgdGhlIEFQSSBleHBlY3RzIHRpdGxlLWNhc2VkIGRheSBuYW1lcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVGl0bGVDYXNlKGRheTogTWFpbnRlbmFuY2VEYXkpOiBzdHJpbmcge1xuICByZXR1cm4gZGF5LmNoYXJBdCgwKSArIGRheS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgbWFpbnRlbmFuY2Ugc3RhcnQgaG91ciBzdHJpbmcgaXMgaW4gSEg6MDAgZm9ybWF0ICgyNC1ob3VyLCBtaW51dGVzIG11c3QgYmUgMDApLlxuICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAdGhyb3dzIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIGlmIHRoZSBmb3JtYXQgaXMgaW52YWxpZFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWludGVuYW5jZVRpbWUodGltZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodGltZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCEvXihbMDFdXFxkfDJbMC0zXSk6MDAkLy50ZXN0KHRpbWUpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgbGl0YE1haW50ZW5hbmNlVGltZUZvcm1hdGAsXG4gICAgICBgTWFpbnRlbmFuY2UgdGltZSBtdXN0IGJlIGluIEhIOjAwIGZvcm1hdCAoMjQtaG91ciwgbWludXRlcyBtdXN0IGJlIDAwKSwgZ290ICcke3RpbWV9J2AsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE1lZGlhTGl2ZSBwaXBlbGluZSBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBNZWRpYUxpdmVQaXBlbGluZSB7XG4gIC8qKiBQaXBlbGluZSAwICovXG4gIFBJUEVMSU5FXzAgPSAnUElQRUxJTkVfMCcsXG4gIC8qKiBQaXBlbGluZSAxICovXG4gIFBJUEVMSU5FXzEgPSAnUElQRUxJTkVfMScsXG59XG5cbi8qKlxuICogTmV0d29yayBpbnRlcmZhY2Ugb3B0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya0ludGVyZmFjZSB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEVOQVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFTkEgPSBuZXcgTmV0d29ya0ludGVyZmFjZSgnZW5hJyk7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEVGQS5cbiAgICogRm9yIENESSBlbnN1cmUgeW91IHVzZSBFRkEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVGQSA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKCdlZmEnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIG5ldHdvcmsgaW50ZXJmYWNlIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV0d29yayBpbnRlcmZhY2Ugc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBOZXR3b3JrSW50ZXJmYWNlIHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtJbnRlcmZhY2UodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV0d29yayBpbnRlcmZhY2Ugc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBWUEMgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNJbnRlcmZhY2VDb25maWcge1xuICAvKipcbiAgICogVW5pcXVlIG5hbWUgZm9yIHRoaXMgVlBDIGludGVyZmFjZSB3aXRoaW4gdGhlIGZsb3cuIENhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogSURzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZXMuIFNldCB0aGlzIHdoZW4gaW1wb3J0aW5nIGV4aXN0aW5nIEVOSXMgdmlhXG4gICAqIGBWcGNJbnRlcmZhY2UuZnJvbU5ldHdvcmtJbnRlcmZhY2VzKClgOyBsZWF2ZSB1bnNldCB0byBoYXZlIE1lZGlhQ29ubmVjdCBjcmVhdGUgdGhlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBNZWRpYUNvbm5lY3QgY3JlYXRlcyBuZXR3b3JrIGludGVyZmFjZXMgYXV0b21hdGljYWxseVxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0ludGVyZmFjZUlkcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgbmV0d29yayBpbnRlcmZhY2UuIFVzZSBgRUZBYCBmb3IgQ0RJIHdvcmtmbG93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQ7IHdoZW4gb21pdHRlZCwgTWVkaWFDb25uZWN0IGFwcGxpZXMgTmV0d29ya0ludGVyZmFjZS5FTkEgYXQgZGVwbG95IHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtJbnRlcmZhY2VUeXBlPzogTmV0d29ya0ludGVyZmFjZTtcbiAgLyoqXG4gICAqIElBTSByb2xlIHRoYXQgTWVkaWFDb25uZWN0IGFzc3VtZXMgdG8gY3JlYXRlIEVOSXMgaW4geW91ciBhY2NvdW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cHMgdG8gYXBwbHkgdG8gdGhlIEVOSS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xuICAvKipcbiAgICogU3VibmV0IHdoZXJlIHRoZSBFTkkgaXMgY3JlYXRlZC4gTXVzdCBiZSBpbiB0aGUgc2FtZSBBdmFpbGFiaWxpdHkgWm9uZSBhcyB0aGUgZmxvdy5cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldDogSVN1Ym5ldDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIG5ldyBWUEMgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNJbnRlcmZhY2VEZWZpbmVQcm9wcyB7XG4gIC8qKlxuICAgKiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWUEMgaW50ZXJmYWNlIHdpdGhpbiB0aGUgZmxvdy4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24uXG4gICAqL1xuICByZWFkb25seSB2cGNJbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJQU0gcm9sZSB0aGF0IE1lZGlhQ29ubmVjdCBhc3N1bWVzIHRvIGNyZWF0ZSBFTklzIGluIHlvdXIgYWNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU6IElSb2xlO1xuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXBzIHRvIGFwcGx5IHRvIHRoZSBFTkkuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwczogSVNlY3VyaXR5R3JvdXBbXTtcbiAgLyoqXG4gICAqIFN1Ym5ldCB3aGVyZSB0aGUgRU5JIGlzIGNyZWF0ZWQuIE11c3QgYmUgaW4gdGhlIHNhbWUgQXZhaWxhYmlsaXR5IFpvbmUgYXMgdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXQ6IElTdWJuZXQ7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBuZXR3b3JrIGludGVyZmFjZS4gVXNlIGBFRkFgIGZvciBDREkgd29ya2Zsb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgd2hlbiBvbWl0dGVkLCBNZWRpYUNvbm5lY3QgYXBwbGllcyBOZXR3b3JrSW50ZXJmYWNlLkVOQSBhdCBkZXBsb3kgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0ludGVyZmFjZVR5cGU/OiBOZXR3b3JrSW50ZXJmYWNlO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgVlBDIEludGVyZmFjZSBmcm9tIGV4aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwY0ludGVyZmFjZUZyb21OZXR3b3JrSW50ZXJmYWNlc1Byb3BzIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZQQyBpbnRlcmZhY2Ugd2l0aGluIHRoZSBmbG93LiBDYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHZwY0ludGVyZmFjZU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIElBTSByb2xlIHRoYXQgTWVkaWFDb25uZWN0IGFzc3VtZXMgdG8gYWNjZXNzIHRoZSBFTklzLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cHMgYXBwbGllZCB0byB0aGUgZXhpc3RpbmcgRU5Jcy5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xuICAvKipcbiAgICogU3VibmV0IHdoZXJlIHRoZSBleGlzdGluZyBFTklzIGxpdmUuIE11c3QgYmUgaW4gdGhlIHNhbWUgQXZhaWxhYmlsaXR5IFpvbmUgYXMgdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXQ6IElTdWJuZXQ7XG4gIC8qKlxuICAgKiBJRHMgb2YgdGhlIHByZS1jcmVhdGVkIG5ldHdvcmsgaW50ZXJmYWNlcyB0byByZXVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtJbnRlcmZhY2VJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIFZQQyBJbnRlcmZhY2UgY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFZwY0ludGVyZmFjZSB7XG4gIC8qKlxuICAgKiBEZWZpbmUgYSBuZXcgVlBDIEludGVyZmFjZSBjb25maWd1cmF0aW9uLiBNZWRpYUNvbm5lY3Qgd2lsbCBjcmVhdGUgbmV0d29yayBpbnRlcmZhY2VzIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBWUEMgSW50ZXJmYWNlIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgVnBjSW50ZXJmYWNlQ29uZmlnIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZShwcm9wczogVnBjSW50ZXJmYWNlRGVmaW5lUHJvcHMpOiBWcGNJbnRlcmZhY2VDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBwcm9wcy52cGNJbnRlcmZhY2VOYW1lLFxuICAgICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBwcm9wcy5zZWN1cml0eUdyb3VwcyxcbiAgICAgIHN1Ym5ldDogcHJvcHMuc3VibmV0LFxuICAgICAgbmV0d29ya0ludGVyZmFjZVR5cGU6IHByb3BzLm5ldHdvcmtJbnRlcmZhY2VUeXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgVlBDIEludGVyZmFjZSBjb25maWd1cmF0aW9uIHVzaW5nIGV4aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIFZQQyBJbnRlcmZhY2UgcHJvcGVydGllcyB3aXRoIGV4aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlIElEc1xuICAgKiBAcmV0dXJucyBWcGNJbnRlcmZhY2VDb25maWcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU5ldHdvcmtJbnRlcmZhY2VzKHByb3BzOiBWcGNJbnRlcmZhY2VGcm9tTmV0d29ya0ludGVyZmFjZXNQcm9wcyk6IFZwY0ludGVyZmFjZUNvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHByb3BzLnZwY0ludGVyZmFjZU5hbWUsXG4gICAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgc2VjdXJpdHlHcm91cHM6IHByb3BzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0OiBwcm9wcy5zdWJuZXQsXG4gICAgICBuZXR3b3JrSW50ZXJmYWNlSWRzOiBwcm9wcy5uZXR3b3JrSW50ZXJmYWNlSWRzLFxuICAgIH07XG4gIH1cbn1cbi8qKlxuICogU3RhdGljIGtleSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgWml4aSBwcm90b2NvbCBzb3VyY2VzIGFuZCBvdXRwdXRzLFxuICogYW5kIGZsb3cgZW50aXRsZW1lbnRzLlxuICpcbiAqIFRoZSBzZWNyZXQgbXVzdCBsaXZlIGluIHRoZSBzYW1lIEFXUyBhY2NvdW50IGFuZCBSZWdpb24gYXMgdGhlIHJlc291cmNlIChzb3VyY2UsXG4gKiBvdXRwdXQsIG9yIGVudGl0bGVtZW50KSB0aGF0IHVzZXMgaXQuIE1lZGlhQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzLWFjY291bnQgb3JcbiAqIGNyb3NzLVJlZ2lvbiBzZWNyZXRzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvZW5jcnlwdGlvbi1zdGF0aWMta2V5LXNldC11cC5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Nyb3NzLXNlcnZpY2UtY29uZnVzZWQtZGVwdXR5LXByZXZlbnRpb24uaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0tleUVuY3J5cHRpb24ge1xuICAvKipcbiAgICogSUFNIHJvbGUgdGhhdCBNZWRpYUNvbm5lY3QgYXNzdW1lcyB0byBhY2Nlc3MgdGhlIFNlY3JldHMgTWFuYWdlciBzZWNyZXQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgcm9sZSBpcyB1c2VkIGFzLWlzOyB5b3UgbXVzdCBncmFudCBpdCB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zXG4gICAqIHlvdXJzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgc2NvcGVkIHJvbGUgaXMgYXV0by1jcmVhdGVkIHdpdGggcmVhZCBhY2Nlc3MgdG8gdGhlIHNlY3JldCAoaW5jbHVkaW5nXG4gICAqIGBrbXM6RGVjcnlwdGAgZm9yIGEgY3VzdG9tZXItbWFuYWdlZCBrZXkpIGFuZCBhIGNvbmZ1c2VkLWRlcHV0eSB0cnVzdCBjb25kaXRpb24uIFNlZVxuICAgKiB0aGUgKipFbmNyeXB0aW9uKiogc2VjdGlvbiBvZiB0aGUgbW9kdWxlIFJFQURNRSBmb3IgdGhlIGdlbmVyYXRlZCB0cnVzdCBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBlbmNyeXB0aW9uIGtleS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldDogSVNlY3JldDtcbiAgLyoqXG4gICAqIFRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBhbGdvcml0aG06IEVuY3J5cHRpb25BbGdvcml0aG07XG59XG5cbi8qKlxuICogU1JUIHBhc3N3b3JkIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBTUlQgTGlzdGVuZXIgYW5kIFNSVCBDYWxsZXJcbiAqIHNvdXJjZXMgYW5kIG91dHB1dHMgb24gZmxvd3MuXG4gKlxuICogVGhlIHNlY3JldCBtdXN0IGxpdmUgaW4gdGhlIHNhbWUgQVdTIGFjY291bnQgYW5kIFJlZ2lvbiBhcyB0aGUgcmVzb3VyY2UgKHNvdXJjZSBvclxuICogb3V0cHV0KSB0aGF0IHVzZXMgaXQuIE1lZGlhQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzLWFjY291bnQgb3IgY3Jvc3MtUmVnaW9uXG4gKiBzZWNyZXRzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvZW5jcnlwdGlvbi1zcnQtcGFzc3dvcmQtc2V0LXVwLmh0bWxcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvY3Jvc3Mtc2VydmljZS1jb25mdXNlZC1kZXB1dHktcHJldmVudGlvbi5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3J0UGFzc3dvcmRFbmNyeXB0aW9uIHtcbiAgLyoqXG4gICAqIElBTSByb2xlIHRoYXQgTWVkaWFDb25uZWN0IGFzc3VtZXMgdG8gYWNjZXNzIHRoZSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgdGhlIHJvbGUgaXMgdXNlZCBhcy1pczsgeW91IG11c3QgZ3JhbnQgaXQgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uc1xuICAgKiB5b3Vyc2VsZi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHNjb3BlZCByb2xlIGlzIGF1dG8tY3JlYXRlZCB3aXRoIHJlYWQgYWNjZXNzIHRvIHRoZSBzZWNyZXQgYW5kIGFcbiAgICogY29uZnVzZWQtZGVwdXR5IHRydXN0IGNvbmRpdGlvbi4gU2VlIHRoZSAqKkVuY3J5cHRpb24qKiBzZWN0aW9uIG9mIHRoZSBtb2R1bGUgUkVBRE1FXG4gICAqIGZvciB0aGUgZ2VuZXJhdGVkIHRydXN0IHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBJUm9sZTtcbiAgLyoqXG4gICAqIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgY29udGFpbmluZyB0aGUgU1JUIHBhc3NwaHJhc2UuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ6IElTZWNyZXQ7XG59XG5cbi8qKlxuICogVHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHJvdXRlciBpbnRlZ3JhdGlvbnMg4oCUIHNlY3VyaW5nIHRoZSBsaW5rIGJldHdlZW4gYVxuICogcm91dGVyIGFuZCBhIGZsb3cgb3IgYSBNZWRpYUxpdmUgY2hhbm5lbC9pbnB1dC4gVXNlcyBBV1MgU2VjcmV0cyBNYW5hZ2VyIGZvciBrZXlcbiAqIG1hbmFnZW1lbnQuXG4gKlxuICogVGhlIHNlY3JldCBtdXN0IGxpdmUgaW4gdGhlIHNhbWUgQVdTIGFjY291bnQgYW5kIFJlZ2lvbiBhcyB0aGUgY29uc3VtaW5nIHJlc291cmNlLlxuICogTWVkaWFDb25uZWN0IGRvZXMgbm90IHN1cHBvcnQgY3Jvc3MtYWNjb3VudCBvciBjcm9zcy1SZWdpb24gc2VjcmV0cy5cbiAqXG4gKiAqKlRydXN0LXBvbGljeSBzY29wZSBvbiByb3V0ZXJzLioqIFJvdXRlciBJL08gaWRzIGFyZSBzZXJ2aWNlLWdlbmVyYXRlZCAodW5rbm93biBhdCBzeW50aFxuICogdGltZSksIGFuZCBwaW5uaW5nIHRoZSBsaXZlIEFSTiB3b3VsZCBjcmVhdGUgYSBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGN5Y2xlIOKAlCBzbyB0aGVcbiAqIGF1dG8tY3JlYXRlZCByb2xlIHBpbnMgYGF3czpTb3VyY2VBcm5gIHRvIGEgd2lsZGNhcmRlZCBBUk4gKGBhcm46Li4uOnJvdXRlcklucHV0OipgIC9cbiAqIGBhcm46Li4uOnJvdXRlck91dHB1dDoqYCkgcGx1cyBgYXdzOlNvdXJjZUFjY291bnRgLiBUbyBwaW4gYSB0aWdodGVyIHRydXN0IHBvbGljeSwgc3VwcGx5XG4gKiB5b3VyIG93biBgcm9sZWAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFjb25uZWN0L2xhdGVzdC91Zy9jcm9zcy1zZXJ2aWNlLWNvbmZ1c2VkLWRlcHV0eS1wcmV2ZW50aW9uLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2l0RW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBJQU0gcm9sZSB0aGF0IE1lZGlhQ29ubmVjdCBhc3N1bWVzIHRvIGFjY2VzcyB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldC5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIHRoZSByb2xlIGlzIHVzZWQgYXMtaXM7IHlvdSBtdXN0IGdyYW50IGl0IHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbnNcbiAgICogeW91cnNlbGYuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBzY29wZWQgcm9sZSBpcyBhdXRvLWNyZWF0ZWQgd2l0aCByZWFkIGFjY2VzcyB0byB0aGUgc2VjcmV0IGFuZCBhXG4gICAqIGNvbmZ1c2VkLWRlcHV0eSB0cnVzdCBjb25kaXRpb24uIFNlZSB0aGUgKipFbmNyeXB0aW9uKiogc2VjdGlvbiBvZiB0aGUgbW9kdWxlIFJFQURNRVxuICAgKiBmb3IgdGhlIGdlbmVyYXRlZCB0cnVzdCBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHRyYW5zaXQgZW5jcnlwdGlvbiBrZXkuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ6IElTZWNyZXQ7XG59XG5cbi8qKlxuICogU1JUIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3Igcm91dGVyIGlucHV0cyBhbmQgb3V0cHV0cyAoU1JUIExpc3RlbmVyIGFuZCBTUlRcbiAqIENhbGxlcikuIFVzZXMgQVdTIFNlY3JldHMgTWFuYWdlciBmb3Iga2V5IG1hbmFnZW1lbnQuIERpc3RpbmN0IGZyb21cbiAqIHtAbGluayBTcnRQYXNzd29yZEVuY3J5cHRpb259LCB3aGljaCBpcyB1c2VkIGZvciBmbG93IHNvdXJjZXMgYW5kIG91dHB1dHMuXG4gKlxuICogVGhlIHNlY3JldCBtdXN0IGxpdmUgaW4gdGhlIHNhbWUgQVdTIGFjY291bnQgYW5kIFJlZ2lvbiBhcyB0aGUgcm91dGVyIEkvTyB0aGF0IHVzZXNcbiAqIGl0LiBNZWRpYUNvbm5lY3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9zcy1hY2NvdW50IG9yIGNyb3NzLVJlZ2lvbiBzZWNyZXRzLlxuICpcbiAqICoqVHJ1c3QtcG9saWN5IHNjb3BlIG9uIHJvdXRlcnMuKiogUm91dGVyIEkvTyBpZHMgYXJlIHNlcnZpY2UtZ2VuZXJhdGVkICh1bmtub3duIGF0IHN5bnRoXG4gKiB0aW1lKSwgYW5kIHBpbm5pbmcgdGhlIGxpdmUgQVJOIHdvdWxkIGNyZWF0ZSBhIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUg4oCUIHNvIHRoZVxuICogYXV0by1jcmVhdGVkIHJvbGUgcGlucyBgYXdzOlNvdXJjZUFybmAgdG8gYSB3aWxkY2FyZGVkIEFSTiAoYGFybjouLi46cm91dGVySW5wdXQ6KmAgL1xuICogYGFybjouLi46cm91dGVyT3V0cHV0OipgKSBwbHVzIGBhd3M6U291cmNlQWNjb3VudGAuIFRvIHBpbiBhIHRpZ2h0ZXIgdHJ1c3QgcG9saWN5LCBzdXBwbHlcbiAqIHlvdXIgb3duIGByb2xlYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Nyb3NzLXNlcnZpY2UtY29uZnVzZWQtZGVwdXR5LXByZXZlbnRpb24uaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlclNydEVuY3J5cHRpb24ge1xuICAvKipcbiAgICogSUFNIHJvbGUgdGhhdCBNZWRpYUNvbm5lY3QgYXNzdW1lcyB0byBhY2Nlc3MgdGhlIFNlY3JldHMgTWFuYWdlciBzZWNyZXQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgcm9sZSBpcyB1c2VkIGFzLWlzOyB5b3UgbXVzdCBncmFudCBpdCB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zXG4gICAqIHlvdXJzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgc2NvcGVkIHJvbGUgaXMgYXV0by1jcmVhdGVkIHdpdGggcmVhZCBhY2Nlc3MgdG8gdGhlIHNlY3JldCBhbmQgYVxuICAgKiBjb25mdXNlZC1kZXB1dHkgdHJ1c3QgY29uZGl0aW9uLiBTZWUgdGhlICoqRW5jcnlwdGlvbioqIHNlY3Rpb24gb2YgdGhlIG1vZHVsZSBSRUFETUVcbiAgICogZm9yIHRoZSBnZW5lcmF0ZWQgdHJ1c3QgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IElSb2xlO1xuICAvKipcbiAgICogU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHRoZSBTUlQgcGFzc3BocmFzZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldDogSVNlY3JldDtcbn1cblxuLyoqXG4gKiBFbmNyeXB0aW9uIGtleSB0eXBlIGZvciB0cmFuc2l0IGVuY3J5cHRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZW51bSBFbmNyeXB0aW9uS2V5VHlwZSB7XG4gIFNFQ1JFVFNfTUFOQUdFUj0nU0VDUkVUU19NQU5BR0VSJyxcbiAgQVVUT01BVElDPSdBVVRPTUFUSUMnLFxufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gSUFNIHJvbGUgZm9yIE1lZGlhQ29ubmVjdCB0byBhY2Nlc3MgYSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LiBSZXR1cm5zIHRoZVxuICogdXNlci1wcm92aWRlZCBgcm9sZWAgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGF1dG8tY3JlYXRlcyBhIHNjb3BlZCByb2xlOiBpbmxpbmUgc2VjcmV0IHJlYWQsXG4gKiBga21zOkRlY3J5cHRgIHdoZW4gdGhlIHNlY3JldCBoYXMgYSBDTUssIGFuZCBhIHRydXN0IHBvbGljeSB3aXRoIGBhd3M6U291cmNlQWNjb3VudGBcbiAqIChwbHVzIGBhd3M6U291cmNlQXJuYCB3aGVuIGBzb3VyY2VBcm5gIGlzIGdpdmVuKS4gVGhlIHJldHVybmVkIGBncmFudGAgbGV0cyBjYWxsZXJzIG9yZGVyXG4gKiB0aGUgcm9sZSdzIHNlY3JldC1yZWFkIHBvbGljeSBiZWZvcmUgdGhlIGNvbnN1bWluZyByZXNvdXJjZSDigJQgcmVxdWlyZWQgZm9yIHJvdXRlciBJL08uXG4gKlxuICogQSBwcm92aWRlZCByb2xlIGlzIHVzZWQgYXMtaXMgYW5kIGlzIG5vdCBncmFudGVkIHNlY3JldCBhY2Nlc3Mg4oCUIHRoZSBjYWxsZXIgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyBpdCBjYW4gcmVhZCB0aGUgc2VjcmV0IChhbmQgZGVjcnlwdCBpdHMgS01TIGtleSwgaWYgYW55KS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Nyb3NzLXNlcnZpY2UtY29uZnVzZWQtZGVwdXR5LXByZXZlbnRpb24uaHRtbFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRW5jcnlwdGlvblJvbGUoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBzdHJpbmcsXG4gIHJvbGU6IElSb2xlIHwgdW5kZWZpbmVkLFxuICBzZWNyZXQ6IElTZWNyZXQsXG4gIHNvdXJjZUFybj86IHN0cmluZyxcbik6IHsgcm9sZTogSVJvbGU7IGdyYW50PzogR3JhbnQgfSB7XG4gIGlmIChyb2xlKSByZXR1cm4geyByb2xlIH07XG5cbiAgY29uc3QgY29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gICAgU3RyaW5nRXF1YWxzOiB7ICdhd3M6U291cmNlQWNjb3VudCc6IEF3cy5BQ0NPVU5UX0lEIH0sXG4gIH07XG4gIGlmIChzb3VyY2VBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMuQXJuTGlrZSA9IHsgJ2F3czpTb3VyY2VBcm4nOiBzb3VyY2VBcm4gfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBuZXcgUm9sZShzY29wZSwgaWQsIHtcbiAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdtZWRpYWNvbm5lY3QuYW1hem9uYXdzLmNvbScsIHsgY29uZGl0aW9ucyB9KSxcbiAgICBkZXNjcmlwdGlvbjogJ0F1dG8tZ2VuZXJhdGVkIE1lZGlhQ29ubmVjdCByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGVuY3J5cHRpb24gc2VjcmV0JyxcbiAgfSk7XG5cbiAgLy8gR3JhbnQgaGVscGVyOiBhZGRzIHNlY3JldCByZWFkIChHZXRTZWNyZXRWYWx1ZS9EZXNjcmliZVNlY3JldCkgcGx1cyBrbXM6RGVjcnlwdFxuICAvLyAod2l0aCBhIGttczpWaWFTZXJ2aWNlIGNvbmRpdGlvbikgd2hlbiB0aGUgc2VjcmV0IHVzZXMgYSBjdXN0b21lci1tYW5hZ2VkIGtleS5cbiAgY29uc3QgcmVhZEdyYW50ID0gc2VjcmV0LmdyYW50UmVhZChjcmVhdGVkKTtcblxuICAvLyBncmFudFJlYWQgY292ZXJzIDIgb2YgdGhlIDQgc2VjcmV0LXJlYWQgYWN0aW9ucyBNZWRpYUNvbm5lY3QncyBwb2xpY3kgbmVlZHM7IGFkZCB0aGVcbiAgLy8gb3RoZXIgMiwgc2NvcGVkIHRvIHRoZSBzYW1lIHNlY3JldC4gKFNraXBwaW5nIHRoZSBkb2MncyBgTGlzdFNlY3JldHNgIOKAlCBpdCBuZWVkc1xuICAvLyBgUmVzb3VyY2U6ICpgIGFuZCBpc24ndCByZXF1aXJlZCB0byByZWFkIGEga25vd24gc2VjcmV0LilcbiAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvaWFtLXBvbGljeS1leGFtcGxlcy1hc20tc2VjcmV0cy5odG1sXG4gIGNvbnN0IGV4dHJhR3JhbnQgPSBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgZ3JhbnRlZTogY3JlYXRlZCxcbiAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFJlc291cmNlUG9saWN5JywgJ3NlY3JldHNtYW5hZ2VyOkxpc3RTZWNyZXRWZXJzaW9uSWRzJ10sXG4gICAgcmVzb3VyY2VBcm5zOiBbc2VjcmV0LnNlY3JldEFybl0sXG4gIH0pO1xuXG4gIHJldHVybiB7IHJvbGU6IGNyZWF0ZWQsIGdyYW50OiByZWFkR3JhbnQuY29tYmluZShleHRyYUdyYW50KSB9O1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgQ0ZOIHN0YXRpYy1rZXkgZW5jcnlwdGlvbiBibG9jaywgYXV0by1jcmVhdGluZyBhIHJvbGUgd2hlbiBub25lIGlzIHN1cHBsaWVkLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTdGF0aWNLZXlFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGVuY3J5cHRpb246IFN0YXRpY0tleUVuY3J5cHRpb24sIHNvdXJjZUFybj86IHN0cmluZykge1xuICBjb25zdCB7IHJvbGUgfSA9IHJlc29sdmVFbmNyeXB0aW9uUm9sZShzY29wZSwgJ0VuY3J5cHRpb25Sb2xlJywgZW5jcnlwdGlvbi5yb2xlLCBlbmNyeXB0aW9uLnNlY3JldCwgc291cmNlQXJuKTtcbiAgcmV0dXJuIHtcbiAgICBrZXlUeXBlOiBLZXlUeXBlLlNUQVRJQ19LRVkudmFsdWUsXG4gICAgcm9sZUFybjogcm9sZS5yb2xlQXJuLFxuICAgIHNlY3JldEFybjogZW5jcnlwdGlvbi5zZWNyZXQuc2VjcmV0QXJuLFxuICAgIGFsZ29yaXRobTogZW5jcnlwdGlvbi5hbGdvcml0aG0udmFsdWUsXG4gIH07XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBDRk4gU1JULXBhc3N3b3JkIGVuY3J5cHRpb24gYmxvY2ssIGF1dG8tY3JlYXRpbmcgYSByb2xlIHdoZW4gbm9uZSBpcyBzdXBwbGllZC5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU3J0UGFzc3dvcmRFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGVuY3J5cHRpb246IFNydFBhc3N3b3JkRW5jcnlwdGlvbiwgc291cmNlQXJuPzogc3RyaW5nKSB7XG4gIGNvbnN0IHsgcm9sZSB9ID0gcmVzb2x2ZUVuY3J5cHRpb25Sb2xlKHNjb3BlLCAnRW5jcnlwdGlvblJvbGUnLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pO1xuICByZXR1cm4ge1xuICAgIGtleVR5cGU6IEtleVR5cGUuU1JUX1BBU1NXT1JELnZhbHVlLFxuICAgIHJvbGVBcm46IHJvbGUucm9sZUFybixcbiAgICBzZWNyZXRBcm46IGVuY3J5cHRpb24uc2VjcmV0LnNlY3JldEFybixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgdGhlIENGTiByb3V0ZXIgU1JUIGVuY3J5cHRpb24gYmxvY2sgKGlubmVyIGBlbmNyeXB0aW9uS2V5YCBvYmplY3QpLFxuICogYXV0by1jcmVhdGluZyBhIHJvbGUgd2hlbiBub25lIGlzIHN1cHBsaWVkLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJSb3V0ZXJTcnRFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGVuY3J5cHRpb246IFJvdXRlclNydEVuY3J5cHRpb24sIHNvdXJjZUFybj86IHN0cmluZykge1xuICBjb25zdCB7IHJvbGUgfSA9IHJlc29sdmVFbmNyeXB0aW9uUm9sZShzY29wZSwgaWQsIGVuY3J5cHRpb24ucm9sZSwgZW5jcnlwdGlvbi5zZWNyZXQsIHNvdXJjZUFybik7XG4gIHJldHVybiB7XG4gICAgZW5jcnlwdGlvbktleToge1xuICAgICAgcm9sZUFybjogcm9sZS5yb2xlQXJuLFxuICAgICAgc2VjcmV0QXJuOiBlbmNyeXB0aW9uLnNlY3JldC5zZWNyZXRBcm4sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgdGhlIENGTiB0cmFuc2l0IGVuY3J5cHRpb24gYmxvY2s6IFNFQ1JFVFNfTUFOQUdFUiAoYXV0by1jcmVhdGluZyBhIHJvbGUgd2hlblxuICogbm9uZSBpcyBzdXBwbGllZCkgd2hlbiBgZW5jcnlwdGlvbmAgaXMgZ2l2ZW4sIG90aGVyd2lzZSB0aGUgQVVUT01BVElDIGRlZmF1bHQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRyYW5zaXRFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGVuY3J5cHRpb24/OiBUcmFuc2l0RW5jcnlwdGlvbiwgc291cmNlQXJuPzogc3RyaW5nKSB7XG4gIGlmIChlbmNyeXB0aW9uKSB7XG4gICAgY29uc3QgeyByb2xlIH0gPSByZXNvbHZlRW5jcnlwdGlvblJvbGUoc2NvcGUsIGlkLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pO1xuICAgIHJldHVybiB7XG4gICAgICBlbmNyeXB0aW9uS2V5Q29uZmlndXJhdGlvbjoge1xuICAgICAgICBzZWNyZXRzTWFuYWdlcjoge1xuICAgICAgICAgIHJvbGVBcm46IHJvbGUucm9sZUFybixcbiAgICAgICAgICBzZWNyZXRBcm46IGVuY3J5cHRpb24uc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uS2V5VHlwZTogRW5jcnlwdGlvbktleVR5cGUuU0VDUkVUU19NQU5BR0VSLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbmNyeXB0aW9uS2V5VHlwZTogRW5jcnlwdGlvbktleVR5cGUuQVVUT01BVElDLFxuICAgIGVuY3J5cHRpb25LZXlDb25maWd1cmF0aW9uOiB7XG4gICAgICBhdXRvbWF0aWM6IHt9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0cmFuc2l0IGVuY3J5cHRpb24gdG8gaXRzIENGTiBjb25maWcgcGx1cyB0aGUgYXV0by1jcmVhdGVkIHJvbGUncyBzZWNyZXQtcmVhZFxuICogZ3JhbnQgKHdoZW4gYSByb2xlIHdhcyBhdXRvLWNyZWF0ZWQpLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHJhbnNpdEVuY3J5cHRpb24oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgZW5jcnlwdGlvbj86IFRyYW5zaXRFbmNyeXB0aW9uLCBzb3VyY2VBcm4/OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBlbmNyeXB0aW9uXG4gICAgPyByZXNvbHZlRW5jcnlwdGlvblJvbGUoc2NvcGUsIGlkLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbmZpZyA9IHJlbmRlclRyYW5zaXRFbmNyeXB0aW9uKFxuICAgIHNjb3BlLFxuICAgIGlkLFxuICAgIGVuY3J5cHRpb24gJiYgcmVzb2x2ZWQgPyB7IC4uLmVuY3J5cHRpb24sIHJvbGU6IHJlc29sdmVkLnJvbGUgfSA6IGVuY3J5cHRpb24sXG4gICAgc291cmNlQXJuLFxuICApO1xuICByZXR1cm4geyBjb25maWcsIGdyYW50OiByZXNvbHZlZD8uZ3JhbnQgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHJvdXRlciBTUlQgZW5jcnlwdGlvbiB0byBpdHMgQ0ZOIGNvbmZpZyBwbHVzIHRoZSBhdXRvLWNyZWF0ZWQgcm9sZSdzIHNlY3JldC1yZWFkXG4gKiBncmFudCAod2hlbiBhIHJvbGUgd2FzIGF1dG8tY3JlYXRlZCksIHNvIHRoZSBjb25zdW1pbmcgcm91dGVyIEkvTyBjYW4gb3JkZXIgaXQgYmVmb3JlXG4gKiBpdHNlbGYuIFNlZSB7QGxpbmsgcmVzb2x2ZVRyYW5zaXRFbmNyeXB0aW9ufSBmb3Igd2h5IHRoZSBvcmRlcmluZyBtYXR0ZXJzLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUm91dGVyU3J0RW5jcnlwdGlvbihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBlbmNyeXB0aW9uOiBSb3V0ZXJTcnRFbmNyeXB0aW9uLCBzb3VyY2VBcm4/OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRW5jcnlwdGlvblJvbGUoc2NvcGUsIGlkLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pO1xuICBjb25zdCBjb25maWcgPSByZW5kZXJSb3V0ZXJTcnRFbmNyeXB0aW9uKHNjb3BlLCBpZCwgeyAuLi5lbmNyeXB0aW9uLCByb2xlOiByZXNvbHZlZC5yb2xlIH0sIHNvdXJjZUFybik7XG4gIHJldHVybiB7IGNvbmZpZywgZ3JhbnQ6IHJlc29sdmVkLmdyYW50IH07XG59XG5cbi8qKlxuICogQSB2aWRlbyBmcmFtZSByYXRlIGV4cHJlc3NlZCBhcyBhIHJhdGlvbmFsIG51bWJlciAobnVtZXJhdG9yL2Rlbm9taW5hdG9yKS5cbiAqXG4gKiBVc2UgdGhlIHByZWRlZmluZWQgY29uc3RhbnRzIGZvciBzdGFuZGFyZCByYXRlcywgb3Ige0BsaW5rIEZyYW1lcmF0ZS5vZn0gZm9yIGEgY3VzdG9tIHJhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGcmFtZXJhdGUge1xuICAvKiogMjQgZnBzIChjaW5lbWEpIOKAlCBgMjQvMWAuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlBTXzI0ID0gbmV3IEZyYW1lcmF0ZSgyNCwgMSk7XG4gIC8qKiAyNSBmcHMg4oCUIGAyNS8xYC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGUFNfMjUgPSBuZXcgRnJhbWVyYXRlKDI1LCAxKTtcbiAgLyoqIDI5Ljk3IGZwcyDigJQgYDMwMDAwLzEwMDFgLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZQU18yOV85NyA9IG5ldyBGcmFtZXJhdGUoMzAwMDAsIDEwMDEpO1xuICAvKiogMzAgZnBzIOKAlCBgMzAvMWAuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlBTXzMwID0gbmV3IEZyYW1lcmF0ZSgzMCwgMSk7XG4gIC8qKiA1MCBmcHMg4oCUIGA1MC8xYC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGUFNfNTAgPSBuZXcgRnJhbWVyYXRlKDUwLCAxKTtcbiAgLyoqIDU5Ljk0IGZwcyDigJQgYDYwMDAwLzEwMDFgLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZQU181OV85NCA9IG5ldyBGcmFtZXJhdGUoNjAwMDAsIDEwMDEpO1xuICAvKiogNjAgZnBzIOKAlCBgNjAvMWAuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlBTXzYwID0gbmV3IEZyYW1lcmF0ZSg2MCwgMSk7XG5cbiAgLyoqXG4gICAqIERlZmluZSBhIGN1c3RvbSBmcmFtZSByYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gbnVtZXJhdG9yIE51bWVyYXRvciBvZiB0aGUgcmF0ZS5cbiAgICogQHBhcmFtIGRlbm9taW5hdG9yIERlbm9taW5hdG9yIG9mIHRoZSByYXRlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcik6IEZyYW1lcmF0ZSB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQobnVtZXJhdG9yKSAmJiAoIU51bWJlci5pc0ludGVnZXIobnVtZXJhdG9yKSB8fCBudW1lcmF0b3IgPD0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRnJhbWVyYXRlTnVtZXJhdG9yYCwgYEZyYW1lIHJhdGUgbnVtZXJhdG9yIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3QgJHtudW1lcmF0b3J9YCk7XG4gICAgfVxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGRlbm9taW5hdG9yKSAmJiAoIU51bWJlci5pc0ludGVnZXIoZGVub21pbmF0b3IpIHx8IGRlbm9taW5hdG9yIDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEZyYW1lcmF0ZURlbm9taW5hdG9yYCwgYEZyYW1lIHJhdGUgZGVub21pbmF0b3IgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGdvdCAke2Rlbm9taW5hdG9yfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZyYW1lcmF0ZShudW1lcmF0b3IsIGRlbm9taW5hdG9yKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbnVtZXJhdG9yVmFsdWU6IG51bWJlcjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZW5vbWluYXRvclZhbHVlOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcikge1xuICAgIHRoaXMuX251bWVyYXRvclZhbHVlID0gbnVtZXJhdG9yO1xuICAgIHRoaXMuX2Rlbm9taW5hdG9yVmFsdWUgPSBkZW5vbWluYXRvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUuICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLl9udW1lcmF0b3JWYWx1ZX0vJHt0aGlzLl9kZW5vbWluYXRvclZhbHVlfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIHZhbHVlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfbnVtZXJhdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWVyYXRvclZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciB2YWx1ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2Rlbm9taW5hdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlbm9taW5hdG9yVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcGl4ZWwgYXNwZWN0IHJhdGlvIChQQVIpIG9mIHRoZSB2aWRlby5cbiAqXG4gKiBVc2UgdGhlIHByZWRlZmluZWQgY29uc3RhbnRzIGZvciBzdGFuZGFyZCByYXRpb3MsIG9yIHtAbGluayBQaXhlbEFzcGVjdFJhdGlvLm9mfSBmb3JcbiAqIGEgY3VzdG9tIHJhdGlvLlxuICovXG5leHBvcnQgY2xhc3MgUGl4ZWxBc3BlY3RSYXRpbyB7XG4gIC8qKiBTcXVhcmUgcGl4ZWxzIChgMToxYCkuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1FVQVJFID0gbmV3IFBpeGVsQXNwZWN0UmF0aW8oMSwgMSk7XG5cbiAgLyoqXG4gICAqIERlZmluZSBhIHBpeGVsIGFzcGVjdCByYXRpby5cbiAgICpcbiAgICogQHBhcmFtIG51bWVyYXRvciBOdW1lcmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKiBAcGFyYW0gZGVub21pbmF0b3IgRGVub21pbmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcik6IFBpeGVsQXNwZWN0UmF0aW8ge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKG51bWVyYXRvcikgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bWVyYXRvcikgfHwgbnVtZXJhdG9yIDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFBpeGVsQXNwZWN0UmF0aW9OdW1lcmF0b3JgLCBgUGl4ZWwgYXNwZWN0IHJhdGlvIG51bWVyYXRvciBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgZ290ICR7bnVtZXJhdG9yfWApO1xuICAgIH1cbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChkZW5vbWluYXRvcikgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRlbm9taW5hdG9yKSB8fCBkZW5vbWluYXRvciA8PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBQaXhlbEFzcGVjdFJhdGlvRGVub21pbmF0b3JgLCBgUGl4ZWwgYXNwZWN0IHJhdGlvIGRlbm9taW5hdG9yIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3QgJHtkZW5vbWluYXRvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQaXhlbEFzcGVjdFJhdGlvKG51bWVyYXRvciwgZGVub21pbmF0b3IpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9udW1lcmF0b3JWYWx1ZTogbnVtYmVyO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlbm9taW5hdG9yVmFsdWU6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIG51bWVyYXRvciBOdW1lcmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKiBAcGFyYW0gZGVub21pbmF0b3IgRGVub21pbmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcikge1xuICAgIHRoaXMuX251bWVyYXRvclZhbHVlID0gbnVtZXJhdG9yO1xuICAgIHRoaXMuX2Rlbm9taW5hdG9yVmFsdWUgPSBkZW5vbWluYXRvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgaW4gYG51bWVyYXRvcjpkZW5vbWluYXRvcmAgZm9ybS4gKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuX251bWVyYXRvclZhbHVlfToke3RoaXMuX2Rlbm9taW5hdG9yVmFsdWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtZXJhdG9yIG9mIHRoZSByYXRpby5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX251bWVyYXRvcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9udW1lcmF0b3JWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVub21pbmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZGVub21pbmF0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGVub21pbmF0b3JWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGdpdmVuIGJpdHJhdGUgZXhjZWVkcyB0aGUgc3BlY2lmaWVkIHRpZXIncyBNYnBzIGxpbWl0LlxuICogVXNlZCBieSByb3V0ZXIgaW5wdXQvb3V0cHV0IGNvbnN0cnVjdHMgdG8gdmFsaWRhdGUgYml0cmF0ZSBmaXRzIHdpdGhpbiB0aGUgY2hvc2VuIHRpZXIuXG4gKlxuICogQHBhcmFtIHRpZXJNYnBzIFRoZSB0aWVyJ3MgYml0cmF0ZSBsaW1pdCBpbiBNYnBzLCBvciBgdW5kZWZpbmVkYCBmb3IgY3VzdG9tIHRpZXJzLlxuICogQHBhcmFtIG1heGltdW1CaXRyYXRlIFRoZSBjb25maWd1cmVkIG1heGltdW0gYml0cmF0ZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYml0cmF0ZSBleGNlZWRzIHRoZSB0aWVyIGxpbWl0OyBgZmFsc2VgIG90aGVyd2lzZSAoaW5jbHVkaW5nIGN1c3RvbSB0aWVycykuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VlZHNSb3V0ZXJUaWVyQml0cmF0ZSh0aWVyTWJwczogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXhpbXVtQml0cmF0ZTogQml0cmF0ZSk6IGJvb2xlYW4ge1xuICBpZiAodGllck1icHMgPT09IHVuZGVmaW5lZCB8fCBtYXhpbXVtQml0cmF0ZS5pc1VucmVzb2x2ZWQoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbWF4aW11bUJpdHJhdGUudG9CcHMoKSA+IHRpZXJNYnBzICogMV8wMDBfMDAwO1xufVxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGdpdmVuIENJRFIgbGl0ZXJhbCBpcyBhIGZ1bGx5LW9wZW4gcmFuZ2Ug4oCUIGFueSBgLzBgXG4gKiBwcmVmaXgsIGNvdmVyaW5nIGJvdGggSVB2NCAoYDAuMC4wLjAvMGApIGFuZCBJUHY2IChgOjovMGApLiBDYWxsZXJzIGFyZVxuICogZXhwZWN0ZWQgdG8gcHJlLWNoZWNrIGZvciB0b2tlbi1lbmNvZGVkIHZhbHVlcywgc2luY2UgYW4gdW5yZXNvbHZlZCB0b2tlblxuICogY2Fubm90IGJlIGluc3BlY3RlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlbkNpZHIoY2lkcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFwvMCQvLnRlc3QoY2lkci50cmltKCkpO1xufVxuIl19
|