@aws-cdk/aws-medialive-alpha 2.268.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.
Files changed (70) hide show
  1. package/.jsii +60888 -0
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +524 -0
  4. package/LICENSE +201 -0
  5. package/NOTICE +2 -0
  6. package/README.md +1297 -0
  7. package/grants.json +27 -0
  8. package/lib/audio-codec-settings.d.ts +901 -0
  9. package/lib/audio-codec-settings.js +1098 -0
  10. package/lib/audio-selector.d.ts +170 -0
  11. package/lib/audio-selector.js +306 -0
  12. package/lib/avail-settings.d.ts +231 -0
  13. package/lib/avail-settings.js +226 -0
  14. package/lib/caption-selector.d.ts +234 -0
  15. package/lib/caption-selector.js +413 -0
  16. package/lib/caption-settings.d.ts +349 -0
  17. package/lib/caption-settings.js +482 -0
  18. package/lib/channel-features.d.ts +106 -0
  19. package/lib/channel-features.js +85 -0
  20. package/lib/channel-placement-group.d.ts +73 -0
  21. package/lib/channel-placement-group.js +132 -0
  22. package/lib/channel.d.ts +687 -0
  23. package/lib/channel.js +1096 -0
  24. package/lib/cluster.d.ts +129 -0
  25. package/lib/cluster.js +158 -0
  26. package/lib/color-correction.d.ts +39 -0
  27. package/lib/color-correction.js +29 -0
  28. package/lib/destinations.d.ts +242 -0
  29. package/lib/destinations.js +455 -0
  30. package/lib/encode-configuration.d.ts +615 -0
  31. package/lib/encode-configuration.js +629 -0
  32. package/lib/enums.d.ts +698 -0
  33. package/lib/enums.js +1045 -0
  34. package/lib/file-location.d.ts +65 -0
  35. package/lib/file-location.js +150 -0
  36. package/lib/framerate.d.ts +31 -0
  37. package/lib/framerate.js +71 -0
  38. package/lib/index.d.ts +26 -0
  39. package/lib/index.js +43 -0
  40. package/lib/input-attachment.d.ts +319 -0
  41. package/lib/input-attachment.js +228 -0
  42. package/lib/input-security-group.d.ts +51 -0
  43. package/lib/input-security-group.js +123 -0
  44. package/lib/input-specification.d.ts +111 -0
  45. package/lib/input-specification.js +181 -0
  46. package/lib/input.d.ts +505 -0
  47. package/lib/input.js +803 -0
  48. package/lib/m2ts-settings.d.ts +421 -0
  49. package/lib/m2ts-settings.js +469 -0
  50. package/lib/m3u8-settings.d.ts +272 -0
  51. package/lib/m3u8-settings.js +304 -0
  52. package/lib/medialive-grants.generated.d.ts +30 -0
  53. package/lib/medialive-grants.generated.js +92 -0
  54. package/lib/network.d.ts +83 -0
  55. package/lib/network.js +132 -0
  56. package/lib/output-group.d.ts +924 -0
  57. package/lib/output-group.js +941 -0
  58. package/lib/outputs.d.ts +304 -0
  59. package/lib/outputs.js +598 -0
  60. package/lib/sdi-source.d.ts +124 -0
  61. package/lib/sdi-source.js +180 -0
  62. package/lib/shared.d.ts +44 -0
  63. package/lib/shared.js +146 -0
  64. package/lib/video-codec-settings.d.ts +1500 -0
  65. package/lib/video-codec-settings.js +1722 -0
  66. package/lib/video-selection.d.ts +92 -0
  67. package/lib/video-selection.js +95 -0
  68. package/package.json +135 -0
  69. package/rosetta/_generated.ts-fixture +6 -0
  70. package/rosetta/default.ts-fixture +21 -0
