@aws-cdk/aws-eks-v2-alpha
Version:
The CDK Construct Library for AWS::EKS
315 lines • 34.4 kB
JavaScript
"use strict";
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AlbController = exports.AlbScheme = exports.AlbControllerVersion = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const fs = require("fs");
const path = require("path");
const constructs_1 = require("constructs");
const helm_chart_1 = require("./helm-chart");
const service_account_1 = require("./service-account");
const iam = require("aws-cdk-lib/aws-iam");
// v2 - keep this import as a separate section to reduce merge conflict when forward merging with the v2 branch.
// eslint-disable-next-line
const core_1 = require("aws-cdk-lib/core");
/**
* Controller version.
*
* Corresponds to the image tag of 'amazon/aws-load-balancer-controller' image.
*/
class AlbControllerVersion {
/**
* Specify a custom version and an associated helm chart version.
* Use this if the version you need is not available in one of the predefined versions.
* Note that in this case, you will also need to provide an IAM policy in the controller options.
*
* ALB controller version and helm chart version compatibility information can be found
* here: https://github.com/aws/eks-charts/blob/v0.0.133/stable/aws-load-balancer-controller/Chart.yaml
*
* @param version The version number.
* @param helmChartVersion The version of the helm chart. Version 1.4.1 is the default version to support legacy
* users.
*/
static of(version, helmChartVersion = '1.4.1') {
return new AlbControllerVersion(version, helmChartVersion, true);
}
constructor(
/**
* The version string.
*/
version,
/**
* The version of the helm chart to use.
*/
helmChartVersion,
/**
* Whether or not its a custom version.
*/
custom) {
this.version = version;
this.helmChartVersion = helmChartVersion;
this.custom = custom;
}
}
exports.AlbControllerVersion = AlbControllerVersion;
_a = JSII_RTTI_SYMBOL_1;
AlbControllerVersion[_a] = { fqn: "@aws-cdk/aws-eks-v2-alpha.AlbControllerVersion", version: "2.208.0-alpha.0" };
/**
* v2.0.0
*/
AlbControllerVersion.V2_0_0 = new AlbControllerVersion('v2.0.0', '1.4.1', false);
/**
* v2.0.1
*/
AlbControllerVersion.V2_0_1 = new AlbControllerVersion('v2.0.1', '1.4.1', false);
/**
* v2.1.0
*/
AlbControllerVersion.V2_1_0 = new AlbControllerVersion('v2.1.0', '1.4.1', false);
/**
* v2.1.1
*/
AlbControllerVersion.V2_1_1 = new AlbControllerVersion('v2.1.1', '1.4.1', false);
/**
* v2.1.2
*/
AlbControllerVersion.V2_1_2 = new AlbControllerVersion('v2.1.2', '1.4.1', false);
/**
* v2.1.3
*/
AlbControllerVersion.V2_1_3 = new AlbControllerVersion('v2.1.3', '1.4.1', false);
/**
* v2.0.0
*/
AlbControllerVersion.V2_2_0 = new AlbControllerVersion('v2.2.0', '1.4.1', false);
/**
* v2.2.1
*/
AlbControllerVersion.V2_2_1 = new AlbControllerVersion('v2.2.1', '1.4.1', false);
/**
* v2.2.2
*/
AlbControllerVersion.V2_2_2 = new AlbControllerVersion('v2.2.2', '1.4.1', false);
/**
* v2.2.3
*/
AlbControllerVersion.V2_2_3 = new AlbControllerVersion('v2.2.3', '1.4.1', false);
/**
* v2.2.4
*/
AlbControllerVersion.V2_2_4 = new AlbControllerVersion('v2.2.4', '1.4.1', false);
/**
* v2.3.0
*/
AlbControllerVersion.V2_3_0 = new AlbControllerVersion('v2.3.0', '1.4.1', false);
/**
* v2.3.1
*/
AlbControllerVersion.V2_3_1 = new AlbControllerVersion('v2.3.1', '1.4.1', false);
/**
* v2.4.1
*/
AlbControllerVersion.V2_4_1 = new AlbControllerVersion('v2.4.1', '1.4.1', false);
/**
* v2.4.2
*/
AlbControllerVersion.V2_4_2 = new AlbControllerVersion('v2.4.2', '1.4.3', false);
/**
* v2.4.3
*/
AlbControllerVersion.V2_4_3 = new AlbControllerVersion('v2.4.3', '1.4.4', false);
/**
* v2.4.4
*/
AlbControllerVersion.V2_4_4 = new AlbControllerVersion('v2.4.4', '1.4.5', false);
/**
* v2.4.5
*/
AlbControllerVersion.V2_4_5 = new AlbControllerVersion('v2.4.5', '1.4.6', false);
/**
* v2.4.6
*/
AlbControllerVersion.V2_4_6 = new AlbControllerVersion('v2.4.6', '1.4.7', false);
/**
* v2.4.7
*/
AlbControllerVersion.V2_4_7 = new AlbControllerVersion('v2.4.7', '1.4.8', false);
/**
* v2.5.0
*/
AlbControllerVersion.V2_5_0 = new AlbControllerVersion('v2.5.0', '1.5.0', false);
/**
* v2.5.1
*/
AlbControllerVersion.V2_5_1 = new AlbControllerVersion('v2.5.1', '1.5.2', false);
/**
* v2.5.2
*/
AlbControllerVersion.V2_5_2 = new AlbControllerVersion('v2.5.2', '1.5.3', false);
/**
* v2.5.3
*/
AlbControllerVersion.V2_5_3 = new AlbControllerVersion('v2.5.3', '1.5.4', false);
/**
* v2.5.4
*/
AlbControllerVersion.V2_5_4 = new AlbControllerVersion('v2.5.4', '1.5.5', false);
/**
* v2.6.0
*/
AlbControllerVersion.V2_6_0 = new AlbControllerVersion('v2.6.0', '1.6.0', false);
/**
* v2.6.1
*/
AlbControllerVersion.V2_6_1 = new AlbControllerVersion('v2.6.1', '1.6.1', false);
/**
* v2.6.2
*/
AlbControllerVersion.V2_6_2 = new AlbControllerVersion('v2.6.2', '1.6.2', false);
/**
* v2.7.0
*/
AlbControllerVersion.V2_7_0 = new AlbControllerVersion('v2.7.0', '1.7.0', false);
/**
* v2.7.1
*/
AlbControllerVersion.V2_7_1 = new AlbControllerVersion('v2.7.1', '1.7.1', false);
/**
* v2.7.2
*/
AlbControllerVersion.V2_7_2 = new AlbControllerVersion('v2.7.2', '1.7.2', false);
/**
* v2.8.0
*/
AlbControllerVersion.V2_8_0 = new AlbControllerVersion('v2.8.0', '1.8.0', false);
/**
* v2.8.1
*/
AlbControllerVersion.V2_8_1 = new AlbControllerVersion('v2.8.1', '1.8.1', false);
/**
* v2.8.2
*/
AlbControllerVersion.V2_8_2 = new AlbControllerVersion('v2.8.2', '1.8.2', false);
/**
* ALB Scheme.
*
* @see https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.3/guide/ingress/annotations/#scheme
*/
var AlbScheme;
(function (AlbScheme) {
/**
* The nodes of an internal load balancer have only private IP addresses.
* The DNS name of an internal load balancer is publicly resolvable to the private IP addresses of the nodes.
* Therefore, internal load balancers can only route requests from clients with access to the VPC for the load balancer.
*/
AlbScheme["INTERNAL"] = "internal";
/**
* An internet-facing load balancer has a publicly resolvable DNS name, so it can route requests from clients over the internet
* to the EC2 instances that are registered with the load balancer.
*/
AlbScheme["INTERNET_FACING"] = "internet-facing";
})(AlbScheme || (exports.AlbScheme = AlbScheme = {}));
/**
* Construct for installing the AWS ALB Contoller on EKS clusters.
*
* Use the factory functions `get` and `getOrCreate` to obtain/create instances of this controller.
*
* @see https://kubernetes-sigs.github.io/aws-load-balancer-controller
*
*/
class AlbController extends constructs_1.Construct {
/**
* Create the controller construct associated with this cluster and scope.
*
* Singleton per stack/cluster.
*/
static create(scope, props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_AlbControllerProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.create);
}
throw error;
}
const stack = core_1.Stack.of(scope);
const uid = AlbController.uid(props.cluster);
return new AlbController(stack, uid, props);
}
static uid(cluster) {
return `${core_1.Names.nodeUniqueId(cluster.node)}-AlbController`;
}
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_AlbControllerProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, AlbController);
}
throw error;
}
const namespace = 'kube-system';
const serviceAccount = new service_account_1.ServiceAccount(this, 'alb-sa', { namespace, name: 'aws-load-balancer-controller', cluster: props.cluster });
if (props.version.custom && !props.policy) {
throw new Error("'albControllerOptions.policy' is required when using a custom controller version");
}
// https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/deploy/installation/#iam-permissions
const policy = props.policy ?? JSON.parse(fs.readFileSync(path.join(__dirname, 'addons', `alb-iam_policy-${props.version.version}.json`), 'utf8'));
for (const statement of policy.Statement) {
const rewrittenStatement = {
...statement,
Resource: this.rewritePolicyResources(statement.Resource),
};
serviceAccount.addToPrincipalPolicy(iam.PolicyStatement.fromJson(rewrittenStatement));
}
// https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/deploy/installation/#add-controller-to-cluster
const chart = new helm_chart_1.HelmChart(this, 'Resource', {
cluster: props.cluster,
chart: 'aws-load-balancer-controller',
repository: 'https://aws.github.io/eks-charts',
namespace,
release: 'aws-load-balancer-controller',
version: props.version.helmChartVersion,
wait: true,
timeout: core_1.Duration.minutes(15),
values: {
clusterName: props.cluster.clusterName,
serviceAccount: {
create: false,
name: serviceAccount.serviceAccountName,
},
region: core_1.Stack.of(this).region,
vpcId: props.cluster.vpc.vpcId,
image: {
repository: props.repository ?? '602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon/aws-load-balancer-controller',
tag: props.version.version,
},
},
});
// the controller relies on permissions deployed using these resources.
chart.node.addDependency(serviceAccount);
chart.node.addDependency(props.cluster.openIdConnectProvider);
}
rewritePolicyResources(resources) {
// This is safe to disable because we're actually replacing the literal partition with a reference to
// the stack partition (which is hardcoded into the JSON files) to prevent issues such as
// aws/aws-cdk#22520.
// eslint-disable-next-line @cdklabs/no-literal-partition
const rewriteResource = (s) => s.replace('arn:aws:', `arn:${core_1.Aws.PARTITION}:`);
if (!resources) {
return resources;
}
if (!Array.isArray(resources)) {
return rewriteResource(resources);
}
return resources.map(rewriteResource);
}
}
exports.AlbController = AlbController;
_b = JSII_RTTI_SYMBOL_1;
AlbController[_b] = { fqn: "@aws-cdk/aws-eks-v2-alpha.AlbController", version: "2.208.0-alpha.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxiLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhbGItY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDJDQUF1QztBQUV2Qyw2Q0FBeUM7QUFDekMsdURBQW1EO0FBQ25ELDJDQUEyQztBQUUzQyxnSEFBZ0g7QUFDaEgsMkJBQTJCO0FBQzNCLDJDQUErRDtBQUUvRDs7OztHQUlHO0FBQ0gsTUFBYSxvQkFBb0I7SUEySy9COzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFlLEVBQUUsbUJBQTJCLE9BQU87UUFDbEUsT0FBTyxJQUFJLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNsRTtJQUVEO0lBQ0U7O09BRUc7SUFDYSxPQUFlO0lBQy9COztPQUVHO0lBQ2EsZ0JBQXdCO0lBQ3hDOztPQUVHO0lBQ2EsTUFBZTtRQVJmLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFJZixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVE7UUFJeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUztLQUFLOztBQXZNeEMsb0RBd01DOzs7QUF2TUM7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFDb0IsMkJBQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkY7O0dBRUc7QUFD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SyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0tBQy9EO0lBRU8sc0JBQXNCLENBQUMsU0FBd0M7UUFDckUscUdBQXFHO1FBQ3JHLHlGQUF5RjtRQUN6RixxQkFBcUI7UUFDckIseURBQXlEO1FBQ3pELE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLFVBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRXRGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDdkM7O0FBbEZILHNDQW1GQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENsdXN0ZXIgfSBmcm9tICcuL2NsdXN0ZXInO1xuaW1wb3J0IHsgSGVsbUNoYXJ0IH0gZnJvbSAnLi9oZWxtLWNoYXJ0JztcbmltcG9ydCB7IFNlcnZpY2VBY2NvdW50IH0gZnJvbSAnLi9zZXJ2aWNlLWFjY291bnQnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuXG4vLyB2MiAtIGtlZXAgdGhpcyBpbXBvcnQgYXMgYSBzZXBhcmF0ZSBzZWN0aW9uIHRvIHJlZHVjZSBtZXJnZSBjb25mbGljdCB3aGVuIGZvcndhcmQgbWVyZ2luZyB3aXRoIHRoZSB2MiBicmFuY2guXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCB7IEF3cywgRHVyYXRpb24sIE5hbWVzLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuXG4vKipcbiAqIENvbnRyb2xsZXIgdmVyc2lvbi5cbiAqXG4gKiBDb3JyZXNwb25kcyB0byB0aGUgaW1hZ2UgdGFnIG9mICdhbWF6b24vYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlcicgaW1hZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbGJDb250cm9sbGVyVmVyc2lvbiB7XG4gIC8qKlxuICAgKiB2Mi4wLjBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfMF8wID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi4wLjAnLCAnMS40LjEnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjAuMVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl8wXzEgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjAuMScsICcxLjQuMScsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuMS4wXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzFfMCA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuMS4wJywgJzEuNC4xJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi4xLjFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfMV8xID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi4xLjEnLCAnMS40LjEnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjEuMlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl8xXzIgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjEuMicsICcxLjQuMScsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuMS4zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzFfMyA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuMS4zJywgJzEuNC4xJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi4wLjBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfMl8wID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi4yLjAnLCAnMS40LjEnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjIuMVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl8yXzEgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjIuMScsICcxLjQuMScsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuMi4yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzJfMiA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuMi4yJywgJzEuNC4xJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi4yLjNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfMl8zID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi4yLjMnLCAnMS40LjEnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjIuNFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl8yXzQgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjIuNCcsICcxLjQuMScsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuMy4wXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzNfMCA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuMy4wJywgJzEuNC4xJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi4zLjFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfM18xID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi4zLjEnLCAnMS40LjEnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjQuMVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl80XzEgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjQuMScsICcxLjQuMScsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuNC4yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzRfMiA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuNC4yJywgJzEuNC4zJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi40LjNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfNF8zID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi40LjMnLCAnMS40LjQnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjQuNFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl80XzQgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjQuNCcsICcxLjQuNScsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuNC41XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzRfNSA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuNC41JywgJzEuNC42JywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi40LjZcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfNF82ID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi40LjYnLCAnMS40LjcnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjQuN1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl80XzcgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjQuNycsICcxLjQuOCcsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuNS4wXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzVfMCA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuNS4wJywgJzEuNS4wJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi41LjFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfNV8xID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi41LjEnLCAnMS41LjInLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjUuMlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl81XzIgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjUuMicsICcxLjUuMycsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuNS4zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzVfMyA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuNS4zJywgJzEuNS40JywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi41LjRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfNV80ID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi41LjQnLCAnMS41LjUnLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjYuMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl82XzAgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjYuMCcsICcxLjYuMCcsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuNi4xXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzZfMSA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuNi4xJywgJzEuNi4xJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi42LjJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfNl8yID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi42LjInLCAnMS42LjInLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjcuMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl83XzAgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjcuMCcsICcxLjcuMCcsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuNy4xXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzdfMSA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuNy4xJywgJzEuNy4xJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi43LjJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfN18yID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi43LjInLCAnMS43LjInLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIHYyLjguMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMl84XzAgPSBuZXcgQWxiQ29udHJvbGxlclZlcnNpb24oJ3YyLjguMCcsICcxLjguMCcsIGZhbHNlKTtcblxuICAvKipcbiAgICogdjIuOC4xXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYyXzhfMSA9IG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbigndjIuOC4xJywgJzEuOC4xJywgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiB2Mi44LjJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfOF8yID0gbmV3IEFsYkNvbnRyb2xsZXJWZXJzaW9uKCd2Mi44LjInLCAnMS44LjInLCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gdmVyc2lvbiBhbmQgYW4gYXNzb2NpYXRlZCBoZWxtIGNoYXJ0IHZlcnNpb24uXG4gICAqIFVzZSB0aGlzIGlmIHRoZSB2ZXJzaW9uIHlvdSBuZWVkIGlzIG5vdCBhdmFpbGFibGUgaW4gb25lIG9mIHRoZSBwcmVkZWZpbmVkIHZlcnNpb25zLlxuICAgKiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlLCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhbiBJQU0gcG9saWN5IGluIHRoZSBjb250cm9sbGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEFMQiBjb250cm9sbGVyIHZlcnNpb24gYW5kIGhlbG0gY2hhcnQgdmVyc2lvbiBjb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZFxuICAgKiBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2Vrcy1jaGFydHMvYmxvYi92MC4wLjEzMy9zdGFibGUvYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlci9DaGFydC55YW1sXG4gICAqXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICogQHBhcmFtIGhlbG1DaGFydFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGhlbG0gY2hhcnQuIFZlcnNpb24gMS40LjEgaXMgdGhlIGRlZmF1bHQgdmVyc2lvbiB0byBzdXBwb3J0IGxlZ2FjeVxuICAgKiB1c2Vycy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmVyc2lvbjogc3RyaW5nLCBoZWxtQ2hhcnRWZXJzaW9uOiBzdHJpbmcgPSAnMS40LjEnKSB7XG4gICAgcmV0dXJuIG5ldyBBbGJDb250cm9sbGVyVmVyc2lvbih2ZXJzaW9uLCBoZWxtQ2hhcnRWZXJzaW9uLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGhlbG0gY2hhcnQgdG8gdXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBoZWxtQ2hhcnRWZXJzaW9uOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgaXRzIGEgY3VzdG9tIHZlcnNpb24uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGN1c3RvbTogYm9vbGVhbikgeyB9XG59XG5cbi8qKlxuICogQUxCIFNjaGVtZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy1zaWdzLmdpdGh1Yi5pby9hd3MtbG9hZC1iYWxhbmNlci1jb250cm9sbGVyL3YyLjMvZ3VpZGUvaW5ncmVzcy9hbm5vdGF0aW9ucy8jc2NoZW1lXG4gKi9cbmV4cG9ydCBlbnVtIEFsYlNjaGVtZSB7XG5cbiAgLyoqXG4gICAqIFRoZSBub2RlcyBvZiBhbiBpbnRlcm5hbCBsb2FkIGJhbGFuY2VyIGhhdmUgb25seSBwcml2YXRlIElQIGFkZHJlc3Nlcy5cbiAgICogVGhlIEROUyBuYW1lIG9mIGFuIGludGVybmFsIGxvYWQgYmFsYW5jZXIgaXMgcHVibGljbHkgcmVzb2x2YWJsZSB0byB0aGUgcHJpdmF0ZSBJUCBhZGRyZXNzZXMgb2YgdGhlIG5vZGVzLlxuICAgKiBUaGVyZWZvcmUsIGludGVybmFsIGxvYWQgYmFsYW5jZXJzIGNhbiBvbmx5IHJvdXRlIHJlcXVlc3RzIGZyb20gY2xpZW50cyB3aXRoIGFjY2VzcyB0byB0aGUgVlBDIGZvciB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIElOVEVSTkFMID0gJ2ludGVybmFsJyxcblxuICAvKipcbiAgICogQW4gaW50ZXJuZXQtZmFjaW5nIGxvYWQgYmFsYW5jZXIgaGFzIGEgcHVibGljbHkgcmVzb2x2YWJsZSBETlMgbmFtZSwgc28gaXQgY2FuIHJvdXRlIHJlcXVlc3RzIGZyb20gY2xpZW50cyBvdmVyIHRoZSBpbnRlcm5ldFxuICAgKiB0byB0aGUgRUMyIGluc3RhbmNlcyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBJTlRFUk5FVF9GQUNJTkcgPSAnaW50ZXJuZXQtZmFjaW5nJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgQWxiQ29udHJvbGxlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxiQ29udHJvbGxlck9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBjb250cm9sbGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogQWxiQ29udHJvbGxlclZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvc2l0b3J5IHRvIHB1bGwgdGhlIGNvbnRyb2xsZXIgaW1hZ2UgZnJvbS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgd29ya3MgZm9yIG1vc3QgcmVnaW9ucywgYnV0IG5vdCBhbGwuXG4gICAqIElmIHRoZSByZXBvc2l0b3J5IGlzIG5vdCBhcHBsaWNhYmxlIHRvIHlvdXIgcmVnaW9uLCB1c2UgYSBjdXN0b20gcmVwb3NpdG9yeVxuICAgKiBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9rdWJlcm5ldGVzLXNpZ3MvYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlci9yZWxlYXNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgJzYwMjQwMTE0MzQ1Mi5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL2FtYXpvbi9hd3MtbG9hZC1iYWxhbmNlci1jb250cm9sbGVyJ1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSBwb2xpY3kgdG8gYXBwbHkgdG8gdGhlIHNlcnZpY2UgYWNjb3VudC5cbiAgICpcbiAgICogSWYgeW91J3JlIHVzaW5nIG9uZSBvZiB0aGUgYnVpbHQtaW4gdmVyc2lvbnMsIHRoaXMgaXMgbm90IHJlcXVpcmVkIHNpbmNlXG4gICAqIENESyBzaGlwcyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwb2xpY2llcyBmb3IgdGhvc2UgdmVyc2lvbnMuXG4gICAqXG4gICAqIEhvd2V2ZXIsIGlmIHlvdSBhcmUgdXNpbmcgYSBjdXN0b20gdmVyc2lvbiwgdGhpcyBpcyByZXF1aXJlZCAoYW5kIHZhbGlkYXRlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ29ycmVzcG9uZHMgdG8gdGhlIHByZWRlZmluZWQgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeT86IGFueTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBgQWxiQ29udHJvbGxlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxiQ29udHJvbGxlclByb3BzIGV4dGVuZHMgQWxiQ29udHJvbGxlck9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKiBDbHVzdGVyIHRvIGluc3RhbGwgdGhlIGNvbnRyb2xsZXIgb250by5cbiAgICovXG4gIHJlYWRvbmx5IGNsdXN0ZXI6IENsdXN0ZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGZvciBpbnN0YWxsaW5nIHRoZSBBV1MgQUxCIENvbnRvbGxlciBvbiBFS1MgY2x1c3RlcnMuXG4gKlxuICogVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBgZ2V0YCBhbmQgYGdldE9yQ3JlYXRlYCB0byBvYnRhaW4vY3JlYXRlIGluc3RhbmNlcyBvZiB0aGlzIGNvbnRyb2xsZXIuXG4gKlxuICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMtc2lncy5naXRodWIuaW8vYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlclxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEFsYkNvbnRyb2xsZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb250cm9sbGVyIGNvbnN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbHVzdGVyIGFuZCBzY29wZS5cbiAgICpcbiAgICogU2luZ2xldG9uIHBlciBzdGFjay9jbHVzdGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IEFsYkNvbnRyb2xsZXJQcm9wcykge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIGNvbnN0IHVpZCA9IEFsYkNvbnRyb2xsZXIudWlkKHByb3BzLmNsdXN0ZXIpO1xuICAgIHJldHVybiBuZXcgQWxiQ29udHJvbGxlcihzdGFjaywgdWlkLCBwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB1aWQoY2x1c3RlcjogQ2x1c3Rlcikge1xuICAgIHJldHVybiBgJHtOYW1lcy5ub2RlVW5pcXVlSWQoY2x1c3Rlci5ub2RlKX0tQWxiQ29udHJvbGxlcmA7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFsYkNvbnRyb2xsZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBuYW1lc3BhY2UgPSAna3ViZS1zeXN0ZW0nO1xuICAgIGNvbnN0IHNlcnZpY2VBY2NvdW50ID0gbmV3IFNlcnZpY2VBY2NvdW50KHRoaXMsICdhbGItc2EnLCB7IG5hbWVzcGFjZSwgbmFtZTogJ2F3cy1sb2FkLWJhbGFuY2VyLWNvbnRyb2xsZXInLCBjbHVzdGVyOiBwcm9wcy5jbHVzdGVyIH0pO1xuXG4gICAgaWYgKHByb3BzLnZlcnNpb24uY3VzdG9tICYmICFwcm9wcy5wb2xpY3kpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIidhbGJDb250cm9sbGVyT3B0aW9ucy5wb2xpY3knIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgYSBjdXN0b20gY29udHJvbGxlciB2ZXJzaW9uXCIpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8va3ViZXJuZXRlcy1zaWdzLmdpdGh1Yi5pby9hd3MtbG9hZC1iYWxhbmNlci1jb250cm9sbGVyL3YyLjIvZGVwbG95L2luc3RhbGxhdGlvbi8jaWFtLXBlcm1pc3Npb25zXG4gICAgY29uc3QgcG9saWN5OiBhbnkgPSBwcm9wcy5wb2xpY3kgPz8gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJ2FkZG9ucycsIGBhbGItaWFtX3BvbGljeS0ke3Byb3BzLnZlcnNpb24udmVyc2lvbn0uanNvbmApLCAndXRmOCcpKTtcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHBvbGljeS5TdGF0ZW1lbnQpIHtcbiAgICAgIGNvbnN0IHJld3JpdHRlblN0YXRlbWVudCA9IHtcbiAgICAgICAgLi4uc3RhdGVtZW50LFxuICAgICAgICBSZXNvdXJjZTogdGhpcy5yZXdyaXRlUG9saWN5UmVzb3VyY2VzKHN0YXRlbWVudC5SZXNvdXJjZSksXG4gICAgICB9O1xuICAgICAgc2VydmljZUFjY291bnQuYWRkVG9QcmluY2lwYWxQb2xpY3koaWFtLlBvbGljeVN0YXRlbWVudC5mcm9tSnNvbihyZXdyaXR0ZW5TdGF0ZW1lbnQpKTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2t1YmVybmV0ZXMtc2lncy5naXRodWIuaW8vYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlci92Mi4yL2RlcGxveS9pbnN0YWxsYXRpb24vI2FkZC1jb250cm9sbGVyLXRvLWNsdXN0ZXJcbiAgICBjb25zdCBjaGFydCA9IG5ldyBIZWxtQ2hhcnQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgY2x1c3RlcjogcHJvcHMuY2x1c3RlcixcbiAgICAgIGNoYXJ0OiAnYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlcicsXG4gICAgICByZXBvc2l0b3J5OiAnaHR0cHM6Ly9hd3MuZ2l0aHViLmlvL2Vrcy1jaGFydHMnLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgcmVsZWFzZTogJ2F3cy1sb2FkLWJhbGFuY2VyLWNvbnRyb2xsZXInLFxuICAgICAgdmVyc2lvbjogcHJvcHMudmVyc2lvbi5oZWxtQ2hhcnRWZXJzaW9uLFxuXG4gICAgICB3YWl0OiB0cnVlLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXIuY2x1c3Rlck5hbWUsXG4gICAgICAgIHNlcnZpY2VBY2NvdW50OiB7XG4gICAgICAgICAgY3JlYXRlOiBmYWxzZSxcbiAgICAgICAgICBuYW1lOiBzZXJ2aWNlQWNjb3VudC5zZXJ2aWNlQWNjb3VudE5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHJlZ2lvbjogU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgICB2cGNJZDogcHJvcHMuY2x1c3Rlci52cGMudnBjSWQsXG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgcmVwb3NpdG9yeTogcHJvcHMucmVwb3NpdG9yeSA/PyAnNjAyNDAxMTQzNDUyLmRrci5lY3IudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20vYW1hem9uL2F3cy1sb2FkLWJhbGFuY2VyLWNvbnRyb2xsZXInLFxuICAgICAgICAgIHRhZzogcHJvcHMudmVyc2lvbi52ZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHRoZSBjb250cm9sbGVyIHJlbGllcyBvbiBwZXJtaXNzaW9ucyBkZXBsb3llZCB1c2luZyB0aGVzZSByZXNvdXJjZXMuXG4gICAgY2hhcnQubm9kZS5hZGREZXBlbmRlbmN5KHNlcnZpY2VBY2NvdW50KTtcbiAgICBjaGFydC5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMuY2x1c3Rlci5vcGVuSWRDb25uZWN0UHJvdmlkZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXdyaXRlUG9saWN5UmVzb3VyY2VzKHJlc291cmNlczogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBzYWZlIHRvIGRpc2FibGUgYmVjYXVzZSB3ZSdyZSBhY3R1YWxseSByZXBsYWNpbmcgdGhlIGxpdGVyYWwgcGFydGl0aW9uIHdpdGggYSByZWZlcmVuY2UgdG9cbiAgICAvLyB0aGUgc3RhY2sgcGFydGl0aW9uICh3aGljaCBpcyBoYXJkY29kZWQgaW50byB0aGUgSlNPTiBmaWxlcykgdG8gcHJldmVudCBpc3N1ZXMgc3VjaCBhc1xuICAgIC8vIGF3cy9hd3MtY2RrIzIyNTIwLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvblxuICAgIGNvbnN0IHJld3JpdGVSZXNvdXJjZSA9IChzOiBzdHJpbmcpID0+IHMucmVwbGFjZSgnYXJuOmF3czonLCBgYXJuOiR7QXdzLlBBUlRJVElPTn06YCk7XG5cbiAgICBpZiAoIXJlc291cmNlcykge1xuICAgICAgcmV0dXJuIHJlc291cmNlcztcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc291cmNlcykpIHtcbiAgICAgIHJldHVybiByZXdyaXRlUmVzb3VyY2UocmVzb3VyY2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlcy5tYXAocmV3cml0ZVJlc291cmNlKTtcbiAgfVxufVxuIl19