UNPKG

@cloudsnorkel/cdk-github-runners

Version:

CDK construct to create GitHub Actions self-hosted runners. Creates ephemeral runners on demand. Easy to deploy and highly customizable.

267 lines 41.3 kB
"use strict"; var _a, _b, _c; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseProvider = exports.Os = exports.Architecture = exports.RunnerVersion = void 0; exports.amiRootDevice = amiRootDevice; exports.generateStateName = generateStateName; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const crypto = require("crypto"); const cdk = require("aws-cdk-lib"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs_1 = require("constructs"); const ami_root_device_function_1 = require("./ami-root-device-function"); const utils_1 = require("../utils"); /** * Defines desired GitHub Actions runner version. */ class RunnerVersion { /** * Use the latest version available at the time the runner provider image is built. */ static latest() { return new RunnerVersion('latest'); } /** * Use a specific version. * * @see https://github.com/actions/runner/releases * * @param version GitHub Runner version */ static specific(version) { return new RunnerVersion(version); } constructor(version) { this.version = version; } /** * Check if two versions are the same. * * @param other version to compare */ is(other) { return this.version == other.version; } } exports.RunnerVersion = RunnerVersion; _a = JSII_RTTI_SYMBOL_1; RunnerVersion[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerVersion", version: "0.14.21" }; /** * CPU architecture enum for an image. */ class Architecture { static of(architecture) { return new Architecture(architecture); } constructor(name) { this.name = name; } /** * Checks if the given architecture is the same as this one. * * @param arch architecture to compare */ is(arch) { return arch.name == this.name; } /** * Checks if this architecture is in a given list. * * @param arches architectures to check */ isIn(arches) { for (const arch of arches) { if (this.is(arch)) { return true; } } return false; } /** * Checks if a given EC2 instance type matches this architecture. * * @param instanceType instance type to check */ instanceTypeMatch(instanceType) { if (instanceType.architecture == aws_cdk_lib_1.aws_ec2.InstanceArchitecture.X86_64) { return this.is(Architecture.X86_64); } if (instanceType.architecture == aws_cdk_lib_1.aws_ec2.InstanceArchitecture.ARM_64) { return this.is(Architecture.ARM64); } throw new Error('Unknown instance type architecture'); } } exports.Architecture = Architecture; _b = JSII_RTTI_SYMBOL_1; Architecture[_b] = { fqn: "@cloudsnorkel/cdk-github-runners.Architecture", version: "0.14.21" }; /** * ARM64 */ Architecture.ARM64 = Architecture.of('ARM64'); /** * X86_64 */ Architecture.X86_64 = Architecture.of('X86_64'); /** * OS enum for an image. */ class Os { static of(os) { return new Os(os); } constructor(name) { this.name = name; } /** * Checks if the given OS is the same as this one. * * @param os OS to compare */ is(os) { return os.name == this.name; } /** * Checks if this OS is in a given list. * * @param oses list of OS to check */ isIn(oses) { for (const os of oses) { if (this.is(os)) { return true; } } return false; } } exports.Os = Os; _c = JSII_RTTI_SYMBOL_1; Os[_c] = { fqn: "@cloudsnorkel/cdk-github-runners.Os", version: "0.14.21" }; /** * Linux * * @deprecated use {@link LINUX_UBUNTU}, {@link LINUX_UBUNTU_2404}, {@link LINUX_AMAZON_2} or {@link LINUX_AMAZON_2023} */ Os.LINUX = Os.of('Linux'); /** * Ubuntu Linux */ Os.LINUX_UBUNTU = Os.of('Ubuntu Linux'); /** * Ubuntu Linux 22.04 */ Os.LINUX_UBUNTU_2204 = Os.of('Ubuntu Linux 22.04'); /** * Ubuntu Linux 24.04 */ Os.LINUX_UBUNTU_2404 = Os.of('Ubuntu Linux 24.04'); /** * Amazon Linux 2 */ Os.LINUX_AMAZON_2 = Os.of('Amazon Linux 2'); /** * Amazon Linux 2023 */ Os.LINUX_AMAZON_2023 = Os.of('Amazon Linux 2023'); /** * @internal */ Os._ALL_LINUX_VERSIONS = [Os.LINUX, Os.LINUX_UBUNTU, Os.LINUX_UBUNTU_2204, Os.LINUX_UBUNTU_2404, Os.LINUX_AMAZON_2, Os.LINUX_AMAZON_2023]; /** * @internal */ Os._ALL_LINUX_AMAZON_VERSIONS = [Os.LINUX_AMAZON_2, Os.LINUX_AMAZON_2023]; /** * @internal */ Os._ALL_LINUX_UBUNTU_VERSIONS = [Os.LINUX_UBUNTU, Os.LINUX_UBUNTU_2204, Os.LINUX_UBUNTU_2404]; /** * Windows */ Os.WINDOWS = Os.of('Windows'); /** * Base class for all providers with common methods used by all providers. * * @internal */ class BaseProvider extends constructs_1.Construct { constructor(scope, id, _props) { super(scope, id); cdk.Tags.of(this).add('GitHubRunners:Provider', this.node.path); } labelsFromProperties(defaultLabel, propsLabel, propsLabels) { if (propsLabels && propsLabel) { throw new Error('Must supply either `label` or `labels` in runner properties, but not both. Try removing the `label` property.'); } if (propsLabels) { return propsLabels; } if (propsLabel) { return [propsLabel]; } return [defaultLabel]; } } exports.BaseProvider = BaseProvider; /** * Use custom resource to determine the root device name of a given AMI, Launch Template, or SSM parameter pointing to AMI. * * TODO move somewhere more common as it's used by both providers and AMI builder now * * @internal */ function amiRootDevice(scope, ami) { const crHandler = (0, utils_1.singletonLambda)(ami_root_device_function_1.AmiRootDeviceFunction, scope, 'AMI Root Device Reader', { description: 'Custom resource handler that discovers the boot drive device name for a given AMI', timeout: cdk.Duration.minutes(1), logGroup: (0, utils_1.singletonLogGroup)(scope, utils_1.SingletonLogType.RUNNER_IMAGE_BUILD), loggingFormat: aws_cdk_lib_1.aws_lambda.LoggingFormat.JSON, initialPolicy: [ new aws_cdk_lib_1.aws_iam.PolicyStatement({ actions: [ 'ssm:GetParameter', 'ec2:DescribeImages', 'ec2:DescribeLaunchTemplateVersions', 'imagebuilder:GetImage', ], resources: ['*'], }), ], }); return new aws_cdk_lib_1.CustomResource(scope, 'AMI Root Device', { serviceToken: crHandler.functionArn, resourceType: 'Custom::AmiRootDevice', properties: { Ami: ami ?? '', }, }); } /** * Creates a shortened state name from a construct's path for use in AWS Step Functions. * Step Functions state names are limited to 80 characters. This function generates a name * from the construct's path (without the stack name), optionally appends a suffix, and * shortens it if necessary by truncating and appending a hash suffix to ensure uniqueness. * * @param construct The construct to get the path from * @param suffix Optional suffix to append to the path (e.g., "data", "rand", "choice") * @returns A shortened state name that fits within AWS Step Functions' 80-character limit * @internal */ function generateStateName(construct, suffix) { // Get construct path without stack name const basePath = construct.node.path.split('/').slice(1).join('/'); // Build full name with optional suffix const fullName = suffix ? `${basePath} ${suffix}` : basePath; // Shorten if necessary const maxLength = 80; if (fullName.length <= maxLength) { return fullName; } const hashSuffix = crypto.createHash('md5').update(fullName).digest('hex').slice(0, 3); const separator = '-'; const truncatedLength = maxLength - hashSuffix.length - separator.length; const truncated = fullName.slice(0, truncatedLength); return `${truncated}${separator}${hashSuffix}`; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQTBuQkEsc0NBMEJDO0FBYUQsOENBa0JDOztBQW5yQkQsaUNBQWlDO0FBQ2pDLG1DQUFtQztBQUNuQyw2Q0FTcUI7QUFFckIsMkNBQW1EO0FBQ25ELHlFQUFtRTtBQUNuRSxvQ0FBZ0Y7QUFFaEY7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDeEI7O09BRUc7SUFDSSxNQUFNLENBQUMsTUFBTTtRQUNsQixPQUFPLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQWU7UUFDcEMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBK0IsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxFQUFFLENBQUMsS0FBb0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkMsQ0FBQzs7QUE3Qkgsc0NBOEJDOzs7QUFFRDs7R0FFRztBQUNILE1BQWEsWUFBWTtJQVdmLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBb0I7UUFDcEMsT0FBTyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsWUFBb0MsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7SUFDaEQsQ0FBQztJQUVEOzs7O01BSUU7SUFDSyxFQUFFLENBQUMsSUFBa0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxJQUFJLENBQUMsTUFBc0I7UUFDaEMsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxZQUE4QjtRQUNyRCxJQUFJLFlBQVksQ0FBQyxZQUFZLElBQUkscUJBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxZQUFZLElBQUkscUJBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDeEQsQ0FBQzs7QUF0REgsb0NBdURDOzs7QUF0REM7O0dBRUc7QUFDb0Isa0JBQUssR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXhEOztHQUVHO0FBQ29CLG1CQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQWdENUQ7O0dBRUc7QUFDSCxNQUFhLEVBQUU7SUFzREwsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFVO1FBQzFCLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELFlBQW9DLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQ2hELENBQUM7SUFFRDs7OztNQUlFO0lBQ0ssRUFBRSxDQUFDLEVBQU07UUFDZCxPQUFPLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLElBQUksQ0FBQyxJQUFVO1FBQ3BCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O0FBbEZILGdCQW1GQzs7O0FBbEZDOzs7O0VBSUU7QUFDcUIsUUFBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFOUM7O0dBRUc7QUFDb0IsZUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFNUQ7O0VBRUU7QUFDcUIsb0JBQWlCLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRXZFOztHQUVHO0FBQ29CLG9CQUFpQixHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUV2RTs7R0FFRztBQUNvQixpQkFBYyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUVoRTs7R0FFRztBQUNvQixvQkFBaUIsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFdEU7O0dBRUc7QUFDb0Isc0JBQW1CLEdBQ3hDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUVuSDs7S0FFSztBQUNrQiw2QkFBMEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFOUY7O0tBRUs7QUFDa0IsNkJBQTBCLEdBQUcsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUVsSDs7RUFFRTtBQUNxQixVQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQWlicEQ7Ozs7R0FJRztBQUNILE1BQXNCLFlBQWEsU0FBUSxzQkFBUztJQUNsRCxZQUFzQixLQUFnQixFQUFFLEVBQVUsRUFBRSxNQUE0QjtRQUM5RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxZQUFvQixFQUFFLFVBQThCLEVBQUUsV0FBaUM7UUFDcEgsSUFBSSxXQUFXLElBQUksVUFBVSxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywrR0FBK0csQ0FBQyxDQUFDO1FBQ25JLENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBcEJELG9DQW9CQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxLQUFnQixFQUFFLEdBQVk7SUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBQSx1QkFBZSxFQUFDLGdEQUFxQixFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRTtRQUN4RixXQUFXLEVBQUUsbUZBQW1GO1FBQ2hHLE9BQU8sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEMsUUFBUSxFQUFFLElBQUEseUJBQWlCLEVBQUMsS0FBSyxFQUFFLHdCQUFnQixDQUFDLGtCQUFrQixDQUFDO1FBQ3ZFLGFBQWEsRUFBRSx3QkFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJO1FBQ3hDLGFBQWEsRUFBRTtZQUNiLElBQUkscUJBQUcsQ0FBQyxlQUFlLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRTtvQkFDUCxrQkFBa0I7b0JBQ2xCLG9CQUFvQjtvQkFDcEIsb0NBQW9DO29CQUNwQyx1QkFBdUI7aUJBQ3hCO2dCQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQzthQUNqQixDQUFDO1NBQ0g7S0FDRixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksNEJBQWMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7UUFDbEQsWUFBWSxFQUFFLFNBQVMsQ0FBQyxXQUFXO1FBQ25DLFlBQVksRUFBRSx1QkFBdUI7UUFDckMsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFO1NBQ2Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLFNBQW9CLEVBQUUsTUFBZTtJQUNyRSx3Q0FBd0M7SUFDeEMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFbkUsdUNBQXVDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUU3RCx1QkFBdUI7SUFDdkIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkYsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLE1BQU0sZUFBZSxHQUFHLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDekUsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckQsT0FBTyxHQUFHLFNBQVMsR0FBRyxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIGF3c19lYzIgYXMgZWMyLFxuICBhd3NfZWNyIGFzIGVjcixcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19sYW1iZGEgYXMgbGFtYmRhLFxuICBhd3NfbG9ncyBhcyBsb2dzLFxuICBhd3Nfc3RlcGZ1bmN0aW9ucyBhcyBzdGVwZnVuY3Rpb25zLFxuICBDdXN0b21SZXNvdXJjZSxcbiAgRHVyYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEVic0RldmljZVZvbHVtZVR5cGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQW1pUm9vdERldmljZUZ1bmN0aW9uIH0gZnJvbSAnLi9hbWktcm9vdC1kZXZpY2UtZnVuY3Rpb24nO1xuaW1wb3J0IHsgc2luZ2xldG9uTGFtYmRhLCBzaW5nbGV0b25Mb2dHcm91cCwgU2luZ2xldG9uTG9nVHlwZSB9IGZyb20gJy4uL3V0aWxzJztcblxuLyoqXG4gKiBEZWZpbmVzIGRlc2lyZWQgR2l0SHViIEFjdGlvbnMgcnVubmVyIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5uZXJWZXJzaW9uIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBydW5uZXIgcHJvdmlkZXIgaW1hZ2UgaXMgYnVpbHQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxhdGVzdCgpOiBSdW5uZXJWZXJzaW9uIHtcbiAgICByZXR1cm4gbmV3IFJ1bm5lclZlcnNpb24oJ2xhdGVzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBhIHNwZWNpZmljIHZlcnNpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzXG4gICAqXG4gICAqIEBwYXJhbSB2ZXJzaW9uIEdpdEh1YiBSdW5uZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVjaWZpYyh2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFJ1bm5lclZlcnNpb24odmVyc2lvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nKSB7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHdvIHZlcnNpb25zIGFyZSB0aGUgc2FtZS5cbiAgICpcbiAgICogQHBhcmFtIG90aGVyIHZlcnNpb24gdG8gY29tcGFyZVxuICAgKi9cbiAgcHVibGljIGlzKG90aGVyOiBSdW5uZXJWZXJzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvbiA9PSBvdGhlci52ZXJzaW9uO1xuICB9XG59XG5cbi8qKlxuICogQ1BVIGFyY2hpdGVjdHVyZSBlbnVtIGZvciBhbiBpbWFnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFyY2hpdGVjdHVyZSB7XG4gIC8qKlxuICAgKiBBUk02NFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBUk02NCA9IEFyY2hpdGVjdHVyZS5vZignQVJNNjQnKTtcblxuICAvKipcbiAgICogWDg2XzY0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFg4Nl82NCA9IEFyY2hpdGVjdHVyZS5vZignWDg2XzY0Jyk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgb2YoYXJjaGl0ZWN0dXJlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdGVjdHVyZShhcmNoaXRlY3R1cmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nKSB7XG4gIH1cblxuICAvKipcbiAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyY2hpdGVjdHVyZSBpcyB0aGUgc2FtZSBhcyB0aGlzIG9uZS5cbiAgKlxuICAqIEBwYXJhbSBhcmNoIGFyY2hpdGVjdHVyZSB0byBjb21wYXJlXG4gICovXG4gIHB1YmxpYyBpcyhhcmNoOiBBcmNoaXRlY3R1cmUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXJjaC5uYW1lID09IHRoaXMubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBhcmNoaXRlY3R1cmUgaXMgaW4gYSBnaXZlbiBsaXN0LlxuICAgKlxuICAgKiBAcGFyYW0gYXJjaGVzIGFyY2hpdGVjdHVyZXMgdG8gY2hlY2tcbiAgICovXG4gIHB1YmxpYyBpc0luKGFyY2hlczogQXJjaGl0ZWN0dXJlW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGFyY2ggb2YgYXJjaGVzKSB7XG4gICAgICBpZiAodGhpcy5pcyhhcmNoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGdpdmVuIEVDMiBpbnN0YW5jZSB0eXBlIG1hdGNoZXMgdGhpcyBhcmNoaXRlY3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSBpbnN0YW5jZVR5cGUgaW5zdGFuY2UgdHlwZSB0byBjaGVja1xuICAgKi9cbiAgcHVibGljIGluc3RhbmNlVHlwZU1hdGNoKGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmIChpbnN0YW5jZVR5cGUuYXJjaGl0ZWN0dXJlID09IGVjMi5JbnN0YW5jZUFyY2hpdGVjdHVyZS5YODZfNjQpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2VUeXBlLmFyY2hpdGVjdHVyZSA9PSBlYzIuSW5zdGFuY2VBcmNoaXRlY3R1cmUuQVJNXzY0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pcyhBcmNoaXRlY3R1cmUuQVJNNjQpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gaW5zdGFuY2UgdHlwZSBhcmNoaXRlY3R1cmUnKTtcbiAgfVxufVxuXG4vKipcbiAqIE9TIGVudW0gZm9yIGFuIGltYWdlLlxuICovXG5leHBvcnQgY2xhc3MgT3Mge1xuICAvKipcbiAgKiBMaW51eFxuICAqXG4gICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBMSU5VWF9VQlVOVFV9LCB7QGxpbmsgTElOVVhfVUJVTlRVXzI0MDR9LCB7QGxpbmsgTElOVVhfQU1BWk9OXzJ9IG9yIHtAbGluayBMSU5VWF9BTUFaT05fMjAyM31cbiAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMSU5VWCA9IE9zLm9mKCdMaW51eCcpO1xuXG4gIC8qKlxuICAgKiBVYnVudHUgTGludXhcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTElOVVhfVUJVTlRVID0gT3Mub2YoJ1VidW50dSBMaW51eCcpO1xuXG4gIC8qKlxuICAqIFVidW50dSBMaW51eCAyMi4wNFxuICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExJTlVYX1VCVU5UVV8yMjA0ID0gT3Mub2YoJ1VidW50dSBMaW51eCAyMi4wNCcpO1xuXG4gIC8qKlxuICAgKiBVYnVudHUgTGludXggMjQuMDRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTElOVVhfVUJVTlRVXzI0MDQgPSBPcy5vZignVWJ1bnR1IExpbnV4IDI0LjA0Jyk7XG5cbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExJTlVYX0FNQVpPTl8yID0gT3Mub2YoJ0FtYXpvbiBMaW51eCAyJyk7XG5cbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyMDIzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExJTlVYX0FNQVpPTl8yMDIzID0gT3Mub2YoJ0FtYXpvbiBMaW51eCAyMDIzJyk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBfQUxMX0xJTlVYX1ZFUlNJT05TID1cbiAgICBbT3MuTElOVVgsIE9zLkxJTlVYX1VCVU5UVSwgT3MuTElOVVhfVUJVTlRVXzIyMDQsIE9zLkxJTlVYX1VCVU5UVV8yNDA0LCBPcy5MSU5VWF9BTUFaT05fMiwgT3MuTElOVVhfQU1BWk9OXzIwMjNdO1xuXG4gIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IF9BTExfTElOVVhfQU1BWk9OX1ZFUlNJT05TID0gW09zLkxJTlVYX0FNQVpPTl8yLCBPcy5MSU5VWF9BTUFaT05fMjAyM107XG5cbiAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgX0FMTF9MSU5VWF9VQlVOVFVfVkVSU0lPTlMgPSBbT3MuTElOVVhfVUJVTlRVLCBPcy5MSU5VWF9VQlVOVFVfMjIwNCwgT3MuTElOVVhfVUJVTlRVXzI0MDRdO1xuXG4gIC8qKlxuICAqIFdpbmRvd3NcbiAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBXSU5ET1dTID0gT3Mub2YoJ1dpbmRvd3MnKTtcblxuICBwcml2YXRlIHN0YXRpYyBvZihvczogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBPcyhvcyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcpIHtcbiAgfVxuXG4gIC8qKlxuICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gT1MgaXMgdGhlIHNhbWUgYXMgdGhpcyBvbmUuXG4gICpcbiAgKiBAcGFyYW0gb3MgT1MgdG8gY29tcGFyZVxuICAqL1xuICBwdWJsaWMgaXMob3M6IE9zKSB7XG4gICAgcmV0dXJuIG9zLm5hbWUgPT0gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIE9TIGlzIGluIGEgZ2l2ZW4gbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIG9zZXMgbGlzdCBvZiBPUyB0byBjaGVja1xuICAgKi9cbiAgcHVibGljIGlzSW4ob3NlczogT3NbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3Qgb3Mgb2Ygb3Nlcykge1xuICAgICAgaWYgKHRoaXMuaXMob3MpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNjcmlwdGlvbiBvZiBhIERvY2tlciBpbWFnZSBidWlsdCBieSB7QGxpbmsgUnVubmVySW1hZ2VCdWlsZGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5uZXJJbWFnZSB7XG4gIC8qKlxuICAgKiBFQ1IgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlUmVwb3NpdG9yeTogZWNyLklSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgaW1hZ2UgdGFnIHdoZXJlIHRoZSBpbWFnZSB3aWxsIGJlIHB1c2hlZC5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlVGFnOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFyY2hpdGVjdHVyZSBvZiB0aGUgaW1hZ2UuXG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZTtcblxuICAvKipcbiAgICogT1MgdHlwZSBvZiB0aGUgaW1hZ2UuXG4gICAqL1xuICByZWFkb25seSBvczogT3M7XG5cbiAgLyoqXG4gICAqIExvZyBncm91cCB3aGVyZSBpbWFnZSBidWlsZHMgYXJlIGxvZ2dlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwPzogbG9ncy5Mb2dHcm91cDtcblxuICAvKipcbiAgICogSW5zdGFsbGVkIHJ1bm5lciB2ZXJzaW9uLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBvcGVuIGEgdGlja2V0IGlmIHlvdSBuZWVkIHRoaXNcbiAgICovXG4gIHJlYWRvbmx5IHJ1bm5lclZlcnNpb246IFJ1bm5lclZlcnNpb247XG5cbiAgLyoqXG4gICAqIEEgZGVwZW5kYWJsZSBzdHJpbmcgdGhhdCBjYW4gYmUgd2FpdGVkIG9uIHRvIGVuc3VyZSB0aGUgaW1hZ2UgaXMgcmVhZHkuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVhZG9ubHkgX2RlcGVuZGFibGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBBTUkgYnVpbHQgYnkge0BsaW5rIFJ1bm5lckltYWdlQnVpbGRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVyQW1pIHtcbiAgLyoqXG4gICAqIExhdW5jaCB0ZW1wbGF0ZSBwb2ludGluZyB0byB0aGUgbGF0ZXN0IEFNSS5cbiAgICovXG4gIHJlYWRvbmx5IGxhdW5jaFRlbXBsYXRlOiBlYzIuSUxhdW5jaFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBBcmNoaXRlY3R1cmUgb2YgdGhlIGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIE9TIHR5cGUgb2YgdGhlIGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3M6IE9zO1xuXG4gIC8qKlxuICAgKiBMb2cgZ3JvdXAgd2hlcmUgaW1hZ2UgYnVpbGRzIGFyZSBsb2dnZWQuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IGxvZ3MuTG9nR3JvdXA7XG5cbiAgLyoqXG4gICAqIEluc3RhbGxlZCBydW5uZXIgdmVyc2lvbi5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgb3BlbiBhIHRpY2tldCBpZiB5b3UgbmVlZCB0aGlzXG4gICAqL1xuICByZWFkb25seSBydW5uZXJWZXJzaW9uOiBSdW5uZXJWZXJzaW9uO1xufVxuXG4vKipcbiAqIFJldHJ5IG9wdGlvbnMgZm9yIHByb3ZpZGVycy4gVGhlIGRlZmF1bHQgaXMgdG8gcmV0cnkgMjMgdGltZXMgZm9yIGFib3V0IDI0IGhvdXJzIHdpdGggaW5jcmVhc2luZyBpbnRlcnZhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclJldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byByZXRyeSBwcm92aWRlciBvbiBzdXBwb3J0ZWQgZmFpbHVyZXMuIFdoaWNoIGZhaWx1cmVzIGdlbmVyYXRlIGEgcmV0cnkgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgcHJvdmlkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSG93IG11Y2ggdGltZSB0byB3YWl0IGFmdGVyIGZpcnN0IHJldHJ5YWJsZSBmYWlsdXJlLiBUaGlzIGludGVydmFsIHdpbGwgYmUgbXVsdGlwbGllZCBieSB7QGxpbmsgYmFja29mZlJhdGV9IGVhY2ggcmV0cnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgbWludXRlXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeS5cbiAgICpcbiAgICogQGRlZmF1bHQgMjNcbiAgICovXG4gIHJlYWRvbmx5IG1heEF0dGVtcHRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNdWx0aXBsaWNhdGlvbiBmb3IgaG93IG11Y2ggbG9uZ2VyIHRoZSB3YWl0IGludGVydmFsIGdldHMgb24gZXZlcnkgcmV0cnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEuM1xuICAgKi9cbiAgcmVhZG9ubHkgYmFja29mZlJhdGU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBydW5uZXIgcHJvdmlkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5lclByb3ZpZGVyUHJvcHMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkYXlzIGxvZyBldmVudHMgYXJlIGtlcHQgaW4gQ2xvdWRXYXRjaCBMb2dzLiBXaGVuIHVwZGF0aW5nXG4gICAqIHRoaXMgcHJvcGVydHksIHVuc2V0dGluZyBpdCBkb2Vzbid0IHJlbW92ZSB0aGUgbG9nIHJldGVudGlvbiBwb2xpY3kuIFRvXG4gICAqIHJlbW92ZSB0aGUgcmV0ZW50aW9uIHBvbGljeSwgc2V0IHRoZSB2YWx1ZSB0byBgSU5GSU5JVEVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRIXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgcmV0cnlPcHRpb25zfSBvbiB7QGxpbmsgR2l0SHViUnVubmVyc30gaW5zdGVhZFxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlPcHRpb25zPzogUHJvdmlkZXJSZXRyeU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFkZCBkZWZhdWx0IGxhYmVscyBiYXNlZCBvbiBPUyBhbmQgYXJjaGl0ZWN0dXJlIG9mIHRoZSBydW5uZXIuIFRoaXMgd2lsbCB0ZWxsIEdpdEh1YiBSdW5uZXIgdG8gYWRkIGRlZmF1bHQgbGFiZWxzIGxpa2UgYHNlbGYtaG9zdGVkYCwgYGxpbnV4YCwgYHg2NGAsIGFuZCBgYXJtNjRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TGFiZWxzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXb3JrZmxvdyBqb2IgcGFyYW1ldGVycyBhcyBwYXJzZWQgZnJvbSB0aGUgd2ViaG9vayBldmVudC4gUGFzcyB0aGVzZSBpbnRvIHlvdXIgcnVubmVyIGV4ZWN1dG9yIGFuZCBydW4gc29tZXRoaW5nIGxpa2U6XG4gKlxuICogYGBgc2hcbiAqIC4vY29uZmlnLnNoIC0tdW5hdHRlbmRlZCAtLXVybCBcIntSRUdJU1RSQVRJT05fVVJMfVwiIC0tdG9rZW4gXCIke1JVTk5FUl9UT0tFTn1cIiAtLWVwaGVtZXJhbCAtLXdvcmsgX3dvcmsgLS1sYWJlbHMgXCIke1JVTk5FUl9MQUJFTH1cIiAtLW5hbWUgXCIke1JVTk5FUl9OQU1FfVwiIC0tZGlzYWJsZXVwZGF0ZVxuICogYGBgXG4gKlxuICogQWxsIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCBhcyBzdGVwIGZ1bmN0aW9uIHBhdGhzIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB1c2VkIG9ubHkgaW4gc3RlcCBmdW5jdGlvbiB0YXNrIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVyUnVudGltZVBhcmFtZXRlcnMge1xuICAvKipcbiAgICogUGF0aCB0byBydW5uZXIgdG9rZW4gdXNlZCB0byByZWdpc3RlciB0b2tlbi5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bm5lclRva2VuUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGRlc2lyZWQgcnVubmVyIG5hbWUuIFdlIHNwZWNpZmljYWxseSBzZXQgdGhlIG5hbWUgdG8gbWFrZSB0cm91Ymxlc2hvb3RpbmcgZWFzaWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVubmVyTmFtZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBHaXRIdWIgZG9tYWluLiBNb3N0IG9mIHRoZSB0aW1lIHRoaXMgd2lsbCBiZSBnaXRodWIuY29tIGJ1dCBmb3Igc2VsZi1ob3N0ZWQgR2l0SHViIGluc3RhbmNlcywgdGhpcyB3aWxsIGJlIGRpZmZlcmVudC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdGh1YkRvbWFpblBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byByZXBvc2l0b3J5IG93bmVyIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBvd25lclBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byByZXBvc2l0b3J5IG5hbWUuXG4gICAqL1xuICByZWFkb25seSByZXBvUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IG9yIG9yZ2FuaXphdGlvbiBVUkwgdG8gcmVnaXN0ZXIgcnVubmVyIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaXN0cmF0aW9uVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gY29tbWEtc2VwYXJhdGVkIGxhYmVscyBzdHJpbmcgdG8gdXNlIGZvciBydW5uZXIuXG4gICAqL1xuICByZWFkb25seSBsYWJlbHNQYXRoOiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBJbWFnZSBzdGF0dXMgcmV0dXJuZWQgZnJvbSBydW5uZXIgcHJvdmlkZXJzIHRvIGJlIGRpc3BsYXllZCBpbiBzdGF0dXMuanNvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUnVubmVySW1hZ2VTdGF0dXMge1xuICAvKipcbiAgICogSW1hZ2UgcmVwb3NpdG9yeSB3aGVyZSBpbWFnZSBidWlsZGVyIHB1c2hlcyBydW5uZXIgaW1hZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VSZXBvc2l0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhZyBvZiBpbWFnZSB0aGF0IHNob3VsZCBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VUYWc6IHN0cmluZztcblxuICAvKipcbiAgICogTG9nIGdyb3VwIG5hbWUgZm9yIHRoZSBpbWFnZSBidWlsZGVyIHdoZXJlIGhpc3Rvcnkgb2YgaW1hZ2UgYnVpbGRzIGNhbiBiZSBhbmFseXplZC5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQnVpbGRlckxvZ0dyb3VwPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFNSSBzdGF0dXMgcmV0dXJuZWQgZnJvbSBydW5uZXIgcHJvdmlkZXJzIHRvIGJlIGRpc3BsYXllZCBhcyBvdXRwdXQgb2Ygc3RhdHVzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSdW5uZXJBbWlTdGF0dXMge1xuICAvKipcbiAgICogSWQgb2YgbGF1bmNoIHRlbXBsYXRlIHBvaW50aW5nIHRvIHRoZSBsYXRlc3QgQU1JIGJ1aWx0IGJ5IHRoZSBBTUkgYnVpbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxhdW5jaFRlbXBsYXRlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvZyBncm91cCBuYW1lIGZvciB0aGUgQU1JIGJ1aWxkZXIgd2hlcmUgaGlzdG9yeSBvZiBidWlsZHMgY2FuIGJlIGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYW1pQnVpbGRlckxvZ0dyb3VwPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgcnVubmVyIGltYWdlIHN0YXR1cyB1c2VkIGJ5IHN0YXR1cy5qc29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSdW5uZXJQcm92aWRlclN0YXR1cyB7XG4gIC8qKlxuICAgKiBSdW5uZXIgcHJvdmlkZXIgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogTGFiZWxzIGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENESyBjb25zdHJ1Y3Qgbm9kZSBwYXRoIGZvciB0aGlzIHByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RydWN0UGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVlBDIHdoZXJlIHJ1bm5lcnMgd2lsbCBiZSBsYXVuY2hlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZwY0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXBzIGF0dGFjaGVkIHRvIHJ1bm5lcnMuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBSb2xlIGF0dGFjaGVkIHRvIHJ1bm5lcnMuXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IERvY2tlciBpbWFnZSB1c2VkIGJ5IHRoaXMgcnVubmVyIHByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2U/OiBJUnVubmVySW1hZ2VTdGF0dXM7XG5cbiAgLyoqXG4gICAqIERldGFpbHMgYWJvdXQgQU1JIHVzZWQgYnkgdGhpcyBydW5uZXIgcHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSBhbWk/OiBJUnVubmVyQW1pU3RhdHVzO1xuXG4gIC8qKlxuICAgKiBMb2cgZ3JvdXAgZm9yIHJ1bm5lcnMuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGFsbCBydW5uZXIgcHJvdmlkZXJzLiBJbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGFsbCByZXF1aXJlZCByZXNvdXJjZXMgYW5kIHJldHVybiBhIHN0ZXAgZnVuY3Rpb24gdGFzayB0aGF0IHN0YXJ0cyB0aG9zZSByZXNvdXJjZXMgZnJvbSB7QGxpbmsgZ2V0U3RlcEZ1bmN0aW9uVGFza30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJ1bm5lclByb3ZpZGVyIGV4dGVuZHMgZWMyLklDb25uZWN0YWJsZSwgaWFtLklHcmFudGFibGUsIElDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogR2l0SHViIEFjdGlvbnMgbGFiZWxzIHVzZWQgZm9yIHRoaXMgcHJvdmlkZXIuXG4gICAqXG4gICAqIFRoZXNlIGxhYmVscyBhcmUgdXNlZCB0byBpZGVudGlmeSB3aGljaCBwcm92aWRlciBzaG91bGQgc3Bhd24gYSBuZXcgb24tZGVtYW5kIHJ1bm5lci4gRXZlcnkgam9iIHNlbmRzIGEgd2ViaG9vayB3aXRoIHRoZSBsYWJlbHMgaXQncyBsb29raW5nIGZvclxuICAgKiBiYXNlZCBvbiBydW5zLW9uLiBXZSB1c2UgbWF0Y2ggdGhlIGxhYmVscyBmcm9tIHRoZSB3ZWJob29rIHdpdGggdGhlIGxhYmVscyBzcGVjaWZpZWQgaGVyZS4gSWYgYWxsIHRoZSBsYWJlbHMgc3BlY2lmaWVkIGhlcmUgYXJlIHByZXNlbnQgaW4gdGhlXG4gICAqIGpvYidzIGxhYmVscywgdGhpcyBwcm92aWRlciB3aWxsIGJlIGNob3NlbiBhbmQgc3Bhd24gYSBuZXcgcnVubmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTG9nIGdyb3VwIHdoZXJlIHByb3ZpZGVkIHJ1bm5lcnMgd2lsbCBzYXZlIHRoZWlyIGxvZ3MuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgam9iIGxvZywgYnV0IHRoZSBydW5uZXIgaXRzZWxmLiBJdCB3aWxsIG5vdCBjb250YWluIG91dHB1dCBmcm9tIHRoZSBHaXRIdWIgQWN0aW9uIGJ1dCBvbmx5IG1ldGFkYXRhIG9uIGl0cyBleGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Ygc3RlcCBmdW5jdGlvbnMgZXJyb3JzIHRoYXQgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2VcbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5YWJsZUVycm9yczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN0ZXAgZnVuY3Rpb24gdGFza3MgdGhhdCBleGVjdXRlIHRoZSBydW5uZXIuXG4gICAqXG4gICAqIENhbGxlZCBieSBHaXRodWJSdW5uZXJzIGFuZCBzaG91bGRuJ3QgYmUgY2FsbGVkIG1hbnVhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyBzcGVjaWZpYyBidWlsZCBwYXJhbWV0ZXJzXG4gICAqL1xuICBnZXRTdGVwRnVuY3Rpb25UYXNrKHBhcmFtZXRlcnM6IFJ1bm5lclJ1bnRpbWVQYXJhbWV0ZXJzKTogc3RlcGZ1bmN0aW9ucy5JQ2hhaW5hYmxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBtZXRob2QgdGhhdCBtb2RpZmllcyB0aGUgcm9sZSBvZiB0aGUgc3RhdGUgbWFjaGluZSBhZnRlciBhbGwgdGhlIHRhc2tzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgcG9saWN5XG4gICAqIHN0YXRlbWVudHMgdG8gdGhlIHN0YXRlIG1hY2hpbmUgcm9sZSB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgdGFzayByZXR1cm5lZCBmcm9tIHtAbGluayBnZXRTdGVwRnVuY3Rpb25UYXNrfS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlTWFjaGluZVJvbGUgcm9sZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgdGhhdCBleGVjdXRlcyB0aGUgdGFzayByZXR1cm5lZCBmcm9tIHtAbGluayBnZXRTdGVwRnVuY3Rpb25UYXNrfS5cbiAgICovXG4gIGdyYW50U3RhdGVNYWNoaW5lKHN0YXRlTWFjaGluZVJvbGU6IGlhbS5JR3JhbnRhYmxlKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJuIHN0YXR1cyBvZiB0aGUgcnVubmVyIHByb3ZpZGVyIHRvIGJlIHVzZWQgaW4gdGhlIG1haW4gc3RhdHVzIGZ1bmN0aW9uLiBBbHNvIGdpdmVzIHRoZSBzdGF0dXMgZnVuY3Rpb24gYW55IG5lZWRlZCBwZXJtaXNzaW9ucyB0byBxdWVyeSB0aGUgRG9ja2VyIGltYWdlIG9yIEFNSS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXR1c0Z1bmN0aW9uUm9sZSBncmFudGFibGUgZm9yIHRoZSBzdGF0dXMgZnVuY3Rpb25cbiAgICovXG4gIHN0YXR1cyhzdGF0dXNGdW5jdGlvblJvbGU6IGlhbS5JR3JhbnRhYmxlKTogSVJ1bm5lclByb3ZpZGVyU3RhdHVzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY29tcG9zaXRlIHJ1bm5lciBwcm92aWRlcnMgdGhhdCBpbnRlcmFjdCB3aXRoIG11bHRpcGxlIHN1Yi1wcm92aWRlcnMuXG4gKiBVbmxpa2UgSVJ1bm5lclByb3ZpZGVyLCBjb21wb3NpdGUgcHJvdmlkZXJzIGRvIG5vdCBoYXZlIGNvbm5lY3Rpb25zLCBncmFudCBjYXBhYmlsaXRpZXMsXG4gKiBsb2cgZ3JvdXBzLCBvciByZXRyeWFibGUgZXJyb3JzIGFzIHRoZXkgZGVsZWdhdGUgdG8gdGhlaXIgc3ViLXByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9zaXRlUHJvdmlkZXIgZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEdpdEh1YiBBY3Rpb25zIGxhYmVscyB1c2VkIGZvciB0aGlzIHByb3ZpZGVyLlxuICAgKlxuICAgKiBUaGVzZSBsYWJlbHMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgd2hpY2ggcHJvdmlkZXIgc2hvdWxkIHNwYXduIGEgbmV3IG9uLWRlbWFuZCBydW5uZXIuIEV2ZXJ5IGpvYiBzZW5kcyBhIHdlYmhvb2sgd2l0aCB0aGUgbGFiZWxzIGl0J3MgbG9va2luZyBmb3JcbiAgICogYmFzZWQgb24gcnVucy1vbi4gV2UgdXNlIG1hdGNoIHRoZSBsYWJlbHMgZnJvbSB0aGUgd2ViaG9vayB3aXRoIHRoZSBsYWJlbHMgc3BlY2lmaWVkIGhlcmUuIElmIGFsbCB0aGUgbGFiZWxzIHNwZWNpZmllZCBoZXJlIGFyZSBwcmVzZW50IGluIHRoZVxuICAgKiBqb2IncyBsYWJlbHMsIHRoaXMgcHJvdmlkZXIgd2lsbCBiZSBjaG9zZW4gYW5kIHNwYXduIGEgbmV3IHJ1bm5lci5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFsbCBzdWItcHJvdmlkZXJzIGNvbnRhaW5lZCBpbiB0aGlzIGNvbXBvc2l0ZSBwcm92aWRlci5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3QgcHJvdmlkZXJzIGZvciBtZXRyaWMgZmlsdGVycyBhbmQgb3RoZXIgb3BlcmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyczogSVJ1bm5lclByb3ZpZGVyW107XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN0ZXAgZnVuY3Rpb24gdGFza3MgdGhhdCBleGVjdXRlIHRoZSBydW5uZXIuXG4gICAqXG4gICAqIENhbGxlZCBieSBHaXRodWJSdW5uZXJzIGFuZCBzaG91bGRuJ3QgYmUgY2FsbGVkIG1hbnVhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyBzcGVjaWZpYyBidWlsZCBwYXJhbWV0ZXJzXG4gICAqL1xuICBnZXRTdGVwRnVuY3Rpb25UYXNrKHBhcmFtZXRlcnM6IFJ1bm5lclJ1bnRpbWVQYXJhbWV0ZXJzKTogc3RlcGZ1bmN0aW9ucy5JQ2hhaW5hYmxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBtZXRob2QgdGhhdCBtb2RpZmllcyB0aGUgcm9sZSBvZiB0aGUgc3RhdGUgbWFjaGluZSBhZnRlciBhbGwgdGhlIHRhc2tzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgcG9saWN5XG4gICAqIHN0YXRlbWVudHMgdG8gdGhlIHN0YXRlIG1hY2hpbmUgcm9sZSB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgdGFzayByZXR1cm5lZCBmcm9tIHtAbGluayBnZXRTdGVwRnVuY3Rpb25UYXNrfS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlTWFjaGluZVJvbGUgcm9sZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgdGhhdCBleGVjdXRlcyB0aGUgdGFzayByZXR1cm5lZCBmcm9tIHtAbGluayBnZXRTdGVwRnVuY3Rpb25UYXNrfS5cbiAgICovXG4gIGdyYW50U3RhdGVNYWNoaW5lKHN0YXRlTWFjaGluZVJvbGU6IGlhbS5JR3JhbnRhYmxlKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJuIHN0YXR1c2VzIG9mIGFsbCBzdWItcHJvdmlkZXJzIHRvIGJlIHVzZWQgaW4gdGhlIG1haW4gc3RhdHVzIGZ1bmN0aW9uLiBBbHNvIGdpdmVzIHRoZSBzdGF0dXMgZnVuY3Rpb24gYW55IG5lZWRlZCBwZXJtaXNzaW9ucyB0byBxdWVyeSB0aGUgRG9ja2VyIGltYWdlcyBvciBBTUlzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdHVzRnVuY3Rpb25Sb2xlIGdyYW50YWJsZSBmb3IgdGhlIHN0YXR1cyBmdW5jdGlvblxuICAgKi9cbiAgc3RhdHVzKHN0YXR1c0Z1bmN0aW9uUm9sZTogaWFtLklHcmFudGFibGUpOiBJUnVubmVyUHJvdmlkZXJTdGF0dXNbXTtcbn1cblxuLyoqXG4gKiBTdG9yYWdlIG9wdGlvbnMgZm9yIHRoZSBydW5uZXIgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIEVCUyB2b2x1bWUgdHlwZVxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9FQlNWb2x1bWVUeXBlcy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IGBFYnNEZXZpY2VWb2x1bWVUeXBlLkdQMmBcbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZVR5cGU/OiBFYnNEZXZpY2VWb2x1bWVUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIEkvTyBvcGVyYXRpb25zIHBlciBzZWNvbmQgKElPUFMpIHRvIHByb3Zpc2lvbiBmb3IgdGhlIHZvbHVtZS5cbiAgICpcbiAgICogTXVzdCBvbmx5IGJlIHNldCBmb3IgYHZvbHVtZVR5cGVgOiBgRWJzRGV2aWNlVm9sdW1lVHlwZS5JTzFgXG4gICAqXG4gICAqIFRoZSBtYXhpbXVtIHJhdGlvIG9mIElPUFMgdG8gdm9sdW1lIHNpemUgKGluIEdpQikgaXMgNTA6MSwgc28gZm9yIDUsMDAwIHByb3Zpc2lvbmVkIElPUFMsXG4gICAqIHlvdSBuZWVkIGF0IGxlYXN0IDEwMCBHaUIgc3RvcmFnZSBvbiB0aGUgdm9sdW1lLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9FQlNWb2x1bWVUeXBlcy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZSwgcmVxdWlyZWQgZm9yIGBFYnNEZXZpY2VWb2x1bWVUeXBlLklPMWBcbiAgICovXG4gIHJlYWRvbmx5IGlvcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0aHJvdWdocHV0IHRoYXQgdGhlIHZvbHVtZSBzdXBwb3J0cywgaW4gTWlCL3NcbiAgICogVGFrZXMgYSBtaW5pbXVtIG9mIDEyNSBhbmQgbWF4aW11bSBvZiAxMDAwLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItdm9sdW1lLmh0bWwjY2ZuLWVjMi12b2x1bWUtdGhyb3VnaHB1dFxuICAgKiBAZGVmYXVsdCAtIDEyNSBNaUIvcy4gT25seSB2YWxpZCBvbiBncDMgdm9sdW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IHRocm91Z2hwdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIHByb3ZpZGVycyB3aXRoIGNvbW1vbiBtZXRob2RzIHVzZWQgYnkgYWxsIHByb3ZpZGVycy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VQcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBfcHJvcHM/OiBSdW5uZXJQcm92aWRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNkay5UYWdzLm9mKHRoaXMpLmFkZCgnR2l0SHViUnVubmVyczpQcm92aWRlcicsIHRoaXMubm9kZS5wYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBsYWJlbHNGcm9tUHJvcGVydGllcyhkZWZhdWx0TGFiZWw6IHN0cmluZywgcHJvcHNMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcm9wc0xhYmVsczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHByb3BzTGFiZWxzICYmIHByb3BzTGFiZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBzdXBwbHkgZWl0aGVyIGBsYWJlbGAgb3IgYGxhYmVsc2AgaW4gcnVubmVyIHByb3BlcnRpZXMsIGJ1dCBub3QgYm90aC4gVHJ5IHJlbW92aW5nIHRoZSBgbGFiZWxgIHByb3BlcnR5LicpO1xuICAgIH1cblxuICAgIGlmIChwcm9wc0xhYmVscykge1xuICAgICAgcmV0dXJuIHByb3BzTGFiZWxzO1xuICAgIH1cbiAgICBpZiAocHJvcHNMYWJlbCkge1xuICAgICAgcmV0dXJuIFtwcm9wc0xhYmVsXTtcbiAgICB9XG4gICAgcmV0dXJuIFtkZWZhdWx0TGFiZWxdO1xuICB9XG59XG5cbi8qKlxuICogVXNlIGN1c3RvbSByZXNvdXJjZSB0byBkZXRlcm1pbmUgdGhlIHJvb3QgZGV2aWNlIG5hbWUgb2YgYSBnaXZlbiBBTUksIExhdW5jaCBUZW1wbGF0ZSwgb3IgU1NNIHBhcmFtZXRlciBwb2ludGluZyB0byBBTUkuXG4gKlxuICogVE9ETyBtb3ZlIHNvbWV3aGVyZSBtb3JlIGNvbW1vbiBhcyBpdCdzIHVzZWQgYnkgYm90aCBwcm92aWRlcnMgYW5kIEFNSSBidWlsZGVyIG5vd1xuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYW1pUm9vdERldmljZShzY29wZTogQ29uc3RydWN0LCBhbWk/OiBzdHJpbmcpIHtcbiAgY29uc3QgY3JIYW5kbGVyID0gc2luZ2xldG9uTGFtYmRhKEFtaVJvb3REZXZpY2VGdW5jdGlvbiwgc2NvcGUsICdBTUkgUm9vdCBEZXZpY2UgUmVhZGVyJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQ3VzdG9tIHJlc291cmNlIGhhbmRsZXIgdGhhdCBkaXNjb3ZlcnMgdGhlIGJvb3QgZHJpdmUgZGV2aWNlIG5hbWUgZm9yIGEgZ2l2ZW4gQU1JJyxcbiAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygxKSxcbiAgICBsb2dHcm91cDogc2luZ2xldG9uTG9nR3JvdXAoc2NvcGUsIFNpbmdsZXRvbkxvZ1R5cGUuUlVOTkVSX0lNQUdFX0JVSUxEKSxcbiAgICBsb2dnaW5nRm9ybWF0OiBsYW1iZGEuTG9nZ2luZ0Zvcm1hdC5KU09OLFxuICAgIGluaXRpYWxQb2xpY3k6IFtcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdzc206R2V0UGFyYW1ldGVyJyxcbiAgICAgICAgICAnZWMyOkRlc2NyaWJlSW1hZ2VzJyxcbiAgICAgICAgICAnZWMyOkRlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucycsXG4gICAgICAgICAgJ2ltYWdlYnVpbGRlcjpHZXRJbWFnZScsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSxcbiAgICBdLFxuICB9KTtcblxuICByZXR1cm4gbmV3IEN1c3RvbVJlc291cmNlKHNjb3BlLCAnQU1JIFJvb3QgRGV2aWNlJywge1xuICAgIHNlcnZpY2VUb2tlbjogY3JIYW5kbGVyLmZ1bmN0aW9uQXJuLFxuICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6QW1pUm9vdERldmljZScsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgQW1pOiBhbWkgPz8gJycsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNob3J0ZW5lZCBzdGF0ZSBuYW1lIGZyb20gYSBjb25zdHJ1Y3QncyBwYXRoIGZvciB1c2UgaW4gQVdTIFN0ZXAgRnVuY3Rpb25zLlxuICogU3RlcCBGdW5jdGlvbnMgc3RhdGUgbmFtZXMgYXJlIGxpbWl0ZWQgdG8gODAgY2hhcmFjdGVycy4gVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYSBuYW1lXG4gKiBmcm9tIHRoZSBjb25zdHJ1Y3QncyBwYXRoICh3aXRob3V0IHRoZSBzdGFjayBuYW1lKSwgb3B0aW9uYWxseSBhcHBlbmRzIGEgc3VmZml4LCBhbmRcbiAqIHNob3J0ZW5zIGl0IGlmIG5lY2Vzc2FyeSBieSB0cnVuY2F0aW5nIGFuZCBhcHBlbmRpbmcgYSBoYXNoIHN1ZmZpeCB0byBlbnN1cmUgdW5pcXVlbmVzcy5cbiAqXG4gKiBAcGFyYW0gY29uc3RydWN0IFRoZSBjb25zdHJ1Y3QgdG8gZ2V0IHRoZSBwYXRoIGZyb21cbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgc3VmZml4IHRvIGFwcGVuZCB0byB0aGUgcGF0aCAoZS5nLiwgXCJkYXRhXCIsIFwicmFuZFwiLCBcImNob2ljZVwiKVxuICogQHJldHVybnMgQSBzaG9ydGVuZWQgc3RhdGUgbmFtZSB0aGF0IGZpdHMgd2l0aGluIEFXUyBTdGVwIEZ1bmN0aW9ucycgODAtY2hhcmFjdGVyIGxpbWl0XG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU3RhdGVOYW1lKGNvbnN0cnVjdDogQ29uc3RydWN0LCBzdWZmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBHZXQgY29uc3RydWN0IHBhdGggd2l0aG91dCBzdGFjayBuYW1lXG4gIGNvbnN0IGJhc2VQYXRoID0gY29uc3RydWN0Lm5vZGUucGF0aC5zcGxpdCgnLycpLnNsaWNlKDEpLmpvaW4oJy8nKTtcblxuICAvLyBCdWlsZCBmdWxsIG5hbWUgd2l0aCBvcHRpb25hbCBzdWZmaXhcbiAgY29uc3QgZnVsbE5hbWUgPSBzdWZmaXggPyBgJHtiYXNlUGF0aH0gJHtzdWZmaXh9YCA6IGJhc2VQYXRoO1xuXG4gIC8vIFNob3J0ZW4gaWYgbmVjZXNzYXJ5XG4gIGNvbnN0IG1heExlbmd0aCA9IDgwO1xuICBpZiAoZnVsbE5hbWUubGVuZ3RoIDw9IG1heExlbmd0aCkge1xuICAgIHJldHVybiBmdWxsTmFtZTtcbiAgfVxuXG4gIGNvbnN0IGhhc2hTdWZmaXggPSBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKGZ1bGxOYW1lKS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIDMpO1xuICBjb25zdCBzZXBhcmF0b3IgPSAnLSc7XG4gIGNvbnN0IHRydW5jYXRlZExlbmd0aCA9IG1heExlbmd0aCAtIGhhc2hTdWZmaXgubGVuZ3RoIC0gc2VwYXJhdG9yLmxlbmd0aDtcbiAgY29uc3QgdHJ1bmNhdGVkID0gZnVsbE5hbWUuc2xpY2UoMCwgdHJ1bmNhdGVkTGVuZ3RoKTtcbiAgcmV0dXJuIGAke3RydW5jYXRlZH0ke3NlcGFyYXRvcn0ke2hhc2hTdWZmaXh9YDtcbn1cbiJdfQ==