package/lib/input.js ADDED
@@ -0,0 +1,803 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.Input = exports.InputConfiguration = exports.MulticastProtocol = exports.SrtDecryptionAlgorithm = exports.InputSource = exports.InputType = exports.InputNetworkLocation = void 0;
38
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
42
+ const aws_medialive_1 = require("aws-cdk-lib/aws-medialive");
43
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
44
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
45
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
46
+ const shared_1 = require("./shared");
47
+ /**
48
+ * The network location of a MediaLive input — the AWS cloud, or an on-premises network for
49
+ * MediaLive Anywhere.
50
+ */
51
+ class InputNetworkLocation {
52
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputNetworkLocation", version: "2.268.0-alpha.0" };
53
+ /** The input exists in the AWS cloud (the default). */
54
+ static AWS = new InputNetworkLocation('AWS');
55
+ /** The input exists in an on-premises network (MediaLive Anywhere). */
56
+ static ON_PREMISES = new InputNetworkLocation('ON_PREMISES');
57
+ /** A value not yet modelled by AWS CDK. */
58
+ static of(value) {
59
+ return new InputNetworkLocation(value);
60
+ }
61
+ /** The underlying string value passed to CloudFormation. */
62
+ value;
63
+ constructor(value) {
64
+ this.value = value;
65
+ }
66
+ }
67
+ exports.InputNetworkLocation = InputNetworkLocation;
68
+ /**
69
+ * The type of MediaLive input. Users select an input type via
70
+ * the `InputConfiguration` factory methods, never by passing this type directly.
71
+ * @internal
72
+ */
73
+ var InputType;
74
+ (function (InputType) {
75
+ /** Push a UDP transport stream to MediaLive */
76
+ InputType["UDP_PUSH"] = "UDP_PUSH";
77
+ /** Push an RTP transport stream to MediaLive */
78
+ InputType["RTP_PUSH"] = "RTP_PUSH";
79
+ /** Push an RTMP stream to MediaLive */
80
+ InputType["RTMP_PUSH"] = "RTMP_PUSH";
81
+ /** Pull an RTMP stream from a server */
82
+ InputType["RTMP_PULL"] = "RTMP_PULL";
83
+ /** Pull HLS or TS content from a URL */
84
+ InputType["URL_PULL"] = "URL_PULL";
85
+ /** Pull an MP4 file from a URL */
86
+ InputType["MP4_FILE"] = "MP4_FILE";
87
+ /** Receive content from AWS Elemental MediaConnect */
88
+ InputType["MEDIACONNECT"] = "MEDIACONNECT";
89
+ /** Receive content from an Elemental Link device */
90
+ InputType["INPUT_DEVICE"] = "INPUT_DEVICE";
91
+ /** Receive uncompressed content via AWS CDI */
92
+ InputType["AWS_CDI"] = "AWS_CDI";
93
+ /** Pull a TS file from a URL */
94
+ InputType["TS_FILE"] = "TS_FILE";
95
+ /** Pull content from an SRT source (caller mode) */
96
+ InputType["SRT_CALLER"] = "SRT_CALLER";
97
+ /** Receive content pushed via SRT (listener mode) */
98
+ InputType["SRT_LISTENER"] = "SRT_LISTENER";
99
+ /** Receive multicast content. Requires `anywhereSettings` on the MediaLive Channel. */
100
+ InputType["MULTICAST"] = "MULTICAST";
101
+ /** Receive content via SMPTE 2110. Requires `anywhereSettings` on the MediaLive Channel. */
102
+ InputType["SMPTE_2110_RECEIVER_GROUP"] = "SMPTE_2110_RECEIVER_GROUP";
103
+ /** Receive content from an SDI source. Requires `anywhereSettings` on the MediaLive Channel. */
104
+ InputType["SDI"] = "SDI";
105
+ /** Receive content from a MediaConnect router */
106
+ InputType["MEDIACONNECT_ROUTER"] = "MEDIACONNECT_ROUTER";
107
+ })(InputType || (exports.InputType = InputType = {}));
108
+ /**
109
+ * A source for a pull-type input. Use the static factory methods to create.
110
+ */
111
+ class InputSource {
112
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputSource", version: "2.268.0-alpha.0" };
113
+ /**
114
+ * Create a source from a URL.
115
+ * @param url The URL where MediaLive pulls the source content from.
116
+ * @param options Optional credentials.
117
+ */
118
+ static url(url, options) {
119
+ try {
120
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_InputSourceOptions(options);
121
+ }
122
+ catch (error) {
123
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
124
+ Error.captureStackTrace(error, this.url);
125
+ }
126
+ throw error;
127
+ }
128
+ return new UrlInputSource(url, options);
129
+ }
130
+ /**
131
+ * Create a source from an S3 bucket. Automatically grants read access
132
+ * to the channel's role.
133
+ *
134
+ * @param bucket The S3 bucket containing the source file.
135
+ * @param key The object key within the bucket (e.g. 'videos/intro.mp4').
136
+ */
137
+ static fromBucket(bucket, key) {
138
+ return new S3InputSource(bucket, key);
139
+ }
140
+ /** @internal */
141
+ _grantRead(_role) { }
142
+ }
143
+ exports.InputSource = InputSource;
144
+ /** @internal */
145
+ class UrlInputSource extends InputSource {
146
+ url;
147
+ options;
148
+ constructor(url, options) {
149
+ super();
150
+ this.url = url;
151
+ this.options = options;
152
+ }
153
+ _bind() {
154
+ return { url: this.url, username: this.options?.username, passwordParam: this.options?.password?.parameterName };
155
+ }
156
+ _grantRead(role) {
157
+ // MediaLive reads the password from SSM Parameter Store at channel runtime, so the
158
+ // channel role needs read access to the parameter (scoped to the parameter ARN).
159
+ this.options?.password?.grantRead(role);
160
+ }
161
+ }
162
+ /** @internal */
163
+ class S3InputSource extends InputSource {
164
+ bucket;
165
+ url;
166
+ constructor(bucket, key) {
167
+ super();
168
+ this.bucket = bucket;
169
+ this.url = `s3ssl://${bucket.bucketName}/${key}`;
170
+ }
171
+ _bind() {
172
+ return { url: this.url };
173
+ }
174
+ _grantRead(role) {
175
+ this.bucket.grantRead(role);
176
+ }
177
+ }
178
+ /** The encryption algorithm for SRT decryption. */
179
+ class SrtDecryptionAlgorithm {
180
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.SrtDecryptionAlgorithm", version: "2.268.0-alpha.0" };
181
+ /** AES-128. */
182
+ static AES128 = new SrtDecryptionAlgorithm('AES128');
183
+ /** AES-192. */
184
+ static AES192 = new SrtDecryptionAlgorithm('AES192');
185
+ /** AES-256. */
186
+ static AES256 = new SrtDecryptionAlgorithm('AES256');
187
+ /** A value not yet modelled by AWS CDK. */
188
+ static of(value) {
189
+ return new SrtDecryptionAlgorithm(value);
190
+ }
191
+ /** The underlying string value passed to CloudFormation. */
192
+ value;
193
+ constructor(value) {
194
+ this.value = value;
195
+ }
196
+ }
197
+ exports.SrtDecryptionAlgorithm = SrtDecryptionAlgorithm;
198
+ /** The transport protocol for a multicast source. */
199
+ class MulticastProtocol {
200
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.MulticastProtocol", version: "2.268.0-alpha.0" };
201
+ /** UDP transport. */
202
+ static UDP = new MulticastProtocol('udp');
203
+ /** RTP transport. */
204
+ static RTP = new MulticastProtocol('rtp');
205
+ /** A value not yet modelled by AWS CDK. */
206
+ static of(value) {
207
+ return new MulticastProtocol(value);
208
+ }
209
+ /** The underlying string value passed to CloudFormation. */
210
+ value;
211
+ constructor(value) {
212
+ this.value = value;
213
+ }
214
+ }
215
+ exports.MulticastProtocol = MulticastProtocol;
216
+ /**
217
+ * Bind push-input destinations to their CFN shape.
218
+ * @internal
219
+ */
220
+ function bindPushDestinations(destinations) {
221
+ return destinations?.map(d => ({
222
+ streamName: d.streamName,
223
+ network: d.network?.networkRef.networkId,
224
+ networkRoutes: d.networkRoutes?.map(r => ({ cidr: r.cidr, gateway: r.gateway })),
225
+ staticIpAddress: d.staticIpAddress,
226
+ }));
227
+ }
228
+ /**
229
+ * Bind a SMPTE 2110 SDP location to its CFN shape.
230
+ * @internal
231
+ */
232
+ function bindSdpLocation(loc) {
233
+ return { sdpUrl: loc.sdpUrl, mediaIndex: loc.mediaIndex };
234
+ }
235
+ /**
236
+ * Defines the input configuration for a MediaLive Input.
237
+ *
238
+ * Use the static factory methods to create the appropriate configuration for your input type.
239
+ */
240
+ class InputConfiguration {
241
+ _bindFn;
242
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputConfiguration", version: "2.268.0-alpha.0" };
243
+ /**
244
+ * Create a URL pull input for HLS or TS streams.
245
+ *
246
+ * @example
247
+ *
248
+ * InputConfiguration.urlPull([
249
+ * InputSource.url('https://example.com/stream.m3u8'),
250
+ * ]);
251
+ *
252
+ */
253
+ static urlPull(sources) {
254
+ return InputConfiguration.createPullInput(InputType.URL_PULL, sources);
255
+ }
256
+ /** Create an RTMP pull input. */
257
+ static rtmpPull(sources) {
258
+ return InputConfiguration.createPullInput(InputType.RTMP_PULL, sources);
259
+ }
260
+ /** Create an MP4 file pull input. */
261
+ static mp4File(sources) {
262
+ return InputConfiguration.createPullInput(InputType.MP4_FILE, sources);
263
+ }
264
+ /** Create a TS file pull input. */
265
+ static tsFile(sources) {
266
+ return InputConfiguration.createPullInput(InputType.TS_FILE, sources);
267
+ }
268
+ /**
269
+ * Create an RTMP push input.
270
+ *
271
+ * @example
272
+ *
273
+ * declare const securityGroup: InputSecurityGroup;
274
+ *
275
+ * InputConfiguration.rtmpPush({
276
+ * inputSecurityGroups: [securityGroup],
277
+ * });
278
+ *
279
+ */
280
+ static rtmpPush(props) {
281
+ try {
282
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_PushInputProps(props);
283
+ }
284
+ catch (error) {
285
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
286
+ Error.captureStackTrace(error, this.rtmpPush);
287
+ }
288
+ throw error;
289
+ }
290
+ return new InputConfiguration(() => ({
291
+ type: InputType.RTMP_PUSH,
292
+ inputClass: props.destinations?.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
293
+ inputSecurityGroups: props.inputSecurityGroups?.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
294
+ destinations: bindPushDestinations(props.destinations),
295
+ }));
296
+ }
297
+ /** Create an RTP push input. */
298
+ static rtpPush(props) {
299
+ try {
300
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_PushInputProps(props);
301
+ }
302
+ catch (error) {
303
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
304
+ Error.captureStackTrace(error, this.rtpPush);
305
+ }
306
+ throw error;
307
+ }
308
+ return new InputConfiguration(() => ({
309
+ type: InputType.RTP_PUSH,
310
+ inputClass: props.destinations?.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
311
+ inputSecurityGroups: props.inputSecurityGroups?.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
312
+ destinations: bindPushDestinations(props.destinations),
313
+ }));
314
+ }
315
+ /** Create a UDP push input. */
316
+ static udpPush(props) {
317
+ try {
318
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_PushInputProps(props);
319
+ }
320
+ catch (error) {
321
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
322
+ Error.captureStackTrace(error, this.udpPush);
323
+ }
324
+ throw error;
325
+ }
326
+ return new InputConfiguration(() => ({
327
+ type: InputType.UDP_PUSH,
328
+ inputClass: props.destinations?.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
329
+ inputSecurityGroups: props.inputSecurityGroups?.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
330
+ destinations: bindPushDestinations(props.destinations),
331
+ }));
332
+ }
333
+ /**
334
+ * Create a MediaConnect router input configuration.
335
+ *
336
+ * @example
337
+ *
338
+ * // Single pipeline with default AZ
339
+ * InputConfiguration.mediaConnectRouter();
340
+ *
341
+ * @example
342
+ *
343
+ * // Redundant pipelines with explicit AZs
344
+ * InputConfiguration.mediaConnectRouter({
345
+ * availabilityZones: ['us-east-1a', 'us-east-1b'],
346
+ * });
347
+ *
348
+ */
349
+ static mediaConnectRouter(props) {
350
+ try {
351
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectRouterInputProps(props);
352
+ }
353
+ catch (error) {
354
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
355
+ Error.captureStackTrace(error, this.mediaConnectRouter);
356
+ }
357
+ throw error;
358
+ }
359
+ return new InputConfiguration((scope) => {
360
+ const stackAzs = scope ? aws_cdk_lib_1.Stack.of(scope).availabilityZones : [];
361
+ const azs = props?.availabilityZones ?? [stackAzs[0]];
362
+ if (azs.length < 1 || azs.length > 2) {
363
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RouterAzCount`, 'MediaConnect Router input requires 1 or 2 availability zones.');
364
+ }
365
+ const destinations = azs.map(az => ({
366
+ availabilityZoneName: az,
367
+ }));
368
+ return {
369
+ type: InputType.MEDIACONNECT_ROUTER,
370
+ inputClass: azs.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
371
+ routerSettings: {
372
+ destinations,
373
+ encryptionType: props?.encryptionSecret ? 'CUSTOM' : 'AUTOMATIC',
374
+ secretArn: props?.encryptionSecret?.secretArn,
375
+ },
376
+ };
377
+ });
378
+ }
379
+ /**
380
+ * Create a MediaConnect flow input configuration.
381
+ *
382
+ * @example
383
+ *
384
+ * declare const role: iam.IRole;
385
+ * declare const flow: mediaconnect.IFlowRef;
386
+ *
387
+ * InputConfiguration.mediaConnect({
388
+ * flows: [flow],
389
+ * role,
390
+ * });
391
+ *
392
+ */
393
+ static mediaConnect(props) {
394
+ try {
395
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectInputProps(props);
396
+ }
397
+ catch (error) {
398
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
399
+ Error.captureStackTrace(error, this.mediaConnect);
400
+ }
401
+ throw error;
402
+ }
403
+ if (props.flows.length < 1 || props.flows.length > 2) {
404
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MediaConnectFlowsLimit`, 'You must specify 1 or 2 MediaConnect flows.');
405
+ }
406
+ return new InputConfiguration((scope) => {
407
+ const role = props.role ?? createInputRole(scope, 'MediaConnectRole');
408
+ return {
409
+ type: InputType.MEDIACONNECT,
410
+ inputClass: props.flows.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
411
+ mediaConnectFlows: props.flows.map(f => ({ flowArn: f.flowRef.flowArn })),
412
+ roleArn: role.roleArn,
413
+ // Only auto-grant actions with auto-created role. A user-provided role
414
+ // is left alone — the caller adds its permissions.
415
+ mediaConnectFlowGrant: props.role === undefined ? { role } : undefined,
416
+ };
417
+ });
418
+ }
419
+ /** Create an SDI input configuration. */
420
+ static sdi(sources) {
421
+ return new InputConfiguration(() => ({
422
+ type: InputType.SDI,
423
+ inputClass: sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
424
+ // MediaLive's SdiSources property expects the numeric SDI source ID, not the ARN.
425
+ sdiSources: sources.map(s => s.sdiSourceId),
426
+ }));
427
+ }
428
+ /** Create an Elemental Link input from one or two registered Link device IDs. */
429
+ static inputDevice(props) {
430
+ try {
431
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_InputDeviceInputProps(props);
432
+ }
433
+ catch (error) {
434
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
435
+ Error.captureStackTrace(error, this.inputDevice);
436
+ }
437
+ throw error;
438
+ }
439
+ if (props.deviceIds.length < 1 || props.deviceIds.length > 2) {
440
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `InputDeviceCount`, 'You must specify 1 or 2 input devices.');
441
+ }
442
+ return new InputConfiguration(() => ({
443
+ type: InputType.INPUT_DEVICE,
444
+ inputClass: props.deviceIds.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
445
+ inputDevices: props.deviceIds.map(id => ({ id })),
446
+ }));
447
+ }
448
+ /**
449
+ * Create a CDI (uncompressed) input delivered into a VPC.
450
+ *
451
+ * MediaLive creates network interfaces in the supplied subnets and hands back the CDI push
452
+ * endpoints. The required EC2 permissions are granted to the role automatically.
453
+ */
454
+ static cdi(props) {
455
+ try {
456
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_CdiInputProps(props);
457
+ }
458
+ catch (error) {
459
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
460
+ Error.captureStackTrace(error, this.cdi);
461
+ }
462
+ throw error;
463
+ }
464
+ if (props.subnets.length !== 2) {
465
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CdiSubnetCount`, 'CDI inputs require exactly 2 subnets in two different availability zones.');
466
+ }
467
+ const subnetIds = props.subnets.map(s => s.subnetRef.subnetId);
468
+ const securityGroupIds = props.securityGroups?.map(sg => sg.securityGroupRef.securityGroupId);
469
+ return new InputConfiguration((scope) => {
470
+ const role = props.role ?? createInputRole(scope, 'CdiRole');
471
+ return {
472
+ type: InputType.AWS_CDI,
473
+ inputClass: 'STANDARD',
474
+ roleArn: role.roleArn,
475
+ vpc: { subnetIds, securityGroupIds },
476
+ // Only auto-grant actions with auto-created role. A user-provided role
477
+ // is left alone — the caller adds its permissions.
478
+ vpcRoleGrant: props.role === undefined ? { role, subnetIds, securityGroupIds: securityGroupIds ?? [] } : undefined,
479
+ };
480
+ });
481
+ }
482
+ /** Create a multicast input. Requires `anywhereSettings` on the channel. */
483
+ static multicast(props) {
484
+ try {
485
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MulticastInputProps(props);
486
+ }
487
+ catch (error) {
488
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
489
+ Error.captureStackTrace(error, this.multicast);
490
+ }
491
+ throw error;
492
+ }
493
+ if (props.sources.length < 1 || props.sources.length > 2) {
494
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MulticastSourceCount`, 'You must specify 1 or 2 multicast sources.');
495
+ }
496
+ return new InputConfiguration(() => ({
497
+ type: InputType.MULTICAST,
498
+ inputClass: props.sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
499
+ multicastSettings: {
500
+ sources: props.sources.map(s => ({
501
+ url: `${(s.protocol ?? MulticastProtocol.UDP).value}://${s.address}:${s.port}`,
502
+ sourceIp: s.sourceIp,
503
+ })),
504
+ },
505
+ }));
506
+ }
507
+ /** Create a SMPTE 2110 receiver group input. Requires `anywhereSettings` on the channel. */
508
+ static smpte2110ReceiverGroup(props) {
509
+ try {
510
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_Smpte2110InputProps(props);
511
+ }
512
+ catch (error) {
513
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
514
+ Error.captureStackTrace(error, this.smpte2110ReceiverGroup);
515
+ }
516
+ throw error;
517
+ }
518
+ if ((props.audioSdps?.length ?? 0) > 50) {
519
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `Smpte2110AudioSdpCount`, 'A SMPTE 2110 input supports at most 50 audio SDPs.');
520
+ }
521
+ if ((props.ancillarySdps?.length ?? 0) > 50) {
522
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `Smpte2110AncillarySdpCount`, 'A SMPTE 2110 input supports at most 50 ancillary SDPs.');
523
+ }
524
+ return new InputConfiguration(() => ({
525
+ type: InputType.SMPTE_2110_RECEIVER_GROUP,
526
+ smpte2110ReceiverGroupSettings: {
527
+ smpte2110ReceiverGroups: [{
528
+ sdpSettings: {
529
+ videoSdp: props.videoSdp ? bindSdpLocation(props.videoSdp) : undefined,
530
+ audioSdps: props.audioSdps?.map(bindSdpLocation),
531
+ ancillarySdps: props.ancillarySdps?.map(bindSdpLocation),
532
+ },
533
+ }],
534
+ },
535
+ }));
536
+ }
537
+ /**
538
+ * Create an SRT caller input configuration.
539
+ *
540
+ * @example
541
+ *
542
+ * InputConfiguration.srtCaller([{
543
+ * srtListenerAddress: '10.0.0.1',
544
+ * srtListenerPort: 5000,
545
+ * }]);
546
+ *
547
+ */
548
+ static srtCaller(sources) {
549
+ if (sources.length < 1 || sources.length > 2) {
550
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtCallerSourcesLimit`, 'You must specify 1 or 2 SRT caller sources.');
551
+ }
552
+ return new InputConfiguration(() => ({
553
+ type: InputType.SRT_CALLER,
554
+ inputClass: sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
555
+ srtSettings: {
556
+ srtCallerSources: sources.map(s => ({
557
+ srtListenerAddress: s.srtListenerAddress,
558
+ srtListenerPort: s.srtListenerPort.toString(),
559
+ minimumLatency: s.minimumLatency?.toMilliseconds(),
560
+ streamId: s.streamId,
561
+ decryption: s.decryption ? {
562
+ algorithm: s.decryption.algorithm?.value,
563
+ passphraseSecretArn: s.decryption.passphraseSecret?.secretArn,
564
+ } : undefined,
565
+ })),
566
+ },
567
+ }));
568
+ }
569
+ /** Create an SRT listener input configuration. */
570
+ static srtListener(props) {
571
+ try {
572
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SrtListenerInputProps(props);
573
+ }
574
+ catch (error) {
575
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
576
+ Error.captureStackTrace(error, this.srtListener);
577
+ }
578
+ throw error;
579
+ }
580
+ return new InputConfiguration(() => ({
581
+ type: InputType.SRT_LISTENER,
582
+ inputClass: props.inputClass?.value ?? 'SINGLE_PIPELINE',
583
+ inputSecurityGroups: props.inputSecurityGroups.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
584
+ srtSettings: {
585
+ srtListenerSettings: {
586
+ minimumLatency: props.minimumLatency?.toMilliseconds(),
587
+ streamId: props.streamId,
588
+ decryption: props.decryption ? {
589
+ algorithm: props.decryption.algorithm?.value,
590
+ passphraseSecretArn: props.decryption.passphraseSecret?.secretArn,
591
+ } : undefined,
592
+ },
593
+ },
594
+ }));
595
+ }
596
+ static createPullInput(type, sources) {
597
+ if (sources.length < 1) {
598
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PullInputSourcesMinimum`, 'You must specify at least 1 input source.');
599
+ }
600
+ if (sources.length > 2) {
601
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PullInputSourcesLimit`, 'You cannot specify more than 2 input sources.');
602
+ }
603
+ return new InputConfiguration(() => {
604
+ return {
605
+ type,
606
+ inputClass: sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
607
+ inputSources: sources,
608
+ sources: sources.map(s => s._bind()),
609
+ };
610
+ });
611
+ }
612
+ constructor(_bindFn) {
613
+ this._bindFn = _bindFn;
614
+ }
615
+ /** @internal */
616
+ _bind(scope) {
617
+ return this._bindFn(scope);
618
+ }
619
+ }
620
+ exports.InputConfiguration = InputConfiguration;
621
+ /**
622
+ * Create the default IAM role for an input that MediaLive assumes (MediaConnect flow or CDI/VPC).
623
+ * The caller wires the specific managed/EC2 actions onto the role.
624
+ */
625
+ function createInputRole(scope, id) {
626
+ if (!scope) {
627
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `InputRoleScope`, 'Cannot auto-create an input role without a construct scope; provide an explicit `role`.');
628
+ }
629
+ return new aws_iam_1.Role(scope, id, {
630
+ assumedBy: new aws_iam_1.ServicePrincipal('medialive.amazonaws.com', {
631
+ conditions: {
632
+ StringEquals: { 'aws:SourceAccount': aws_cdk_lib_1.Aws.ACCOUNT_ID },
633
+ ArnLike: {
634
+ 'aws:SourceArn': aws_cdk_lib_1.Stack.of(scope).formatArn({
635
+ service: 'medialive',
636
+ resource: 'input',
637
+ resourceName: '*',
638
+ arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
639
+ }),
640
+ },
641
+ },
642
+ }),
643
+ });
644
+ }
645
+ /**
646
+ * Defines an AWS Elemental MediaLive Input.
647
+ */
648
+ let Input = (() => {
649
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
650
+ let _classDescriptor;
651
+ let _classExtraInitializers = [];
652
+ let _classThis;
653
+ let _classSuper = aws_cdk_lib_1.Resource;
654
+ var Input = class extends _classSuper {
655
+ static { _classThis = this; }
656
+ static {
657
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
658
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
659
+ Input = _classThis = _classDescriptor.value;
660
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
661
+ }
662
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.Input", version: "2.268.0-alpha.0" };
663
+ /** Uniquely identifies this class. */
664
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-medialive-alpha.Input';
665
+ /** Import an existing input by its ARN. The id is parsed out of the ARN. */
666
+ static fromInputArn(scope, id, inputArn) {
667
+ const inputId = (0, shared_1.extractResourceId)(inputArn, 'Input');
668
+ class Import extends aws_cdk_lib_1.Resource {
669
+ inputArn = inputArn;
670
+ inputId = inputId;
671
+ inputClass = undefined;
672
+ inputType = undefined;
673
+ inputDestinations = undefined;
674
+ inputSources = undefined;
675
+ get inputRef() {
676
+ return { inputId: this.inputId, inputArn: this.inputArn };
677
+ }
678
+ /** @internal Imported inputs own no sources, so granting is a no-op. */
679
+ _grantPermissions(_role) { }
680
+ }
681
+ return new Import(scope, id);
682
+ }
683
+ inputArn;
684
+ inputId;
685
+ inputClass;
686
+ inputType;
687
+ inputDestinations;
688
+ inputSources;
689
+ /** A reference to this Input resource. */
690
+ get inputRef() {
691
+ return { inputId: this.inputId, inputArn: this.inputArn };
692
+ }
693
+ inputSourceRefs;
694
+ constructor(scope, id, props) {
695
+ super(scope, id, {
696
+ physicalName: props.inputName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 256 }) }),
697
+ });
698
+ try {
699
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_InputProps(props);
700
+ }
701
+ catch (error) {
702
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
703
+ Error.captureStackTrace(error, Input);
704
+ }
705
+ throw error;
706
+ }
707
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
708
+ const config = props.input._bind(this);
709
+ // Security-group rules: on-premises inputs don't support security groups, while cloud push
710
+ // inputs require at least one. Both always fail at deploy otherwise, so validate at synth.
711
+ const isOnPremises = props.inputNetworkLocation?.value === InputNetworkLocation.ON_PREMISES.value;
712
+ const hasSecurityGroups = (config.inputSecurityGroups?.length ?? 0) > 0;
713
+ const isPushInput = config.type === InputType.RTMP_PUSH
714
+ || config.type === InputType.RTP_PUSH
715
+ || config.type === InputType.UDP_PUSH;
716
+ if (isOnPremises && hasSecurityGroups) {
717
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `OnPremisesInputSecurityGroups`, 'on-premises inputs do not support input security groups; remove inputSecurityGroups for an ON_PREMISES input', this);
718
+ }
719
+ if (!isOnPremises && isPushInput && !hasSecurityGroups) {
720
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `PushInputSecurityGroupsRequired`, 'cloud push inputs require at least one input security group', this);
721
+ }
722
+ // SDI inputs are on-premises hardware sources — MediaLive always rejects an SDI input
723
+ // whose network location isn't ON_PREMISES, so fail fast at synth.
724
+ if (config.type === InputType.SDI && !isOnPremises) {
725
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `SdiInputRequiresOnPremises`, "an SDI input's inputNetworkLocation must be InputNetworkLocation.ON_PREMISES", this);
726
+ }
727
+ const resource = new aws_medialive_1.CfnInput(this, 'Resource', {
728
+ name: this.physicalName,
729
+ type: config.type,
730
+ roleArn: config.roleArn,
731
+ sources: config.sources,
732
+ destinations: config.destinations,
733
+ mediaConnectFlows: config.mediaConnectFlows,
734
+ inputDevices: config.inputDevices,
735
+ multicastSettings: config.multicastSettings,
736
+ smpte2110ReceiverGroupSettings: config.smpte2110ReceiverGroupSettings,
737
+ routerSettings: config.routerSettings,
738
+ srtSettings: config.srtSettings,
739
+ sdiSources: config.sdiSources,
740
+ vpc: config.vpc,
741
+ inputSecurityGroups: config.inputSecurityGroups,
742
+ inputNetworkLocation: props.inputNetworkLocation?.value,
743
+ tags: props.tags,
744
+ });
745
+ this.inputArn = resource.inputRef.inputArn;
746
+ this.inputId = resource.inputRef.inputId;
747
+ this.inputClass = config.inputClass;
748
+ this.inputType = config.type;
749
+ this.inputDestinations = resource.attrDestinations;
750
+ this.inputSources = resource.attrSources;
751
+ this.inputSourceRefs = config.inputSources ?? [];
752
+ // MediaConnect flow inputs: grant managed flow-management actions.
753
+ // Resource is `*` — service rejects flow-ARN-scoped grants.
754
+ if (config.mediaConnectFlowGrant) {
755
+ aws_iam_1.Grant.addToPrincipal({
756
+ grantee: config.mediaConnectFlowGrant.role,
757
+ actions: [
758
+ 'mediaconnect:ManagedDescribeFlow',
759
+ 'mediaconnect:ManagedAddOutput',
760
+ 'mediaconnect:ManagedRemoveOutput',
761
+ ],
762
+ resourceArns: ['*'],
763
+ }).applyBefore(resource);
764
+ }
765
+ // CDI/VPC inputs: Create/Delete scoped to ENI + subnets + SGs; Describe* needs `*`.
766
+ if (config.vpcRoleGrant) {
767
+ const stack = aws_cdk_lib_1.Stack.of(this);
768
+ const grant = config.vpcRoleGrant;
769
+ const networkInterfaceArn = stack.formatArn({ service: 'ec2', resource: 'network-interface', resourceName: '*' });
770
+ const subnetArns = grant.subnetIds.map(s => stack.formatArn({ service: 'ec2', resource: 'subnet', resourceName: s }));
771
+ const securityGroupArns = grant.securityGroupIds.map(sg => stack.formatArn({ service: 'ec2', resource: 'security-group', resourceName: sg }));
772
+ aws_iam_1.Grant.addToPrincipal({
773
+ grantee: grant.role,
774
+ actions: [
775
+ 'ec2:CreateNetworkInterface',
776
+ 'ec2:CreateNetworkInterfacePermission',
777
+ 'ec2:DeleteNetworkInterface',
778
+ ],
779
+ resourceArns: [networkInterfaceArn, ...subnetArns, ...securityGroupArns],
780
+ }).applyBefore(resource);
781
+ aws_iam_1.Grant.addToPrincipal({
782
+ grantee: grant.role,
783
+ actions: [
784
+ 'ec2:DescribeNetworkInterfaces',
785
+ 'ec2:DescribeSubnets',
786
+ 'ec2:DescribeSecurityGroups',
787
+ ],
788
+ resourceArns: ['*'], // Describe* actions don't support resource-level permissions
789
+ }).applyBefore(resource);
790
+ }
791
+ }
792
+ /** @internal */
793
+ _grantPermissions(role) {
794
+ this.inputSourceRefs.forEach(s => s._grantRead(role));
795
+ }
796
+ static {
797
+ __runInitializers(_classThis, _classExtraInitializers);
798
+ }
799
+ };
800
+ return Input = _classThis;
801
+ })();
802
+ exports.Input = Input;
803
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBcUg7QUFHckgsaURBQW9FO0FBR3BFLDZEQUFxRDtBQUlyRCw0RUFBNEQ7QUFDNUQsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUsxRSxxQ0FBNkM7QUFzRDdDOzs7R0FHRztBQUNILE1BQWEsb0JBQW9COztJQUMvQix1REFBdUQ7SUFDaEQsTUFBTSxDQUFVLEdBQUcsR0FBRyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELHVFQUF1RTtJQUNoRSxNQUFNLENBQVUsV0FBVyxHQUFHLElBQUksb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFN0UsMkNBQTJDO0lBQ3BDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEM7SUFFRCw0REFBNEQ7SUFDNUMsS0FBSyxDQUFTO0lBRTlCLFlBQW9CLEtBQWE7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7S0FDcEI7O0FBaEJILG9EQWlCQztBQTJCRDs7OztHQUlHO0FBQ0gsSUFBWSxTQWlDWDtBQWpDRCxXQUFZLFNBQVM7SUFDbkIsK0NBQStDO0lBQy9DLGtDQUFxQixDQUFBO0lBQ3JCLGdEQUFnRDtJQUNoRCxrQ0FBcUIsQ0FBQTtJQUNyQix1Q0FBdUM7SUFDdkMsb0NBQXVCLENBQUE7SUFDdkIsd0NBQXdDO0lBQ3hDLG9DQUF1QixDQUFBO0lBQ3ZCLHdDQUF3QztJQUN4QyxrQ0FBcUIsQ0FBQTtJQUNyQixrQ0FBa0M7SUFDbEMsa0NBQXFCLENBQUE7SUFDckIsc0RBQXNEO0lBQ3RELDBDQUE2QixDQUFBO0lBQzdCLG9EQUFvRDtJQUNwRCwwQ0FBNkIsQ0FBQTtJQUM3QiwrQ0FBK0M7SUFD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RSxHQUFHLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO2lCQUN6RSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QixlQUFLLENBQUMsY0FBYyxDQUFDO29CQUNuQixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ25CLE9BQU8sRUFBRTt3QkFDUCwrQkFBK0I7d0JBQy9CLHFCQUFxQjt3QkFDckIsNEJBQTRCO3FCQUM3QjtvQkFDRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSw2REFBNkQ7aUJBQ25GLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsQ0FBQztTQUNGO1FBRUQsZ0JBQWdCO1FBQ1QsaUJBQWlCLENBQUMsSUFBVztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN2RDs7WUF2SlUsdURBQUs7Ozs7O0FBQUwsc0JBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IER1cmF0aW9uLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFN0YWNrLCBBd3MsIEFybkZvcm1hdCwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSVNlY3VyaXR5R3JvdXBSZWYsIElTdWJuZXRSZWYgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB0eXBlIHsgSVJvbGUsIElSb2xlUmVmIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBHcmFudCwgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBJRmxvd1JlZiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWNvbm5lY3QnO1xuaW1wb3J0IHR5cGUgeyBJSW5wdXRSZWYsIElucHV0UmVmZXJlbmNlLCBJSW5wdXRTZWN1cml0eUdyb3VwUmVmLCBJTmV0d29ya1JlZiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWxpdmUnO1xuaW1wb3J0IHsgQ2ZuSW5wdXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFsaXZlJztcbmltcG9ydCB0eXBlIHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgdHlwZSB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHR5cGUgeyBJU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IENoYW5uZWxDbGFzcyB9IGZyb20gJy4vY2hhbm5lbCc7XG5pbXBvcnQgdHlwZSB7IE5ldHdvcmtSb3V0ZSB9IGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgdHlwZSB7IElTZGlTb3VyY2UgfSBmcm9tICcuL3NkaS1zb3VyY2UnO1xuaW1wb3J0IHsgZXh0cmFjdFJlc291cmNlSWQgfSBmcm9tICcuL3NoYXJlZCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIE1lZGlhTGl2ZSBJbnB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW5wdXQgZXh0ZW5kcyBJUmVzb3VyY2UsIElJbnB1dFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGlucHV0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpbnB1dEFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBpbnB1dC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlucHV0IGNsYXNzIChTVEFOREFSRCBvciBTSU5HTEVfUElQRUxJTkUpLlxuICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgaW5wdXQgdHlwZXMgd2hlcmUgdGhlIHBpcGVsaW5lIGNvdW50IGlzIGtub3duIGF0IGNvbnN0cnVjdCB0aW1lXG4gICAqIChlLmcuIG1lZGlhQ29ubmVjdFJvdXRlcikuIFVuZGVmaW5lZCBmb3IgaW1wb3J0ZWQgaW5wdXRzIGFuZCBvdGhlciB0eXBlcy5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRDbGFzcz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0eXBlIChlLmcuIFNSVF9DQUxMRVIsIE1QNF9GSUxFLCBVUkxfUFVMTCkuXG4gICAqIFVuZGVmaW5lZCBmb3IgaW1wb3J0ZWQgaW5wdXRzLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpbnB1dFR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3IgcHVzaCBpbnB1dHMsIHRoZSBkZXN0aW5hdGlvbiBVUkxzIHdoZXJlIHRoZSB1cHN0cmVhbSBzeXN0ZW0gc2VuZHMgY29udGVudC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXREZXN0aW5hdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEZvciBwdWxsIGlucHV0cywgdGhlIHNvdXJjZSBVUkxzIHdoZXJlIE1lZGlhTGl2ZSBwdWxscyBjb250ZW50IGZyb20uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgY2hhbm5lbCByb2xlIHJlYWQgYWNjZXNzIHRvIHRoaXMgaW5wdXQncyBzb3VyY2VzLlxuICAgKlxuICAgKiBPd25lZCBpbnB1dHMgZ3JhbnQgYWNjZXNzIHRvIHRoZSByZXNvdXJjZXMgYmFja2luZyB0aGVpciBzb3VyY2VzIChlLmcuIFMzIGJ1Y2tldHNcbiAgICogZm9yIGZpbGUgaW5wdXRzKTsgaW1wb3J0ZWQgaW5wdXRzIGFyZSBhIG5vLW9wLCBzaW5jZSB0aGVpciBzb3VyY2VzIGFyZW4ndCBvd25lZCBieVxuICAgKiB0aGlzIHN0YWNrLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlUmVmKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgbmV0d29yayBsb2NhdGlvbiBvZiBhIE1lZGlhTGl2ZSBpbnB1dCDigJQgdGhlIEFXUyBjbG91ZCwgb3IgYW4gb24tcHJlbWlzZXMgbmV0d29yayBmb3JcbiAqIE1lZGlhTGl2ZSBBbnl3aGVyZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElucHV0TmV0d29ya0xvY2F0aW9uIHtcbiAgLyoqIFRoZSBpbnB1dCBleGlzdHMgaW4gdGhlIEFXUyBjbG91ZCAodGhlIGRlZmF1bHQpLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFXUyA9IG5ldyBJbnB1dE5ldHdvcmtMb2NhdGlvbignQVdTJyk7XG4gIC8qKiBUaGUgaW5wdXQgZXhpc3RzIGluIGFuIG9uLXByZW1pc2VzIG5ldHdvcmsgKE1lZGlhTGl2ZSBBbnl3aGVyZSkuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgT05fUFJFTUlTRVMgPSBuZXcgSW5wdXROZXR3b3JrTG9jYXRpb24oJ09OX1BSRU1JU0VTJyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBJbnB1dE5ldHdvcmtMb2NhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dE5ldHdvcmtMb2NhdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvKiogVGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBNZWRpYUxpdmUgSW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBJbnB1dCBuYW1lLlxuICAgKiBAZGVmYXVsdCAtIGF1dG8tZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBpbnB1dE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbnB1dCBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgaW5wdXQgdHlwZSBhbmQgc291cmNlIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ6IElucHV0Q29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIGxvY2F0aW9uIG9mIHRoZSBpbnB1dCDigJQgQVdTIGNsb3VkIG9yIG9uLXByZW1pc2VzIChNZWRpYUxpdmUgQW55d2hlcmUpLlxuICAgKiBAZGVmYXVsdCAtIEFXUywgYXBwbGllZCBieSBNZWRpYUxpdmVcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TmV0d29ya0xvY2F0aW9uPzogSW5wdXROZXR3b3JrTG9jYXRpb247XG4gIC8qKlxuICAgKiBUYWdzIHRvIGFkZCB0byB0aGUgaW5wdXQuXG4gICAqIEBkZWZhdWx0IC0gbm8gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgTWVkaWFMaXZlIGlucHV0LiBVc2VycyBzZWxlY3QgYW4gaW5wdXQgdHlwZSB2aWFcbiAqIHRoZSBgSW5wdXRDb25maWd1cmF0aW9uYCBmYWN0b3J5IG1ldGhvZHMsIG5ldmVyIGJ5IHBhc3NpbmcgdGhpcyB0eXBlIGRpcmVjdGx5LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBlbnVtIElucHV0VHlwZSB7XG4gIC8qKiBQdXNoIGEgVURQIHRyYW5zcG9ydCBzdHJlYW0gdG8gTWVkaWFMaXZlICovXG4gIFVEUF9QVVNIID0gJ1VEUF9QVVNIJyxcbiAgLyoqIFB1c2ggYW4gUlRQIHRyYW5zcG9ydCBzdHJlYW0gdG8gTWVkaWFMaXZlICovXG4gIFJUUF9QVVNIID0gJ1JUUF9QVVNIJyxcbiAgLyoqIFB1c2ggYW4gUlRNUCBzdHJlYW0gdG8gTWVkaWFMaXZlICovXG4gIFJUTVBfUFVTSCA9ICdSVE1QX1BVU0gnLFxuICAvKiogUHVsbCBhbiBSVE1QIHN0cmVhbSBmcm9tIGEgc2VydmVyICovXG4gIFJUTVBfUFVMTCA9ICdSVE1QX1BVTEwnLFxuICAvKiogUHVsbCBITFMgb3IgVFMgY29udGVudCBmcm9tIGEgVVJMICovXG4gIFVSTF9QVUxMID0gJ1VSTF9QVUxMJyxcbiAgLyoqIFB1bGwgYW4gTVA0IGZpbGUgZnJvbSBhIFVSTCAqL1xuICBNUDRfRklMRSA9ICdNUDRfRklMRScsXG4gIC8qKiBSZWNlaXZlIGNvbnRlbnQgZnJvbSBBV1MgRWxlbWVudGFsIE1lZGlhQ29ubmVjdCAqL1xuICBNRURJQUNPTk5FQ1QgPSAnTUVESUFDT05ORUNUJyxcbiAgLyoqIFJlY2VpdmUgY29udGVudCBmcm9tIGFuIEVsZW1lbnRhbCBMaW5rIGRldmljZSAqL1xuICBJTlBVVF9ERVZJQ0UgPSAnSU5QVVRfREVWSUNFJyxcbiAgLyoqIFJlY2VpdmUgdW5jb21wcmVzc2VkIGNvbnRlbnQgdmlhIEFXUyBDREkgKi9cbiAgQVdTX0NESSA9ICdBV1NfQ0RJJyxcbiAgLyoqIFB1bGwgYSBUUyBmaWxlIGZyb20gYSBVUkwgKi9cbiAgVFNfRklMRSA9ICdUU19GSUxFJyxcbiAgLyoqIFB1bGwgY29udGVudCBmcm9tIGFuIFNSVCBzb3VyY2UgKGNhbGxlciBtb2RlKSAqL1xuICBTUlRfQ0FMTEVSID0gJ1NSVF9DQUxMRVInLFxuICAvKiogUmVjZWl2ZSBjb250ZW50IHB1c2hlZCB2aWEgU1JUIChsaXN0ZW5lciBtb2RlKSAqL1xuICBTUlRfTElTVEVORVIgPSAnU1JUX0xJU1RFTkVSJyxcbiAgLyoqIFJlY2VpdmUgbXVsdGljYXN0IGNvbnRlbnQuIFJlcXVpcmVzIGBhbnl3aGVyZVNldHRpbmdzYCBvbiB0aGUgTWVkaWFMaXZlIENoYW5uZWwuICovXG4gIE1VTFRJQ0FTVCA9ICdNVUxUSUNBU1QnLFxuICAvKiogUmVjZWl2ZSBjb250ZW50IHZpYSBTTVBURSAyMTEwLiBSZXF1aXJlcyBgYW55d2hlcmVTZXR0aW5nc2Agb24gdGhlIE1lZGlhTGl2ZSBDaGFubmVsLiAqL1xuICBTTVBURV8yMTEwX1JFQ0VJVkVSX0dST1VQID0gJ1NNUFRFXzIxMTBfUkVDRUlWRVJfR1JPVVAnLFxuICAvKiogUmVjZWl2ZSBjb250ZW50IGZyb20gYW4gU0RJIHNvdXJjZS4gUmVxdWlyZXMgYGFueXdoZXJlU2V0dGluZ3NgIG9uIHRoZSBNZWRpYUxpdmUgQ2hhbm5lbC4gKi9cbiAgU0RJID0gJ1NESScsXG4gIC8qKiBSZWNlaXZlIGNvbnRlbnQgZnJvbSBhIE1lZGlhQ29ubmVjdCByb3V0ZXIgKi9cbiAgTUVESUFDT05ORUNUX1JPVVRFUiA9ICdNRURJQUNPTk5FQ1RfUk9VVEVSJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFVSTC1iYXNlZCBpbnB1dCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRTb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB1c2VybmFtZSBmb3IgYWNjZXNzaW5nIHRoZSB1cHN0cmVhbSBzeXN0ZW0uXG4gICAqIEBkZWZhdWx0IC0gbm8gdXNlcm5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFNTTSBwYXJhbWV0ZXIgdGhhdCBob2xkcyB0aGUgcGFzc3dvcmQgZm9yIGFjY2Vzc2luZyB0aGUgdXBzdHJlYW0gc3lzdGVtLlxuICAgKiBAZGVmYXVsdCAtIG5vIHBhc3N3b3JkXG4gICAqL1xuICByZWFkb25seSBwYXNzd29yZD86IElTdHJpbmdQYXJhbWV0ZXI7XG59XG5cbi8qKlxuICogQSBzb3VyY2UgZm9yIGEgcHVsbC10eXBlIGlucHV0LiBVc2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgdG8gY3JlYXRlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5wdXRTb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgc291cmNlIGZyb20gYSBVUkwuXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB3aGVyZSBNZWRpYUxpdmUgcHVsbHMgdGhlIHNvdXJjZSBjb250ZW50IGZyb20uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1cmwodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBJbnB1dFNvdXJjZU9wdGlvbnMpOiBJbnB1dFNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBVcmxJbnB1dFNvdXJjZSh1cmwsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNvdXJjZSBmcm9tIGFuIFMzIGJ1Y2tldC4gQXV0b21hdGljYWxseSBncmFudHMgcmVhZCBhY2Nlc3NcbiAgICogdG8gdGhlIGNoYW5uZWwncyByb2xlLlxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBidWNrZXQgY29udGFpbmluZyB0aGUgc291cmNlIGZpbGUuXG4gICAqIEBwYXJhbSBrZXkgVGhlIG9iamVjdCBrZXkgd2l0aGluIHRoZSBidWNrZXQgKGUuZy4gJ3ZpZGVvcy9pbnRyby5tcDQnKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ1Y2tldChidWNrZXQ6IElCdWNrZXQsIGtleTogc3RyaW5nKTogSW5wdXRTb3VyY2Uge1xuICAgIHJldHVybiBuZXcgUzNJbnB1dFNvdXJjZShidWNrZXQsIGtleSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZCgpOiB7IHVybDogc3RyaW5nOyB1c2VybmFtZT86IHN0cmluZzsgcGFzc3dvcmRQYXJhbT86IHN0cmluZyB9O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFJlYWQoX3JvbGU6IElSb2xlKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBVcmxJbnB1dFNvdXJjZSBleHRlbmRzIElucHV0U291cmNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB1cmw6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zPzogSW5wdXRTb3VyY2VPcHRpb25zKSB7IHN1cGVyKCk7IH1cbiAgcHVibGljIF9iaW5kKCkge1xuICAgIHJldHVybiB7IHVybDogdGhpcy51cmwsIHVzZXJuYW1lOiB0aGlzLm9wdGlvbnM/LnVzZXJuYW1lLCBwYXNzd29yZFBhcmFtOiB0aGlzLm9wdGlvbnM/LnBhc3N3b3JkPy5wYXJhbWV0ZXJOYW1lIH07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFJlYWQocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICAvLyBNZWRpYUxpdmUgcmVhZHMgdGhlIHBhc3N3b3JkIGZyb20gU1NNIFBhcmFtZXRlciBTdG9yZSBhdCBjaGFubmVsIHJ1bnRpbWUsIHNvIHRoZVxuICAgIC8vIGNoYW5uZWwgcm9sZSBuZWVkcyByZWFkIGFjY2VzcyB0byB0aGUgcGFyYW1ldGVyIChzY29wZWQgdG8gdGhlIHBhcmFtZXRlciBBUk4pLlxuICAgIHRoaXMub3B0aW9ucz8ucGFzc3dvcmQ/LmdyYW50UmVhZChyb2xlKTtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBTM0lucHV0U291cmNlIGV4dGVuZHMgSW5wdXRTb3VyY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYnVja2V0OiBJQnVja2V0LCBrZXk6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy51cmwgPSBgczNzc2w6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS8ke2tleX1gO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpIHtcbiAgICByZXR1cm4geyB1cmw6IHRoaXMudXJsIH07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFJlYWQocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWQocm9sZSk7XG4gIH1cbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGEgTWVkaWFDb25uZWN0IHJvdXRlciBpbnB1dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFDb25uZWN0Um91dGVySW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYXZhaWxhYmlsaXR5IHpvbmVzIGZvciB0aGUgcm91dGVyIGlucHV0IHBpcGVsaW5lcy5cbiAgICpcbiAgICogUHJvdmlkZSBvbmUgQVogZm9yIGEgc2luZ2xlIHBpcGVsaW5lLCBvciB0d28gZm9yIHJlZHVuZGFudCBwaXBlbGluZXMuXG4gICAqIElmIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHRoZSBzdGFjaydzIGZpcnN0IGF2YWlsYWJpbGl0eSB6b25lIChzaW5nbGUgcGlwZWxpbmUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHNpbmdsZSBwaXBlbGluZSB1c2luZyB0aGUgc3RhY2sncyBmaXJzdCBhdmFpbGFiaWxpdHkgem9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGZvciBjdXN0b20gZW5jcnlwdGlvbi5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhdXRvbWF0aWMgZW5jcnlwdGlvbiBpcyB1c2VkLlxuICAgKiBAZGVmYXVsdCAtIGF1dG9tYXRpYyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uU2VjcmV0PzogSVNlY3JldDtcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGEgTWVkaWFDb25uZWN0IGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYUNvbm5lY3RJbnB1dFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBNZWRpYUNvbm5lY3QgZmxvd3MgdG8gdXNlIGFzIHNvdXJjZXMgKG9uZSwgb3IgdHdvIGZvciBwaXBlbGluZSByZWR1bmRhbmN5KS5cbiAgICovXG4gIHJlYWRvbmx5IGZsb3dzOiBJRmxvd1JlZltdO1xuICAvKipcbiAgICogVGhlIElBTSByb2xlIE1lZGlhTGl2ZSB1c2VzIHRvIG1hbmFnZSB0aGUgb3V0cHV0IGl0IGFkZHMgdG8gdGhlIGZsb3cgZm9yIHRoaXMgaW5wdXQuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYSByb2xlIGlzIGNyZWF0ZWQgYW5kIGdyYW50ZWQgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zLlxuICAgKiBXaGVuIHlvdSBwcm92aWRlIGEgcm9sZSwgbm8gcGVybWlzc2lvbnMgYXJlIGFkZGVkIOKAlCB5b3Ugb3duIGFsbCB0aGUgcGVybWlzc2lvbnMgaXQgbmVlZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSByb2xlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbWVkaWFsaXZlLmFtYXpvbmF3cy5jb20gc2VydmljZSBwcmluY2lwYWxcbiAgICpcbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBJUm9sZTtcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGFuIFNSVCBjYWxsZXIgaW5wdXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNydENhbGxlclNvdXJjZVByb3BzIHtcbiAgLyoqIFRoZSBhZGRyZXNzIG9mIHRoZSBTUlQgbGlzdGVuZXIgdG8gY29ubmVjdCB0by4gKi9cbiAgcmVhZG9ubHkgc3J0TGlzdGVuZXJBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBUaGUgcG9ydCBvZiB0aGUgU1JUIGxpc3RlbmVyLiAqL1xuICByZWFkb25seSBzcnRMaXN0ZW5lclBvcnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxhdGVuY3kuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBJRCBmb3IgdGhlIFNSVCBjb25uZWN0aW9uLlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0cmVhbSBJRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWNyeXB0aW9uIHNldHRpbmdzIGZvciB0aGUgU1JUIGNvbm5lY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVjcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVjcnlwdGlvbj86IFNydERlY3J5cHRpb25Qcm9wcztcbn1cblxuLyoqIFRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSBmb3IgU1JUIGRlY3J5cHRpb24uICovXG5leHBvcnQgY2xhc3MgU3J0RGVjcnlwdGlvbkFsZ29yaXRobSB7XG4gIC8qKiBBRVMtMTI4LiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzEyOCA9IG5ldyBTcnREZWNyeXB0aW9uQWxnb3JpdGhtKCdBRVMxMjgnKTtcbiAgLyoqIEFFUy0xOTIuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUVTMTkyID0gbmV3IFNydERlY3J5cHRpb25BbGdvcml0aG0oJ0FFUzE5MicpO1xuICAvKiogQUVTLTI1Ni4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBRVMyNTYgPSBuZXcgU3J0RGVjcnlwdGlvbkFsZ29yaXRobSgnQUVTMjU2Jyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBTcnREZWNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gbmV3IFNydERlY3J5cHRpb25BbGdvcml0aG0odmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKiogUHJvcGVydGllcyBmb3IgU1JUIGRlY3J5cHRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFNydERlY3J5cHRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZW5jcnlwdGlvbiBhbGdvcml0aG0uXG4gICAqIEBkZWZhdWx0IC0gbm8gYWxnb3JpdGhtXG4gICAqL1xuICByZWFkb25seSBhbGdvcml0aG0/OiBTcnREZWNyeXB0aW9uQWxnb3JpdGhtO1xuICAvKipcbiAgICogVGhlIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgY29udGFpbmluZyB0aGUgcGFzc3BocmFzZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGNvbnRlbnQuXG4gICAqIEBkZWZhdWx0IC0gbm8gcGFzc3BocmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3BocmFzZVNlY3JldD86IElTZWNyZXQ7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBhbiBTUlQgbGlzdGVuZXIgaW5wdXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNydExpc3RlbmVySW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBEZWNyeXB0aW9uIHNldHRpbmdzIGZvciB0aGUgU1JUIGNvbm5lY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVjcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVjcnlwdGlvbj86IFNydERlY3J5cHRpb25Qcm9wcztcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxhdGVuY3kuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBJRCB0aGF0IHRoZSB1cHN0cmVhbSBzeXN0ZW0gdXNlcyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhpcyBsaXN0ZW5lci5cbiAgICogQGRlZmF1bHQgLSBubyBzdHJlYW0gSURcbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlucHV0IHNlY3VyaXR5IGdyb3Vwcy4gUmVxdWlyZWQgZm9yIFNSVCBsaXN0ZW5lciBpbnB1dHMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNlY3VyaXR5R3JvdXBzOiBJSW5wdXRTZWN1cml0eUdyb3VwUmVmW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBTVEFOREFSRCAodHdvLXBpcGVsaW5lKSBvciBTSU5HTEVfUElQRUxJTkUgaW5wdXQuIEEgU1RBTkRBUkQgaW5wdXQgY3JlYXRlc1xuICAgKiB0d28gbGlzdGVuZXIgZW5kcG9pbnRzIGZvciBwaXBlbGluZSByZWR1bmRhbmN5LlxuICAgKiBAZGVmYXVsdCBDaGFubmVsQ2xhc3MuU0lOR0xFX1BJUEVMSU5FXG4gICAqL1xuICByZWFkb25seSBpbnB1dENsYXNzPzogQ2hhbm5lbENsYXNzO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gRWxlbWVudGFsIExpbmsgaW5wdXQgZGV2aWNlIGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dERldmljZUlucHV0UHJvcHMge1xuICAvKiogVGhlIElEcyBvZiBvbmUgb3IgdHdvIHJlZ2lzdGVyZWQgRWxlbWVudGFsIExpbmsgZGV2aWNlcy4gVHdvIHByb3ZpZGVzIHBpcGVsaW5lIHJlZHVuZGFuY3kuICovXG4gIHJlYWRvbmx5IGRldmljZUlkczogc3RyaW5nW107XG59XG5cbi8qKiBUaGUgdHJhbnNwb3J0IHByb3RvY29sIGZvciBhIG11bHRpY2FzdCBzb3VyY2UuICovXG5leHBvcnQgY2xhc3MgTXVsdGljYXN0UHJvdG9jb2wge1xuICAvKiogVURQIHRyYW5zcG9ydC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBVRFAgPSBuZXcgTXVsdGljYXN0UHJvdG9jb2woJ3VkcCcpO1xuICAvKiogUlRQIHRyYW5zcG9ydC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSVFAgPSBuZXcgTXVsdGljYXN0UHJvdG9jb2woJ3J0cCcpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogTXVsdGljYXN0UHJvdG9jb2wge1xuICAgIHJldHVybiBuZXcgTXVsdGljYXN0UHJvdG9jb2wodmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKiogQSBzb3VyY2UgZm9yIGEgbXVsdGljYXN0IGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aWNhc3RJbnB1dFNvdXJjZSB7XG4gIC8qKiBUaGUgbXVsdGljYXN0IGdyb3VwIGFkZHJlc3MuICovXG4gIHJlYWRvbmx5IGFkZHJlc3M6IHN0cmluZztcbiAgLyoqIFRoZSBtdWx0aWNhc3QgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRyYW5zcG9ydCBwcm90b2NvbC5cbiAgICogQGRlZmF1bHQgTXVsdGljYXN0UHJvdG9jb2wuVURQXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbD86IE11bHRpY2FzdFByb3RvY29sO1xuICAvKipcbiAgICogRmlsdGVyIHRvIGEgc3BlY2lmaWMgc291cmNlIElQIChzb3VyY2Utc3BlY2lmaWMgbXVsdGljYXN0KS5cbiAgICogQGRlZmF1bHQgLSBhY2NlcHQgYW55IHNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSXA/OiBzdHJpbmc7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBhIG11bHRpY2FzdCBpbnB1dC4gUmVxdWlyZXMgYGFueXdoZXJlU2V0dGluZ3NgIG9uIHRoZSBjaGFubmVsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aWNhc3RJbnB1dFByb3BzIHtcbiAgLyoqIFRoZSBtdWx0aWNhc3Qgc291cmNlcy4gUHJvdmlkZSB0d28gZm9yIGEgU1RBTkRBUkQgKHJlZHVuZGFudC1waXBlbGluZSkgY2hhbm5lbC4gKi9cbiAgcmVhZG9ubHkgc291cmNlczogTXVsdGljYXN0SW5wdXRTb3VyY2VbXTtcbn1cblxuLyoqIEEgcmVmZXJlbmNlIHRvIGFuIFNEUCBmaWxlIHRoYXQgZGVzY3JpYmVzIGEgU01QVEUgMjExMCBzdHJlYW0gdG8gaW5nZXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbXB0ZTIxMTBTZHBMb2NhdGlvbiB7XG4gIC8qKiBUaGUgVVJMIG9mIHRoZSBTRFAgZmlsZS4gKi9cbiAgcmVhZG9ubHkgc2RwVXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIG1lZGlhIHN0cmVhbSB3aXRoaW4gdGhlIFNEUCB0byBpbmdlc3QuIFVzZSB3aGVuIHRoZSBTRFAgZGVzY3JpYmVzXG4gICAqIG1vcmUgdGhhbiBvbmUgc3RyZWFtIG9mIHRoYXQgbWVkaWEgdHlwZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IG1lZGlhSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBTTVBURSAyMTEwIHJlY2VpdmVyIGdyb3VwIGlucHV0LiBSZXF1aXJlcyBgYW55d2hlcmVTZXR0aW5nc2Agb24gdGhlIGNoYW5uZWwuXG4gKlxuICogWW91IHNwZWNpZnkgdGhlIFNEUCBmaWxlcyB0aGF0IGRlc2NyaWJlIHRoZSBzdHJlYW1zIHRvIGluZ2VzdCDigJQgb25lIHZpZGVvIFNEUCwgYW5kIGFueVxuICogbnVtYmVyIG9mIGF1ZGlvIGFuZCBhbmNpbGxhcnkgU0RQcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbXB0ZTIxMTBJbnB1dFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBTRFAgZGVzY3JpYmluZyB0aGUgdmlkZW8gc3RyZWFtLlxuICAgKiBAZGVmYXVsdCAtIG5vIHZpZGVvIHN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkgdmlkZW9TZHA/OiBTbXB0ZTIxMTBTZHBMb2NhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTRFBzIGRlc2NyaWJpbmcgdGhlIGF1ZGlvIHN0cmVhbXMuIFVwIHRvIDUwLlxuICAgKiBAZGVmYXVsdCAtIG5vIGF1ZGlvIHN0cmVhbXNcbiAgICovXG4gIHJlYWRvbmx5IGF1ZGlvU2Rwcz86IFNtcHRlMjExMFNkcExvY2F0aW9uW107XG4gIC8qKlxuICAgKiBUaGUgU0RQcyBkZXNjcmliaW5nIHRoZSBhbmNpbGxhcnkgZGF0YSBzdHJlYW1zIChTQ1RFLTM1IG9yIGNhcHRpb25zKS4gVXAgdG8gNTAuXG4gICAqIEBkZWZhdWx0IC0gbm8gYW5jaWxsYXJ5IGRhdGEgc3RyZWFtc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5jaWxsYXJ5U2Rwcz86IFNtcHRlMjExMFNkcExvY2F0aW9uW107XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBhIENESSAodW5jb21wcmVzc2VkKSBpbnB1dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RpSW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUd28gVlBDIHN1Ym5ldHMsIGluIHR3byBkaWZmZXJlbnQgYXZhaWxhYmlsaXR5IHpvbmVzLCBmb3IgdGhlIENESSBpbnB1dCBuZXR3b3JrIGludGVyZmFjZXMuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRzOiBJU3VibmV0UmVmW107XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cHMgdG8gYXR0YWNoIHRvIHRoZSBDREkgaW5wdXQgbmV0d29yayBpbnRlcmZhY2VzLlxuICAgKiBAZGVmYXVsdCAtIFZQQyBkZWZhdWx0IHNlY3VyaXR5IGdyb3VwXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwUmVmW107XG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgTWVkaWFMaXZlIGFzc3VtZXMgdG8gY3JlYXRlIG5ldHdvcmsgaW50ZXJmYWNlcyBpbiB0aGUgVlBDLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGEgcm9sZSBpcyBjcmVhdGVkIGFuZCBncmFudGVkIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy5cbiAgICogV2hlbiB5b3UgcHJvdmlkZSBhIHJvbGUsIG5vIHBlcm1pc3Npb25zIGFyZSBhZGRlZCDigJQgeW91IG93biBhbGwgdGhlIHBlcm1pc3Npb25zIGl0IG5lZWRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgcm9sZSBpcyBjcmVhdGVkIHdpdGggdGhlIG1lZGlhbGl2ZS5hbWF6b25hd3MuY29tIHNlcnZpY2UgcHJpbmNpcGFsXG4gICAqXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6cHJlZmVyLXJlZi1pbnRlcmZhY2VdXG4gICAqL1xuICByZWFkb25seSByb2xlPzogSVJvbGU7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgcHVzaC10eXBlIGlucHV0cyAoUlRNUF9QVVNILCBSVFBfUFVTSCwgVURQX1BVU0gpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1c2hJbnB1dFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBzZWN1cml0eSBncm91cHMgdGhhdCBjb250cm9sIHdoaWNoIENJRFIgYmxvY2tzIGNhbiBwdXNoIHRvIHRoaXMgaW5wdXQuIFJlcXVpcmVkIGZvclxuICAgKiBjbG91ZCBpbnB1dHM7IG11c3QgYmUgb21pdHRlZCBmb3Igb24tcHJlbWlzZXMgaW5wdXRzIChgSW5wdXROZXR3b3JrTG9jYXRpb24uT05fUFJFTUlTRVNgKSxcbiAgICogd2hpY2ggZG8gbm90IHN1cHBvcnQgc2VjdXJpdHkgZ3JvdXBzLlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgKG9ubHkgdmFsaWQgZm9yIG9uLXByZW1pc2VzIGlucHV0cylcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U2VjdXJpdHlHcm91cHM/OiBJSW5wdXRTZWN1cml0eUdyb3VwUmVmW107XG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb25zIGZvciBwdXNoIGlucHV0cy4gRm9yIFJUTVAgcHVzaCwgZWFjaCBkZXN0aW5hdGlvbiBjYW4gaGF2ZSBhIHN0cmVhbSBuYW1lLlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhTGl2ZSBhdXRvLWdlbmVyYXRlcyBkZXN0aW5hdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9ucz86IFB1c2hJbnB1dERlc3RpbmF0aW9uW107XG59XG5cbi8qKlxuICogQSBkZXN0aW5hdGlvbiBmb3IgYSBwdXNoLXR5cGUgaW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVzaElucHV0RGVzdGluYXRpb24ge1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBuYW1lIGZvciBSVE1QIHB1c2ggZGVzdGluYXRpb25zIChhcHBsaWNhdGlvbiBuYW1lL2luc3RhbmNlKS5cbiAgICogQGRlZmF1bHQgLSBhdXRvLWdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBNZWRpYUxpdmUgQW55d2hlcmUgbmV0d29yayB0aGlzIHB1c2ggZGVzdGluYXRpb24gbGl2ZXMgb24uIFJlcXVpcmVkIHdoZW4gdGhlIGlucHV0J3NcbiAgICogYGlucHV0TmV0d29ya0xvY2F0aW9uYCBpcyBgT05fUFJFTUlTRVNgLlxuICAgKiBAZGVmYXVsdCAtIEFXUy1tYW5hZ2VkIG5ldHdvcmtcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcms/OiBJTmV0d29ya1JlZjtcbiAgLyoqXG4gICAqIFRoZSByb3V0ZXMgdG8gdGhlIHB1c2ggZGVzdGluYXRpb24gb24gdGhlIGxvY2FsIG5ldHdvcmsuIFJlcXVpcmVkIGZvclxuICAgKiBvbi1wcmVtaXNlcyAoYE9OX1BSRU1JU0VTYCkgcHVzaCBpbnB1dHMuXG4gICAqIEBkZWZhdWx0IC0gbm8gcm91dGVzXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrUm91dGVzPzogTmV0d29ya1JvdXRlW107XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBJUCBhZGRyZXNzIHRvIGFzc2lnbiB0byB0aGUgcHVzaCBkZXN0aW5hdGlvbiBvbiB0aGUgbG9jYWwgbmV0d29yay5cbiAgICogQGRlZmF1bHQgLSBNZWRpYUxpdmUgQW55d2hlcmUgdXNlcyBvbmUgZnJvbSB0aGUgSVAgcG9vbCBzcGVjaWZpZWQgb24gdGhlIHNlbGVjdGVkIG5ldHdvcmsgKHNlcnZpY2UgZGVmYXVsdClcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0lwQWRkcmVzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCaW5kIHB1c2gtaW5wdXQgZGVzdGluYXRpb25zIHRvIHRoZWlyIENGTiBzaGFwZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBiaW5kUHVzaERlc3RpbmF0aW9ucyhkZXN0aW5hdGlvbnM/OiBQdXNoSW5wdXREZXN0aW5hdGlvbltdKTogQ2ZuSW5wdXQuSW5wdXREZXN0aW5hdGlvblJlcXVlc3RQcm9wZXJ0eVtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGRlc3RpbmF0aW9ucz8ubWFwKGQgPT4gKHtcbiAgICBzdHJlYW1OYW1lOiBkLnN0cmVhbU5hbWUsXG4gICAgbmV0d29yazogZC5uZXR3b3JrPy5uZXR3b3JrUmVmLm5ldHdvcmtJZCxcbiAgICBuZXR3b3JrUm91dGVzOiBkLm5ldHdvcmtSb3V0ZXM/Lm1hcChyID0+ICh7IGNpZHI6IHIuY2lkciwgZ2F0ZXdheTogci5nYXRld2F5IH0pKSxcbiAgICBzdGF0aWNJcEFkZHJlc3M6IGQuc3RhdGljSXBBZGRyZXNzLFxuICB9KSk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgYmluZCByZXN1bHQgZm9yIElucHV0Q29uZmlndXJhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgSW5wdXRCaW5kQ29uZmlnIHtcbiAgcmVhZG9ubHkgdHlwZTogSW5wdXRUeXBlO1xuICByZWFkb25seSBpbnB1dENsYXNzPzogc3RyaW5nO1xuICByZWFkb25seSBpbnB1dFNvdXJjZXM/OiBJbnB1dFNvdXJjZVtdO1xuICByZWFkb25seSBzb3VyY2VzPzogQ2ZuSW5wdXQuSW5wdXRTb3VyY2VSZXF1ZXN0UHJvcGVydHlbXTtcbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zPzogQ2ZuSW5wdXQuSW5wdXREZXN0aW5hdGlvblJlcXVlc3RQcm9wZXJ0eVtdO1xuICByZWFkb25seSBtZWRpYUNvbm5lY3RGbG93cz86IENmbklucHV0Lk1lZGlhQ29ubmVjdEZsb3dSZXF1ZXN0UHJvcGVydHlbXTtcbiAgcmVhZG9ubHkgaW5wdXREZXZpY2VzPzogQ2ZuSW5wdXQuSW5wdXREZXZpY2VTZXR0aW5nc1Byb3BlcnR5W107XG4gIHJlYWRvbmx5IG11bHRpY2FzdFNldHRpbmdzPzogQ2ZuSW5wdXQuTXVsdGljYXN0U2V0dGluZ3NDcmVhdGVSZXF1ZXN0UHJvcGVydHk7XG4gIHJlYWRvbmx5IHNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5ncz86IENmbklucHV0LlNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5nc1Byb3BlcnR5O1xuICByZWFkb25seSByb3V0ZXJTZXR0aW5ncz86IENmbklucHV0LlJvdXRlclNldHRpbmdzUHJvcGVydHk7XG4gIHJlYWRvbmx5IHNydFNldHRpbmdzPzogQ2ZuSW5wdXQuU3J0U2V0dGluZ3NSZXF1ZXN0UHJvcGVydHk7XG4gIHJlYWRvbmx5IHNkaVNvdXJjZXM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdnBjPzogQ2ZuSW5wdXQuSW5wdXRWcGNSZXF1ZXN0UHJvcGVydHk7XG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlucHV0U2VjdXJpdHlHcm91cHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSByb2xlIChhbmQgdGhlIGZsb3dzIGl0IG11c3QgbWFuYWdlKSBmb3IgYSBNZWRpYUNvbm5lY3QgZmxvdyBpbnB1dC4gTWVkaWFMaXZlXG4gICAqIGFzc3VtZXMgdGhpcyByb2xlIGF0IGlucHV0IGNyZWF0ZS9kZWxldGUgdGltZSB0byBhZGQvcmVtb3ZlIG91dHB1dHMgb24gdGhlIGZsb3dzLFxuICAgKiBzbyBpdCdzIGdyYW50ZWQgdGhlIGBtZWRpYWNvbm5lY3Q6TWFuYWdlZCpgIGZsb3ctbWFuYWdlbWVudCBhY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVkaWFDb25uZWN0Rmxvd0dyYW50PzogTWVkaWFDb25uZWN0Rmxvd0dyYW50O1xuICAvKipcbiAgICogVGhlIHJvbGUgYW5kIFZQQyBzY29wZSBmb3IgYSBDREkvVlBDIGlucHV0LiBNZWRpYUxpdmUgYXNzdW1lcyB0aGlzIHJvbGUgdG8gY3JlYXRlIHRoZVxuICAgKiBpbnB1dCdzIG5ldHdvcmsgaW50ZXJmYWNlcywgc28gaXQncyBncmFudGVkIHRoZSBFQzIgRU5JIGFjdGlvbnMgc2NvcGVkIHRvIHRoZSBWUEMuXG4gICAqL1xuICByZWFkb25seSB2cGNSb2xlR3JhbnQ/OiBWcGNJbnB1dFJvbGVHcmFudDtcbn1cblxuLyoqXG4gKiBUaGUgaW5wdXQgcm9sZSBhbmQgVlBDIHNjb3BlIGZvciBhIENESS9WUEMgaW5wdXQncyBFQzIgRU5JIGF1dG8tZ3JhbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIFZwY0lucHV0Um9sZUdyYW50IHtcbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG4gIHJlYWRvbmx5IHN1Ym5ldElkczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBpbnB1dCByb2xlIGZvciBhIE1lZGlhQ29ubmVjdCBmbG93IGlucHV0J3MgYXV0by1ncmFudC5cbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgTWVkaWFDb25uZWN0Rmxvd0dyYW50IHtcbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG59XG5cbi8qKlxuICogQmluZCBhIFNNUFRFIDIxMTAgU0RQIGxvY2F0aW9uIHRvIGl0cyBDRk4gc2hhcGUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYmluZFNkcExvY2F0aW9uKGxvYzogU21wdGUyMTEwU2RwTG9jYXRpb24pOiBDZm5JbnB1dC5JbnB1dFNkcExvY2F0aW9uUHJvcGVydHkge1xuICByZXR1cm4geyBzZHBVcmw6IGxvYy5zZHBVcmwsIG1lZGlhSW5kZXg6IGxvYy5tZWRpYUluZGV4IH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgaW5wdXQgY29uZmlndXJhdGlvbiBmb3IgYSBNZWRpYUxpdmUgSW5wdXQuXG4gKlxuICogVXNlIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBmb3IgeW91ciBpbnB1dCB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFVSTCBwdWxsIGlucHV0IGZvciBITFMgb3IgVFMgc3RyZWFtcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLnVybFB1bGwoW1xuICAgKiAgICAgIElucHV0U291cmNlLnVybCgnaHR0cHM6Ly9leGFtcGxlLmNvbS9zdHJlYW0ubTN1OCcpLFxuICAgKiAgICBdKTtcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXJsUHVsbChzb3VyY2VzOiBJbnB1dFNvdXJjZVtdKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gSW5wdXRDb25maWd1cmF0aW9uLmNyZWF0ZVB1bGxJbnB1dChJbnB1dFR5cGUuVVJMX1BVTEwsIHNvdXJjZXMpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBSVE1QIHB1bGwgaW5wdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgcnRtcFB1bGwoc291cmNlczogSW5wdXRTb3VyY2VbXSk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIElucHV0Q29uZmlndXJhdGlvbi5jcmVhdGVQdWxsSW5wdXQoSW5wdXRUeXBlLlJUTVBfUFVMTCwgc291cmNlcyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIE1QNCBmaWxlIHB1bGwgaW5wdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgbXA0RmlsZShzb3VyY2VzOiBJbnB1dFNvdXJjZVtdKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gSW5wdXRDb25maWd1cmF0aW9uLmNyZWF0ZVB1bGxJbnB1dChJbnB1dFR5cGUuTVA0X0ZJTEUsIHNvdXJjZXMpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIFRTIGZpbGUgcHVsbCBpbnB1dC4gKi9cbiAgcHVibGljIHN0YXRpYyB0c0ZpbGUoc291cmNlczogSW5wdXRTb3VyY2VbXSk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIElucHV0Q29uZmlndXJhdGlvbi5jcmVhdGVQdWxsSW5wdXQoSW5wdXRUeXBlLlRTX0ZJTEUsIHNvdXJjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBSVE1QIHB1c2ggaW5wdXQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3Qgc2VjdXJpdHlHcm91cDogSW5wdXRTZWN1cml0eUdyb3VwO1xuICAgKlxuICAgKiAgICBJbnB1dENvbmZpZ3VyYXRpb24ucnRtcFB1c2goe1xuICAgKiAgICAgIGlucHV0U2VjdXJpdHlHcm91cHM6IFtzZWN1cml0eUdyb3VwXSxcbiAgICogICAgfSk7XG4gICAqXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJ0bXBQdXNoKHByb3BzOiBQdXNoSW5wdXRQcm9wcyk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5SVE1QX1BVU0gsXG4gICAgICBpbnB1dENsYXNzOiBwcm9wcy5kZXN0aW5hdGlvbnM/Lmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgIGlucHV0U2VjdXJpdHlHcm91cHM6IHByb3BzLmlucHV0U2VjdXJpdHlHcm91cHM/Lm1hcChzZyA9PiBzZy5pbnB1dFNlY3VyaXR5R3JvdXBSZWYuaW5wdXRTZWN1cml0eUdyb3VwSWQpLFxuICAgICAgZGVzdGluYXRpb25zOiBiaW5kUHVzaERlc3RpbmF0aW9ucyhwcm9wcy5kZXN0aW5hdGlvbnMpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gUlRQIHB1c2ggaW5wdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgcnRwUHVzaChwcm9wczogUHVzaElucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+ICh7XG4gICAgICB0eXBlOiBJbnB1dFR5cGUuUlRQX1BVU0gsXG4gICAgICBpbnB1dENsYXNzOiBwcm9wcy5kZXN0aW5hdGlvbnM/Lmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgIGlucHV0U2VjdXJpdHlHcm91cHM6IHByb3BzLmlucHV0U2VjdXJpdHlHcm91cHM/Lm1hcChzZyA9PiBzZy5pbnB1dFNlY3VyaXR5R3JvdXBSZWYuaW5wdXRTZWN1cml0eUdyb3VwSWQpLFxuICAgICAgZGVzdGluYXRpb25zOiBiaW5kUHVzaERlc3RpbmF0aW9ucyhwcm9wcy5kZXN0aW5hdGlvbnMpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBVRFAgcHVzaCBpbnB1dC4gKi9cbiAgcHVibGljIHN0YXRpYyB1ZHBQdXNoKHByb3BzOiBQdXNoSW5wdXRQcm9wcyk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5VRFBfUFVTSCxcbiAgICAgIGlucHV0Q2xhc3M6IHByb3BzLmRlc3RpbmF0aW9ucz8ubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgaW5wdXRTZWN1cml0eUdyb3VwczogcHJvcHMuaW5wdXRTZWN1cml0eUdyb3Vwcz8ubWFwKHNnID0+IHNnLmlucHV0U2VjdXJpdHlHcm91cFJlZi5pbnB1dFNlY3VyaXR5R3JvdXBJZCksXG4gICAgICBkZXN0aW5hdGlvbnM6IGJpbmRQdXNoRGVzdGluYXRpb25zKHByb3BzLmRlc3RpbmF0aW9ucyksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1lZGlhQ29ubmVjdCByb3V0ZXIgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgLy8gU2luZ2xlIHBpcGVsaW5lIHdpdGggZGVmYXVsdCBBWlxuICAgKiAgICBJbnB1dENvbmZpZ3VyYXRpb24ubWVkaWFDb25uZWN0Um91dGVyKCk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIC8vIFJlZHVuZGFudCBwaXBlbGluZXMgd2l0aCBleHBsaWNpdCBBWnNcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLm1lZGlhQ29ubmVjdFJvdXRlcih7XG4gICAqICAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IFsndXMtZWFzdC0xYScsICd1cy1lYXN0LTFiJ10sXG4gICAqICAgIH0pO1xuICAgKlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUNvbm5lY3RSb3V0ZXIocHJvcHM/OiBNZWRpYUNvbm5lY3RSb3V0ZXJJbnB1dFByb3BzKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoc2NvcGUpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrQXpzID0gc2NvcGUgPyBTdGFjay5vZihzY29wZSkuYXZhaWxhYmlsaXR5Wm9uZXMgOiBbXTtcbiAgICAgIGNvbnN0IGF6cyA9IHByb3BzPy5hdmFpbGFiaWxpdHlab25lcyA/PyBbc3RhY2tBenNbMF1dO1xuICAgICAgaWYgKGF6cy5sZW5ndGggPCAxIHx8IGF6cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVyQXpDb3VudGAsICdNZWRpYUNvbm5lY3QgUm91dGVyIGlucHV0IHJlcXVpcmVzIDEgb3IgMiBhdmFpbGFiaWxpdHkgem9uZXMuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbnM6IENmbklucHV0LlJvdXRlckRlc3RpbmF0aW9uU2V0dGluZ3NQcm9wZXJ0eVtdID0gYXpzLm1hcChheiA9PiAoe1xuICAgICAgICBhdmFpbGFiaWxpdHlab25lTmFtZTogYXosXG4gICAgICB9KSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBJbnB1dFR5cGUuTUVESUFDT05ORUNUX1JPVVRFUixcbiAgICAgICAgaW5wdXRDbGFzczogYXpzLmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgICAgcm91dGVyU2V0dGluZ3M6IHtcbiAgICAgICAgICBkZXN0aW5hdGlvbnMsXG4gICAgICAgICAgZW5jcnlwdGlvblR5cGU6IHByb3BzPy5lbmNyeXB0aW9uU2VjcmV0ID8gJ0NVU1RPTScgOiAnQVVUT01BVElDJyxcbiAgICAgICAgICBzZWNyZXRBcm46IHByb3BzPy5lbmNyeXB0aW9uU2VjcmV0Py5zZWNyZXRBcm4sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1lZGlhQ29ubmVjdCBmbG93IGlucHV0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3Qgcm9sZTogaWFtLklSb2xlO1xuICAgKiAgICBkZWNsYXJlIGNvbnN0IGZsb3c6IG1lZGlhY29ubmVjdC5JRmxvd1JlZjtcbiAgICpcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLm1lZGlhQ29ubmVjdCh7XG4gICAqICAgICAgZmxvd3M6IFtmbG93XSxcbiAgICogICAgICByb2xlLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWVkaWFDb25uZWN0KHByb3BzOiBNZWRpYUNvbm5lY3RJbnB1dFByb3BzKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICBpZiAocHJvcHMuZmxvd3MubGVuZ3RoIDwgMSB8fCBwcm9wcy5mbG93cy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1lZGlhQ29ubmVjdEZsb3dzTGltaXRgLCAnWW91IG11c3Qgc3BlY2lmeSAxIG9yIDIgTWVkaWFDb25uZWN0IGZsb3dzLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoc2NvcGUpID0+IHtcbiAgICAgIGNvbnN0IHJvbGUgPSBwcm9wcy5yb2xlID8/IGNyZWF0ZUlucHV0Um9sZShzY29wZSwgJ01lZGlhQ29ubmVjdFJvbGUnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IElucHV0VHlwZS5NRURJQUNPTk5FQ1QsXG4gICAgICAgIGlucHV0Q2xhc3M6IHByb3BzLmZsb3dzLmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgICAgbWVkaWFDb25uZWN0Rmxvd3M6IHByb3BzLmZsb3dzLm1hcChmID0+ICh7IGZsb3dBcm46IGYuZmxvd1JlZi5mbG93QXJuIH0pKSxcbiAgICAgICAgcm9sZUFybjogcm9sZS5yb2xlQXJuLFxuICAgICAgICAvLyBPbmx5IGF1dG8tZ3JhbnQgYWN0aW9ucyB3aXRoIGF1dG8tY3JlYXRlZCByb2xlLiBBIHVzZXItcHJvdmlkZWQgcm9sZVxuICAgICAgICAvLyBpcyBsZWZ0IGFsb25lIOKAlCB0aGUgY2FsbGVyIGFkZHMgaXRzIHBlcm1pc3Npb25zLlxuICAgICAgICBtZWRpYUNvbm5lY3RGbG93R3JhbnQ6IHByb3BzLnJvbGUgPT09IHVuZGVmaW5lZCA/IHsgcm9sZSB9IDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gU0RJIGlucHV0IGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzdGF0aWMgc2RpKHNvdXJjZXM6IElTZGlTb3VyY2VbXSk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5TREksXG4gICAgICBpbnB1dENsYXNzOiBzb3VyY2VzLmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgIC8vIE1lZGlhTGl2ZSdzIFNkaVNvdXJjZXMgcHJvcGVydHkgZXhwZWN0cyB0aGUgbnVtZXJpYyBTREkgc291cmNlIElELCBub3QgdGhlIEFSTi5cbiAgICAgIHNkaVNvdXJjZXM6IHNvdXJjZXMubWFwKHMgPT4gcy5zZGlTb3VyY2VJZCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBFbGVtZW50YWwgTGluayBpbnB1dCBmcm9tIG9uZSBvciB0d28gcmVnaXN0ZXJlZCBMaW5rIGRldmljZSBJRHMuICovXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXREZXZpY2UocHJvcHM6IElucHV0RGV2aWNlSW5wdXRQcm9wcyk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKHByb3BzLmRldmljZUlkcy5sZW5ndGggPCAxIHx8IHByb3BzLmRldmljZUlkcy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YElucHV0RGV2aWNlQ291bnRgLCAnWW91IG11c3Qgc3BlY2lmeSAxIG9yIDIgaW5wdXQgZGV2aWNlcy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5JTlBVVF9ERVZJQ0UsXG4gICAgICBpbnB1dENsYXNzOiBwcm9wcy5kZXZpY2VJZHMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgaW5wdXREZXZpY2VzOiBwcm9wcy5kZXZpY2VJZHMubWFwKGlkID0+ICh7IGlkIH0pKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ0RJICh1bmNvbXByZXNzZWQpIGlucHV0IGRlbGl2ZXJlZCBpbnRvIGEgVlBDLlxuICAgKlxuICAgKiBNZWRpYUxpdmUgY3JlYXRlcyBuZXR3b3JrIGludGVyZmFjZXMgaW4gdGhlIHN1cHBsaWVkIHN1Ym5ldHMgYW5kIGhhbmRzIGJhY2sgdGhlIENESSBwdXNoXG4gICAqIGVuZHBvaW50cy4gVGhlIHJlcXVpcmVkIEVDMiBwZXJtaXNzaW9ucyBhcmUgZ3JhbnRlZCB0byB0aGUgcm9sZSBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjZGkocHJvcHM6IENkaUlucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChwcm9wcy5zdWJuZXRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDZGlTdWJuZXRDb3VudGAsICdDREkgaW5wdXRzIHJlcXVpcmUgZXhhY3RseSAyIHN1Ym5ldHMgaW4gdHdvIGRpZmZlcmVudCBhdmFpbGFiaWxpdHkgem9uZXMuJyk7XG4gICAgfVxuICAgIGNvbnN0IHN1Ym5ldElkcyA9IHByb3BzLnN1Ym5ldHMubWFwKHMgPT4gcy5zdWJuZXRSZWYuc3VibmV0SWQpO1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBJZHMgPSBwcm9wcy5zZWN1cml0eUdyb3Vwcz8ubWFwKHNnID0+IHNnLnNlY3VyaXR5R3JvdXBSZWYuc2VjdXJpdHlHcm91cElkKTtcbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoc2NvcGUpID0+IHtcbiAgICAgIGNvbnN0IHJvbGUgPSBwcm9wcy5yb2xlID8/IGNyZWF0ZUlucHV0Um9sZShzY29wZSwgJ0NkaVJvbGUnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IElucHV0VHlwZS5BV1NfQ0RJLFxuICAgICAgICBpbnB1dENsYXNzOiAnU1RBTkRBUkQnLFxuICAgICAgICByb2xlQXJuOiByb2xlLnJvbGVBcm4sXG4gICAgICAgIHZwYzogeyBzdWJuZXRJZHMsIHNlY3VyaXR5R3JvdXBJZHMgfSxcbiAgICAgICAgLy8gT25seSBhdXRvLWdyYW50IGFjdGlvbnMgd2l0aCBhdXRvLWNyZWF0ZWQgcm9sZS4gQSB1c2VyLXByb3ZpZGVkIHJvbGVcbiAgICAgICAgLy8gaXMgbGVmdCBhbG9uZSDigJQgdGhlIGNhbGxlciBhZGRzIGl0cyBwZXJtaXNzaW9ucy5cbiAgICAgICAgdnBjUm9sZUdyYW50OiBwcm9wcy5yb2xlID09PSB1bmRlZmluZWQgPyB7IHJvbGUsIHN1Ym5ldElkcywgc2VjdXJpdHlHcm91cElkczogc2VjdXJpdHlHcm91cElkcyA/PyBbXSB9IDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBtdWx0aWNhc3QgaW5wdXQuIFJlcXVpcmVzIGBhbnl3aGVyZVNldHRpbmdzYCBvbiB0aGUgY2hhbm5lbC4gKi9cbiAgcHVibGljIHN0YXRpYyBtdWx0aWNhc3QocHJvcHM6IE11bHRpY2FzdElucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChwcm9wcy5zb3VyY2VzLmxlbmd0aCA8IDEgfHwgcHJvcHMuc291cmNlcy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE11bHRpY2FzdFNvdXJjZUNvdW50YCwgJ1lvdSBtdXN0IHNwZWNpZnkgMSBvciAyIG11bHRpY2FzdCBzb3VyY2VzLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoKSA9PiAoe1xuICAgICAgdHlwZTogSW5wdXRUeXBlLk1VTFRJQ0FTVCxcbiAgICAgIGlucHV0Q2xhc3M6IHByb3BzLnNvdXJjZXMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgbXVsdGljYXN0U2V0dGluZ3M6IHtcbiAgICAgICAgc291cmNlczogcHJvcHMuc291cmNlcy5tYXAocyA9PiAoe1xuICAgICAgICAgIHVybDogYCR7KHMucHJvdG9jb2wgPz8gTXVsdGljYXN0UHJvdG9jb2wuVURQKS52YWx1ZX06Ly8ke3MuYWRkcmVzc306JHtzLnBvcnR9YCxcbiAgICAgICAgICBzb3VyY2VJcDogcy5zb3VyY2VJcCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgU01QVEUgMjExMCByZWNlaXZlciBncm91cCBpbnB1dC4gUmVxdWlyZXMgYGFueXdoZXJlU2V0dGluZ3NgIG9uIHRoZSBjaGFubmVsLiAqL1xuICBwdWJsaWMgc3RhdGljIHNtcHRlMjExMFJlY2VpdmVyR3JvdXAocHJvcHM6IFNtcHRlMjExMElucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmICgocHJvcHMuYXVkaW9TZHBzPy5sZW5ndGggPz8gMCkgPiA1MCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTbXB0ZTIxMTBBdWRpb1NkcENvdW50YCwgJ0EgU01QVEUgMjExMCBpbnB1dCBzdXBwb3J0cyBhdCBtb3N0IDUwIGF1ZGlvIFNEUHMuJyk7XG4gICAgfVxuICAgIGlmICgocHJvcHMuYW5jaWxsYXJ5U2Rwcz8ubGVuZ3RoID8/IDApID4gNTApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU21wdGUyMTEwQW5jaWxsYXJ5U2RwQ291bnRgLCAnQSBTTVBURSAyMTEwIGlucHV0IHN1cHBvcnRzIGF0IG1vc3QgNTAgYW5jaWxsYXJ5IFNEUHMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+ICh7XG4gICAgICB0eXBlOiBJbnB1dFR5cGUuU01QVEVfMjExMF9SRUNFSVZFUl9HUk9VUCxcbiAgICAgIHNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBzbXB0ZTIxMTBSZWNlaXZlckdyb3VwczogW3tcbiAgICAgICAgICBzZHBTZXR0aW5nczoge1xuICAgICAgICAgICAgdmlkZW9TZHA6IHByb3BzLnZpZGVvU2RwID8gYmluZFNkcExvY2F0aW9uKHByb3BzLnZpZGVvU2RwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF1ZGlvU2RwczogcHJvcHMuYXVkaW9TZHBzPy5tYXAoYmluZFNkcExvY2F0aW9uKSxcbiAgICAgICAgICAgIGFuY2lsbGFyeVNkcHM6IHByb3BzLmFuY2lsbGFyeVNkcHM/Lm1hcChiaW5kU2RwTG9jYXRpb24pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1dLFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNSVCBjYWxsZXIgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLnNydENhbGxlcihbe1xuICAgKiAgICAgIHNydExpc3RlbmVyQWRkcmVzczogJzEwLjAuMC4xJyxcbiAgICogICAgICBzcnRMaXN0ZW5lclBvcnQ6IDUwMDAsXG4gICAqICAgIH1dKTtcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3J0Q2FsbGVyKHNvdXJjZXM6IFNydENhbGxlclNvdXJjZVByb3BzW10pOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChzb3VyY2VzLmxlbmd0aCA8IDEgfHwgc291cmNlcy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNydENhbGxlclNvdXJjZXNMaW1pdGAsICdZb3UgbXVzdCBzcGVjaWZ5IDEgb3IgMiBTUlQgY2FsbGVyIHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+ICh7XG4gICAgICB0eXBlOiBJbnB1dFR5cGUuU1JUX0NBTExFUixcbiAgICAgIGlucHV0Q2xhc3M6IHNvdXJjZXMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgc3J0U2V0dGluZ3M6IHtcbiAgICAgICAgc3J0Q2FsbGVyU291cmNlczogc291cmNlcy5tYXAocyA9PiAoe1xuICAgICAgICAgIHNydExpc3RlbmVyQWRkcmVzczogcy5zcnRMaXN0ZW5lckFkZHJlc3MsXG4gICAgICAgICAgc3J0TGlzdGVuZXJQb3J0OiBzLnNydExpc3RlbmVyUG9ydC50b1N0cmluZygpLFxuICAgICAgICAgIG1pbmltdW1MYXRlbmN5OiBzLm1pbmltdW1MYXRlbmN5Py50b01pbGxpc2Vjb25kcygpLFxuICAgICAgICAgIHN0cmVhbUlkOiBzLnN0cmVhbUlkLFxuICAgICAgICAgIGRlY3J5cHRpb246IHMuZGVjcnlwdGlvbiA/IHtcbiAgICAgICAgICAgIGFsZ29yaXRobTogcy5kZWNyeXB0aW9uLmFsZ29yaXRobT8udmFsdWUsXG4gICAgICAgICAgICBwYXNzcGhyYXNlU2VjcmV0QXJuOiBzLmRlY3J5cHRpb24ucGFzc3BocmFzZVNlY3JldD8uc2VjcmV0QXJuLFxuICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBTUlQgbGlzdGVuZXIgaW5wdXQgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHN0YXRpYyBzcnRMaXN0ZW5lcihwcm9wczogU3J0TGlzdGVuZXJJbnB1dFByb3BzKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoKSA9PiAoe1xuICAgICAgdHlwZTogSW5wdXRUeXBlLlNSVF9MSVNURU5FUixcbiAgICAgIGlucHV0Q2xhc3M6IHByb3BzLmlucHV0Q2xhc3M/LnZhbHVlID8/ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgaW5wdXRTZWN1cml0eUdyb3VwczogcHJvcHMuaW5wdXRTZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4gc2cuaW5wdXRTZWN1cml0eUdyb3VwUmVmLmlucHV0U2VjdXJpdHlHcm91cElkKSxcbiAgICAgIHNydFNldHRpbmdzOiB7XG4gICAgICAgIHNydExpc3RlbmVyU2V0dGluZ3M6IHtcbiAgICAgICAgICBtaW5pbXVtTGF0ZW5jeTogcHJvcHMubWluaW11bUxhdGVuY3k/LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICAgICAgc3RyZWFtSWQ6IHByb3BzLnN0cmVhbUlkLFxuICAgICAgICAgIGRlY3J5cHRpb246IHByb3BzLmRlY3J5cHRpb24gPyB7XG4gICAgICAgICAgICBhbGdvcml0aG06IHByb3BzLmRlY3J5cHRpb24uYWxnb3JpdGhtPy52YWx1ZSxcbiAgICAgICAgICAgIHBhc3NwaHJhc2VTZWNyZXRBcm46IHByb3BzLmRlY3J5cHRpb24ucGFzc3BocmFzZVNlY3JldD8uc2VjcmV0QXJuLFxuICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVB1bGxJbnB1dCh0eXBlOiBJbnB1dFR5cGUsIHNvdXJjZXM6IElucHV0U291cmNlW10pOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChzb3VyY2VzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgUHVsbElucHV0U291cmNlc01pbmltdW1gLCAnWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCAxIGlucHV0IHNvdXJjZS4nKTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZXMubGVuZ3RoID4gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBQdWxsSW5wdXRTb3VyY2VzTGltaXRgLCAnWW91IGNhbm5vdCBzcGVjaWZ5IG1vcmUgdGhhbiAyIGlucHV0IHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGlucHV0Q2xhc3M6IHNvdXJjZXMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgICBpbnB1dFNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMubWFwKHMgPT4gcy5fYmluZCgpKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX2JpbmRGbjogKHNjb3BlPzogQ29uc3RydWN0KSA9PiBJbnB1dEJpbmRDb25maWcpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoc2NvcGU/OiBDb25zdHJ1Y3QpOiBJbnB1dEJpbmRDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9iaW5kRm4oc2NvcGUpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBkZWZhdWx0IElBTSByb2xlIGZvciBhbiBpbnB1dCB0aGF0IE1lZGlhTGl2ZSBhc3N1bWVzIChNZWRpYUNvbm5lY3QgZmxvdyBvciBDREkvVlBDKS5cbiAqIFRoZSBjYWxsZXIgd2lyZXMgdGhlIHNwZWNpZmljIG1hbmFnZWQvRUMyIGFjdGlvbnMgb250byB0aGUgcm9sZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRSb2xlKHNjb3BlOiBDb25zdHJ1Y3QgfCB1bmRlZmluZWQsIGlkOiBzdHJpbmcpOiBJUm9sZSB7XG4gIGlmICghc2NvcGUpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBsaXRgSW5wdXRSb2xlU2NvcGVgLFxuICAgICAgJ0Nhbm5vdCBhdXRvLWNyZWF0ZSBhbiBpbnB1dCByb2xlIHdpdGhvdXQgYSBjb25zdHJ1Y3Qgc2NvcGU7IHByb3ZpZGUgYW4gZXhwbGljaXQgYHJvbGVgLicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbmV3IFJvbGUoc2NvcGUsIGlkLCB7XG4gICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbWVkaWFsaXZlLmFtYXpvbmF3cy5jb20nLCB7XG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczogeyAnYXdzOlNvdXJjZUFjY291bnQnOiBBd3MuQUNDT1VOVF9JRCB9LFxuICAgICAgICBBcm5MaWtlOiB7XG4gICAgICAgICAgJ2F3czpTb3VyY2VBcm4nOiBTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgICAgIHNlcnZpY2U6ICdtZWRpYWxpdmUnLFxuICAgICAgICAgICAgcmVzb3VyY2U6ICdpbnB1dCcsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6ICcqJyxcbiAgICAgICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFMaXZlIElucHV0LlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgSW5wdXQgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElJbnB1dCB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhbGl2ZS1hbHBoYS5JbnB1dCc7XG5cbiAgLyoqIEltcG9ydCBhbiBleGlzdGluZyBpbnB1dCBieSBpdHMgQVJOLiBUaGUgaWQgaXMgcGFyc2VkIG91dCBvZiB0aGUgQVJOLiAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbnB1dEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBpbnB1dEFybjogc3RyaW5nKTogSUlucHV0IHtcbiAgICBjb25zdCBpbnB1dElkID0gZXh0cmFjdFJlc291cmNlSWQoaW5wdXRBcm4sICdJbnB1dCcpO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJSW5wdXQge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlucHV0QXJuID0gaW5wdXRBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRJZCA9IGlucHV0SWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRDbGFzcyA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpbnB1dFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXREZXN0aW5hdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIGdldCBpbnB1dFJlZigpOiBJbnB1dFJlZmVyZW5jZSB7XG4gICAgICAgIHJldHVybiB7IGlucHV0SWQ6IHRoaXMuaW5wdXRJZCwgaW5wdXRBcm46IHRoaXMuaW5wdXRBcm4gfTtcbiAgICAgIH1cbiAgICAgIC8qKiBAaW50ZXJuYWwgSW1wb3J0ZWQgaW5wdXRzIG93biBubyBzb3VyY2VzLCBzbyBncmFudGluZyBpcyBhIG5vLW9wLiAqL1xuICAgICAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKF9yb2xlOiBJUm9sZSk6IHZvaWQge31cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBpbnB1dEFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRDbGFzcz86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGlucHV0VHlwZT86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGlucHV0RGVzdGluYXRpb25zPzogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBpbnB1dFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKiogQSByZWZlcmVuY2UgdG8gdGhpcyBJbnB1dCByZXNvdXJjZS4gKi9cbiAgcHVibGljIGdldCBpbnB1dFJlZigpOiBJbnB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHsgaW5wdXRJZDogdGhpcy5pbnB1dElkLCBpbnB1dEFybjogdGhpcy5pbnB1dEFybiB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dFNvdXJjZVJlZnM6IElucHV0U291cmNlW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElucHV0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuaW5wdXROYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAyNTYgfSkgfSksXG4gICAgfSk7XG5cbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBjb25maWcgPSBwcm9wcy5pbnB1dC5fYmluZCh0aGlzKTtcblxuICAgIC8vIFNlY3VyaXR5LWdyb3VwIHJ1bGVzOiBvbi1wcmVtaXNlcyBpbnB1dHMgZG9uJ3Qgc3VwcG9ydCBzZWN1cml0eSBncm91cHMsIHdoaWxlIGNsb3VkIHB1c2hcbiAgICAvLyBpbnB1dHMgcmVxdWlyZSBhdCBsZWFzdCBvbmUuIEJvdGggYWx3YXlzIGZhaWwgYXQgZGVwbG95IG90aGVyd2lzZSwgc28gdmFsaWRhdGUgYXQgc3ludGguXG4gICAgY29uc3QgaXNPblByZW1pc2VzID0gcHJvcHMuaW5wdXROZXR3b3JrTG9jYXRpb24/LnZhbHVlID09PSBJbnB1dE5ldHdvcmtMb2NhdGlvbi5PTl9QUkVNSVNFUy52YWx1ZTtcbiAgICBjb25zdCBoYXNTZWN1cml0eUdyb3VwcyA9IChjb25maWcuaW5wdXRTZWN1cml0eUdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMDtcbiAgICBjb25zdCBpc1B1c2hJbnB1dCA9IGNvbmZpZy50eXBlID09PSBJbnB1dFR5cGUuUlRNUF9QVVNIXG4gICAgICB8fCBjb25maWcudHlwZSA9PT0gSW5wdXRUeXBlLlJUUF9QVVNIXG4gICAgICB8fCBjb25maWcudHlwZSA9PT0gSW5wdXRUeXBlLlVEUF9QVVNIO1xuICAgIGlmIChpc09uUHJlbWlzZXMgJiYgaGFzU2VjdXJpdHlHcm91cHMpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBPblByZW1pc2VzSW5wdXRTZWN1cml0eUdyb3Vwc2AsXG4gICAgICAgICdvbi1wcmVtaXNlcyBpbnB1dHMgZG8gbm90IHN1cHBvcnQgaW5wdXQgc2VjdXJpdHkgZ3JvdXBzOyByZW1vdmUgaW5wdXRTZWN1cml0eUdyb3VwcyBmb3IgYW4gT05fUFJFTUlTRVMgaW5wdXQnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc09uUHJlbWlzZXMgJiYgaXNQdXNoSW5wdXQgJiYgIWhhc1NlY3VyaXR5R3JvdXBzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUHVzaElucHV0U2VjdXJpdHlHcm91cHNSZXF1aXJlZGAsXG4gICAgICAgICdjbG91ZCBwdXNoIGlucHV0cyByZXF1aXJlIGF0IGxlYXN0IG9uZSBpbnB1dCBzZWN1cml0eSBncm91cCcsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBTREkgaW5wdXRzIGFyZSBvbi1wcmVtaXNlcyBoYXJkd2FyZSBzb3VyY2VzIOKAlCBNZWRpYUxpdmUgYWx3YXlzIHJlamVjdHMgYW4gU0RJIGlucHV0XG4gICAgLy8gd2hvc2UgbmV0d29yayBsb2NhdGlvbiBpc24ndCBPTl9QUkVNSVNFUywgc28gZmFpbCBmYXN0IGF0IHN5bnRoLlxuICAgIGlmIChjb25maWcudHlwZSA9PT0gSW5wdXRUeXBlLlNESSAmJiAhaXNPblByZW1pc2VzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgU2RpSW5wdXRSZXF1aXJlc09uUHJlbWlzZXNgLFxuICAgICAgICBcImFuIFNESSBpbnB1dCdzIGlucHV0TmV0d29ya0xvY2F0aW9uIG11c3QgYmUgSW5wdXROZXR3b3JrTG9jYXRpb24uT05fUFJFTUlTRVNcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuSW5wdXQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICB0eXBlOiBjb25maWcudHlwZSxcbiAgICAgIHJvbGVBcm46IGNvbmZpZy5yb2xlQXJuLFxuICAgICAgc291cmNlczogY29uZmlnLnNvdXJjZXMsXG4gICAgICBkZXN0aW5hdGlvbnM6IGNvbmZpZy5kZXN0aW5hdGlvbnMsXG4gICAgICBtZWRpYUNvbm5lY3RGbG93czogY29uZmlnLm1lZGlhQ29ubmVjdEZsb3dzLFxuICAgICAgaW5wdXREZXZpY2VzOiBjb25maWcuaW5wdXREZXZpY2VzLFxuICAgICAgbXVsdGljYXN0U2V0dGluZ3M6IGNvbmZpZy5tdWx0aWNhc3RTZXR0aW5ncyxcbiAgICAgIHNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5nczogY29uZmlnLnNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5ncyxcbiAgICAgIHJvdXRlclNldHRpbmdzOiBjb25maWcucm91dGVyU2V0dGluZ3MsXG4gICAgICBzcnRTZXR0aW5nczogY29uZmlnLnNydFNldHRpbmdzLFxuICAgICAgc2RpU291cmNlczogY29uZmlnLnNkaVNvdXJjZXMsXG4gICAgICB2cGM6IGNvbmZpZy52cGMsXG4gICAgICBpbnB1dFNlY3VyaXR5R3JvdXBzOiBjb25maWcuaW5wdXRTZWN1cml0eUdyb3VwcyxcbiAgICAgIGlucHV0TmV0d29ya0xvY2F0aW9uOiBwcm9wcy5pbnB1dE5ldHdvcmtMb2NhdGlvbj8udmFsdWUsXG4gICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbnB1dEFybiA9IHJlc291cmNlLmlucHV0UmVmLmlucHV0QXJuO1xuICAgIHRoaXMuaW5wdXRJZCA9IHJlc291cmNlLmlucHV0UmVmLmlucHV0SWQ7XG4gICAgdGhpcy5pbnB1dENsYXNzID0gY29uZmlnLmlucHV0Q2xhc3M7XG4gICAgdGhpcy5pbnB1dFR5cGUgPSBjb25maWcudHlwZTtcbiAgICB0aGlzLmlucHV0RGVzdGluYXRpb25zID0gcmVzb3VyY2UuYXR0ckRlc3RpbmF0aW9ucztcbiAgICB0aGlzLmlucHV0U291cmNlcyA9IHJlc291cmNlLmF0dHJTb3VyY2VzO1xuICAgIHRoaXMuaW5wdXRTb3VyY2VSZWZzID0gY29uZmlnLmlucHV0U291cmNlcyA/PyBbXTtcblxuICAgIC8vIE1lZGlhQ29ubmVjdCBmbG93IGlucHV0czogZ3JhbnQgbWFuYWdlZCBmbG93LW1hbmFnZW1lbnQgYWN0aW9ucy5cbiAgICAvLyBSZXNvdXJjZSBpcyBgKmAg4oCUIHNlcnZpY2UgcmVqZWN0cyBmbG93LUFSTi1zY29wZWQgZ3JhbnRzLlxuICAgIGlmIChjb25maWcubWVkaWFDb25uZWN0Rmxvd0dyYW50KSB7XG4gICAgICBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICAgIGdyYW50ZWU6IGNvbmZpZy5tZWRpYUNvbm5lY3RGbG93R3JhbnQucm9sZSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdtZWRpYWNvbm5lY3Q6TWFuYWdlZERlc2NyaWJlRmxvdycsXG4gICAgICAgICAgJ21lZGlhY29ubmVjdDpNYW5hZ2VkQWRkT3V0cHV0JyxcbiAgICAgICAgICAnbWVkaWFjb25uZWN0Ok1hbmFnZWRSZW1vdmVPdXRwdXQnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZUFybnM6IFsnKiddLFxuICAgICAgfSkuYXBwbHlCZWZvcmUocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIC8vIENESS9WUEMgaW5wdXRzOiBDcmVhdGUvRGVsZXRlIHNjb3BlZCB0byBFTkkgKyBzdWJuZXRzICsgU0dzOyBEZXNjcmliZSogbmVlZHMgYCpgLlxuICAgIGlmIChjb25maWcudnBjUm9sZUdyYW50KSB7XG4gICAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgICAgY29uc3QgZ3JhbnQgPSBjb25maWcudnBjUm9sZUdyYW50O1xuICAgICAgY29uc3QgbmV0d29ya0ludGVyZmFjZUFybiA9IHN0YWNrLmZvcm1hdEFybih7IHNlcnZpY2U6ICdlYzInLCByZXNvdXJjZTogJ25ldHdvcmstaW50ZXJmYWNlJywgcmVzb3VyY2VOYW1lOiAnKicgfSk7XG4gICAgICBjb25zdCBzdWJuZXRBcm5zID0gZ3JhbnQuc3VibmV0SWRzLm1hcChzID0+IHN0YWNrLmZvcm1hdEFybih7IHNlcnZpY2U6ICdlYzInLCByZXNvdXJjZTogJ3N1Ym5ldCcsIHJlc291cmNlTmFtZTogcyB9KSk7XG4gICAgICBjb25zdCBzZWN1cml0eUdyb3VwQXJucyA9IGdyYW50LnNlY3VyaXR5R3JvdXBJZHMubWFwKHNnID0+IHN0YWNrLmZvcm1hdEFybih7IHNlcnZpY2U6ICdlYzInLCByZXNvdXJjZTogJ3NlY3VyaXR5LWdyb3VwJywgcmVzb3VyY2VOYW1lOiBzZyB9KSk7XG5cbiAgICAgIEdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgICAgZ3JhbnRlZTogZ3JhbnQucm9sZSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdlYzI6Q3JlYXRlTmV0d29ya0ludGVyZmFjZScsXG4gICAgICAgICAgJ2VjMjpDcmVhdGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbicsXG4gICAgICAgICAgJ2VjMjpEZWxldGVOZXR3b3JrSW50ZXJmYWNlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiBbbmV0d29ya0ludGVyZmFjZUFybiwgLi4uc3VibmV0QXJucywgLi4uc2VjdXJpdHlHcm91cEFybnNdLFxuICAgICAgfSkuYXBwbHlCZWZvcmUocmVzb3VyY2UpO1xuICAgICAgR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgICBncmFudGVlOiBncmFudC5yb2xlLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VzJyxcbiAgICAgICAgICAnZWMyOkRlc2NyaWJlU3VibmV0cycsXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZVNlY3VyaXR5R3JvdXBzJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiBbJyonXSwgLy8gRGVzY3JpYmUqIGFjdGlvbnMgZG9uJ3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9uc1xuICAgICAgfSkuYXBwbHlCZWZvcmUocmVzb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFNvdXJjZVJlZnMuZm9yRWFjaChzID0+IHMuX2dyYW50UmVhZChyb2xlKSk7XG4gIH1cbn1cbiJdfQ==