UNPKG

@aws-cdk/aws-ivs-alpha

Version:

The CDK Construct Library for AWS::IVS

214 lines 29.4 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Channel = exports.Policy = exports.MaximumResolution = exports.Preset = exports.ChannelType = exports.LatencyMode = exports.ContainerFormat = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const core = require("aws-cdk-lib/core"); const core_1 = require("aws-cdk-lib/core"); const aws_ivs_1 = require("aws-cdk-lib/aws-ivs"); const stream_key_1 = require("./stream-key"); const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource"); /** * Reference to a new or existing IVS Channel */ class ChannelBase extends core.Resource { addStreamKey(id) { return new stream_key_1.StreamKey(this, id, { channel: this, }); } } /** * Container Format */ var ContainerFormat; (function (ContainerFormat) { /** * Use MPEG-TS. */ ContainerFormat["TS"] = "TS"; /** * Use fMP4. */ ContainerFormat["FRAGMENTED_MP4"] = "FRAGMENTED_MP4"; })(ContainerFormat || (exports.ContainerFormat = ContainerFormat = {})); /** * Channel latency mode */ var LatencyMode; (function (LatencyMode) { /** * Use LOW to minimize broadcaster-to-viewer latency for interactive broadcasts. */ LatencyMode["LOW"] = "LOW"; /** * Use NORMAL for broadcasts that do not require viewer interaction. */ LatencyMode["NORMAL"] = "NORMAL"; })(LatencyMode || (exports.LatencyMode = LatencyMode = {})); /** * The channel type, which determines the allowable resolution and bitrate. * If you exceed the allowable resolution or bitrate, the stream probably will disconnect immediately. * * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html */ var ChannelType; (function (ChannelType) { /** * Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. * Transcoding allows higher playback quality across a range of download speeds. Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps. * Audio is transcoded only for renditions 360p and below; above that, audio is passed through. */ ChannelType["STANDARD"] = "STANDARD"; /** * Delivers the original input to viewers. The viewer’s video-quality choice is limited to the original input. */ ChannelType["BASIC"] = "BASIC"; /** * Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. * Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at SD quality (480p). * Audio for all renditions is transcoded, and an audio-only rendition is available. */ ChannelType["ADVANCED_SD"] = "ADVANCED_SD"; /** * Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. * Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at HD quality (720p). * Audio for all renditions is transcoded, and an audio-only rendition is available. */ ChannelType["ADVANCED_HD"] = "ADVANCED_HD"; })(ChannelType || (exports.ChannelType = ChannelType = {})); /** * An optional transcode preset for the channel. This is selectable only for ADVANCED_HD and ADVANCED_SD channel types. * * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html */ var Preset; (function (Preset) { /** * Use a lower bitrate than STANDARD for each quality level. Use it if you have low download bandwidth and/or simple video content (e.g., talking heads). */ Preset["CONSTRAINED_BANDWIDTH_DELIVERY"] = "CONSTRAINED_BANDWIDTH_DELIVERY"; /** * Use a higher bitrate for each quality level. Use it if you have high download bandwidth and/or complex video content (e.g., flashes and quick scene changes). */ Preset["HIGHER_BANDWIDTH_DELIVERY"] = "HIGHER_BANDWIDTH_DELIVERY"; })(Preset || (exports.Preset = Preset = {})); /** * Maximum resolution for multitrack input. */ var MaximumResolution; (function (MaximumResolution) { /** * Full HD (1080p) */ MaximumResolution["FULL_HD"] = "FULL_HD"; /** * HD (720p) */ MaximumResolution["HD"] = "HD"; /** * SD (480p) */ MaximumResolution["SD"] = "SD"; })(MaximumResolution || (exports.MaximumResolution = MaximumResolution = {})); /** * Whether multitrack input is allowed or required. */ var Policy; (function (Policy) { /** * Multitrack input is allowed. */ Policy["ALLOW"] = "ALLOW"; /** * Multitrack input is required. */ Policy["REQUIRE"] = "REQUIRE"; })(Policy || (exports.Policy = Policy = {})); /** A new IVS channel */ class Channel extends ChannelBase { /** * Import an existing channel */ static fromChannelArn(scope, id, channelArn) { // This will throw an error if the arn cannot be parsed let arnComponents = core.Arn.split(channelArn, core.ArnFormat.SLASH_RESOURCE_NAME); if (!core.Token.isUnresolved(arnComponents.service) && arnComponents.service !== 'ivs') { throw new Error(`Invalid service, expected 'ivs', got '${arnComponents.service}'`); } if (!core.Token.isUnresolved(arnComponents.resource) && arnComponents.resource !== 'channel') { throw new Error(`Invalid resource, expected 'channel', got '${arnComponents.resource}'`); } class Import extends ChannelBase { constructor() { super(...arguments); this.channelArn = channelArn; } } return new Import(scope, id); } constructor(scope, id, props = {}) { super(scope, id, { physicalName: props.channelName ?? core_1.Lazy.string({ produce: () => core_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '-_' }), }), }); try { jsiiDeprecationWarnings._aws_cdk_aws_ivs_alpha_ChannelProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Channel); } throw error; } // Enhanced CDK Analytics Telemetry (0, metadata_resource_1.addConstructMetadata)(this, props); if (this.physicalName && !core.Token.isUnresolved(this.physicalName) && !/^[a-zA-Z0-9-_]*$/.test(this.physicalName)) { throw new Error(`channelName must contain only numbers, letters, hyphens and underscores, got: '${this.physicalName}'`); } let preset; if (props.type && [ChannelType.STANDARD, ChannelType.BASIC].includes(props.type) && props.preset) { preset = ''; } else { preset = props.preset; } if (props.multitrackInputConfiguration !== undefined) { if (props.type !== undefined && props.type !== ChannelType.STANDARD) { throw new Error(`\`multitrackInputConfiguration\` is only supported for \`ChannelType.STANDARD\`, got: ${props.type}.`); } if (props.containerFormat !== undefined && props.containerFormat !== ContainerFormat.FRAGMENTED_MP4) { throw new Error(`\`containerFormat\` must be set to \`ContainerFormat.FRAGMENTED_MP4\` when \`multitrackInputConfiguration\` is specified, got: ${props.containerFormat}.`); } } const resource = new aws_ivs_1.CfnChannel(this, 'Resource', { authorized: props.authorized, insecureIngest: props.insecureIngest, latencyMode: props.latencyMode, name: this.physicalName, type: props.type, preset, recordingConfigurationArn: props.recordingConfiguration?.recordingConfigurationArn, containerFormat: props.containerFormat ?? (props.multitrackInputConfiguration ? ContainerFormat.FRAGMENTED_MP4 : undefined), multitrackInputConfiguration: props.multitrackInputConfiguration ? { enabled: true, maximumResolution: props.multitrackInputConfiguration.maximumResolution, policy: props.multitrackInputConfiguration.policy, } : undefined, }); this.channelArn = resource.attrArn; this.channelIngestEndpoint = resource.attrIngestEndpoint; this.channelPlaybackUrl = resource.attrPlaybackUrl; } } exports.Channel = Channel; _a = JSII_RTTI_SYMBOL_1; Channel[_a] = { fqn: "@aws-cdk/aws-ivs-alpha.Channel", version: "2.188.0-alpha.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLDJDQUErQztBQUUvQyxpREFBaUQ7QUFDakQsNkNBQXlDO0FBRXpDLDhFQUE4RTtBQW9COUU7O0dBRUc7QUFDSCxNQUFlLFdBQVksU0FBUSxJQUFJLENBQUMsUUFBUTtJQUd2QyxZQUFZLENBQUMsRUFBVTtRQUM1QixPQUFPLElBQUksc0JBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQzdCLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO0tBQ0o7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxlQVVYO0FBVkQsV0FBWSxlQUFlO0lBQ3pCOztPQUVHO0lBQ0gsNEJBQVMsQ0FBQTtJQUVUOztPQUVHO0lBQ0gsb0RBQWlDLENBQUE7QUFDbkMsQ0FBQyxFQVZXLGVBQWUsK0JBQWYsZUFBZSxRQVUxQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxXQVVYO0FBVkQsV0FBWSxXQUFXO0lBQ3JCOztPQUVHO0lBQ0gsMEJBQVcsQ0FBQTtJQUVYOztPQUVHO0lBQ0gsZ0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVZXLFdBQVcsMkJBQVgsV0FBVyxRQVV0QjtBQUVEOzs7OztHQUtHO0FBQ0gsSUFBWSxXQTBCWDtBQTFCRCxXQUFZLFdBQVc7SUFDckI7Ozs7T0FJRztJQUNILG9DQUFxQixDQUFBO0lBRXJCOztPQUVHO0lBQ0gsOEJBQWUsQ0FBQTtJQUVmOzs7O09BSUc7SUFDSCwwQ0FBMkIsQ0FBQTtJQUUzQjs7OztPQUlHO0lBQ0gsMENBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQTFCVyxXQUFXLDJCQUFYLFdBQVcsUUEwQnRCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksTUFXWDtBQVhELFdBQVksTUFBTTtJQUNoQjs7T0FFRztJQUNILDJFQUFpRSxDQUFBO0lBRWpFOztPQUVHO0lBQ0gsaUVBQXVE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Q0UsT0FBTyxFQUFFLElBQUk7b0JBQ2IsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLDRCQUE0QixDQUFDLGlCQUFpQjtvQkFDdkUsTUFBTSxFQUFFLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNO2lCQUNsRDtnQkFDRCxDQUFDLENBQUMsU0FBUztTQUNkLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1FBQ3pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO0tBQ3BEOztBQTVGSCwwQkE2RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgTGF6eSwgTmFtZXMgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2ZuQ2hhbm5lbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pdnMnO1xuaW1wb3J0IHsgU3RyZWFtS2V5IH0gZnJvbSAnLi9zdHJlYW0ta2V5JztcbmltcG9ydCB7IElSZWNvcmRpbmdDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9yZWNvcmRpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIElWUyBDaGFubmVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNoYW5uZWwgZXh0ZW5kcyBjb3JlLklSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgY2hhbm5lbCBBUk4uIEZvciBleGFtcGxlOiBhcm46YXdzOml2czp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOmNoYW5uZWwvYWJjZEFCQ0RlZmdoXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQWRkcyBhIHN0cmVhbSBrZXkgZm9yIHRoaXMgSVZTIENoYW5uZWwuXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgSURcbiAgICovXG4gIGFkZFN0cmVhbUtleShpZDogc3RyaW5nKTogU3RyZWFtS2V5O1xufVxuXG4vKipcbiAqIFJlZmVyZW5jZSB0byBhIG5ldyBvciBleGlzdGluZyBJVlMgQ2hhbm5lbFxuICovXG5hYnN0cmFjdCBjbGFzcyBDaGFubmVsQmFzZSBleHRlbmRzIGNvcmUuUmVzb3VyY2UgaW1wbGVtZW50cyBJQ2hhbm5lbCB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjaGFubmVsQXJuOiBzdHJpbmc7XG5cbiAgcHVibGljIGFkZFN0cmVhbUtleShpZDogc3RyaW5nKTogU3RyZWFtS2V5IHtcbiAgICByZXR1cm4gbmV3IFN0cmVhbUtleSh0aGlzLCBpZCwge1xuICAgICAgY2hhbm5lbDogdGhpcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5lciBGb3JtYXRcbiAqL1xuZXhwb3J0IGVudW0gQ29udGFpbmVyRm9ybWF0IHtcbiAgLyoqXG4gICAqIFVzZSBNUEVHLVRTLlxuICAgKi9cbiAgVFMgPSAnVFMnLFxuXG4gIC8qKlxuICAgKiBVc2UgZk1QNC5cbiAgICovXG4gIEZSQUdNRU5URURfTVA0ID0gJ0ZSQUdNRU5URURfTVA0Jyxcbn1cblxuLyoqXG4gKiBDaGFubmVsIGxhdGVuY3kgbW9kZVxuICovXG5leHBvcnQgZW51bSBMYXRlbmN5TW9kZSB7XG4gIC8qKlxuICAgKiBVc2UgTE9XIHRvIG1pbmltaXplIGJyb2FkY2FzdGVyLXRvLXZpZXdlciBsYXRlbmN5IGZvciBpbnRlcmFjdGl2ZSBicm9hZGNhc3RzLlxuICAgKi9cbiAgTE9XID0gJ0xPVycsXG5cbiAgLyoqXG4gICAqIFVzZSBOT1JNQUwgZm9yIGJyb2FkY2FzdHMgdGhhdCBkbyBub3QgcmVxdWlyZSB2aWV3ZXIgaW50ZXJhY3Rpb24uXG4gICAqL1xuICBOT1JNQUwgPSAnTk9STUFMJyxcbn1cblxuLyoqXG4gKiBUaGUgY2hhbm5lbCB0eXBlLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbGxvd2FibGUgcmVzb2x1dGlvbiBhbmQgYml0cmF0ZS5cbiAqIElmIHlvdSBleGNlZWQgdGhlIGFsbG93YWJsZSByZXNvbHV0aW9uIG9yIGJpdHJhdGUsIHRoZSBzdHJlYW0gcHJvYmFibHkgd2lsbCBkaXNjb25uZWN0IGltbWVkaWF0ZWx5LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWl2cy1jaGFubmVsLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gQ2hhbm5lbFR5cGUge1xuICAvKipcbiAgICogTXVsdGlwbGUgcXVhbGl0aWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQsIHRvIGF1dG9tYXRpY2FsbHkgZ2l2ZSB2aWV3ZXJzIHRoZSBiZXN0IGV4cGVyaWVuY2UgZm9yIHRoZWlyIGRldmljZXMgYW5kIG5ldHdvcmsgY29uZGl0aW9ucy5cbiAgICogVHJhbnNjb2RpbmcgYWxsb3dzIGhpZ2hlciBwbGF5YmFjayBxdWFsaXR5IGFjcm9zcyBhIHJhbmdlIG9mIGRvd25sb2FkIHNwZWVkcy4gUmVzb2x1dGlvbiBjYW4gYmUgdXAgdG8gMTA4MHAgYW5kIGJpdHJhdGUgY2FuIGJlIHVwIHRvIDguNSBNYnBzLlxuICAgKiBBdWRpbyBpcyB0cmFuc2NvZGVkIG9ubHkgZm9yIHJlbmRpdGlvbnMgMzYwcCBhbmQgYmVsb3c7IGFib3ZlIHRoYXQsIGF1ZGlvIGlzIHBhc3NlZCB0aHJvdWdoLlxuICAgKi9cbiAgU1RBTkRBUkQgPSAnU1RBTkRBUkQnLFxuXG4gIC8qKlxuICAgKiBEZWxpdmVycyB0aGUgb3JpZ2luYWwgaW5wdXQgdG8gdmlld2Vycy4gVGhlIHZpZXdlcuKAmXMgdmlkZW8tcXVhbGl0eSBjaG9pY2UgaXMgbGltaXRlZCB0byB0aGUgb3JpZ2luYWwgaW5wdXQuXG4gICAqL1xuICBCQVNJQyA9ICdCQVNJQycsXG5cbiAgLyoqXG4gICAqIE11bHRpcGxlIHF1YWxpdGllcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGlucHV0LCB0byBhdXRvbWF0aWNhbGx5IGdpdmUgdmlld2VycyB0aGUgYmVzdCBleHBlcmllbmNlIGZvciB0aGVpciBkZXZpY2VzIGFuZCBuZXR3b3JrIGNvbmRpdGlvbnMuXG4gICAqIElucHV0IHJlc29sdXRpb24gY2FuIGJlIHVwIHRvIDEwODBwIGFuZCBiaXRyYXRlIGNhbiBiZSB1cCB0byA4LjUgTWJwczsgb3V0cHV0IGlzIGNhcHBlZCBhdCBTRCBxdWFsaXR5ICg0ODBwKS5cbiAgICogQXVkaW8gZm9yIGFsbCByZW5kaXRpb25zIGlzIHRyYW5zY29kZWQsIGFuZCBhbiBhdWRpby1vbmx5IHJlbmRpdGlvbiBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBBRFZBTkNFRF9TRCA9ICdBRFZBTkNFRF9TRCcsXG5cbiAgLyoqXG4gICAqIE11bHRpcGxlIHF1YWxpdGllcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGlucHV0LCB0byBhdXRvbWF0aWNhbGx5IGdpdmUgdmlld2VycyB0aGUgYmVzdCBleHBlcmllbmNlIGZvciB0aGVpciBkZXZpY2VzIGFuZCBuZXR3b3JrIGNvbmRpdGlvbnMuXG4gICAqIElucHV0IHJlc29sdXRpb24gY2FuIGJlIHVwIHRvIDEwODBwIGFuZCBiaXRyYXRlIGNhbiBiZSB1cCB0byA4LjUgTWJwczsgb3V0cHV0IGlzIGNhcHBlZCBhdCBIRCBxdWFsaXR5ICg3MjBwKS5cbiAgICogQXVkaW8gZm9yIGFsbCByZW5kaXRpb25zIGlzIHRyYW5zY29kZWQsIGFuZCBhbiBhdWRpby1vbmx5IHJlbmRpdGlvbiBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBBRFZBTkNFRF9IRCA9ICdBRFZBTkNFRF9IRCcsXG59XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgdHJhbnNjb2RlIHByZXNldCBmb3IgdGhlIGNoYW5uZWwuIFRoaXMgaXMgc2VsZWN0YWJsZSBvbmx5IGZvciBBRFZBTkNFRF9IRCBhbmQgQURWQU5DRURfU0QgY2hhbm5lbCB0eXBlcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1pdnMtY2hhbm5lbC5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldCB7XG4gIC8qKlxuICAgKiBVc2UgYSBsb3dlciBiaXRyYXRlIHRoYW4gU1RBTkRBUkQgZm9yIGVhY2ggcXVhbGl0eSBsZXZlbC4gVXNlIGl0IGlmIHlvdSBoYXZlIGxvdyBkb3dubG9hZCBiYW5kd2lkdGggYW5kL29yIHNpbXBsZSB2aWRlbyBjb250ZW50IChlLmcuLCB0YWxraW5nIGhlYWRzKS5cbiAgICovXG4gIENPTlNUUkFJTkVEX0JBTkRXSURUSF9ERUxJVkVSWSA9ICdDT05TVFJBSU5FRF9CQU5EV0lEVEhfREVMSVZFUlknLFxuXG4gIC8qKlxuICAgKiBVc2UgYSBoaWdoZXIgYml0cmF0ZSBmb3IgZWFjaCBxdWFsaXR5IGxldmVsLiBVc2UgaXQgaWYgeW91IGhhdmUgaGlnaCBkb3dubG9hZCBiYW5kd2lkdGggYW5kL29yIGNvbXBsZXggdmlkZW8gY29udGVudCAoZS5nLiwgZmxhc2hlcyBhbmQgcXVpY2sgc2NlbmUgY2hhbmdlcykuXG4gICAqL1xuICBISUdIRVJfQkFORFdJRFRIX0RFTElWRVJZID0gJ0hJR0hFUl9CQU5EV0lEVEhfREVMSVZFUlknLFxuXG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBuZXcgQ2hhbm5lbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYW5uZWxQcm9wcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjaGFubmVsIGlzIGF1dGhvcml6ZWQuXG4gICAqXG4gICAqIElmIHlvdSB3aXNoIHRvIG1ha2UgYW4gYXV0aG9yaXplZCBjaGFubmVsLCB5b3Ugd2lsbCBuZWVkIHRvIGVuc3VyZSB0aGF0XG4gICAqIGEgUGxheWJhY2tLZXlQYWlyIGhhcyBiZWVuIHVwbG9hZGVkIHRvIHlvdXIgYWNjb3VudCBhcyB0aGlzIGlzIHVzZWQgdG9cbiAgICogdmFsaWRhdGUgdGhlIHNpZ25lZCBKV1QgdGhhdCBpcyByZXF1aXJlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXplZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGljaCBjb250ZW50LXBhY2thZ2luZyBmb3JtYXQgaXMgdXNlZCAoTVBFRy1UUyBvciBmTVA0KS5cbiAgICpcbiAgICogSWYgYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25gIGlzIHNwZWNpZmllZCwgb25seSBmTVA0IGNhbiBiZSB1c2VkLlxuICAgKiBPdGhlcndpc2UsIGBjb250YWluZXJGb3JtYXRgIG1heSBiZSBzZXQgdG8gYENvbnRhaW5lckZvcm1hdC5UU2Agb3IgYENvbnRhaW5lckZvcm1hdC5GUkFHTUVOVEVEX01QNGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYENvbnRhaW5lckZvcm1hdC5GUkFHTUVOVEVEX01QNGAgaXMgYXV0b21hdGljYWxseSBzZXQgd2hlbiB0aGUgYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25gIGlzIHNwZWNpZmllZC4gSWYgbm90IHNwZWNpZmllZCwgaXQgcmVtYWlucyB1bmRlZmluZWQgYW5kIHVzZXMgdGhlIElWUyBkZWZhdWx0IHNldHRpbmcgKFRTKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lckZvcm1hdD86IENvbnRhaW5lckZvcm1hdDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hhbm5lbCBhbGxvd3MgaW5zZWN1cmUgUlRNUCBpbmdlc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbnNlY3VyZUluZ2VzdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENoYW5uZWwgbGF0ZW5jeSBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBMYXRlbmN5TW9kZS5MT1dcbiAgICovXG4gIHJlYWRvbmx5IGxhdGVuY3lNb2RlPzogTGF0ZW5jeU1vZGU7XG5cbiAgLyoqXG4gICAqIEEgbmFtZSBmb3IgdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPYmplY3Qgc3BlY2lmeWluZyBtdWx0aXRyYWNrIGlucHV0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFlvdSBtdXN0IHNwZWNpZnkgYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25gIGlmIHlvdSB3YW50IHRvIHVzZSBNdWx0aVRyYWNrIFZpZGVvLlxuICAgKlxuICAgKiBgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbmAgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGBDaGFubmVsVHlwZS5TVEFOREFSRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIElWUyBkZWZhdWx0IHNldHRpbmcgaXMgbm90IHVzZSBNdWx0aVRyYWNrIFZpZGVvLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pdnMvbGF0ZXN0L0xvd0xhdGVuY3lVc2VyR3VpZGUvbXVsdGl0cmFjay12aWRlby5odG1sXG4gICAqL1xuICByZWFkb25seSBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uPzogTXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGNoYW5uZWwgdHlwZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYWxsb3dhYmxlIHJlc29sdXRpb24gYW5kIGJpdHJhdGUuXG4gICAqIElmIHlvdSBleGNlZWQgdGhlIGFsbG93YWJsZSByZXNvbHV0aW9uIG9yIGJpdHJhdGUsIHRoZSBzdHJlYW0gd2lsbCBkaXNjb25uZWN0IGltbWVkaWF0ZWx5XG4gICAqXG4gICAqIEBkZWZhdWx0IENoYW5uZWxUeXBlLlNUQU5EQVJEXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogQ2hhbm5lbFR5cGU7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRyYW5zY29kZSBwcmVzZXQgZm9yIHRoZSBjaGFubmVsLiBDYW4gYmUgdXNlZCBmb3IgQURWQU5DRURfSEQgYW5kIEFEVkFOQ0VEX1NEIGNoYW5uZWwgdHlwZXMuXG4gICAqIFdoZW4gTE9XIG9yIFNUQU5EQVJEIGlzIHVzZWQsIHRoZSBwcmVzZXQgd2lsbCBiZSBvdmVycmlkZGVuIGFuZCBzZXQgdG8gbm9uZSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBQcmVzZXQuSElHSEVSX0JBTkRXSURUSF9ERUxJVkVSWSBpZiBjaGFubmVsVHlwZSBpcyBBRFZBTkNFRF9TRCBvciBBRFZBTkNFRF9IRCwgbm9uZSBvdGhlcndpc2VcbiAgICovXG4gIHJlYWRvbmx5IHByZXNldD86IFByZXNldDtcblxuICAvKipcbiAgICogQSByZWNvcmRpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVjb3JkaW5nIGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSByZWNvcmRpbmdDb25maWd1cmF0aW9uPzogSVJlY29yZGluZ0NvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogTWF4aW11bSByZXNvbHV0aW9uIGZvciBtdWx0aXRyYWNrIGlucHV0LlxuICovXG5leHBvcnQgZW51bSBNYXhpbXVtUmVzb2x1dGlvbiB7XG4gIC8qKlxuICAgKiBGdWxsIEhEICgxMDgwcClcbiAgICovXG4gIEZVTExfSEQgPSAnRlVMTF9IRCcsXG5cbiAgLyoqXG4gICAqIEhEICg3MjBwKVxuICAgKi9cbiAgSEQgPSAnSEQnLFxuXG4gIC8qKlxuICAgKiBTRCAoNDgwcClcbiAgICovXG4gIFNEID0gJ1NEJyxcbn1cblxuLyoqXG4gKiBXaGV0aGVyIG11bHRpdHJhY2sgaW5wdXQgaXMgYWxsb3dlZCBvciByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGVudW0gUG9saWN5IHtcbiAgLyoqXG4gICAqIE11bHRpdHJhY2sgaW5wdXQgaXMgYWxsb3dlZC5cbiAgICovXG4gIEFMTE9XID0gJ0FMTE9XJyxcblxuICAvKipcbiAgICogTXVsdGl0cmFjayBpbnB1dCBpcyByZXF1aXJlZC5cbiAgICovXG4gIFJFUVVJUkUgPSAnUkVRVUlSRScsXG59XG5cbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBzcGVjaWZpZXMgbXVsdGl0cmFjayBpbnB1dCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTWF4aW11bSByZXNvbHV0aW9uIGZvciBtdWx0aXRyYWNrIGlucHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4aW11bVJlc29sdXRpb246IE1heGltdW1SZXNvbHV0aW9uO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBtdWx0aXRyYWNrIGlucHV0IGlzIGFsbG93ZWQgb3IgcmVxdWlyZWQuXG4gICAqL1xuICByZWFkb25seSBwb2xpY3k6IFBvbGljeTtcbn1cblxuLyoqXG4gIEEgbmV3IElWUyBjaGFubmVsXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGFubmVsIGV4dGVuZHMgQ2hhbm5lbEJhc2Uge1xuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNoYW5uZWxBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY2hhbm5lbEFybjogc3RyaW5nKTogSUNoYW5uZWwge1xuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYXJuIGNhbm5vdCBiZSBwYXJzZWRcbiAgICBsZXQgYXJuQ29tcG9uZW50cyA9IGNvcmUuQXJuLnNwbGl0KGNoYW5uZWxBcm4sIGNvcmUuQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpO1xuXG4gICAgaWYgKCFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZChhcm5Db21wb25lbnRzLnNlcnZpY2UpICYmIGFybkNvbXBvbmVudHMuc2VydmljZSAhPT0gJ2l2cycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXJ2aWNlLCBleHBlY3RlZCAnaXZzJywgZ290ICcke2FybkNvbXBvbmVudHMuc2VydmljZX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZChhcm5Db21wb25lbnRzLnJlc291cmNlKSAmJiBhcm5Db21wb25lbnRzLnJlc291cmNlICE9PSAnY2hhbm5lbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNvdXJjZSwgZXhwZWN0ZWQgJ2NoYW5uZWwnLCBnb3QgJyR7YXJuQ29tcG9uZW50cy5yZXNvdXJjZX0nYCk7XG4gICAgfVxuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQ2hhbm5lbEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxBcm4gPSBjaGFubmVsQXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIGluZ2VzdCBlbmRwb2ludCwgcGFydCBvZiB0aGUgZGVmaW5pdGlvbiBvZiBhbiBpbmdlc3Qgc2VydmVyLCB1c2VkIHdoZW4geW91IHNldCB1cCBzdHJlYW1pbmcgc29mdHdhcmUuXG4gICAqIEZvciBleGFtcGxlOiBhMWIyYzNkNGU1ZjYuZ2xvYmFsLWNvbnRyaWJ1dGUubGl2ZS12aWRlby5uZXRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxJbmdlc3RFbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIHBsYXliYWNrIFVSTC4gRm9yIGV4YW1wbGU6XG4gICAqIGh0dHBzOi8vYTFiMmMzZDRlNWY2LnVzLXdlc3QtMi5wbGF5YmFjay5saXZlLXZpZGVvLm5ldC9hcGkvdmlkZW8vdjEvdXMtd2VzdC0yLjEyMzQ1Njc4OTAxMi5jaGFubmVsLmFiY2RFRkdILm0zdThcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxQbGF5YmFja1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDaGFubmVsUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5jaGFubmVsTmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogMTI4LCBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICctXycgfSksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZSAmJiAhY29yZS5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpICYmICEvXlthLXpBLVowLTktX10qJC8udGVzdCh0aGlzLnBoeXNpY2FsTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2hhbm5lbE5hbWUgbXVzdCBjb250YWluIG9ubHkgbnVtYmVycywgbGV0dGVycywgaHlwaGVucyBhbmQgdW5kZXJzY29yZXMsIGdvdDogJyR7dGhpcy5waHlzaWNhbE5hbWV9J2ApO1xuICAgIH1cblxuICAgIGxldCBwcmVzZXQ7XG5cbiAgICBpZiAocHJvcHMudHlwZSAmJiBbQ2hhbm5lbFR5cGUuU1RBTkRBUkQsIENoYW5uZWxUeXBlLkJBU0lDXS5pbmNsdWRlcyhwcm9wcy50eXBlKSAmJiBwcm9wcy5wcmVzZXQpIHtcbiAgICAgIHByZXNldCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVzZXQgPSBwcm9wcy5wcmVzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByb3BzLnR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy50eXBlICE9PSBDaGFubmVsVHlwZS5TVEFOREFSRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25cXGAgaXMgb25seSBzdXBwb3J0ZWQgZm9yIFxcYENoYW5uZWxUeXBlLlNUQU5EQVJEXFxgLCBnb3Q6ICR7cHJvcHMudHlwZX0uYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5jb250YWluZXJGb3JtYXQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5jb250YWluZXJGb3JtYXQgIT09IENvbnRhaW5lckZvcm1hdC5GUkFHTUVOVEVEX01QNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNvbnRhaW5lckZvcm1hdFxcYCBtdXN0IGJlIHNldCB0byBcXGBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDRcXGAgd2hlbiBcXGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uXFxgIGlzIHNwZWNpZmllZCwgZ290OiAke3Byb3BzLmNvbnRhaW5lckZvcm1hdH0uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuQ2hhbm5lbCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBhdXRob3JpemVkOiBwcm9wcy5hdXRob3JpemVkLFxuICAgICAgaW5zZWN1cmVJbmdlc3Q6IHByb3BzLmluc2VjdXJlSW5nZXN0LFxuICAgICAgbGF0ZW5jeU1vZGU6IHByb3BzLmxhdGVuY3lNb2RlLFxuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICB0eXBlOiBwcm9wcy50eXBlLFxuICAgICAgcHJlc2V0LFxuICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvbkFybjogcHJvcHMucmVjb3JkaW5nQ29uZmlndXJhdGlvbj8ucmVjb3JkaW5nQ29uZmlndXJhdGlvbkFybixcbiAgICAgIGNvbnRhaW5lckZvcm1hdDogcHJvcHMuY29udGFpbmVyRm9ybWF0ID8/XG4gICAgICAgIChwcm9wcy5tdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uID8gQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0IDogdW5kZWZpbmVkKSxcbiAgICAgIG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb246IHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gP1xuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBtYXhpbXVtUmVzb2x1dGlvbjogcHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbi5tYXhpbXVtUmVzb2x1dGlvbixcbiAgICAgICAgICBwb2xpY3k6IHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24ucG9saWN5LFxuICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFubmVsQXJuID0gcmVzb3VyY2UuYXR0ckFybjtcbiAgICB0aGlzLmNoYW5uZWxJbmdlc3RFbmRwb2ludCA9IHJlc291cmNlLmF0dHJJbmdlc3RFbmRwb2ludDtcbiAgICB0aGlzLmNoYW5uZWxQbGF5YmFja1VybCA9IHJlc291cmNlLmF0dHJQbGF5YmFja1VybDtcbiAgfVxufVxuIl19