@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
@@ -0,0 +1,455 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaConnectRouterSettings = exports.MediaPackageV2Destination = exports.MediaPackageV2EndpointId = exports.SrtDestination = exports.RtmpDestination = exports.UdpOutputDestination = exports.S3OutputDestination = exports.OutputDestination = void 0;
4
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
8
+ /**
9
+ * Validate a network port (1–65535), unless tokenized.
10
+ * @internal
11
+ */
12
+ function validatePort(port) {
13
+ if (!aws_cdk_lib_1.Token.isUnresolved(port) && (!Number.isInteger(port) || port < 1 || port > 65535)) {
14
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `InvalidPort`, `port must be an integer between 1 and 65535, got ${JSON.stringify(port)}`);
15
+ }
16
+ }
17
+ /** @internal */
18
+ function s3Url(bucket, prefix) {
19
+ return `s3ssl://${bucket.bucketName}${prefix ? `/${prefix}` : ''}`;
20
+ }
21
+ /**
22
+ * A general URL-based output destination — an S3 bucket or an HTTP(S) endpoint.
23
+ *
24
+ * Used by HLS, MS Smooth, and CMAF Ingest output groups. Each output group's `destinations`
25
+ * prop is typed to the destination valid for its protocol, so an invalid pairing (e.g. a UDP
26
+ * destination on an HLS group) is a compile-time error rather than a deploy-time failure.
27
+ */
28
+ class OutputDestination {
29
+ destUrl;
30
+ bucket;
31
+ options;
32
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.OutputDestination", version: "2.268.0-alpha.0" };
33
+ /** Deliver to an S3 bucket (auto-grants write to the channel role). */
34
+ static toBucket(bucket, prefix) {
35
+ return new OutputDestination(s3Url(bucket, prefix), bucket);
36
+ }
37
+ /** Deliver to a raw URL — typically an `https://` origin (or an `s3ssl://` path). */
38
+ static url(url, options) {
39
+ try {
40
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_OutputDestinationOptions(options);
41
+ }
42
+ catch (error) {
43
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
44
+ Error.captureStackTrace(error, this.url);
45
+ }
46
+ throw error;
47
+ }
48
+ return new OutputDestination(url, undefined, options);
49
+ }
50
+ constructor(destUrl, bucket, options) {
51
+ this.destUrl = destUrl;
52
+ this.bucket = bucket;
53
+ this.options = options;
54
+ }
55
+ /** @internal */
56
+ _bind() {
57
+ return { url: this.destUrl, username: this.options?.username, passwordParam: this.options?.password?.parameterName };
58
+ }
59
+ /** @internal */
60
+ _grantPermissions(role) {
61
+ this.bucket?.grantReadWrite(role);
62
+ this.options?.password?.grantRead(role);
63
+ }
64
+ }
65
+ exports.OutputDestination = OutputDestination;
66
+ /**
67
+ * A destination for an Archive or Frame Capture output group — always an S3 bucket.
68
+ */
69
+ class S3OutputDestination {
70
+ destUrl;
71
+ bucket;
72
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.S3OutputDestination", version: "2.268.0-alpha.0" };
73
+ /** Deliver to an S3 bucket (auto-grants write to the channel role). */
74
+ static toBucket(bucket, prefix) {
75
+ return new S3OutputDestination(s3Url(bucket, prefix), bucket);
76
+ }
77
+ /** Deliver to a raw `s3ssl://` path (escape hatch when you don't have a bucket construct). */
78
+ static url(url) {
79
+ return new S3OutputDestination(url);
80
+ }
81
+ constructor(destUrl, bucket) {
82
+ this.destUrl = destUrl;
83
+ this.bucket = bucket;
84
+ }
85
+ /** @internal */
86
+ _bind() {
87
+ return { url: this.destUrl };
88
+ }
89
+ /** @internal */
90
+ _grantPermissions(role) {
91
+ this.bucket?.grantReadWrite(role);
92
+ }
93
+ }
94
+ exports.S3OutputDestination = S3OutputDestination;
95
+ /**
96
+ * A destination for a UDP output group — a UDP or RTP transport endpoint.
97
+ */
98
+ class UdpOutputDestination {
99
+ destUrl;
100
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.UdpOutputDestination", version: "2.268.0-alpha.0" };
101
+ /** Deliver over UDP — builds `udp://address:port`. */
102
+ static udp(props) {
103
+ try {
104
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_TransportOutputDestinationProps(props);
105
+ }
106
+ catch (error) {
107
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
108
+ Error.captureStackTrace(error, this.udp);
109
+ }
110
+ throw error;
111
+ }
112
+ validatePort(props.port);
113
+ return new UdpOutputDestination(`udp://${props.address}:${props.port}`);
114
+ }
115
+ /** Deliver over RTP — builds `rtp://address:port`. */
116
+ static rtp(props) {
117
+ try {
118
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_TransportOutputDestinationProps(props);
119
+ }
120
+ catch (error) {
121
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
122
+ Error.captureStackTrace(error, this.rtp);
123
+ }
124
+ throw error;
125
+ }
126
+ validatePort(props.port);
127
+ return new UdpOutputDestination(`rtp://${props.address}:${props.port}`);
128
+ }
129
+ /** Deliver to a raw transport URL (escape hatch). */
130
+ static url(url) {
131
+ return new UdpOutputDestination(url);
132
+ }
133
+ constructor(destUrl) {
134
+ this.destUrl = destUrl;
135
+ }
136
+ /** @internal */
137
+ _bind() {
138
+ return { url: this.destUrl };
139
+ }
140
+ /** @internal */
141
+ _grantPermissions(_role) { }
142
+ }
143
+ exports.UdpOutputDestination = UdpOutputDestination;
144
+ /**
145
+ * A destination for an RTMP output group. Use the static factory methods to create.
146
+ */
147
+ class RtmpDestination {
148
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.RtmpDestination", version: "2.268.0-alpha.0" };
149
+ /**
150
+ * Create an RTMP destination.
151
+ * @param url The RTMP endpoint URL (e.g. rtmp://host/appname).
152
+ * @param streamName The stream name (stream key).
153
+ * @param options Optional credentials.
154
+ */
155
+ static url(url, streamName, options) {
156
+ try {
157
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_OutputDestinationOptions(options);
158
+ }
159
+ catch (error) {
160
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
161
+ Error.captureStackTrace(error, this.url);
162
+ }
163
+ throw error;
164
+ }
165
+ return new UrlRtmpDestination(url, streamName, options);
166
+ }
167
+ /** @internal - Grant the channel role read access to the password parameter, if configured. */
168
+ _grantPermissions(_role) { }
169
+ }
170
+ exports.RtmpDestination = RtmpDestination;
171
+ /** @internal */
172
+ class UrlRtmpDestination extends RtmpDestination {
173
+ url;
174
+ streamName;
175
+ options;
176
+ constructor(url, streamName, options) {
177
+ super();
178
+ this.url = url;
179
+ this.streamName = streamName;
180
+ this.options = options;
181
+ }
182
+ _bind() {
183
+ return {
184
+ url: this.url,
185
+ streamName: this.streamName,
186
+ username: this.options?.username,
187
+ passwordParam: this.options?.password?.parameterName,
188
+ };
189
+ }
190
+ _grantPermissions(role) {
191
+ this.options?.password?.grantRead(role);
192
+ }
193
+ }
194
+ /**
195
+ * A destination for an SRT output group. Use the static factory methods to create.
196
+ */
197
+ class SrtDestination {
198
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.SrtDestination", version: "2.268.0-alpha.0" };
199
+ /** Create a caller-mode SRT destination. MediaLive connects to the remote listener. */
200
+ static caller(props) {
201
+ try {
202
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SrtCallerDestinationProps(props);
203
+ }
204
+ catch (error) {
205
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
206
+ Error.captureStackTrace(error, this.caller);
207
+ }
208
+ throw error;
209
+ }
210
+ validatePort(props.port);
211
+ return new SrtCallerDestination(`srt://${props.address}:${props.port}`, props.streamId, props.encryptionPassphraseSecret);
212
+ }
213
+ /**
214
+ * Create a caller-mode SRT destination from a full SRT URL.
215
+ *
216
+ * Use this when you already have a URL rather than a separate host and port — for example a
217
+ * MediaConnect Router Input's ingest endpoint (`routerInput.endpoints[0].url`).
218
+ */
219
+ static callerUrl(url, options) {
220
+ try {
221
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SrtCallerUrlOptions(options);
222
+ }
223
+ catch (error) {
224
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
225
+ Error.captureStackTrace(error, this.callerUrl);
226
+ }
227
+ throw error;
228
+ }
229
+ return new SrtCallerDestination(url, options.streamId, options.encryptionPassphraseSecret);
230
+ }
231
+ /** Create a listener-mode SRT destination. MediaLive listens for incoming connections. */
232
+ static listener(props) {
233
+ try {
234
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SrtListenerDestinationProps(props);
235
+ }
236
+ catch (error) {
237
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
238
+ Error.captureStackTrace(error, this.listener);
239
+ }
240
+ throw error;
241
+ }
242
+ return new SrtListenerDestination(props);
243
+ }
244
+ /** @internal - Grant permissions for encryption secrets. */
245
+ _grantPermissions(_role) { }
246
+ }
247
+ exports.SrtDestination = SrtDestination;
248
+ /** @internal */
249
+ class SrtCallerDestination extends SrtDestination {
250
+ url;
251
+ streamId;
252
+ encryptionPassphraseSecret;
253
+ constructor(url, streamId, encryptionPassphraseSecret) {
254
+ super();
255
+ this.url = url;
256
+ this.streamId = streamId;
257
+ this.encryptionPassphraseSecret = encryptionPassphraseSecret;
258
+ }
259
+ _bind() {
260
+ return {
261
+ url: this.url,
262
+ connectionMode: 'CALLER',
263
+ streamId: this.streamId,
264
+ encryptionPassphraseSecretArn: this.encryptionPassphraseSecret.secretArn,
265
+ };
266
+ }
267
+ _grantPermissions(role) {
268
+ this.encryptionPassphraseSecret.grantRead(role);
269
+ }
270
+ }
271
+ /** @internal */
272
+ class SrtListenerDestination extends SrtDestination {
273
+ props;
274
+ constructor(props) {
275
+ super();
276
+ this.props = props;
277
+ if (!aws_cdk_lib_1.Token.isUnresolved(props.listenerPort) && (!Number.isInteger(props.listenerPort)
278
+ || props.listenerPort < 5000 || props.listenerPort > 5200)) {
279
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtListenerPort`, `SRT listener port must be an integer between 5000 and 5200, got ${JSON.stringify(props.listenerPort)}`);
280
+ }
281
+ }
282
+ _bind() {
283
+ return {
284
+ connectionMode: 'LISTENER',
285
+ listenerPort: this.props.listenerPort,
286
+ streamId: this.props.streamId,
287
+ encryptionPassphraseSecretArn: this.props.encryptionPassphraseSecret.secretArn,
288
+ };
289
+ }
290
+ _grantPermissions(role) {
291
+ this.props.encryptionPassphraseSecret.grantRead(role);
292
+ }
293
+ }
294
+ /**
295
+ * The pipeline endpoint for a MediaPackage V2 destination.
296
+ */
297
+ class MediaPackageV2EndpointId {
298
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.MediaPackageV2EndpointId", version: "2.268.0-alpha.0" };
299
+ /** Pipeline 0 endpoint */
300
+ static ENDPOINT_1 = new MediaPackageV2EndpointId('ENDPOINT_1');
301
+ /** Pipeline 1 endpoint */
302
+ static ENDPOINT_2 = new MediaPackageV2EndpointId('ENDPOINT_2');
303
+ /** A value not yet modelled by AWS CDK. */
304
+ static of(value) {
305
+ return new MediaPackageV2EndpointId(value);
306
+ }
307
+ /** The underlying string value passed to CloudFormation. */
308
+ value;
309
+ constructor(value) {
310
+ this.value = value;
311
+ }
312
+ }
313
+ exports.MediaPackageV2EndpointId = MediaPackageV2EndpointId;
314
+ /**
315
+ * A MediaPackage V2 destination for a MediaLive output group.
316
+ * Use the static factory method to create.
317
+ */
318
+ class MediaPackageV2Destination {
319
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.MediaPackageV2Destination", version: "2.268.0-alpha.0" };
320
+ /**
321
+ * Create a MediaPackage V2 destination.
322
+ *
323
+ * The region is resolved from the channel's `region` property. Import the MediaPackage V2
324
+ * channel with its region (e.g. via `fromChannelAttributes`) for cross-region delivery.
325
+ *
326
+ * @param channel The MediaPackage V2 channel to send output to.
327
+ * @param endpointId The pipeline endpoint to send to. When omitted, `channelEndpointId` and the
328
+ * region are left unset and MediaLive maps the pipeline automatically (same-region only).
329
+ */
330
+ static channel(channel, endpointId) {
331
+ try {
332
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaPackageV2EndpointId(endpointId);
333
+ }
334
+ catch (error) {
335
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
336
+ Error.captureStackTrace(error, this.channel);
337
+ }
338
+ throw error;
339
+ }
340
+ return new DefaultMediaPackageV2Destination(channel, endpointId);
341
+ }
342
+ /** @internal - Grant ingest permissions to the channel role. */
343
+ _grantPermissions(_role) { }
344
+ }
345
+ exports.MediaPackageV2Destination = MediaPackageV2Destination;
346
+ /** @internal */
347
+ class DefaultMediaPackageV2Destination extends MediaPackageV2Destination {
348
+ mpChannel;
349
+ endpointId;
350
+ constructor(mpChannel, endpointId) {
351
+ super();
352
+ this.mpChannel = mpChannel;
353
+ this.endpointId = endpointId;
354
+ }
355
+ _bind() {
356
+ return {
357
+ channelName: this.mpChannel.channelName,
358
+ channelGroup: this.mpChannel.channelGroupName,
359
+ channelEndpointId: this.endpointId?.value,
360
+ // MediaLive requires an endpoint id whenever a region is set, so only emit the region
361
+ // when an endpoint is provided. Omitting both selects same-region pipeline auto-mapping.
362
+ mediaPackageRegionName: this.endpointId !== undefined ? this.mpChannel.region : undefined,
363
+ };
364
+ }
365
+ _grantPermissions(role) {
366
+ this.mpChannel.grants.ingest(role);
367
+ }
368
+ }
369
+ /** @internal */
370
+ function renderRouterPipeline(config) {
371
+ return config?.encryptionSecret !== undefined
372
+ ? { encryptionType: 'SECRETS_MANAGER', secretArn: config.encryptionSecret.secretArn }
373
+ : { encryptionType: 'AUTOMATIC' };
374
+ }
375
+ /**
376
+ * Transit-encryption settings for a MediaConnect Router output group, applied per channel pipeline.
377
+ *
378
+ * Omit the output group's `routerSettings` entirely for AUTOMATIC (service-managed) encryption on
379
+ * every pipeline. Use `shared()` to apply one secret across all pipelines, or `perPipeline()` to
380
+ * control each pipeline independently.
381
+ */
382
+ class MediaConnectRouterSettings {
383
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.MediaConnectRouterSettings", version: "2.268.0-alpha.0" };
384
+ /**
385
+ * Apply the same settings to every pipeline.
386
+ *
387
+ * @param settings the settings to apply to all pipelines. Omit `encryptionSecret` for AUTOMATIC.
388
+ */
389
+ static shared(settings = {}) {
390
+ try {
391
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectRouterPipelineConfig(settings);
392
+ }
393
+ catch (error) {
394
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
395
+ Error.captureStackTrace(error, this.shared);
396
+ }
397
+ throw error;
398
+ }
399
+ return new SharedMediaConnectRouterSettings(settings);
400
+ }
401
+ /**
402
+ * Configure each pipeline independently. An omitted pipeline uses AUTOMATIC encryption.
403
+ */
404
+ static perPipeline(settings) {
405
+ try {
406
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectRouterPerPipelineSettings(settings);
407
+ }
408
+ catch (error) {
409
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
410
+ Error.captureStackTrace(error, this.perPipeline);
411
+ }
412
+ throw error;
413
+ }
414
+ return new PerPipelineMediaConnectRouterSettings(settings);
415
+ }
416
+ }
417
+ exports.MediaConnectRouterSettings = MediaConnectRouterSettings;
418
+ /** @internal */
419
+ class SharedMediaConnectRouterSettings extends MediaConnectRouterSettings {
420
+ settings;
421
+ constructor(settings) {
422
+ super();
423
+ this.settings = settings;
424
+ }
425
+ _bind(pipelineCount) {
426
+ const entry = renderRouterPipeline(this.settings);
427
+ return Array.from({ length: pipelineCount }, () => entry);
428
+ }
429
+ _secrets() {
430
+ return this.settings.encryptionSecret !== undefined ? [this.settings.encryptionSecret] : [];
431
+ }
432
+ }
433
+ /** @internal */
434
+ class PerPipelineMediaConnectRouterSettings extends MediaConnectRouterSettings {
435
+ settings;
436
+ constructor(settings) {
437
+ super();
438
+ this.settings = settings;
439
+ }
440
+ _bind(pipelineCount) {
441
+ if (pipelineCount === 1 && this.settings.pipeline1 !== undefined) {
442
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MediaConnectRouterPipelineOne`, 'pipeline1 settings are not valid on a SINGLE_PIPELINE channel; use ChannelClass.STANDARD or remove pipeline1');
443
+ }
444
+ const result = [renderRouterPipeline(this.settings.pipeline0)];
445
+ if (pipelineCount === 2) {
446
+ result.push(renderRouterPipeline(this.settings.pipeline1));
447
+ }
448
+ return result;
449
+ }
450
+ _secrets() {
451
+ return [this.settings.pipeline0?.encryptionSecret, this.settings.pipeline1?.encryptionSecret]
452
+ .filter((s) => s !== undefined);
453
+ }
454
+ }
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzdGluYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVzdGluYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsNkNBQTZEO0FBTTdELDRFQUE0RDtBQUU1RDs7O0dBR0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZGLE1BQU0sSUFBSSxxQ0FBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEsYUFBYSxFQUFFLG9EQUFvRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsSSxDQUFDO0FBQ0gsQ0FBQztBQTZCRCxnQkFBZ0I7QUFDaEIsU0FBUyxLQUFLLENBQUMsTUFBZSxFQUFFLE1BQWU7SUFDN0MsT0FBTyxXQUFXLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBYSxpQkFBaUI7SUFVVDtJQUNBO0lBQ0E7O0lBWG5CLHVFQUF1RTtJQUNoRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQWUsRUFBRSxNQUFlO1FBQ3JELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzdEO0lBQ0QscUZBQXFGO0lBQzlFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLE9BQWtDOzs7Ozs7Ozs7O1FBQy9ELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FB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LENBQXVDO0tBQWM7SUFFbkYsS0FBSyxDQUFDLGFBQXFCO1FBQ2hDLElBQUksYUFBYSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqRSxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSwrQkFBK0IsRUFDbEMsOEdBQThHLENBQy9HLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxhQUFhLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFTSxRQUFRO1FBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDO2FBQzFGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBZ0IsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztLQUNqRDtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ2hhbm5lbCBhcyBJTWVkaWFQYWNrYWdlVjJDaGFubmVsIH0gZnJvbSAnQGF3cy1jZGsvYXdzLW1lZGlhcGFja2FnZXYyLWFscGhhJztcbmltcG9ydCB7IFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSVJvbGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgQ2ZuQ2hhbm5lbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWxpdmUnO1xuaW1wb3J0IHR5cGUgeyBJQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB0eXBlIHsgSVNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IElTdHJpbmdQYXJhbWV0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgbmV0d29yayBwb3J0ICgx4oCTNjU1MzUpLCB1bmxlc3MgdG9rZW5pemVkLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocG9ydCkgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPCAxIHx8IHBvcnQgPiA2NTUzNSkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEludmFsaWRQb3J0YCwgYHBvcnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgNjU1MzUsIGdvdCAke0pTT04uc3RyaW5naWZ5KHBvcnQpfWApO1xuICB9XG59XG5cbi8qKlxuICogQSBkZXN0aW5hdGlvbiBhZGRyZXNzIChJUCBvciBob3N0KSBhbmQgcG9ydCBmb3IgYSB0cmFuc3BvcnQtc3RyZWFtIG91dHB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnRPdXRwdXREZXN0aW5hdGlvblByb3BzIHtcbiAgLyoqIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIOKAlCBhIHVuaWNhc3Qgb3IgbXVsdGljYXN0IElQLCBvciBhIGhvc3RuYW1lLiAqL1xuICByZWFkb25seSBhZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVzdGluYXRpb24gcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgVVJMLWJhc2VkIG91dHB1dCBkZXN0aW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdXRwdXREZXN0aW5hdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXJuYW1lIGZvciBhY2Nlc3NpbmcgdGhlIGRvd25zdHJlYW0gc3lzdGVtLlxuICAgKiBAZGVmYXVsdCAtIG5vIGNyZWRlbnRpYWxzXG4gICAqL1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEFuIFNTTSBTdHJpbmcgUGFyYW1ldGVyIGhvbGRpbmcgdGhlIHBhc3N3b3JkIGZvciBhY2Nlc3NpbmcgdGhlIGRvd25zdHJlYW0gc3lzdGVtLiBNZWRpYUxpdmVcbiAgICogcmVhZHMgaXQgZnJvbSBQYXJhbWV0ZXIgU3RvcmUgYXQgY2hhbm5lbCBydW50aW1lLCBzbyB0aGUgY2hhbm5lbCByb2xlIGlzIGdyYW50ZWQgcmVhZCBhY2Nlc3MuXG4gICAqIEBkZWZhdWx0IC0gbm8gY3JlZGVudGlhbHNcbiAgICovXG4gIHJlYWRvbmx5IHBhc3N3b3JkPzogSVN0cmluZ1BhcmFtZXRlcjtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZnVuY3Rpb24gczNVcmwoYnVja2V0OiBJQnVja2V0LCBwcmVmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHMzc3NsOi8vJHtidWNrZXQuYnVja2V0TmFtZX0ke3ByZWZpeCA/IGAvJHtwcmVmaXh9YCA6ICcnfWA7XG59XG5cbi8qKlxuICogQSBnZW5lcmFsIFVSTC1iYXNlZCBvdXRwdXQgZGVzdGluYXRpb24g4oCUIGFuIFMzIGJ1Y2tldCBvciBhbiBIVFRQKFMpIGVuZHBvaW50LlxuICpcbiAqIFVzZWQgYnkgSExTLCBNUyBTbW9vdGgsIGFuZCBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXBzLiBFYWNoIG91dHB1dCBncm91cCdzIGBkZXN0aW5hdGlvbnNgXG4gKiBwcm9wIGlzIHR5cGVkIHRvIHRoZSBkZXN0aW5hdGlvbiB2YWxpZCBmb3IgaXRzIHByb3RvY29sLCBzbyBhbiBpbnZhbGlkIHBhaXJpbmcgKGUuZy4gYSBVRFBcbiAqIGRlc3RpbmF0aW9uIG9uIGFuIEhMUyBncm91cCkgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgcmF0aGVyIHRoYW4gYSBkZXBsb3ktdGltZSBmYWlsdXJlLlxuICovXG5leHBvcnQgY2xhc3MgT3V0cHV0RGVzdGluYXRpb24ge1xuICAvKiogRGVsaXZlciB0byBhbiBTMyBidWNrZXQgKGF1dG8tZ3JhbnRzIHdyaXRlIHRvIHRoZSBjaGFubmVsIHJvbGUpLiAqL1xuICBwdWJsaWMgc3RhdGljIHRvQnVja2V0KGJ1Y2tldDogSUJ1Y2tldCwgcHJlZml4Pzogc3RyaW5nKTogT3V0cHV0RGVzdGluYXRpb24ge1xuICAgIHJldHVybiBuZXcgT3V0cHV0RGVzdGluYXRpb24oczNVcmwoYnVja2V0LCBwcmVmaXgpLCBidWNrZXQpO1xuICB9XG4gIC8qKiBEZWxpdmVyIHRvIGEgcmF3IFVSTCDigJQgdHlwaWNhbGx5IGFuIGBodHRwczovL2Agb3JpZ2luIChvciBhbiBgczNzc2w6Ly9gIHBhdGgpLiAqL1xuICBwdWJsaWMgc3RhdGljIHVybCh1cmw6IHN0cmluZywgb3B0aW9ucz86IE91dHB1dERlc3RpbmF0aW9uT3B0aW9ucyk6IE91dHB1dERlc3RpbmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE91dHB1dERlc3RpbmF0aW9uKHVybCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdFVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVja2V0PzogSUJ1Y2tldCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiBPdXRwdXREZXN0aW5hdGlvbk9wdGlvbnMsXG4gICkge31cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoKSB7XG4gICAgcmV0dXJuIHsgdXJsOiB0aGlzLmRlc3RVcmwsIHVzZXJuYW1lOiB0aGlzLm9wdGlvbnM/LnVzZXJuYW1lLCBwYXNzd29yZFBhcmFtOiB0aGlzLm9wdGlvbnM/LnBhc3N3b3JkPy5wYXJhbWV0ZXJOYW1lIH07XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldD8uZ3JhbnRSZWFkV3JpdGUocm9sZSk7XG4gICAgdGhpcy5vcHRpb25zPy5wYXNzd29yZD8uZ3JhbnRSZWFkKHJvbGUpO1xuICB9XG59XG5cbi8qKlxuICogQSBkZXN0aW5hdGlvbiBmb3IgYW4gQXJjaGl2ZSBvciBGcmFtZSBDYXB0dXJlIG91dHB1dCBncm91cCDigJQgYWx3YXlzIGFuIFMzIGJ1Y2tldC5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzT3V0cHV0RGVzdGluYXRpb24ge1xuICAvKiogRGVsaXZlciB0byBhbiBTMyBidWNrZXQgKGF1dG8tZ3JhbnRzIHdyaXRlIHRvIHRoZSBjaGFubmVsIHJvbGUpLiAqL1xuICBwdWJsaWMgc3RhdGljIHRvQnVja2V0KGJ1Y2tldDogSUJ1Y2tldCwgcHJlZml4Pzogc3RyaW5nKTogUzNPdXRwdXREZXN0aW5hdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTM091dHB1dERlc3RpbmF0aW9uKHMzVXJsKGJ1Y2tldCwgcHJlZml4KSwgYnVja2V0KTtcbiAgfVxuICAvKiogRGVsaXZlciB0byBhIHJhdyBgczNzc2w6Ly9gIHBhdGggKGVzY2FwZSBoYXRjaCB3aGVuIHlvdSBkb24ndCBoYXZlIGEgYnVja2V0IGNvbnN0cnVjdCkuICovXG4gIHB1YmxpYyBzdGF0aWMgdXJsKHVybDogc3RyaW5nKTogUzNPdXRwdXREZXN0aW5hdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTM091dHB1dERlc3RpbmF0aW9uKHVybCk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlc3RVcmw6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBidWNrZXQ/OiBJQnVja2V0KSB7fVxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfYmluZCgpIHtcbiAgICByZXR1cm4geyB1cmw6IHRoaXMuZGVzdFVybCB9O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5idWNrZXQ/LmdyYW50UmVhZFdyaXRlKHJvbGUpO1xuICB9XG59XG5cbi8qKlxuICogQSBkZXN0aW5hdGlvbiBmb3IgYSBVRFAgb3V0cHV0IGdyb3VwIOKAlCBhIFVEUCBvciBSVFAgdHJhbnNwb3J0IGVuZHBvaW50LlxuICovXG5leHBvcnQgY2xhc3MgVWRwT3V0cHV0RGVzdGluYXRpb24ge1xuICAvKiogRGVsaXZlciBvdmVyIFVEUCDigJQgYnVpbGRzIGB1ZHA6Ly9hZGRyZXNzOnBvcnRgLiAqL1xuICBwdWJsaWMgc3RhdGljIHVkcChwcm9wczogVHJhbnNwb3J0T3V0cHV0RGVzdGluYXRpb25Qcm9wcyk6IFVkcE91dHB1dERlc3RpbmF0aW9uIHtcbiAgICB2YWxpZGF0ZVBvcnQocHJvcHMucG9ydCk7XG4gICAgcmV0dXJuIG5ldyBVZHBPdXRwdXREZXN0aW5hdGlvbihgdWRwOi8vJHtwcm9wcy5hZGRyZXNzfToke3Byb3BzLnBvcnR9YCk7XG4gIH1cbiAgLyoqIERlbGl2ZXIgb3ZlciBSVFAg4oCUIGJ1aWxkcyBgcnRwOi8vYWRkcmVzczpwb3J0YC4gKi9cbiAgcHVibGljIHN0YXRpYyBydHAocHJvcHM6IFRyYW5zcG9ydE91dHB1dERlc3RpbmF0aW9uUHJvcHMpOiBVZHBPdXRwdXREZXN0aW5hdGlvbiB7XG4gICAgdmFsaWRhdGVQb3J0KHByb3BzLnBvcnQpO1xuICAgIHJldHVybiBuZXcgVWRwT3V0cHV0RGVzdGluYXRpb24oYHJ0cDovLyR7cHJvcHMuYWRkcmVzc306JHtwcm9wcy5wb3J0fWApO1xuICB9XG4gIC8qKiBEZWxpdmVyIHRvIGEgcmF3IHRyYW5zcG9ydCBVUkwgKGVzY2FwZSBoYXRjaCkuICovXG4gIHB1YmxpYyBzdGF0aWMgdXJsKHVybDogc3RyaW5nKTogVWRwT3V0cHV0RGVzdGluYXRpb24ge1xuICAgIHJldHVybiBuZXcgVWRwT3V0cHV0RGVzdGluYXRpb24odXJsKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVzdFVybDogc3RyaW5nKSB7fVxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfYmluZCgpIHtcbiAgICByZXR1cm4geyB1cmw6IHRoaXMuZGVzdFVybCB9O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKF9yb2xlOiBJUm9sZSk6IHZvaWQge31cbn1cblxuLyoqXG4gKiBBIGRlc3RpbmF0aW9uIGZvciBhbiBSVE1QIG91dHB1dCBncm91cC4gVXNlIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIHRvIGNyZWF0ZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJ0bXBEZXN0aW5hdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gUlRNUCBkZXN0aW5hdGlvbi5cbiAgICogQHBhcmFtIHVybCBUaGUgUlRNUCBlbmRwb2ludCBVUkwgKGUuZy4gcnRtcDovL2hvc3QvYXBwbmFtZSkuXG4gICAqIEBwYXJhbSBzdHJlYW1OYW1lIFRoZSBzdHJlYW0gbmFtZSAoc3RyZWFtIGtleSkuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1cmwodXJsOiBzdHJpbmcsIHN0cmVhbU5hbWU6IHN0cmluZywgb3B0aW9ucz86IE91dHB1dERlc3RpbmF0aW9uT3B0aW9ucyk6IFJ0bXBEZXN0aW5hdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBVcmxSdG1wRGVzdGluYXRpb24odXJsLCBzdHJlYW1OYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKCk6IHsgdXJsOiBzdHJpbmc7IHN0cmVhbU5hbWU6IHN0cmluZzsgdXNlcm5hbWU/OiBzdHJpbmc7IHBhc3N3b3JkUGFyYW0/OiBzdHJpbmcgfTtcblxuICAvKiogQGludGVybmFsIC0gR3JhbnQgdGhlIGNoYW5uZWwgcm9sZSByZWFkIGFjY2VzcyB0byB0aGUgcGFzc3dvcmQgcGFyYW1ldGVyLCBpZiBjb25maWd1cmVkLiAqL1xuICBwdWJsaWMgX2dyYW50UGVybWlzc2lvbnMoX3JvbGU6IElSb2xlKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBVcmxSdG1wRGVzdGluYXRpb24gZXh0ZW5kcyBSdG1wRGVzdGluYXRpb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IE91dHB1dERlc3RpbmF0aW9uT3B0aW9ucyxcbiAgKSB7IHN1cGVyKCk7IH1cbiAgcHVibGljIF9iaW5kKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgc3RyZWFtTmFtZTogdGhpcy5zdHJlYW1OYW1lLFxuICAgICAgdXNlcm5hbWU6IHRoaXMub3B0aW9ucz8udXNlcm5hbWUsXG4gICAgICBwYXNzd29yZFBhcmFtOiB0aGlzLm9wdGlvbnM/LnBhc3N3b3JkPy5wYXJhbWV0ZXJOYW1lLFxuICAgIH07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zPy5wYXNzd29yZD8uZ3JhbnRSZWFkKHJvbGUpO1xuICB9XG59XG5cbi8qKlxuICogU1JUIGNhbGxlciBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNydENhbGxlckRlc3RpbmF0aW9uUHJvcHMge1xuICAvKiogVGhlIGFkZHJlc3MgKElQIG9yIGhvc3QpIG9mIHRoZSBTUlQgbGlzdGVuZXIgdG8gY29ubmVjdCB0by4gKi9cbiAgcmVhZG9ubHkgYWRkcmVzczogc3RyaW5nO1xuICAvKiogVGhlIHBvcnQgb2YgdGhlIFNSVCBsaXN0ZW5lciB0byBjb25uZWN0IHRvLiAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc3RyZWFtIElEIGZvciB0aGUgU1JUIGNvbm5lY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm8gc3RyZWFtIElEXG4gICAqL1xuICByZWFkb25seSBzdHJlYW1JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRpb24gcGFzc3BocmFzZS5cbiAgICpcbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25QYXNzcGhyYXNlU2VjcmV0OiBJU2VjcmV0O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgVVJMLWJhc2VkIFNSVCBjYWxsZXIgZGVzdGluYXRpb24gKGBTcnREZXN0aW5hdGlvbi5jYWxsZXJVcmxgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcnRDYWxsZXJVcmxPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdHJlYW0gSUQgZm9yIHRoZSBTUlQgY29ubmVjdGlvbi5cbiAgICogQGRlZmF1bHQgLSBubyBzdHJlYW0gSURcbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgY29udGFpbmluZyB0aGUgZW5jcnlwdGlvbiBwYXNzcGhyYXNlLlxuICAgKlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvblBhc3NwaHJhc2VTZWNyZXQ6IElTZWNyZXQ7XG59XG5cbi8qKlxuICogU1JUIGxpc3RlbmVyIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMuXG4gKlxuICogSW4gbGlzdGVuZXIgbW9kZSwgTWVkaWFMaXZlIG9wZW5zIGEgc29ja2V0IG9uIGBsaXN0ZW5lclBvcnRgIGFuZCB3YWl0cyBmb3IgdGhlIGRvd25zdHJlYW1cbiAqIHN5c3RlbSB0byBjb25uZWN0LiBUaGUgZG93bnN0cmVhbSBzeXN0ZW0gbmVlZHMgdGhlIGNoYW5uZWwncyBvdXRib3VuZCBJUCBhbmQgdGhpcyBwb3J0IOKAlFxuICogQVdTIGRvZXMgbm90IHJlcXVpcmUgKG9yIHVzZSkgYSBkZXN0aW5hdGlvbiBVUkwgaW4gbGlzdGVuZXIgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcnRMaXN0ZW5lckRlc3RpbmF0aW9uUHJvcHMge1xuICAvKiogVGhlIHBvcnQgdGhhdCBNZWRpYUxpdmUgd2lsbCBsaXN0ZW4gb24uIEFXUyByZXNlcnZlcyB0aGUgcmFuZ2UgNTAwMOKAkzUyMDAgZm9yIFNSVCBsaXN0ZW5lciBvdXRwdXQuICovXG4gIHJlYWRvbmx5IGxpc3RlbmVyUG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBJRCBmb3IgdGhlIFNSVCBjb25uZWN0aW9uLlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0cmVhbSBJRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHRoZSBlbmNyeXB0aW9uIHBhc3NwaHJhc2UuXG4gICAqXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6cHJlZmVyLXJlZi1pbnRlcmZhY2VdXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uUGFzc3BocmFzZVNlY3JldDogSVNlY3JldDtcbn1cblxuLyoqXG4gKiBBIGRlc3RpbmF0aW9uIGZvciBhbiBTUlQgb3V0cHV0IGdyb3VwLiBVc2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgdG8gY3JlYXRlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3J0RGVzdGluYXRpb24ge1xuICAvKiogQ3JlYXRlIGEgY2FsbGVyLW1vZGUgU1JUIGRlc3RpbmF0aW9uLiBNZWRpYUxpdmUgY29ubmVjdHMgdG8gdGhlIHJlbW90ZSBsaXN0ZW5lci4gKi9cbiAgcHVibGljIHN0YXRpYyBjYWxsZXIocHJvcHM6IFNydENhbGxlckRlc3RpbmF0aW9uUHJvcHMpOiBTcnREZXN0aW5hdGlvbiB7XG4gICAgdmFsaWRhdGVQb3J0KHByb3BzLnBvcnQpO1xuICAgIHJldHVybiBuZXcgU3J0Q2FsbGVyRGVzdGluYXRpb24oYHNydDovLyR7cHJvcHMuYWRkcmVzc306JHtwcm9wcy5wb3J0fWAsIHByb3BzLnN0cmVhbUlkLCBwcm9wcy5lbmNyeXB0aW9uUGFzc3BocmFzZVNlY3JldCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNhbGxlci1tb2RlIFNSVCBkZXN0aW5hdGlvbiBmcm9tIGEgZnVsbCBTUlQgVVJMLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSBhbHJlYWR5IGhhdmUgYSBVUkwgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBob3N0IGFuZCBwb3J0IOKAlCBmb3IgZXhhbXBsZSBhXG4gICAqIE1lZGlhQ29ubmVjdCBSb3V0ZXIgSW5wdXQncyBpbmdlc3QgZW5kcG9pbnQgKGByb3V0ZXJJbnB1dC5lbmRwb2ludHNbMF0udXJsYCkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNhbGxlclVybCh1cmw6IHN0cmluZywgb3B0aW9uczogU3J0Q2FsbGVyVXJsT3B0aW9ucyk6IFNydERlc3RpbmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFNydENhbGxlckRlc3RpbmF0aW9uKHVybCwgb3B0aW9ucy5zdHJlYW1JZCwgb3B0aW9ucy5lbmNyeXB0aW9uUGFzc3BocmFzZVNlY3JldCk7XG4gIH1cbiAgLyoqIENyZWF0ZSBhIGxpc3RlbmVyLW1vZGUgU1JUIGRlc3RpbmF0aW9uLiBNZWRpYUxpdmUgbGlzdGVucyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMuICovXG4gIHB1YmxpYyBzdGF0aWMgbGlzdGVuZXIocHJvcHM6IFNydExpc3RlbmVyRGVzdGluYXRpb25Qcm9wcyk6IFNydERlc3RpbmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFNydExpc3RlbmVyRGVzdGluYXRpb24ocHJvcHMpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoKTogeyB1cmw/OiBzdHJpbmc7IGNvbm5lY3Rpb25Nb2RlPzogc3RyaW5nO1xuICAgIGVuY3J5cHRpb25QYXNzcGhyYXNlU2VjcmV0QXJuPzogc3RyaW5nO1xuICAgIGxpc3RlbmVyUG9ydD86IG51bWJlcjsgc3RyZWFtSWQ/OiBzdHJpbmc7IH07XG5cbiAgLyoqIEBpbnRlcm5hbCAtIEdyYW50IHBlcm1pc3Npb25zIGZvciBlbmNyeXB0aW9uIHNlY3JldHMuICovXG4gIHB1YmxpYyBfZ3JhbnRQZXJtaXNzaW9ucyhfcm9sZTogSVJvbGUpOiB2b2lkIHt9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFNydENhbGxlckRlc3RpbmF0aW9uIGV4dGVuZHMgU3J0RGVzdGluYXRpb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVuY3J5cHRpb25QYXNzcGhyYXNlU2VjcmV0OiBJU2VjcmV0LFxuICApIHsgc3VwZXIoKTsgfVxuICBwdWJsaWMgX2JpbmQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBjb25uZWN0aW9uTW9kZTogJ0NBTExFUicsXG4gICAgICBzdHJlYW1JZDogdGhpcy5zdHJlYW1JZCxcbiAgICAgIGVuY3J5cHRpb25QYXNzcGhyYXNlU2VjcmV0QXJuOiB0aGlzLmVuY3J5cHRpb25QYXNzcGhyYXNlU2VjcmV0LnNlY3JldEFybixcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZSBfZ3JhbnRQZXJtaXNzaW9ucyhyb2xlOiBJUm9sZSk6IHZvaWQge1xuICAgIHRoaXMuZW5jcnlwdGlvblBhc3NwaHJhc2VTZWNyZXQuZ3JhbnRSZWFkKHJvbGUpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFNydExpc3RlbmVyRGVzdGluYXRpb24gZXh0ZW5kcyBTcnREZXN0aW5hdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFNydExpc3RlbmVyRGVzdGluYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubGlzdGVuZXJQb3J0KSAmJiAoIU51bWJlci5pc0ludGVnZXIocHJvcHMubGlzdGVuZXJQb3J0KVxuICAgICAgfHwgcHJvcHMubGlzdGVuZXJQb3J0IDwgNTAwMCB8fCBwcm9wcy5saXN0ZW5lclBvcnQgPiA1MjAwKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTcnRMaXN0ZW5lclBvcnRgLCBgU1JUIGxpc3RlbmVyIHBvcnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gNTAwMCBhbmQgNTIwMCwgZ290ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMubGlzdGVuZXJQb3J0KX1gKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIF9iaW5kKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0aW9uTW9kZTogJ0xJU1RFTkVSJyxcbiAgICAgIGxpc3RlbmVyUG9ydDogdGhpcy5wcm9wcy5saXN0ZW5lclBvcnQsXG4gICAgICBzdHJlYW1JZDogdGhpcy5wcm9wcy5zdHJlYW1JZCxcbiAgICAgIGVuY3J5cHRpb25QYXNzcGhyYXNlU2VjcmV0QXJuOiB0aGlzLnByb3BzLmVuY3J5cHRpb25QYXNzcGhyYXNlU2VjcmV0LnNlY3JldEFybixcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZSBfZ3JhbnRQZXJtaXNzaW9ucyhyb2xlOiBJUm9sZSk6IHZvaWQge1xuICAgIHRoaXMucHJvcHMuZW5jcnlwdGlvblBhc3NwaHJhc2VTZWNyZXQuZ3JhbnRSZWFkKHJvbGUpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHBpcGVsaW5lIGVuZHBvaW50IGZvciBhIE1lZGlhUGFja2FnZSBWMiBkZXN0aW5hdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lZGlhUGFja2FnZVYyRW5kcG9pbnRJZCB7XG4gIC8qKiBQaXBlbGluZSAwIGVuZHBvaW50ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRU5EUE9JTlRfMSA9IG5ldyBNZWRpYVBhY2thZ2VWMkVuZHBvaW50SWQoJ0VORFBPSU5UXzEnKTtcbiAgLyoqIFBpcGVsaW5lIDEgZW5kcG9pbnQgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFTkRQT0lOVF8yID0gbmV3IE1lZGlhUGFja2FnZVYyRW5kcG9pbnRJZCgnRU5EUE9JTlRfMicpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogTWVkaWFQYWNrYWdlVjJFbmRwb2ludElkIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhUGFja2FnZVYyRW5kcG9pbnRJZCh2YWx1ZSk7XG4gIH1cblxuICAvKiogVGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQSBNZWRpYVBhY2thZ2UgVjIgZGVzdGluYXRpb24gZm9yIGEgTWVkaWFMaXZlIG91dHB1dCBncm91cC5cbiAqIFVzZSB0aGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lZGlhUGFja2FnZVYyRGVzdGluYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgTWVkaWFQYWNrYWdlIFYyIGRlc3RpbmF0aW9uLlxuICAgKlxuICAgKiBUaGUgcmVnaW9uIGlzIHJlc29sdmVkIGZyb20gdGhlIGNoYW5uZWwncyBgcmVnaW9uYCBwcm9wZXJ0eS4gSW1wb3J0IHRoZSBNZWRpYVBhY2thZ2UgVjJcbiAgICogY2hhbm5lbCB3aXRoIGl0cyByZWdpb24gKGUuZy4gdmlhIGBmcm9tQ2hhbm5lbEF0dHJpYnV0ZXNgKSBmb3IgY3Jvc3MtcmVnaW9uIGRlbGl2ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgTWVkaWFQYWNrYWdlIFYyIGNoYW5uZWwgdG8gc2VuZCBvdXRwdXQgdG8uXG4gICAqIEBwYXJhbSBlbmRwb2ludElkIFRoZSBwaXBlbGluZSBlbmRwb2ludCB0byBzZW5kIHRvLiBXaGVuIG9taXR0ZWQsIGBjaGFubmVsRW5kcG9pbnRJZGAgYW5kIHRoZVxuICAgKiByZWdpb24gYXJlIGxlZnQgdW5zZXQgYW5kIE1lZGlhTGl2ZSBtYXBzIHRoZSBwaXBlbGluZSBhdXRvbWF0aWNhbGx5IChzYW1lLXJlZ2lvbiBvbmx5KS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2hhbm5lbChjaGFubmVsOiBJTWVkaWFQYWNrYWdlVjJDaGFubmVsLCBlbmRwb2ludElkPzogTWVkaWFQYWNrYWdlVjJFbmRwb2ludElkKTogTWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBEZWZhdWx0TWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbihjaGFubmVsLCBlbmRwb2ludElkKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKCk6IHsgY2hhbm5lbE5hbWU6IHN0cmluZzsgY2hhbm5lbEdyb3VwOiBzdHJpbmc7IGNoYW5uZWxFbmRwb2ludElkPzogc3RyaW5nOyBtZWRpYVBhY2thZ2VSZWdpb25OYW1lPzogc3RyaW5nIH07XG5cbiAgLyoqIEBpbnRlcm5hbCAtIEdyYW50IGluZ2VzdCBwZXJtaXNzaW9ucyB0byB0aGUgY2hhbm5lbCByb2xlLiAqL1xuICBwdWJsaWMgX2dyYW50UGVybWlzc2lvbnMoX3JvbGU6IElSb2xlKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBEZWZhdWx0TWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbiBleHRlbmRzIE1lZGlhUGFja2FnZVYyRGVzdGluYXRpb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1wQ2hhbm5lbDogSU1lZGlhUGFja2FnZVYyQ2hhbm5lbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50SWQ/OiBNZWRpYVBhY2thZ2VWMkVuZHBvaW50SWQsXG4gICkgeyBzdXBlcigpOyB9XG4gIHB1YmxpYyBfYmluZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hhbm5lbE5hbWU6IHRoaXMubXBDaGFubmVsLmNoYW5uZWxOYW1lLFxuICAgICAgY2hhbm5lbEdyb3VwOiB0aGlzLm1wQ2hhbm5lbC5jaGFubmVsR3JvdXBOYW1lLFxuICAgICAgY2hhbm5lbEVuZHBvaW50SWQ6IHRoaXMuZW5kcG9pbnRJZD8udmFsdWUsXG4gICAgICAvLyBNZWRpYUxpdmUgcmVxdWlyZXMgYW4gZW5kcG9pbnQgaWQgd2hlbmV2ZXIgYSByZWdpb24gaXMgc2V0LCBzbyBvbmx5IGVtaXQgdGhlIHJlZ2lvblxuICAgICAgLy8gd2hlbiBhbiBlbmRwb2ludCBpcyBwcm92aWRlZC4gT21pdHRpbmcgYm90aCBzZWxlY3RzIHNhbWUtcmVnaW9uIHBpcGVsaW5lIGF1dG8tbWFwcGluZy5cbiAgICAgIG1lZGlhUGFja2FnZVJlZ2lvbk5hbWU6IHRoaXMuZW5kcG9pbnRJZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5tcENoYW5uZWwucmVnaW9uIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5tcENoYW5uZWwuZ3JhbnRzLmluZ2VzdChyb2xlKTtcbiAgfVxufVxuXG4vKipcbiAqIFBlci1waXBlbGluZSBzZXR0aW5ncyBmb3IgYSBNZWRpYUNvbm5lY3QgUm91dGVyIG91dHB1dCBkZXN0aW5hdGlvbi5cbiAqXG4gKiBUb2RheSB0aGlzIGNhcnJpZXMgb25seSB0cmFuc2l0IGVuY3J5cHRpb24sIGJ1dCBpdCBpcyBhIHN0cnVjdCBzbyB0aGF0IGZ1dHVyZSBwZXItcGlwZWxpbmVcbiAqIE1lZGlhQ29ubmVjdCBSb3V0ZXIgc2V0dGluZ3MgY2FuIGJlIGFkZGVkIHdpdGhvdXQgYW4gQVBJIGJyZWFrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhQ29ubmVjdFJvdXRlclBpcGVsaW5lQ29uZmlnIHtcbiAgLyoqXG4gICAqIEEgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBob2xkaW5nIHRoZSB0cmFuc2l0LWVuY3J5cHRpb24gcGFzc3BocmFzZS4gV2hlbiBzZXQsIHRoZSBwaXBlbGluZVxuICAgKiB1c2VzIGBTRUNSRVRTX01BTkFHRVJgIGVuY3J5cHRpb247IHRoZSBjaGFubmVsIHJvbGUgaXMgZ3JhbnRlZCByZWFkIGFjY2VzcyB0byB0aGUgc2VjcmV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFVVE9NQVRJQyAoc2VydmljZS1tYW5hZ2VkKSB0cmFuc2l0IGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25TZWNyZXQ/OiBJU2VjcmV0O1xufVxuXG4vKipcbiAqIFBlci1waXBlbGluZSBzZXR0aW5ncyBmb3IgYE1lZGlhQ29ubmVjdFJvdXRlclNldHRpbmdzLnBlclBpcGVsaW5lKClgLlxuICpcbiAqIE1lZGlhTGl2ZSBtYXBzIGEgY2hhbm5lbCdzIHBpcGVsaW5lcyB0byBNZWRpYUNvbm5lY3QgUm91dGVyIG91dHB1dCBkZXN0aW5hdGlvbnMgcG9zaXRpb25hbGx5O1xuICogdGhlIGNvbnNvbGUgbGFiZWxzIHRoZW0gXCJEZXN0aW5hdGlvbiBBXCIgKHBpcGVsaW5lIDApIGFuZCBcIkRlc3RpbmF0aW9uIEJcIiAocGlwZWxpbmUgMSkuIEFuXG4gKiBvbWl0dGVkIHBpcGVsaW5lIHVzZXMgQVVUT01BVElDIHRyYW5zaXQgZW5jcnlwdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYUNvbm5lY3RSb3V0ZXJQZXJQaXBlbGluZVNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFNldHRpbmdzIGZvciBwaXBlbGluZSAwIChcIkRlc3RpbmF0aW9uIEFcIiBpbiB0aGUgTWVkaWFMaXZlIGNvbnNvbGUpLlxuICAgKiBAZGVmYXVsdCAtIEFVVE9NQVRJQyB0cmFuc2l0IGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lMD86IE1lZGlhQ29ubmVjdFJvdXRlclBpcGVsaW5lQ29uZmlnO1xuICAvKipcbiAgICogU2V0dGluZ3MgZm9yIHBpcGVsaW5lIDEgKFwiRGVzdGluYXRpb24gQlwiIGluIHRoZSBjb25zb2xlKS4gU1RBTkRBUkQgY2hhbm5lbHMgb25seSDigJRcbiAgICogU0lOR0xFX1BJUEVMSU5FIGNoYW5uZWxzIGhhdmUgbm8gc2Vjb25kIHBpcGVsaW5lLlxuICAgKiBAZGVmYXVsdCAtIEFVVE9NQVRJQyB0cmFuc2l0IGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lMT86IE1lZGlhQ29ubmVjdFJvdXRlclBpcGVsaW5lQ29uZmlnO1xufVxuXG4vKiogQGludGVybmFsICovXG5mdW5jdGlvbiByZW5kZXJSb3V0ZXJQaXBlbGluZShjb25maWc/OiBNZWRpYUNvbm5lY3RSb3V0ZXJQaXBlbGluZUNvbmZpZyk6IENmbkNoYW5uZWwuTWVkaWFDb25uZWN0Um91dGVyT3V0cHV0RGVzdGluYXRpb25TZXR0aW5nc1Byb3BlcnR5IHtcbiAgcmV0dXJuIGNvbmZpZz8uZW5jcnlwdGlvblNlY3JldCAhPT0gdW5kZWZpbmVkXG4gICAgPyB7IGVuY3J5cHRpb25UeXBlOiAnU0VDUkVUU19NQU5BR0VSJywgc2VjcmV0QXJuOiBjb25maWcuZW5jcnlwdGlvblNlY3JldC5zZWNyZXRBcm4gfVxuICAgIDogeyBlbmNyeXB0aW9uVHlwZTogJ0FVVE9NQVRJQycgfTtcbn1cblxuLyoqXG4gKiBUcmFuc2l0LWVuY3J5cHRpb24gc2V0dGluZ3MgZm9yIGEgTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXQgZ3JvdXAsIGFwcGxpZWQgcGVyIGNoYW5uZWwgcGlwZWxpbmUuXG4gKlxuICogT21pdCB0aGUgb3V0cHV0IGdyb3VwJ3MgYHJvdXRlclNldHRpbmdzYCBlbnRpcmVseSBmb3IgQVVUT01BVElDIChzZXJ2aWNlLW1hbmFnZWQpIGVuY3J5cHRpb24gb25cbiAqIGV2ZXJ5IHBpcGVsaW5lLiBVc2UgYHNoYXJlZCgpYCB0byBhcHBseSBvbmUgc2VjcmV0IGFjcm9zcyBhbGwgcGlwZWxpbmVzLCBvciBgcGVyUGlwZWxpbmUoKWAgdG9cbiAqIGNvbnRyb2wgZWFjaCBwaXBlbGluZSBpbmRlcGVuZGVudGx5LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWVkaWFDb25uZWN0Um91dGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogQXBwbHkgdGhlIHNhbWUgc2V0dGluZ3MgdG8gZXZlcnkgcGlwZWxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyB0aGUgc2V0dGluZ3MgdG8gYXBwbHkgdG8gYWxsIHBpcGVsaW5lcy4gT21pdCBgZW5jcnlwdGlvblNlY3JldGAgZm9yIEFVVE9NQVRJQy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2hhcmVkKHNldHRpbmdzOiBNZWRpYUNvbm5lY3RSb3V0ZXJQaXBlbGluZUNvbmZpZyA9IHt9KTogTWVkaWFDb25uZWN0Um91dGVyU2V0dGluZ3Mge1xuICAgIHJldHVybiBuZXcgU2hhcmVkTWVkaWFDb25uZWN0Um91dGVyU2V0dGluZ3Moc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBlYWNoIHBpcGVsaW5lIGluZGVwZW5kZW50bHkuIEFuIG9taXR0ZWQgcGlwZWxpbmUgdXNlcyBBVVRPTUFUSUMgZW5jcnlwdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcGVyUGlwZWxpbmUoc2V0dGluZ3M6IE1lZGlhQ29ubmVjdFJvdXRlclBlclBpcGVsaW5lU2V0dGluZ3MpOiBNZWRpYUNvbm5lY3RSb3V0ZXJTZXR0aW5ncyB7XG4gICAgcmV0dXJuIG5ldyBQZXJQaXBlbGluZU1lZGlhQ29ubmVjdFJvdXRlclNldHRpbmdzKHNldHRpbmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHBlci1waXBlbGluZSBkZXN0aW5hdGlvbiBzZXR0aW5ncyBmb3IgdGhlIGdpdmVuIHBpcGVsaW5lIGNvdW50ICgxIGZvclxuICAgKiBTSU5HTEVfUElQRUxJTkUsIDIgZm9yIFNUQU5EQVJEKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQocGlwZWxpbmVDb3VudDogbnVtYmVyKTogQ2ZuQ2hhbm5lbC5NZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXREZXN0aW5hdGlvblNldHRpbmdzUHJvcGVydHlbXTtcblxuICAvKipcbiAgICogVGhlIHNlY3JldHMgcmVmZXJlbmNlZCBieSB0aGVzZSBzZXR0aW5ncywgZm9yIGdyYW50aW5nIHJlYWQgYWNjZXNzIHRvIHRoZSBjaGFubmVsIHJvbGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9zZWNyZXRzKCk6IElTZWNyZXRbXTtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgU2hhcmVkTWVkaWFDb25uZWN0Um91dGVyU2V0dGluZ3MgZXh0ZW5kcyBNZWRpYUNvbm5lY3RSb3V0ZXJTZXR0aW5ncyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3M6IE1lZGlhQ29ubmVjdFJvdXRlclBpcGVsaW5lQ29uZmlnKSB7IHN1cGVyKCk7IH1cblxuICBwdWJsaWMgX2JpbmQocGlwZWxpbmVDb3VudDogbnVtYmVyKTogQ2ZuQ2hhbm5lbC5NZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXREZXN0aW5hdGlvblNldHRpbmdzUHJvcGVydHlbXSB7XG4gICAgY29uc3QgZW50cnkgPSByZW5kZXJSb3V0ZXJQaXBlbGluZSh0aGlzLnNldHRpbmdzKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogcGlwZWxpbmVDb3VudCB9LCAoKSA9PiBlbnRyeSk7XG4gIH1cblxuICBwdWJsaWMgX3NlY3JldHMoKTogSVNlY3JldFtdIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5lbmNyeXB0aW9uU2VjcmV0ICE9PSB1bmRlZmluZWQgPyBbdGhpcy5zZXR0aW5ncy5lbmNyeXB0aW9uU2VjcmV0XSA6IFtdO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFBlclBpcGVsaW5lTWVkaWFDb25uZWN0Um91dGVyU2V0dGluZ3MgZXh0ZW5kcyBNZWRpYUNvbm5lY3RSb3V0ZXJTZXR0aW5ncyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3M6IE1lZGlhQ29ubmVjdFJvdXRlclBlclBpcGVsaW5lU2V0dGluZ3MpIHsgc3VwZXIoKTsgfVxuXG4gIHB1YmxpYyBfYmluZChwaXBlbGluZUNvdW50OiBudW1iZXIpOiBDZm5DaGFubmVsLk1lZGlhQ29ubmVjdFJvdXRlck91dHB1dERlc3RpbmF0aW9uU2V0dGluZ3NQcm9wZXJ0eVtdIHtcbiAgICBpZiAocGlwZWxpbmVDb3VudCA9PT0gMSAmJiB0aGlzLnNldHRpbmdzLnBpcGVsaW5lMSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBNZWRpYUNvbm5lY3RSb3V0ZXJQaXBlbGluZU9uZWAsXG4gICAgICAgICdwaXBlbGluZTEgc2V0dGluZ3MgYXJlIG5vdCB2YWxpZCBvbiBhIFNJTkdMRV9QSVBFTElORSBjaGFubmVsOyB1c2UgQ2hhbm5lbENsYXNzLlNUQU5EQVJEIG9yIHJlbW92ZSBwaXBlbGluZTEnLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gW3JlbmRlclJvdXRlclBpcGVsaW5lKHRoaXMuc2V0dGluZ3MucGlwZWxpbmUwKV07XG4gICAgaWYgKHBpcGVsaW5lQ291bnQgPT09IDIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHJlbmRlclJvdXRlclBpcGVsaW5lKHRoaXMuc2V0dGluZ3MucGlwZWxpbmUxKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgX3NlY3JldHMoKTogSVNlY3JldFtdIHtcbiAgICByZXR1cm4gW3RoaXMuc2V0dGluZ3MucGlwZWxpbmUwPy5lbmNyeXB0aW9uU2VjcmV0LCB0aGlzLnNldHRpbmdzLnBpcGVsaW5lMT8uZW5jcnlwdGlvblNlY3JldF1cbiAgICAgIC5maWx0ZXIoKHMpOiBzIGlzIElTZWNyZXQgPT4gcyAhPT0gdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19