UNPKG

@aws-cdk/aws-ivs-alpha

Version:

The CDK Construct Library for AWS::IVS

277 lines 34.1 kB
"use strict"; var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { if (result === void 0) continue; if (result === null || typeof result !== "object") throw new TypeError("Object expected"); if (_ = accept(result.get)) descriptor.get = _; if (_ = accept(result.set)) descriptor.set = _; if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { if (kind === "field") initializers.unshift(_); else descriptor[key] = _; } } if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; }; var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { var useValue = arguments.length > 2; for (var i = 0; i < initializers.length; i++) { value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); } return useValue ? value : void 0; }; 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"); const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable"); /** * 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 */ let Channel = (() => { let _classDecorators = [prop_injectable_1.propertyInjectable]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = ChannelBase; var Channel = class extends _classSuper { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); Channel = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); } static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ivs-alpha.Channel", version: "2.223.0-alpha.0" }; /** Uniquely identifies this class. */ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ivs-alpha.Channel'; /** * 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 { channelArn = channelArn; } return new Import(scope, id); } channelArn; /** * Channel ingest endpoint, part of the definition of an ingest server, used when you set up streaming software. * For example: a1b2c3d4e5f6.global-contribute.live-video.net * @attribute */ channelIngestEndpoint; /** * Channel playback URL. For example: * https://a1b2c3d4e5f6.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.abcdEFGH.m3u8 * @attribute */ channelPlaybackUrl; 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; } static { __runInitializers(_classThis, _classExtraInitializers); } }; return Channel = _classThis; })(); exports.Channel = Channel; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLDJDQUErQztBQUUvQyxpREFBaUQ7QUFDakQsNkNBQXlDO0FBRXpDLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFvQjFFOztHQUVHO0FBQ0gsTUFBZSxXQUFZLFNBQVEsSUFBSSxDQUFDLFFBQVE7SUFHdkMsWUFBWSxDQUFDLEVBQVU7UUFDNUIsT0FBTyxJQUFJLHNCQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUM3QixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztLQUNKO0NBQ0Y7QUFFRDs7R0FFRztBQUNILElBQVksZUFVWDtBQVZELFdBQVksZUFBZTtJQUN6Qjs7T0FFRztJQUNILDRCQUFTLENBQUE7SUFFVDs7T0FFRztJQUNILG9EQUFpQyxDQUFBO0FBQ25DLENBQUMsRUFWVyxlQUFlLCtCQUFmLGVBQWUsUUFVMUI7QUFFRDs7R0FFRztBQUNILElBQVksV0FVWDtBQVZELFdBQVksV0FBVztJQUNyQjs7T0FFRztJQUNILDBCQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILGdDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxXQUFXLDJCQUFYLFdBQVcsUUFVdEI7QUFFRDs7Ozs7R0FLRztBQUNILElBQVksV0EwQlg7QUExQkQsV0FBWSxXQUFXO0lBQ3JCOzs7O09BSUc7SUFDSCxvQ0FBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILDhCQUFlLENBQUE7SUFFZjs7OztPQUlHO0lBQ0gsMENBQTJCLENBQUE7SUFFM0I7Ozs7T0FJRztJQUNILDBDQUEyQixDQUFBO0FBQzdCLENBQUMsRUExQlcsV0FBVywyQkFBWCxXQUFXLFFBMEJ0QjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLE1BV1g7QUFYRCxXQUFZLE1BQU07SUFDaEI7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QUNoQixNQUFNO2dCQUNOLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSx5QkFBeUI7Z0JBQ2xGLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtvQkFDcEMsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbkYsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7b0JBQ2hFO3dCQUNFLE9BQU8sRUFBRSxJQUFJO3dCQUNiLGlCQUFpQixFQUFFLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUI7d0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBTTtxQkFDbEQ7b0JBQ0QsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDbkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN6RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztTQUNwRDs7WUEvRlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgTGF6eSwgTmFtZXMgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2ZuQ2hhbm5lbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pdnMnO1xuaW1wb3J0IHsgU3RyZWFtS2V5IH0gZnJvbSAnLi9zdHJlYW0ta2V5JztcbmltcG9ydCB7IElSZWNvcmRpbmdDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9yZWNvcmRpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBJVlMgQ2hhbm5lbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDaGFubmVsIGV4dGVuZHMgY29yZS5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIGNoYW5uZWwgQVJOLiBGb3IgZXhhbXBsZTogYXJuOmF3czppdnM6dXMtd2VzdC0yOjEyMzQ1Njc4OTAxMjpjaGFubmVsL2FiY2RBQkNEZWZnaFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdHJlYW0ga2V5IGZvciB0aGlzIElWUyBDaGFubmVsLlxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0IElEXG4gICAqL1xuICBhZGRTdHJlYW1LZXkoaWQ6IHN0cmluZyk6IFN0cmVhbUtleTtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gYSBuZXcgb3IgZXhpc3RpbmcgSVZTIENoYW5uZWxcbiAqL1xuYWJzdHJhY3QgY2xhc3MgQ2hhbm5lbEJhc2UgZXh0ZW5kcyBjb3JlLlJlc291cmNlIGltcGxlbWVudHMgSUNoYW5uZWwge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuXG4gIHB1YmxpYyBhZGRTdHJlYW1LZXkoaWQ6IHN0cmluZyk6IFN0cmVhbUtleSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1LZXkodGhpcywgaWQsIHtcbiAgICAgIGNoYW5uZWw6IHRoaXMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb250YWluZXIgRm9ybWF0XG4gKi9cbmV4cG9ydCBlbnVtIENvbnRhaW5lckZvcm1hdCB7XG4gIC8qKlxuICAgKiBVc2UgTVBFRy1UUy5cbiAgICovXG4gIFRTID0gJ1RTJyxcblxuICAvKipcbiAgICogVXNlIGZNUDQuXG4gICAqL1xuICBGUkFHTUVOVEVEX01QNCA9ICdGUkFHTUVOVEVEX01QNCcsXG59XG5cbi8qKlxuICogQ2hhbm5lbCBsYXRlbmN5IG1vZGVcbiAqL1xuZXhwb3J0IGVudW0gTGF0ZW5jeU1vZGUge1xuICAvKipcbiAgICogVXNlIExPVyB0byBtaW5pbWl6ZSBicm9hZGNhc3Rlci10by12aWV3ZXIgbGF0ZW5jeSBmb3IgaW50ZXJhY3RpdmUgYnJvYWRjYXN0cy5cbiAgICovXG4gIExPVyA9ICdMT1cnLFxuXG4gIC8qKlxuICAgKiBVc2UgTk9STUFMIGZvciBicm9hZGNhc3RzIHRoYXQgZG8gbm90IHJlcXVpcmUgdmlld2VyIGludGVyYWN0aW9uLlxuICAgKi9cbiAgTk9STUFMID0gJ05PUk1BTCcsXG59XG5cbi8qKlxuICogVGhlIGNoYW5uZWwgdHlwZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYWxsb3dhYmxlIHJlc29sdXRpb24gYW5kIGJpdHJhdGUuXG4gKiBJZiB5b3UgZXhjZWVkIHRoZSBhbGxvd2FibGUgcmVzb2x1dGlvbiBvciBiaXRyYXRlLCB0aGUgc3RyZWFtIHByb2JhYmx5IHdpbGwgZGlzY29ubmVjdCBpbW1lZGlhdGVseS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1pdnMtY2hhbm5lbC5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIENoYW5uZWxUeXBlIHtcbiAgLyoqXG4gICAqIE11bHRpcGxlIHF1YWxpdGllcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGlucHV0LCB0byBhdXRvbWF0aWNhbGx5IGdpdmUgdmlld2VycyB0aGUgYmVzdCBleHBlcmllbmNlIGZvciB0aGVpciBkZXZpY2VzIGFuZCBuZXR3b3JrIGNvbmRpdGlvbnMuXG4gICAqIFRyYW5zY29kaW5nIGFsbG93cyBoaWdoZXIgcGxheWJhY2sgcXVhbGl0eSBhY3Jvc3MgYSByYW5nZSBvZiBkb3dubG9hZCBzcGVlZHMuIFJlc29sdXRpb24gY2FuIGJlIHVwIHRvIDEwODBwIGFuZCBiaXRyYXRlIGNhbiBiZSB1cCB0byA4LjUgTWJwcy5cbiAgICogQXVkaW8gaXMgdHJhbnNjb2RlZCBvbmx5IGZvciByZW5kaXRpb25zIDM2MHAgYW5kIGJlbG93OyBhYm92ZSB0aGF0LCBhdWRpbyBpcyBwYXNzZWQgdGhyb3VnaC5cbiAgICovXG4gIFNUQU5EQVJEID0gJ1NUQU5EQVJEJyxcblxuICAvKipcbiAgICogRGVsaXZlcnMgdGhlIG9yaWdpbmFsIGlucHV0IHRvIHZpZXdlcnMuIFRoZSB2aWV3ZXLigJlzIHZpZGVvLXF1YWxpdHkgY2hvaWNlIGlzIGxpbWl0ZWQgdG8gdGhlIG9yaWdpbmFsIGlucHV0LlxuICAgKi9cbiAgQkFTSUMgPSAnQkFTSUMnLFxuXG4gIC8qKlxuICAgKiBNdWx0aXBsZSBxdWFsaXRpZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCwgdG8gYXV0b21hdGljYWxseSBnaXZlIHZpZXdlcnMgdGhlIGJlc3QgZXhwZXJpZW5jZSBmb3IgdGhlaXIgZGV2aWNlcyBhbmQgbmV0d29yayBjb25kaXRpb25zLlxuICAgKiBJbnB1dCByZXNvbHV0aW9uIGNhbiBiZSB1cCB0byAxMDgwcCBhbmQgYml0cmF0ZSBjYW4gYmUgdXAgdG8gOC41IE1icHM7IG91dHB1dCBpcyBjYXBwZWQgYXQgU0QgcXVhbGl0eSAoNDgwcCkuXG4gICAqIEF1ZGlvIGZvciBhbGwgcmVuZGl0aW9ucyBpcyB0cmFuc2NvZGVkLCBhbmQgYW4gYXVkaW8tb25seSByZW5kaXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQURWQU5DRURfU0QgPSAnQURWQU5DRURfU0QnLFxuXG4gIC8qKlxuICAgKiBNdWx0aXBsZSBxdWFsaXRpZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCwgdG8gYXV0b21hdGljYWxseSBnaXZlIHZpZXdlcnMgdGhlIGJlc3QgZXhwZXJpZW5jZSBmb3IgdGhlaXIgZGV2aWNlcyBhbmQgbmV0d29yayBjb25kaXRpb25zLlxuICAgKiBJbnB1dCByZXNvbHV0aW9uIGNhbiBiZSB1cCB0byAxMDgwcCBhbmQgYml0cmF0ZSBjYW4gYmUgdXAgdG8gOC41IE1icHM7IG91dHB1dCBpcyBjYXBwZWQgYXQgSEQgcXVhbGl0eSAoNzIwcCkuXG4gICAqIEF1ZGlvIGZvciBhbGwgcmVuZGl0aW9ucyBpcyB0cmFuc2NvZGVkLCBhbmQgYW4gYXVkaW8tb25seSByZW5kaXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQURWQU5DRURfSEQgPSAnQURWQU5DRURfSEQnLFxufVxuXG4vKipcbiAqIEFuIG9wdGlvbmFsIHRyYW5zY29kZSBwcmVzZXQgZm9yIHRoZSBjaGFubmVsLiBUaGlzIGlzIHNlbGVjdGFibGUgb25seSBmb3IgQURWQU5DRURfSEQgYW5kIEFEVkFOQ0VEX1NEIGNoYW5uZWwgdHlwZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtaXZzLWNoYW5uZWwuaHRtbFxuICovXG5leHBvcnQgZW51bSBQcmVzZXQge1xuICAvKipcbiAgICogVXNlIGEgbG93ZXIgYml0cmF0ZSB0aGFuIFNUQU5EQVJEIGZvciBlYWNoIHF1YWxpdHkgbGV2ZWwuIFVzZSBpdCBpZiB5b3UgaGF2ZSBsb3cgZG93bmxvYWQgYmFuZHdpZHRoIGFuZC9vciBzaW1wbGUgdmlkZW8gY29udGVudCAoZS5nLiwgdGFsa2luZyBoZWFkcykuXG4gICAqL1xuICBDT05TVFJBSU5FRF9CQU5EV0lEVEhfREVMSVZFUlkgPSAnQ09OU1RSQUlORURfQkFORFdJRFRIX0RFTElWRVJZJyxcblxuICAvKipcbiAgICogVXNlIGEgaGlnaGVyIGJpdHJhdGUgZm9yIGVhY2ggcXVhbGl0eSBsZXZlbC4gVXNlIGl0IGlmIHlvdSBoYXZlIGhpZ2ggZG93bmxvYWQgYmFuZHdpZHRoIGFuZC9vciBjb21wbGV4IHZpZGVvIGNvbnRlbnQgKGUuZy4sIGZsYXNoZXMgYW5kIHF1aWNrIHNjZW5lIGNoYW5nZXMpLlxuICAgKi9cbiAgSElHSEVSX0JBTkRXSURUSF9ERUxJVkVSWSA9ICdISUdIRVJfQkFORFdJRFRIX0RFTElWRVJZJyxcblxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgbmV3IENoYW5uZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsUHJvcHMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hhbm5lbCBpcyBhdXRob3JpemVkLlxuICAgKlxuICAgKiBJZiB5b3Ugd2lzaCB0byBtYWtlIGFuIGF1dGhvcml6ZWQgY2hhbm5lbCwgeW91IHdpbGwgbmVlZCB0byBlbnN1cmUgdGhhdFxuICAgKiBhIFBsYXliYWNrS2V5UGFpciBoYXMgYmVlbiB1cGxvYWRlZCB0byB5b3VyIGFjY291bnQgYXMgdGhpcyBpcyB1c2VkIHRvXG4gICAqIHZhbGlkYXRlIHRoZSBzaWduZWQgSldUIHRoYXQgaXMgcmVxdWlyZWQgZm9yIGF1dGhvcml6YXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hpY2ggY29udGVudC1wYWNrYWdpbmcgZm9ybWF0IGlzIHVzZWQgKE1QRUctVFMgb3IgZk1QNCkuXG4gICAqXG4gICAqIElmIGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpcyBzcGVjaWZpZWQsIG9ubHkgZk1QNCBjYW4gYmUgdXNlZC5cbiAgICogT3RoZXJ3aXNlLCBgY29udGFpbmVyRm9ybWF0YCBtYXkgYmUgc2V0IHRvIGBDb250YWluZXJGb3JtYXQuVFNgIG9yIGBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDRgIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gdGhlIGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpcyBzcGVjaWZpZWQuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHJlbWFpbnMgdW5kZWZpbmVkIGFuZCB1c2VzIHRoZSBJVlMgZGVmYXVsdCBzZXR0aW5nIChUUykuXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJGb3JtYXQ/OiBDb250YWluZXJGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoYW5uZWwgYWxsb3dzIGluc2VjdXJlIFJUTVAgaW5nZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZWN1cmVJbmdlc3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIGxhdGVuY3kgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgTGF0ZW5jeU1vZGUuTE9XXG4gICAqL1xuICByZWFkb25seSBsYXRlbmN5TW9kZT86IExhdGVuY3lNb2RlO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgZm9yIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBuYW1lXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogT2JqZWN0IHNwZWNpZnlpbmcgbXVsdGl0cmFjayBpbnB1dCBjb25maWd1cmF0aW9uLlxuICAgKiBZb3UgbXVzdCBzcGVjaWZ5IGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpZiB5b3Ugd2FudCB0byB1c2UgTXVsdGlUcmFjayBWaWRlby5cbiAgICpcbiAgICogYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25gIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBgQ2hhbm5lbFR5cGUuU1RBTkRBUkRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBJVlMgZGVmYXVsdCBzZXR0aW5nIGlzIG5vdCB1c2UgTXVsdGlUcmFjayBWaWRlby5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaXZzL2xhdGVzdC9Mb3dMYXRlbmN5VXNlckd1aWRlL211bHRpdHJhY2stdmlkZW8uaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbj86IE11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIHR5cGUsIHdoaWNoIGRldGVybWluZXMgdGhlIGFsbG93YWJsZSByZXNvbHV0aW9uIGFuZCBiaXRyYXRlLlxuICAgKiBJZiB5b3UgZXhjZWVkIHRoZSBhbGxvd2FibGUgcmVzb2x1dGlvbiBvciBiaXRyYXRlLCB0aGUgc3RyZWFtIHdpbGwgZGlzY29ubmVjdCBpbW1lZGlhdGVseVxuICAgKlxuICAgKiBAZGVmYXVsdCBDaGFubmVsVHlwZS5TVEFOREFSRFxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IENoYW5uZWxUeXBlO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0cmFuc2NvZGUgcHJlc2V0IGZvciB0aGUgY2hhbm5lbC4gQ2FuIGJlIHVzZWQgZm9yIEFEVkFOQ0VEX0hEIGFuZCBBRFZBTkNFRF9TRCBjaGFubmVsIHR5cGVzLlxuICAgKiBXaGVuIExPVyBvciBTVEFOREFSRCBpcyB1c2VkLCB0aGUgcHJlc2V0IHdpbGwgYmUgb3ZlcnJpZGRlbiBhbmQgc2V0IHRvIG5vbmUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUHJlc2V0LkhJR0hFUl9CQU5EV0lEVEhfREVMSVZFUlkgaWYgY2hhbm5lbFR5cGUgaXMgQURWQU5DRURfU0Qgb3IgQURWQU5DRURfSEQsIG5vbmUgb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBwcmVzZXQ/OiBQcmVzZXQ7XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlY29yZGluZyBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkaW5nQ29uZmlndXJhdGlvbj86IElSZWNvcmRpbmdDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIE1heGltdW0gcmVzb2x1dGlvbiBmb3IgbXVsdGl0cmFjayBpbnB1dC5cbiAqL1xuZXhwb3J0IGVudW0gTWF4aW11bVJlc29sdXRpb24ge1xuICAvKipcbiAgICogRnVsbCBIRCAoMTA4MHApXG4gICAqL1xuICBGVUxMX0hEID0gJ0ZVTExfSEQnLFxuXG4gIC8qKlxuICAgKiBIRCAoNzIwcClcbiAgICovXG4gIEhEID0gJ0hEJyxcblxuICAvKipcbiAgICogU0QgKDQ4MHApXG4gICAqL1xuICBTRCA9ICdTRCcsXG59XG5cbi8qKlxuICogV2hldGhlciBtdWx0aXRyYWNrIGlucHV0IGlzIGFsbG93ZWQgb3IgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBlbnVtIFBvbGljeSB7XG4gIC8qKlxuICAgKiBNdWx0aXRyYWNrIGlucHV0IGlzIGFsbG93ZWQuXG4gICAqL1xuICBBTExPVyA9ICdBTExPVycsXG5cbiAgLyoqXG4gICAqIE11bHRpdHJhY2sgaW5wdXQgaXMgcmVxdWlyZWQuXG4gICAqL1xuICBSRVFVSVJFID0gJ1JFUVVJUkUnLFxufVxuXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgc3BlY2lmaWVzIG11bHRpdHJhY2sgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIE1heGltdW0gcmVzb2x1dGlvbiBmb3IgbXVsdGl0cmFjayBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG1heGltdW1SZXNvbHV0aW9uOiBNYXhpbXVtUmVzb2x1dGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgbXVsdGl0cmFjayBpbnB1dCBpcyBhbGxvd2VkIG9yIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5OiBQb2xpY3k7XG59XG5cbi8qKlxuICBBIG5ldyBJVlMgY2hhbm5lbFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCBleHRlbmRzIENoYW5uZWxCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtaXZzLWFscGhhLkNoYW5uZWwnO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgY2hhbm5lbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ2hhbm5lbEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjaGFubmVsQXJuOiBzdHJpbmcpOiBJQ2hhbm5lbCB7XG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBhcm4gY2Fubm90IGJlIHBhcnNlZFxuICAgIGxldCBhcm5Db21wb25lbnRzID0gY29yZS5Bcm4uc3BsaXQoY2hhbm5lbEFybiwgY29yZS5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG5cbiAgICBpZiAoIWNvcmUuVG9rZW4uaXNVbnJlc29sdmVkKGFybkNvbXBvbmVudHMuc2VydmljZSkgJiYgYXJuQ29tcG9uZW50cy5zZXJ2aWNlICE9PSAnaXZzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2UsIGV4cGVjdGVkICdpdnMnLCBnb3QgJyR7YXJuQ29tcG9uZW50cy5zZXJ2aWNlfSdgKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvcmUuVG9rZW4uaXNVbnJlc29sdmVkKGFybkNvbXBvbmVudHMucmVzb3VyY2UpICYmIGFybkNvbXBvbmVudHMucmVzb3VyY2UgIT09ICdjaGFubmVsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlc291cmNlLCBleHBlY3RlZCAnY2hhbm5lbCcsIGdvdCAnJHthcm5Db21wb25lbnRzLnJlc291cmNlfSdgKTtcbiAgICB9XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBDaGFubmVsQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEFybiA9IGNoYW5uZWxBcm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjaGFubmVsQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoYW5uZWwgaW5nZXN0IGVuZHBvaW50LCBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIG9mIGFuIGluZ2VzdCBzZXJ2ZXIsIHVzZWQgd2hlbiB5b3Ugc2V0IHVwIHN0cmVhbWluZyBzb2Z0d2FyZS5cbiAgICogRm9yIGV4YW1wbGU6IGExYjJjM2Q0ZTVmNi5nbG9iYWwtY29udHJpYnV0ZS5saXZlLXZpZGVvLm5ldFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEluZ2VzdEVuZHBvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoYW5uZWwgcGxheWJhY2sgVVJMLiBGb3IgZXhhbXBsZTpcbiAgICogaHR0cHM6Ly9hMWIyYzNkNGU1ZjYudXMtd2VzdC0yLnBsYXliYWNrLmxpdmUtdmlkZW8ubmV0L2FwaS92aWRlby92MS91cy13ZXN0LTIuMTIzNDU2Nzg5MDEyLmNoYW5uZWwuYWJjZEVGR0gubTN1OFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbFBsYXliYWNrVXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENoYW5uZWxQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmNoYW5uZWxOYW1lID8/IExhenkuc3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjgsIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy1fJyB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgaWYgKHRoaXMucGh5c2ljYWxOYW1lICYmICFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLnBoeXNpY2FsTmFtZSkgJiYgIS9eW2EtekEtWjAtOS1fXSokLy50ZXN0KHRoaXMucGh5c2ljYWxOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjaGFubmVsTmFtZSBtdXN0IGNvbnRhaW4gb25seSBudW1iZXJzLCBsZXR0ZXJzLCBoeXBoZW5zIGFuZCB1bmRlcnNjb3JlcywgZ290OiAnJHt0aGlzLnBoeXNpY2FsTmFtZX0nYCk7XG4gICAgfVxuXG4gICAgbGV0IHByZXNldDtcblxuICAgIGlmIChwcm9wcy50eXBlICYmIFtDaGFubmVsVHlwZS5TVEFOREFSRCwgQ2hhbm5lbFR5cGUuQkFTSUNdLmluY2x1ZGVzKHByb3BzLnR5cGUpICYmIHByb3BzLnByZXNldCkge1xuICAgICAgcHJlc2V0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXNldCA9IHByb3BzLnByZXNldDtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocHJvcHMudHlwZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLnR5cGUgIT09IENoYW5uZWxUeXBlLlNUQU5EQVJEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXFxgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvblxcYCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgXFxgQ2hhbm5lbFR5cGUuU1RBTkRBUkRcXGAsIGdvdDogJHtwcm9wcy50eXBlfS5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmNvbnRhaW5lckZvcm1hdCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmNvbnRhaW5lckZvcm1hdCAhPT0gQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXFxgY29udGFpbmVyRm9ybWF0XFxgIG11c3QgYmUgc2V0IHRvIFxcYENvbnRhaW5lckZvcm1hdC5GUkFHTUVOVEVEX01QNFxcYCB3aGVuIFxcYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25cXGAgaXMgc3BlY2lmaWVkLCBnb3Q6ICR7cHJvcHMuY29udGFpbmVyRm9ybWF0fS5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5DaGFubmVsKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGF1dGhvcml6ZWQ6IHByb3BzLmF1dGhvcml6ZWQsXG4gICAgICBpbnNlY3VyZUluZ2VzdDogcHJvcHMuaW5zZWN1cmVJbmdlc3QsXG4gICAgICBsYXRlbmN5TW9kZTogcHJvcHMubGF0ZW5jeU1vZGUsXG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHR5cGU6IHByb3BzLnR5cGUsXG4gICAgICBwcmVzZXQsXG4gICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uQXJuOiBwcm9wcy5yZWNvcmRpbmdDb25maWd1cmF0aW9uPy5yZWNvcmRpbmdDb25maWd1cmF0aW9uQXJuLFxuICAgICAgY29udGFpbmVyRm9ybWF0OiBwcm9wcy5jb250YWluZXJGb3JtYXQgPz9cbiAgICAgICAgKHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gPyBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDQgOiB1bmRlZmluZWQpLFxuICAgICAgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbjogcHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbiA/XG4gICAgICAgIHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIG1heGltdW1SZXNvbHV0aW9uOiBwcm9wcy5tdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uLm1heGltdW1SZXNvbHV0aW9uLFxuICAgICAgICAgIHBvbGljeTogcHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbi5wb2xpY3ksXG4gICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYW5uZWxBcm4gPSByZXNvdXJjZS5hdHRyQXJuO1xuICAgIHRoaXMuY2hhbm5lbEluZ2VzdEVuZHBvaW50ID0gcmVzb3VyY2UuYXR0ckluZ2VzdEVuZHBvaW50O1xuICAgIHRoaXMuY2hhbm5lbFBsYXliYWNrVXJsID0gcmVzb3VyY2UuYXR0clBsYXliYWNrVXJsO1xuICB9XG59XG4iXX0=