@aws-cdk/aws-mediaconnect-alpha 2.263.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,116 @@
1
+ import type { IResource } from 'aws-cdk-lib';
2
+ import type { IFlowSourceRef } from 'aws-cdk-lib/aws-mediaconnect';
3
+ import type { Construct } from 'constructs';
4
+ import type { IFlow } from './flow';
5
+ import type { SourceConfiguration } from './flow-source-configuration';
6
+ /**
7
+ * Interface for Flow Source
8
+ */
9
+ export interface IFlowSource extends IResource, IFlowSourceRef {
10
+ /**
11
+ * The Amazon Resource Name (ARN) of the flow source.
12
+ *
13
+ * @attribute
14
+ */
15
+ readonly flowSourceArn: string;
16
+ /**
17
+ * The name of the flow source.
18
+ *
19
+ * @attribute
20
+ */
21
+ readonly flowSourceName: string;
22
+ /**
23
+ * The IP address that the flow will be listening on for incoming content.
24
+ *
25
+ * @attribute
26
+ */
27
+ readonly ingestIp: string;
28
+ /**
29
+ * The port that the flow will be listening on for incoming content.
30
+ *
31
+ * @attribute
32
+ */
33
+ readonly sourceIngestPort: string;
34
+ }
35
+ /**
36
+ * Properties for the flow source
37
+ */
38
+ export interface FlowSourceProps {
39
+ /**
40
+ * Additional Source Configuration.
41
+ *
42
+ * Set the source's name via `name` on the configuration (e.g. `SourceConfiguration.rtp({ name })`).
43
+ * When no name is set there, one is generated from construct naming.
44
+ */
45
+ readonly source: SourceConfiguration;
46
+ /**
47
+ * The flow this source is connected to. The flow must have Failover enabled to add an additional source.
48
+ */
49
+ readonly flow: IFlow;
50
+ }
51
+ /**
52
+ * Attributes for importing an existing Flow Source.
53
+ */
54
+ export interface FlowSourceAttributes {
55
+ /**
56
+ * The Amazon Resource Name (ARN) of the flow source.
57
+ */
58
+ readonly flowSourceArn: string;
59
+ /**
60
+ * The name of the flow source.
61
+ *
62
+ * @default - accessing `flowSourceName` on the imported source throws; only provide when available.
63
+ */
64
+ readonly flowSourceName?: string;
65
+ /**
66
+ * The IP address that the flow will be listening on for incoming content.
67
+ *
68
+ * @default - accessing `ingestIp` on the imported source throws; only provide when available.
69
+ */
70
+ readonly ingestIp?: string;
71
+ /**
72
+ * The port that the flow will be listening on for incoming content.
73
+ *
74
+ * @default - accessing `sourceIngestPort` on the imported source throws; only provide when available.
75
+ */
76
+ readonly sourceIngestPort?: string;
77
+ }
78
+ /**
79
+ * Adds source to an existing flow.
80
+ *
81
+ * Adding an additional source requires Failover to be enabled. When you enable Failover,
82
+ * the additional source must use the same protocol as the existing source. A source is
83
+ * the external video content that includes configuration information (encryption and source type)
84
+ * and a network address. Each flow has at least one source. A standard source comes from a source
85
+ * other than another AWS Elemental MediaConnect flow, such as an on-premises encoder.
86
+ */
87
+ export declare class FlowSource extends FlowSourceBase {
88
+ /** Uniquely identifies this class. */
89
+ static readonly PROPERTY_INJECTION_ID: string;
90
+ /**
91
+ * Import an existing Flow Source from its ARN.
92
+ *
93
+ * @param scope The parent construct
94
+ * @param id The construct id
95
+ * @param flowSourceArn The ARN of the Flow Source
96
+ * @returns A Flow Source construct
97
+ */
98
+ static fromFlowSourceArn(scope: Construct, id: string, flowSourceArn: string): IFlowSource;
99
+ /**
100
+ * Import an existing Flow Source from its attributes.
101
+ *
102
+ * Provide `ingestIp` and/or `sourceIngestPort` when importing a source that was deployed
103
+ * externally — otherwise accessing those properties on the imported construct will throw.
104
+ *
105
+ * @param scope The parent construct
106
+ * @param id The construct id
107
+ * @param attrs The Flow Source attributes
108
+ * @returns A Flow Source construct
109
+ */
110
+ static fromFlowSourceAttributes(scope: Construct, id: string, attrs: FlowSourceAttributes): IFlowSource;
111
+ readonly flowSourceArn: string;
112
+ readonly flowSourceName: string;
113
+ readonly ingestIp: string;
114
+ readonly sourceIngestPort: string;
115
+ constructor(scope: Construct, id: string, props: FlowSourceProps);
116
+ }
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.FlowSource = void 0;
38
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const aws_mediaconnect_1 = require("aws-cdk-lib/aws-mediaconnect");
42
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
43
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
44
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
45
+ const flow_source_configuration_1 = require("./flow-source-configuration");
46
+ /**
47
+ * Shared base for both real and imported flow sources.
48
+ * @internal
49
+ */
50
+ class FlowSourceBase extends aws_cdk_lib_1.Resource {
51
+ get flowSourceRef() {
52
+ return { sourceArn: this.flowSourceArn };
53
+ }
54
+ }
55
+ /**
56
+ * Adds source to an existing flow.
57
+ *
58
+ * Adding an additional source requires Failover to be enabled. When you enable Failover,
59
+ * the additional source must use the same protocol as the existing source. A source is
60
+ * the external video content that includes configuration information (encryption and source type)
61
+ * and a network address. Each flow has at least one source. A standard source comes from a source
62
+ * other than another AWS Elemental MediaConnect flow, such as an on-premises encoder.
63
+ */
64
+ let FlowSource = (() => {
65
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
66
+ let _classDescriptor;
67
+ let _classExtraInitializers = [];
68
+ let _classThis;
69
+ let _classSuper = FlowSourceBase;
70
+ var FlowSource = class extends _classSuper {
71
+ static { _classThis = this; }
72
+ static {
73
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
74
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
75
+ FlowSource = _classThis = _classDescriptor.value;
76
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
77
+ }
78
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FlowSource", version: "2.263.0-alpha.0" };
79
+ /** Uniquely identifies this class. */
80
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.FlowSource';
81
+ /**
82
+ * Import an existing Flow Source from its ARN.
83
+ *
84
+ * @param scope The parent construct
85
+ * @param id The construct id
86
+ * @param flowSourceArn The ARN of the Flow Source
87
+ * @returns A Flow Source construct
88
+ */
89
+ static fromFlowSourceArn(scope, id, flowSourceArn) {
90
+ return FlowSource.fromFlowSourceAttributes(scope, id, { flowSourceArn });
91
+ }
92
+ /**
93
+ * Import an existing Flow Source from its attributes.
94
+ *
95
+ * Provide `ingestIp` and/or `sourceIngestPort` when importing a source that was deployed
96
+ * externally — otherwise accessing those properties on the imported construct will throw.
97
+ *
98
+ * @param scope The parent construct
99
+ * @param id The construct id
100
+ * @param attrs The Flow Source attributes
101
+ * @returns A Flow Source construct
102
+ */
103
+ static fromFlowSourceAttributes(scope, id, attrs) {
104
+ try {
105
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_FlowSourceAttributes(attrs);
106
+ }
107
+ catch (error) {
108
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
109
+ Error.captureStackTrace(error, this.fromFlowSourceAttributes);
110
+ }
111
+ throw error;
112
+ }
113
+ class Import extends FlowSourceBase {
114
+ flowSourceArn = attrs.flowSourceArn;
115
+ get flowSourceName() {
116
+ if (attrs.flowSourceName)
117
+ return attrs.flowSourceName;
118
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceNameNotProvided`, `'flowSourceName' is not available on imported FlowSource ${this.node.path}; pass it via fromFlowSourceAttributes`, this);
119
+ }
120
+ get ingestIp() {
121
+ if (attrs.ingestIp)
122
+ return attrs.ingestIp;
123
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceIngestIpNotProvided`, `'ingestIp' is not available on imported FlowSource ${this.node.path}; pass it via fromFlowSourceAttributes`, this);
124
+ }
125
+ get sourceIngestPort() {
126
+ if (attrs.sourceIngestPort)
127
+ return attrs.sourceIngestPort;
128
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceIngestPortNotProvided`, `'sourceIngestPort' is not available on imported FlowSource ${this.node.path}; pass it via fromFlowSourceAttributes`, this);
129
+ }
130
+ }
131
+ return new Import(scope, id);
132
+ }
133
+ flowSourceArn;
134
+ flowSourceName;
135
+ ingestIp;
136
+ sourceIngestPort;
137
+ constructor(scope, id, props) {
138
+ super(scope, id, {
139
+ // The source name comes from the `source` configuration; fall back to a
140
+ // construct-derived name when it sets none.
141
+ physicalName: props.source.flowSourceName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 64 }) }),
142
+ });
143
+ try {
144
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_FlowSourceProps(props);
145
+ }
146
+ catch (error) {
147
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
148
+ Error.captureStackTrace(error, FlowSource);
149
+ }
150
+ throw error;
151
+ }
152
+ // Validate the source name when one is set on the configuration.
153
+ if (props.source.flowSourceName != null && props.source.flowSourceName !== '' && !aws_cdk_lib_1.Token.isUnresolved(props.source.flowSourceName)) {
154
+ if (props.source.flowSourceName.length > 64) {
155
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceNameLength`, `Flow source name must be between 1 and 64 characters, got ${props.source.flowSourceName.length}`, this);
156
+ }
157
+ if (!/^[a-zA-Z0-9_-]+$/.test(props.source.flowSourceName)) {
158
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceNameFormat`, `Flow source name must contain only alphanumeric characters, hyphens, and underscores, got '${props.source.flowSourceName}'`, this);
159
+ }
160
+ }
161
+ // Enhanced CDK Analytics Telemetry
162
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
163
+ const sourceConfig = props.source._bind(this);
164
+ if (sourceConfig.protocol === flow_source_configuration_1.SourceProtocol.CDI.value || sourceConfig.protocol === flow_source_configuration_1.SourceProtocol.JPEGXS.value) {
165
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceProtocolNotSupported`, 'CDI or JPEGXS can only be configured on the main Flow construct', this);
166
+ }
167
+ if (!props.flow.isFailoverEnabled) {
168
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceFailoverRequired`, 'Failover configuration needs to be configured and enabled to add an additional Flow source. ' +
169
+ 'If the Flow is imported via fromFlowAttributes(), set isFailoverEnabled: true', this);
170
+ }
171
+ const { name: _sourceName, ...restSourceConfig } = sourceConfig;
172
+ const resource = new aws_mediaconnect_1.CfnFlowSource(this, 'Resource', {
173
+ ...restSourceConfig,
174
+ flowArn: props.flow.flowArn,
175
+ name: this.physicalName,
176
+ description: sourceConfig.description ?? this.physicalName,
177
+ });
178
+ this.flowSourceArn = resource.flowSourceRef.sourceArn;
179
+ this.flowSourceName = this.physicalName;
180
+ this.ingestIp = resource.attrIngestIp;
181
+ this.sourceIngestPort = resource.attrSourceIngestPort;
182
+ }
183
+ static {
184
+ __runInitializers(_classThis, _classExtraInitializers);
185
+ }
186
+ };
187
+ return FlowSource = _classThis;
188
+ })();
189
+ exports.FlowSource = FlowSource;
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmbG93LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBNEU7QUFDNUUsbUVBQTZEO0FBRTdELDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBSTFFLDJFQUE2RDtBQW9GN0Q7OztHQUdHO0FBQ0gsTUFBZSxjQUFlLFNBQVEsc0JBQVE7SUFNNUMsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQzFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7R0FRRztJQUVVLFVBQVU7NEJBRHRCLG9DQUFrQjs7OztzQkFDYSxjQUFjOzBCQUF0QixTQUFRLFdBQWM7Ozs7WUFBOUMsNktBbUhDOzs7OztRQWxIQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLDRDQUE0QyxDQUFDO1FBRXBHOzs7Ozs7O1dBT0c7UUFDSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsYUFBcUI7WUFDakYsT0FBTyxVQUFVLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDMUU7UUFFRDs7Ozs7Ozs7OztXQVVHO1FBQ0ksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCOzs7Ozs7Ozs7O1lBQzlGLE1BQU0sTUFBTyxTQUFRLGNBQWM7Z0JBQ2pCLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO2dCQUVwRCxJQUFXLGNBQWM7b0JBQ3ZCLElBQUksS0FBSyxDQUFDLGNBQWM7d0JBQUUsT0FBTyxLQUFLLENBQUMsY0FBYyxDQUFDO29CQUN0RCxNQUFNLElBQUksNkJBQWUsQ0FDdkIsSUFBQSxzQkFBRyxF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QUcsRUFBQSxnQ0FBZ0MsRUFBRSxpRUFBaUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxSSxDQUFDO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLDZCQUFlLENBQ3ZCLElBQUEsc0JBQUcsRUFBQSw0QkFBNEIsRUFDL0IsOEZBQThGO29CQUM5RiwrRUFBK0UsRUFDL0UsSUFBSSxDQUNMLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLFlBQVksQ0FBQztZQUVoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLGdDQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDbkQsR0FBRyxnQkFBZ0I7Z0JBQ25CLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDdkIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVk7YUFDM0QsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7U0FDdkQ7O1lBbEhVLHVEQUFVOzs7OztBQUFWLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFRva2VuLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDZm5GbG93U291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElGbG93U291cmNlUmVmLCBGbG93U291cmNlUmVmZXJlbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElGbG93IH0gZnJvbSAnLi9mbG93JztcbmltcG9ydCB0eXBlIHsgU291cmNlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vZmxvdy1zb3VyY2UtY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2VQcm90b2NvbCB9IGZyb20gJy4vZmxvdy1zb3VyY2UtY29uZmlndXJhdGlvbic7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBGbG93IFNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElGbG93U291cmNlIGV4dGVuZHMgSVJlc291cmNlLCBJRmxvd1NvdXJjZVJlZiB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGZsb3cgc291cmNlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBmbG93U291cmNlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmbG93IHNvdXJjZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd1NvdXJjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgZmxvdyB3aWxsIGJlIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5nZXN0SXA6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhhdCB0aGUgZmxvdyB3aWxsIGJlIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSW5nZXN0UG9ydDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBmbG93IHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dTb3VyY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIFNvdXJjZSBDb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBTZXQgdGhlIHNvdXJjZSdzIG5hbWUgdmlhIGBuYW1lYCBvbiB0aGUgY29uZmlndXJhdGlvbiAoZS5nLiBgU291cmNlQ29uZmlndXJhdGlvbi5ydHAoeyBuYW1lIH0pYCkuXG4gICAqIFdoZW4gbm8gbmFtZSBpcyBzZXQgdGhlcmUsIG9uZSBpcyBnZW5lcmF0ZWQgZnJvbSBjb25zdHJ1Y3QgbmFtaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBTb3VyY2VDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgZmxvdyB0aGlzIHNvdXJjZSBpcyBjb25uZWN0ZWQgdG8uIFRoZSBmbG93IG11c3QgaGF2ZSBGYWlsb3ZlciBlbmFibGVkIHRvIGFkZCBhbiBhZGRpdGlvbmFsIHNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGZsb3c6IElGbG93O1xufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBGbG93IFNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93U291cmNlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGZsb3cgc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd1NvdXJjZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmxvdyBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWNjZXNzaW5nIGBmbG93U291cmNlTmFtZWAgb24gdGhlIGltcG9ydGVkIHNvdXJjZSB0aHJvd3M7IG9ubHkgcHJvdmlkZSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGZsb3dTb3VyY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyB0aGF0IHRoZSBmbG93IHdpbGwgYmUgbGlzdGVuaW5nIG9uIGZvciBpbmNvbWluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjY2Vzc2luZyBgaW5nZXN0SXBgIG9uIHRoZSBpbXBvcnRlZCBzb3VyY2UgdGhyb3dzOyBvbmx5IHByb3ZpZGUgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBpbmdlc3RJcD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhhdCB0aGUgZmxvdyB3aWxsIGJlIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhY2Nlc3NpbmcgYHNvdXJjZUluZ2VzdFBvcnRgIG9uIHRoZSBpbXBvcnRlZCBzb3VyY2UgdGhyb3dzOyBvbmx5IHByb3ZpZGUgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VJbmdlc3RQb3J0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNoYXJlZCBiYXNlIGZvciBib3RoIHJlYWwgYW5kIGltcG9ydGVkIGZsb3cgc291cmNlcy5cbiAqIEBpbnRlcm5hbFxuICovXG5hYnN0cmFjdCBjbGFzcyBGbG93U291cmNlQmFzZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUZsb3dTb3VyY2Uge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZmxvd1NvdXJjZUFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZmxvd1NvdXJjZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGluZ2VzdElwOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzb3VyY2VJbmdlc3RQb3J0OiBzdHJpbmc7XG5cbiAgcHVibGljIGdldCBmbG93U291cmNlUmVmKCk6IEZsb3dTb3VyY2VSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IHNvdXJjZUFybjogdGhpcy5mbG93U291cmNlQXJuIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIHNvdXJjZSB0byBhbiBleGlzdGluZyBmbG93LlxuICpcbiAqIEFkZGluZyBhbiBhZGRpdGlvbmFsIHNvdXJjZSByZXF1aXJlcyBGYWlsb3ZlciB0byBiZSBlbmFibGVkLiBXaGVuIHlvdSBlbmFibGUgRmFpbG92ZXIsXG4gKiB0aGUgYWRkaXRpb25hbCBzb3VyY2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIGV4aXN0aW5nIHNvdXJjZS4gQSBzb3VyY2UgaXNcbiAqIHRoZSBleHRlcm5hbCB2aWRlbyBjb250ZW50IHRoYXQgaW5jbHVkZXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAoZW5jcnlwdGlvbiBhbmQgc291cmNlIHR5cGUpXG4gKiBhbmQgYSBuZXR3b3JrIGFkZHJlc3MuIEVhY2ggZmxvdyBoYXMgYXQgbGVhc3Qgb25lIHNvdXJjZS4gQSBzdGFuZGFyZCBzb3VyY2UgY29tZXMgZnJvbSBhIHNvdXJjZVxuICogb3RoZXIgdGhhbiBhbm90aGVyIEFXUyBFbGVtZW50YWwgTWVkaWFDb25uZWN0IGZsb3csIHN1Y2ggYXMgYW4gb24tcHJlbWlzZXMgZW5jb2Rlci5cbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEZsb3dTb3VyY2UgZXh0ZW5kcyBGbG93U291cmNlQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhY29ubmVjdC1hbHBoYS5GbG93U291cmNlJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIEZsb3cgU291cmNlIGZyb20gaXRzIEFSTi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBmbG93U291cmNlQXJuIFRoZSBBUk4gb2YgdGhlIEZsb3cgU291cmNlXG4gICAqIEByZXR1cm5zIEEgRmxvdyBTb3VyY2UgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GbG93U291cmNlQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGZsb3dTb3VyY2VBcm46IHN0cmluZyk6IElGbG93U291cmNlIHtcbiAgICByZXR1cm4gRmxvd1NvdXJjZS5mcm9tRmxvd1NvdXJjZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGZsb3dTb3VyY2VBcm4gfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIEZsb3cgU291cmNlIGZyb20gaXRzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIFByb3ZpZGUgYGluZ2VzdElwYCBhbmQvb3IgYHNvdXJjZUluZ2VzdFBvcnRgIHdoZW4gaW1wb3J0aW5nIGEgc291cmNlIHRoYXQgd2FzIGRlcGxveWVkXG4gICAqIGV4dGVybmFsbHkg4oCUIG90aGVyd2lzZSBhY2Nlc3NpbmcgdGhvc2UgcHJvcGVydGllcyBvbiB0aGUgaW1wb3J0ZWQgY29uc3RydWN0IHdpbGwgdGhyb3cuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIEZsb3cgU291cmNlIGF0dHJpYnV0ZXNcbiAgICogQHJldHVybnMgQSBGbG93IFNvdXJjZSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZsb3dTb3VyY2VBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBGbG93U291cmNlQXR0cmlidXRlcyk6IElGbG93U291cmNlIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBGbG93U291cmNlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZmxvd1NvdXJjZUFybiA9IGF0dHJzLmZsb3dTb3VyY2VBcm47XG5cbiAgICAgIHB1YmxpYyBnZXQgZmxvd1NvdXJjZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLmZsb3dTb3VyY2VOYW1lKSByZXR1cm4gYXR0cnMuZmxvd1NvdXJjZU5hbWU7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEZsb3dTb3VyY2VOYW1lTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnZmxvd1NvdXJjZU5hbWUnIGlzIG5vdCBhdmFpbGFibGUgb24gaW1wb3J0ZWQgRmxvd1NvdXJjZSAke3RoaXMubm9kZS5wYXRofTsgcGFzcyBpdCB2aWEgZnJvbUZsb3dTb3VyY2VBdHRyaWJ1dGVzYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IGluZ2VzdElwKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhdHRycy5pbmdlc3RJcCkgcmV0dXJuIGF0dHJzLmluZ2VzdElwO1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBGbG93U291cmNlSW5nZXN0SXBOb3RQcm92aWRlZGAsXG4gICAgICAgICAgYCdpbmdlc3RJcCcgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBGbG93U291cmNlICR7dGhpcy5ub2RlLnBhdGh9OyBwYXNzIGl0IHZpYSBmcm9tRmxvd1NvdXJjZUF0dHJpYnV0ZXNgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBnZXQgc291cmNlSW5nZXN0UG9ydCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXR0cnMuc291cmNlSW5nZXN0UG9ydCkgcmV0dXJuIGF0dHJzLnNvdXJjZUluZ2VzdFBvcnQ7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEZsb3dTb3VyY2VJbmdlc3RQb3J0Tm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnc291cmNlSW5nZXN0UG9ydCcgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBGbG93U291cmNlICR7dGhpcy5ub2RlLnBhdGh9OyBwYXNzIGl0IHZpYSBmcm9tRmxvd1NvdXJjZUF0dHJpYnV0ZXNgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICByZWFkb25seSBmbG93U291cmNlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZsb3dTb3VyY2VOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluZ2VzdElwOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZUluZ2VzdFBvcnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRmxvd1NvdXJjZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAvLyBUaGUgc291cmNlIG5hbWUgY29tZXMgZnJvbSB0aGUgYHNvdXJjZWAgY29uZmlndXJhdGlvbjsgZmFsbCBiYWNrIHRvIGFcbiAgICAgIC8vIGNvbnN0cnVjdC1kZXJpdmVkIG5hbWUgd2hlbiBpdCBzZXRzIG5vbmUuXG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLnNvdXJjZS5mbG93U291cmNlTmFtZSA/PyBMYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQgfSkgfSksXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgc291cmNlIG5hbWUgd2hlbiBvbmUgaXMgc2V0IG9uIHRoZSBjb25maWd1cmF0aW9uLlxuICAgIGlmIChwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUgIT0gbnVsbCAmJiBwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuc291cmNlLmZsb3dTb3VyY2VOYW1lKSkge1xuICAgICAgaWYgKHByb3BzLnNvdXJjZS5mbG93U291cmNlTmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBGbG93U291cmNlTmFtZUxlbmd0aGAsIGBGbG93IHNvdXJjZSBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLCBnb3QgJHtwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUubGVuZ3RofWAsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKCEvXlthLXpBLVowLTlfLV0rJC8udGVzdChwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEZsb3dTb3VyY2VOYW1lRm9ybWF0YCwgYEZsb3cgc291cmNlIG5hbWUgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcywgZ290ICcke3Byb3BzLnNvdXJjZS5mbG93U291cmNlTmFtZX0nYCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBzb3VyY2VDb25maWcgPSBwcm9wcy5zb3VyY2UuX2JpbmQodGhpcyk7XG5cbiAgICBpZiAoc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5DREkudmFsdWUgfHwgc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5KUEVHWFMudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEZsb3dTb3VyY2VQcm90b2NvbE5vdFN1cHBvcnRlZGAsICdDREkgb3IgSlBFR1hTIGNhbiBvbmx5IGJlIGNvbmZpZ3VyZWQgb24gdGhlIG1haW4gRmxvdyBjb25zdHJ1Y3QnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLmZsb3cuaXNGYWlsb3ZlckVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBGbG93U291cmNlRmFpbG92ZXJSZXF1aXJlZGAsXG4gICAgICAgICdGYWlsb3ZlciBjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQgdG8gYWRkIGFuIGFkZGl0aW9uYWwgRmxvdyBzb3VyY2UuICcgK1xuICAgICAgICAnSWYgdGhlIEZsb3cgaXMgaW1wb3J0ZWQgdmlhIGZyb21GbG93QXR0cmlidXRlcygpLCBzZXQgaXNGYWlsb3ZlckVuYWJsZWQ6IHRydWUnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG5hbWU6IF9zb3VyY2VOYW1lLCAuLi5yZXN0U291cmNlQ29uZmlnIH0gPSBzb3VyY2VDb25maWc7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5GbG93U291cmNlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIC4uLnJlc3RTb3VyY2VDb25maWcsXG4gICAgICBmbG93QXJuOiBwcm9wcy5mbG93LmZsb3dBcm4sXG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBzb3VyY2VDb25maWcuZGVzY3JpcHRpb24gPz8gdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZsb3dTb3VyY2VBcm4gPSByZXNvdXJjZS5mbG93U291cmNlUmVmLnNvdXJjZUFybjtcbiAgICB0aGlzLmZsb3dTb3VyY2VOYW1lID0gdGhpcy5waHlzaWNhbE5hbWU7XG4gICAgdGhpcy5pbmdlc3RJcCA9IHJlc291cmNlLmF0dHJJbmdlc3RJcDtcbiAgICB0aGlzLnNvdXJjZUluZ2VzdFBvcnQgPSByZXNvdXJjZS5hdHRyU291cmNlSW5nZXN0UG9ydDtcbiAgfVxufVxuIl19