@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.
- package/.jsii +60888 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +524 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +1297 -0
- package/grants.json +27 -0
- package/lib/audio-codec-settings.d.ts +901 -0
- package/lib/audio-codec-settings.js +1098 -0
- package/lib/audio-selector.d.ts +170 -0
- package/lib/audio-selector.js +306 -0
- package/lib/avail-settings.d.ts +231 -0
- package/lib/avail-settings.js +226 -0
- package/lib/caption-selector.d.ts +234 -0
- package/lib/caption-selector.js +413 -0
- package/lib/caption-settings.d.ts +349 -0
- package/lib/caption-settings.js +482 -0
- package/lib/channel-features.d.ts +106 -0
- package/lib/channel-features.js +85 -0
- package/lib/channel-placement-group.d.ts +73 -0
- package/lib/channel-placement-group.js +132 -0
- package/lib/channel.d.ts +687 -0
- package/lib/channel.js +1096 -0
- package/lib/cluster.d.ts +129 -0
- package/lib/cluster.js +158 -0
- package/lib/color-correction.d.ts +39 -0
- package/lib/color-correction.js +29 -0
- package/lib/destinations.d.ts +242 -0
- package/lib/destinations.js +455 -0
- package/lib/encode-configuration.d.ts +615 -0
- package/lib/encode-configuration.js +629 -0
- package/lib/enums.d.ts +698 -0
- package/lib/enums.js +1045 -0
- package/lib/file-location.d.ts +65 -0
- package/lib/file-location.js +150 -0
- package/lib/framerate.d.ts +31 -0
- package/lib/framerate.js +71 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.js +43 -0
- package/lib/input-attachment.d.ts +319 -0
- package/lib/input-attachment.js +228 -0
- package/lib/input-security-group.d.ts +51 -0
- package/lib/input-security-group.js +123 -0
- package/lib/input-specification.d.ts +111 -0
- package/lib/input-specification.js +181 -0
- package/lib/input.d.ts +505 -0
- package/lib/input.js +803 -0
- package/lib/m2ts-settings.d.ts +421 -0
- package/lib/m2ts-settings.js +469 -0
- package/lib/m3u8-settings.d.ts +272 -0
- package/lib/m3u8-settings.js +304 -0
- package/lib/medialive-grants.generated.d.ts +30 -0
- package/lib/medialive-grants.generated.js +92 -0
- package/lib/network.d.ts +83 -0
- package/lib/network.js +132 -0
- package/lib/output-group.d.ts +924 -0
- package/lib/output-group.js +941 -0
- package/lib/outputs.d.ts +304 -0
- package/lib/outputs.js +598 -0
- package/lib/sdi-source.d.ts +124 -0
- package/lib/sdi-source.js +180 -0
- package/lib/shared.d.ts +44 -0
- package/lib/shared.js +146 -0
- package/lib/video-codec-settings.d.ts +1500 -0
- package/lib/video-codec-settings.js +1722 -0
- package/lib/video-selection.d.ts +92 -0
- package/lib/video-selection.js +95 -0
- package/package.json +135 -0
- package/rosetta/_generated.ts-fixture +6 -0
- 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
|