UNPKG

@aws-cdk/aws-cloud9-alpha

Version:

The CDK Construct Library for AWS::Cloud9

270 lines 28.8 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.Owner = exports.CloneRepository = exports.Ec2Environment = exports.ImageId = exports.ConnectionType = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const ec2 = require("aws-cdk-lib/aws-ec2"); const cdk = require("aws-cdk-lib/core"); const aws_cloud9_1 = require("aws-cdk-lib/aws-cloud9"); const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource"); const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable"); /** * The connection type used for connecting to an Amazon EC2 environment. */ var ConnectionType; (function (ConnectionType) { /** * Connect through SSH */ ConnectionType["CONNECT_SSH"] = "CONNECT_SSH"; /** * Connect through AWS Systems Manager * When using SSM, service role and instance profile aren't automatically created. * See https://docs.aws.amazon.com/cloud9/latest/user-guide/ec2-ssm.html#service-role-ssm */ ConnectionType["CONNECT_SSM"] = "CONNECT_SSM"; })(ConnectionType || (exports.ConnectionType = ConnectionType = {})); /** * The image ID used for creating an Amazon EC2 environment. */ var ImageId; (function (ImageId) { /** * Create using Amazon Linux 2 */ ImageId["AMAZON_LINUX_2"] = "amazonlinux-2-x86_64"; /** * Create using Amazon Linux 2023 */ ImageId["AMAZON_LINUX_2023"] = "amazonlinux-2023-x86_64"; /** * Create using Ubuntu 18.04 * * @deprecated Since Ubuntu 18.04 has ended standard support as of May 31, 2023, we recommend you choose Ubuntu 22.04. */ ImageId["UBUNTU_18_04"] = "ubuntu-18.04-x86_64"; /** * Create using Ubuntu 22.04 */ ImageId["UBUNTU_22_04"] = "ubuntu-22.04-x86_64"; })(ImageId || (exports.ImageId = ImageId = {})); /** * A Cloud9 Environment with Amazon EC2 * @resource AWS::Cloud9::EnvironmentEC2 */ let Ec2Environment = (() => { let _classDecorators = [prop_injectable_1.propertyInjectable]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = cdk.Resource; var Ec2Environment = 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); Ec2Environment = _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-cloud9-alpha.Ec2Environment", version: "2.222.0-alpha.0" }; /** Uniquely identifies this class. */ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-cloud9-alpha.Ec2Environment'; /** * import from EnvironmentEc2Name */ static fromEc2EnvironmentName(scope, id, ec2EnvironmentName) { class Import extends cdk.Resource { ec2EnvironmentName = ec2EnvironmentName; ec2EnvironmentArn = cdk.Stack.of(this).formatArn({ service: 'cloud9', resource: 'environment', resourceName: this.ec2EnvironmentName, }); } return new Import(scope, id); } /** * The environment name of this Cloud9 environment * * @attribute */ ec2EnvironmentName; /** * The environment ARN of this Cloud9 environment * * @attribute */ ec2EnvironmentArn; /** * The environment ID of this Cloud9 environment */ environmentId; /** * The complete IDE URL of this Cloud9 environment */ ideUrl; /** * VPC ID */ vpc; constructor(scope, id, props) { super(scope, id); try { jsiiDeprecationWarnings._aws_cdk_aws_cloud9_alpha_Ec2EnvironmentProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Ec2Environment); } throw error; } // Enhanced CDK Analytics Telemetry (0, metadata_resource_1.addConstructMetadata)(this, props); this.vpc = props.vpc; if (!props.subnetSelection && this.vpc.publicSubnets.length === 0) { throw new Error('no subnetSelection specified and no public subnet found in the vpc, please specify subnetSelection'); } if (!props.imageId) { throw new Error('No imageId specified, please specify imageId'); } const vpcSubnets = props.subnetSelection ?? { subnetType: ec2.SubnetType.PUBLIC }; const c9env = new aws_cloud9_1.CfnEnvironmentEC2(this, 'Resource', { name: props.ec2EnvironmentName, description: props.description, ownerArn: props.owner?.ownerArn, instanceType: props.instanceType?.toString() ?? ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO).toString(), subnetId: this.vpc.selectSubnets(vpcSubnets).subnetIds[0], repositories: props.clonedRepositories ? props.clonedRepositories.map(r => ({ repositoryUrl: r.repositoryUrl, pathComponent: r.pathComponent, })) : undefined, connectionType: props.connectionType ?? ConnectionType.CONNECT_SSH, imageId: props.imageId, automaticStopTimeMinutes: props.automaticStop?.toMinutes(), }); this.environmentId = c9env.ref; this.ec2EnvironmentArn = c9env.getAtt('Arn').toString(); this.ec2EnvironmentName = c9env.getAtt('Name').toString(); this.ideUrl = `https://${this.env.region}.console.aws.amazon.com/cloud9/ide/${this.environmentId}`; } static { __runInitializers(_classThis, _classExtraInitializers); } }; return Ec2Environment = _classThis; })(); exports.Ec2Environment = Ec2Environment; /** * The class for different repository providers */ class CloneRepository { repositoryUrl; pathComponent; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-cloud9-alpha.CloneRepository", version: "2.222.0-alpha.0" }; /** * import repository to cloud9 environment from AWS CodeCommit * * @param repository the codecommit repository to clone from * @param path the target path in cloud9 environment */ static fromCodeCommit(repository, path) { return { repositoryUrl: repository.repositoryCloneUrlHttp, pathComponent: path, }; } constructor(repositoryUrl, pathComponent) { this.repositoryUrl = repositoryUrl; this.pathComponent = pathComponent; } } exports.CloneRepository = CloneRepository; /** * An environment owner * * */ class Owner { ownerArn; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-cloud9-alpha.Owner", version: "2.222.0-alpha.0" }; /** * Make an IAM user the environment owner * * User need to have AWSCloud9Administrator permissions * @see https://docs.aws.amazon.com/cloud9/latest/user-guide/share-environment.html#share-environment-about * * @param user the User object to use as the environment owner */ static user(user) { return { ownerArn: user.userArn }; } /** * Make an IAM assumed role the environment owner * * @param accountId The account id of the target account * @param roleName The name of the assumed role */ static assumedRole(accountId, roleName) { return { ownerArn: `arn:${cdk.Aws.PARTITION}:sts::${accountId}:assumed-role/${roleName}` }; } /** * Make an IAM federated user the environment owner * * @param accountId The AccountId of the target account * @param userName The name of the federated user */ static federatedUser(accountId, userName) { return { ownerArn: `arn:${cdk.Aws.PARTITION}:sts::${accountId}:federated-user/${userName}` }; } /** * Make the Account Root User the environment owner (not recommended) * * @param accountId the AccountId to use as the environment owner. */ static accountRoot(accountId) { return { ownerArn: `arn:${cdk.Aws.PARTITION}:iam::${accountId}:root` }; } /** * * @param ownerArn of environment owner. */ constructor(ownerArn) { this.ownerArn = ownerArn; } } exports.Owner = Owner; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwyQ0FBMkM7QUFFM0Msd0NBQXdDO0FBRXhDLHVEQUEyRDtBQUMzRCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBc0IxRTs7R0FFRztBQUNILElBQVksY0FXWDtBQVhELFdBQVksY0FBYztJQUN4Qjs7T0FFRztJQUNILDZDQUEyQixDQUFBO0lBQzNCOzs7O09BSUc7SUFDSCw2Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBWFcsY0FBYyw4QkFBZCxjQUFjLFFBV3pCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLE9BbUJYO0FBbkJELFdBQVksT0FBTztJQUNqQjs7T0FFRztJQUNILGtEQUF1QyxDQUFBO0lBQ3ZDOztPQUVHO0lBQ0gsd0RBQTZDLENBQUE7SUFDN0M7Ozs7T0FJRztJQUNILCtDQUFvQyxDQUFBO0lBQ3BDOztPQUVHO0lBQ0gsK0NBQW9DLENBQUE7QUFDdEMsQ0FBQyxFQW5CVyxPQUFPLHVCQUFQLE9BQU8sUUFtQmxCO0FBbUZEOzs7R0FHRztJQUVVLGNBQWM7NEJBRDFCLG9DQUFrQjs7OztzQkFDaUIsR0FBRyxDQUFDLFFBQVE7OEJBQXBCLFNBQVEsV0FBWTs7OztZQUFoRCw2S0FrRkM7Ozs7O1FBakZDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsMENBQTBDLENBQUM7UUFFbEc7O1dBRUc7UUFDSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsa0JBQTBCO1lBQzNGLE1BQU0sTUFBTyxTQUFRLEdBQUcsQ0FBQyxRQUFRO2dCQUN4QixrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztnQkFDeEMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMs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O1FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsU0FBUyxTQUFTLE9BQU8sRUFBRSxDQUFDO0tBQ3hFO0lBRUQ7OztPQUdHO0lBQ0gsWUFBb0MsUUFBZ0I7UUFBaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtLQUFJOztBQTlDMUQsc0JBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29kZWNvbW1pdCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWNvbW1pdCc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBJVXNlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDZm5FbnZpcm9ubWVudEVDMiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZDknO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuXG4vKipcbiAqIEEgQ2xvdWQ5IEVudmlyb25tZW50XG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFYzJFbnZpcm9ubWVudCBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEVudmlyb25tZW50RWMyXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgZW52aXJvbm1lbnRFYzJOYW1lXG4gICAqL1xuICByZWFkb25seSBlYzJFbnZpcm9ubWVudE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFybiBvZiB0aGUgRW52aXJvbm1lbnRFYzJcbiAgICpcbiAgICogQGF0dHJpYnV0ZSBlbnZpcm9ubWVudEUyQXJuXG4gICAqL1xuICByZWFkb25seSBlYzJFbnZpcm9ubWVudEFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBjb25uZWN0aW9uIHR5cGUgdXNlZCBmb3IgY29ubmVjdGluZyB0byBhbiBBbWF6b24gRUMyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZW51bSBDb25uZWN0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBDb25uZWN0IHRocm91Z2ggU1NIXG4gICAqL1xuICBDT05ORUNUX1NTSCA9ICdDT05ORUNUX1NTSCcsXG4gIC8qKlxuICAgKiBDb25uZWN0IHRocm91Z2ggQVdTIFN5c3RlbXMgTWFuYWdlclxuICAgKiBXaGVuIHVzaW5nIFNTTSwgc2VydmljZSByb2xlIGFuZCBpbnN0YW5jZSBwcm9maWxlIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuXG4gICAqIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xvdWQ5L2xhdGVzdC91c2VyLWd1aWRlL2VjMi1zc20uaHRtbCNzZXJ2aWNlLXJvbGUtc3NtXG4gICAqL1xuICBDT05ORUNUX1NTTSA9ICdDT05ORUNUX1NTTScsXG59XG5cbi8qKlxuICogVGhlIGltYWdlIElEIHVzZWQgZm9yIGNyZWF0aW5nIGFuIEFtYXpvbiBFQzIgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlSWQge1xuICAvKipcbiAgICogQ3JlYXRlIHVzaW5nIEFtYXpvbiBMaW51eCAyXG4gICAqL1xuICBBTUFaT05fTElOVVhfMiA9ICdhbWF6b25saW51eC0yLXg4Nl82NCcsXG4gIC8qKlxuICAgKiBDcmVhdGUgdXNpbmcgQW1hem9uIExpbnV4IDIwMjNcbiAgICovXG4gIEFNQVpPTl9MSU5VWF8yMDIzID0gJ2FtYXpvbmxpbnV4LTIwMjMteDg2XzY0JyxcbiAgLyoqXG4gICAqIENyZWF0ZSB1c2luZyBVYnVudHUgMTguMDRcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgVWJ1bnR1IDE4LjA0IGhhcyBlbmRlZCBzdGFuZGFyZCBzdXBwb3J0IGFzIG9mIE1heSAzMSwgMjAyMywgd2UgcmVjb21tZW5kIHlvdSBjaG9vc2UgVWJ1bnR1IDIyLjA0LlxuICAgKi9cbiAgVUJVTlRVXzE4XzA0ID0gJ3VidW50dS0xOC4wNC14ODZfNjQnLFxuICAvKipcbiAgICogQ3JlYXRlIHVzaW5nIFVidW50dSAyMi4wNFxuICAgKi9cbiAgVUJVTlRVXzIyXzA0ID0gJ3VidW50dS0yMi4wNC14ODZfNjQnLFxufVxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBFYzJFbnZpcm9ubWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjMkVudmlyb25tZW50UHJvcHMge1xuICAvKipcbiAgICogT3duZXIgb2YgdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBUaGUgb3duZXIgaGFzIGZ1bGwgY29udHJvbCBvZiB0aGUgZW52aXJvbm1lbnQgYW5kIGNhbiBpbnZpdGUgYWRkaXRpb25hbCBtZW1iZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBpZGVudGl0eSB0aGF0IENsb3VkRm9ybWF0aW9uIGV4ZWN1dGVzIHVuZGVyIHdpbGwgYmUgdGhlIG93bmVyXG4gICAqL1xuICByZWFkb25seSBvd25lcj86IE93bmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBpbnN0YW5jZSB0byBjb25uZWN0IHRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0Mi5taWNyb1xuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VUeXBlPzogZWMyLkluc3RhbmNlVHlwZTtcblxuICAvKipcbiAgICogVGhlIHN1Ym5ldFNlbGVjdGlvbiBvZiB0aGUgVlBDIHRoYXQgQVdTIENsb3VkOSB3aWxsIHVzZSB0byBjb21tdW5pY2F0ZSB3aXRoXG4gICAqIHRoZSBBbWF6b24gRUMyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBwdWJsaWMgc3VibmV0cyBvZiB0aGUgVlBDIGFyZSBzZWxlY3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldFNlbGVjdGlvbj86IGVjMi5TdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgdGhhdCBBV1MgQ2xvdWQ5IHdpbGwgdXNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEFtYXpvbiBFbGFzdGljIENvbXB1dGUgQ2xvdWQgKEFtYXpvbiBFQzIpIGluc3RhbmNlLlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjOiBlYzIuSVZwYztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgZW52aXJvbm1lbnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBuYW1lXG4gICAqL1xuICByZWFkb25seSBlYzJFbnZpcm9ubWVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBDb2RlQ29tbWl0IHJlcG9zaXRvcnkgdG8gYmUgY2xvbmVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZG8gbm90IGNsb25lIGFueSByZXBvc2l0b3J5XG4gICAqL1xuICAvLyByZWFkb25seSBjbG9uZWRSZXBvc2l0b3JpZXM/OiBDbG91ZDlSZXBvc2l0b3J5W107XG4gIHJlYWRvbmx5IGNsb25lZFJlcG9zaXRvcmllcz86IENsb25lUmVwb3NpdG9yeVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiB0eXBlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gYW4gQW1hem9uIEVDMiBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogVmFsaWQgdmFsdWVzIGFyZTogQ09OTkVDVF9TU0ggKGRlZmF1bHQpIGFuZCBDT05ORUNUX1NTTSAoY29ubmVjdGVkIHRocm91Z2ggQVdTIFN5c3RlbXMgTWFuYWdlcilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDT05ORUNUX1NTSFxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvblR5cGU/OiBDb25uZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogVGhlIGltYWdlIElEIHVzZWQgZm9yIGNyZWF0aW5nIGFuIEFtYXpvbiBFQzIgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqL1xuICByZWFkb25seSBpbWFnZUlkOiBJbWFnZUlkO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgdW50aWwgdGhlIHJ1bm5pbmcgaW5zdGFuY2UgaXMgc2h1dCBkb3duIGFmdGVyIHRoZVxuICAgKiBlbnZpcm9ubWVudCB3YXMgbGFzdCB1c2VkLlxuICAgKlxuICAgKiBTZXR0aW5nIGEgdmFsdWUgb2YgMCBtZWFucyB0aGUgaW5zdGFuY2Ugd2lsbCBuZXZlciBiZSBhdXRvbWF0aWNhbGx5IHNodXQgZG93bi5cIlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBpbnN0YW5jZSB3aWxsIG5vdCBiZSBzaHV0IGRvd24gYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dG9tYXRpY1N0b3A/OiBjZGsuRHVyYXRpb247XG59XG5cbi8qKlxuICogQSBDbG91ZDkgRW52aXJvbm1lbnQgd2l0aCBBbWF6b24gRUMyXG4gKiBAcmVzb3VyY2UgQVdTOjpDbG91ZDk6OkVudmlyb25tZW50RUMyXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBFYzJFbnZpcm9ubWVudCBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIElFYzJFbnZpcm9ubWVudCB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWNsb3VkOS1hbHBoYS5FYzJFbnZpcm9ubWVudCc7XG5cbiAgLyoqXG4gICAqIGltcG9ydCBmcm9tIEVudmlyb25tZW50RWMyTmFtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRWMyRW52aXJvbm1lbnROYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGVjMkVudmlyb25tZW50TmFtZTogc3RyaW5nKTogSUVjMkVudmlyb25tZW50IHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBjZGsuUmVzb3VyY2Uge1xuICAgICAgcHVibGljIGVjMkVudmlyb25tZW50TmFtZSA9IGVjMkVudmlyb25tZW50TmFtZTtcbiAgICAgIHB1YmxpYyBlYzJFbnZpcm9ubWVudEFybiA9IGNkay5TdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiAnY2xvdWQ5JyxcbiAgICAgICAgcmVzb3VyY2U6ICdlbnZpcm9ubWVudCcsXG4gICAgICAgIHJlc291cmNlTmFtZTogdGhpcy5lYzJFbnZpcm9ubWVudE5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgbmFtZSBvZiB0aGlzIENsb3VkOSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWMyRW52aXJvbm1lbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBBUk4gb2YgdGhpcyBDbG91ZDkgZW52aXJvbm1lbnRcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVjMkVudmlyb25tZW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBJRCBvZiB0aGlzIENsb3VkOSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudmlyb25tZW50SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbXBsZXRlIElERSBVUkwgb2YgdGhpcyBDbG91ZDkgZW52aXJvbm1lbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVVcmw6IHN0cmluZztcblxuICAvKipcbiAgICogVlBDIElEXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjOiBlYzIuSVZwYztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRWMyRW52aXJvbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYztcbiAgICBpZiAoIXByb3BzLnN1Ym5ldFNlbGVjdGlvbiAmJiB0aGlzLnZwYy5wdWJsaWNTdWJuZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBzdWJuZXRTZWxlY3Rpb24gc3BlY2lmaWVkIGFuZCBubyBwdWJsaWMgc3VibmV0IGZvdW5kIGluIHRoZSB2cGMsIHBsZWFzZSBzcGVjaWZ5IHN1Ym5ldFNlbGVjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMuaW1hZ2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBpbWFnZUlkIHNwZWNpZmllZCwgcGxlYXNlIHNwZWNpZnkgaW1hZ2VJZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHZwY1N1Ym5ldHMgPSBwcm9wcy5zdWJuZXRTZWxlY3Rpb24gPz8geyBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QVUJMSUMgfTtcbiAgICBjb25zdCBjOWVudiA9IG5ldyBDZm5FbnZpcm9ubWVudEVDMih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBwcm9wcy5lYzJFbnZpcm9ubWVudE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBvd25lckFybjogcHJvcHMub3duZXI/Lm93bmVyQXJuLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGU/LnRvU3RyaW5nKCkgPz8gZWMyLkluc3RhbmNlVHlwZS5vZihlYzIuSW5zdGFuY2VDbGFzcy5CVVJTVEFCTEUyLCBlYzIuSW5zdGFuY2VTaXplLk1JQ1JPKS50b1N0cmluZygpLFxuICAgICAgc3VibmV0SWQ6IHRoaXMudnBjLnNlbGVjdFN1Ym5ldHModnBjU3VibmV0cykuc3VibmV0SWRzWzBdLFxuICAgICAgcmVwb3NpdG9yaWVzOiBwcm9wcy5jbG9uZWRSZXBvc2l0b3JpZXMgPyBwcm9wcy5jbG9uZWRSZXBvc2l0b3JpZXMubWFwKHIgPT4gKHtcbiAgICAgICAgcmVwb3NpdG9yeVVybDogci5yZXBvc2l0b3J5VXJsLFxuICAgICAgICBwYXRoQ29tcG9uZW50OiByLnBhdGhDb21wb25lbnQsXG4gICAgICB9KSkgOiB1bmRlZmluZWQsXG4gICAgICBjb25uZWN0aW9uVHlwZTogcHJvcHMuY29ubmVjdGlvblR5cGUgPz8gQ29ubmVjdGlvblR5cGUuQ09OTkVDVF9TU0gsXG4gICAgICBpbWFnZUlkOiBwcm9wcy5pbWFnZUlkLFxuICAgICAgYXV0b21hdGljU3RvcFRpbWVNaW51dGVzOiBwcm9wcy5hdXRvbWF0aWNTdG9wPy50b01pbnV0ZXMoKSxcbiAgICB9KTtcbiAgICB0aGlzLmVudmlyb25tZW50SWQgPSBjOWVudi5yZWY7XG4gICAgdGhpcy5lYzJFbnZpcm9ubWVudEFybiA9IGM5ZW52LmdldEF0dCgnQXJuJykudG9TdHJpbmcoKTtcbiAgICB0aGlzLmVjMkVudmlyb25tZW50TmFtZSA9IGM5ZW52LmdldEF0dCgnTmFtZScpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5pZGVVcmwgPSBgaHR0cHM6Ly8ke3RoaXMuZW52LnJlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9jbG91ZDkvaWRlLyR7dGhpcy5lbnZpcm9ubWVudElkfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY2xhc3MgZm9yIGRpZmZlcmVudCByZXBvc2l0b3J5IHByb3ZpZGVyc1xuICovXG5leHBvcnQgY2xhc3MgQ2xvbmVSZXBvc2l0b3J5IHtcbiAgLyoqXG4gICAqIGltcG9ydCByZXBvc2l0b3J5IHRvIGNsb3VkOSBlbnZpcm9ubWVudCBmcm9tIEFXUyBDb2RlQ29tbWl0XG4gICAqXG4gICAqIEBwYXJhbSByZXBvc2l0b3J5IHRoZSBjb2RlY29tbWl0IHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbVxuICAgKiBAcGFyYW0gcGF0aCAgdGhlIHRhcmdldCBwYXRoIGluIGNsb3VkOSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29kZUNvbW1pdChyZXBvc2l0b3J5OiBjb2RlY29tbWl0LklSZXBvc2l0b3J5LCBwYXRoOiBzdHJpbmcpOiBDbG9uZVJlcG9zaXRvcnkge1xuICAgIHJldHVybiB7XG4gICAgICByZXBvc2l0b3J5VXJsOiByZXBvc2l0b3J5LnJlcG9zaXRvcnlDbG9uZVVybEh0dHAsXG4gICAgICBwYXRoQ29tcG9uZW50OiBwYXRoLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5VXJsOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBwYXRoQ29tcG9uZW50OiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogQW4gZW52aXJvbm1lbnQgb3duZXJcbiAqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgT3duZXIge1xuICAvKipcbiAgICogTWFrZSBhbiBJQU0gdXNlciB0aGUgZW52aXJvbm1lbnQgb3duZXJcbiAgICpcbiAgICogVXNlciBuZWVkIHRvIGhhdmUgQVdTQ2xvdWQ5QWRtaW5pc3RyYXRvciBwZXJtaXNzaW9uc1xuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbG91ZDkvbGF0ZXN0L3VzZXItZ3VpZGUvc2hhcmUtZW52aXJvbm1lbnQuaHRtbCNzaGFyZS1lbnZpcm9ubWVudC1hYm91dFxuICAgKlxuICAgKiBAcGFyYW0gdXNlciB0aGUgVXNlciBvYmplY3QgdG8gdXNlIGFzIHRoZSBlbnZpcm9ubWVudCBvd25lclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1c2VyKHVzZXI6IElVc2VyKTogT3duZXIge1xuICAgIHJldHVybiB7IG93bmVyQXJuOiB1c2VyLnVzZXJBcm4gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFuIElBTSBhc3N1bWVkIHJvbGUgdGhlIGVudmlyb25tZW50IG93bmVyXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50SWQgVGhlIGFjY291bnQgaWQgb2YgdGhlIHRhcmdldCBhY2NvdW50XG4gICAqIEBwYXJhbSByb2xlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXNzdW1lZCByb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzc3VtZWRSb2xlKGFjY291bnRJZDogc3RyaW5nLCByb2xlTmFtZTogc3RyaW5nKTogT3duZXIge1xuICAgIHJldHVybiB7IG93bmVyQXJuOiBgYXJuOiR7Y2RrLkF3cy5QQVJUSVRJT059OnN0czo6JHthY2NvdW50SWR9OmFzc3VtZWQtcm9sZS8ke3JvbGVOYW1lfWAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFuIElBTSBmZWRlcmF0ZWQgdXNlciB0aGUgZW52aXJvbm1lbnQgb3duZXJcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRJZCBUaGUgQWNjb3VudElkIG9mIHRoZSB0YXJnZXQgYWNjb3VudFxuICAgKiBAcGFyYW0gdXNlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZlZGVyYXRlZCB1c2VyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZlZGVyYXRlZFVzZXIoYWNjb3VudElkOiBzdHJpbmcsIHVzZXJOYW1lOiBzdHJpbmcpOiBPd25lciB7XG4gICAgcmV0dXJuIHsgb3duZXJBcm46IGBhcm46JHtjZGsuQXdzLlBBUlRJVElPTn06c3RzOjoke2FjY291bnRJZH06ZmVkZXJhdGVkLXVzZXIvJHt1c2VyTmFtZX1gIH07XG4gIH1cblxuICAvKipcbiAgICogTWFrZSB0aGUgQWNjb3VudCBSb290IFVzZXIgdGhlIGVudmlyb25tZW50IG93bmVyIChub3QgcmVjb21tZW5kZWQpXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50SWQgdGhlIEFjY291bnRJZCB0byB1c2UgYXMgdGhlIGVudmlyb25tZW50IG93bmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhY2NvdW50Um9vdChhY2NvdW50SWQ6IHN0cmluZyk6IE93bmVyIHtcbiAgICByZXR1cm4geyBvd25lckFybjogYGFybjoke2Nkay5Bd3MuUEFSVElUSU9OfTppYW06OiR7YWNjb3VudElkfTpyb290YCB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvd25lckFybiBvZiBlbnZpcm9ubWVudCBvd25lci5cbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG93bmVyQXJuOiBzdHJpbmcpIHt9XG59XG4iXX0=