UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

157 lines 26.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsConsoleUrlFactory = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const monitoring_1 = require("../../monitoring"); class AwsConsoleUrlFactory { constructor(props) { this.awsAccountId = props.awsAccountId; this.awsAccountRegion = props.awsAccountRegion; } getAwsConsoleUrl(destinationUrl) { if (this.awsAccountId) { return aws_cdk_lib_1.Lazy.uncachedString({ produce: (context) => { if (destinationUrl) { return this.getResolvedDestinationUrl(context, destinationUrl); } // simply go to the home page of the AWS console return `https://${this.awsAccountRegion}.console.aws.amazon.com`; }, }); } return undefined; } getApiGatewayUrl(restApiId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/apigateway/home?region=${region}#/apis/${restApiId}/dashboard`; return this.getAwsConsoleUrl(destinationUrl); } getCloudFrontDistributionUrl(distributionId) { const destinationUrl = `https://console.aws.amazon.com/cloudfront/v2/home#/monitoring/${distributionId}`; return this.getAwsConsoleUrl(destinationUrl); } getCloudWatchLogGroupUrl(logGroupName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/cloudwatch/home?region=${region}#logsV2:log-groups/log-group/${logGroupName}`; return this.getAwsConsoleUrl(destinationUrl); } getCodeBuildProjectUrl(projectName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/codebuild/home?region=${region}#/projects/${projectName}`; return this.getAwsConsoleUrl(destinationUrl); } getDocumentDbClusterUrl(clusterId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/docdb/home?region=${region}#cluster-details/${clusterId}`; return this.getAwsConsoleUrl(destinationUrl); } getDynamoTableUrl(tableName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/dynamodb/home?region=${region}#tables:selected=${tableName}`; return this.getAwsConsoleUrl(destinationUrl); } getElastiCacheClusterUrl(clusterId, clusterType) { const region = this.awsAccountRegion; switch (clusterType) { case monitoring_1.ElastiCacheClusterType.MEMCACHED: const destinationUrlMemcached = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#/memcached/${clusterId}`; return this.getAwsConsoleUrl(destinationUrlMemcached); case monitoring_1.ElastiCacheClusterType.REDIS: const destinationUrlRedis = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#/redis/${clusterId}`; return this.getAwsConsoleUrl(destinationUrlRedis); default: throw new Error(`Invalid cache type: ${clusterType}`); } } getKinesisAnalyticsUrl(application) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/kinesisanalytics/home?region=${region}#/details?applicationName=${application}`; return this.getAwsConsoleUrl(destinationUrl); } getKinesisDataStreamUrl(streamName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/kinesis/home?region=${region}#/streams/details/${streamName}/monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getKinesisFirehoseDeliveryStreamUrl(streamName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/firehose/home?region=${region}#/details/${streamName}/monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getLambdaFunctionUrl(functionName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/lambda/home?region=${region}#/functions/${functionName}`; return this.getAwsConsoleUrl(destinationUrl); } getOpenSearchClusterUrl(domainName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/es/home?region=${region}#domain:resource=${domainName};action=dashboard;tab=TAB_CLUSTER_HEALTH_ID_V2`; return this.getAwsConsoleUrl(destinationUrl); } getOpenSearchServerlessCollectionUrl(collectionName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/aos/home?region=${region}#opensearch/collections/${collectionName}`; return this.getAwsConsoleUrl(destinationUrl); } getOsisPipelineUrl(pipelineName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/aos/osis/home?region=${region}#osis/ingestion-pipelines/${pipelineName}`; return this.getAwsConsoleUrl(destinationUrl); } getRdsClusterUrl(clusterId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/rds/home?region=${region}#database:id=${clusterId};is-cluster=true;tab=monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getRdsInstanceUrl(instanceId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/rds/home?region=${region}#database:id=${instanceId};is-cluster=false;tab=monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getRedshiftClusterUrl(clusterId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/redshiftv2/home?region=${region}#cluster-details?cluster=${clusterId}`; return this.getAwsConsoleUrl(destinationUrl); } getSnsTopicUrl(topicArn) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/sns/v3/home?region=${region}#/topic/${topicArn}`; return this.getAwsConsoleUrl(destinationUrl); } getStateMachineUrl(stateMachineArn) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/states/home?region=${region}#/statemachines/view/${stateMachineArn}`; return this.getAwsConsoleUrl(destinationUrl); } getSqsQueueUrl(queueUrl) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/sqs/v3/home?region=${region}#/queues/${queueUrl}`; return this.getAwsConsoleUrl(destinationUrl); } getS3BucketUrl(bucketName) { const region = this.awsAccountRegion; const destinationUrl = `https://s3.console.aws.amazon.com/s3/buckets/${bucketName}?region=${region}&tab=metrics`; return this.getAwsConsoleUrl(destinationUrl); } /** * Resolves a destination URL within a resolution context. * @param context The resolution context. * @param destinationUrl The destination URL to resolve since it may contain CDK tokens. * @see https://docs.aws.amazon.com/cdk/latest/guide/tokens.html */ getResolvedDestinationUrl(context, destinationUrl) { let resolvedDestination = context.resolve(destinationUrl); if (typeof resolvedDestination !== "string") { // keep unresolved since we do not know how to deal with objects resolvedDestination = destinationUrl; } return resolvedDestination; } } exports.AwsConsoleUrlFactory = AwsConsoleUrlFactory; _a = JSII_RTTI_SYMBOL_1; AwsConsoleUrlFactory[_a] = { fqn: "cdk-monitoring-constructs.AwsConsoleUrlFactory", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXdzQ29uc29sZVVybEZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBd3NDb25zb2xlVXJsRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFvRDtBQUVwRCxpREFBMEQ7QUFPMUQsTUFBYSxvQkFBb0I7SUFJL0IsWUFBWSxLQUFnQztRQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsY0FBdUI7UUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxrQkFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDekIsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ25CLElBQUksY0FBYyxFQUFFLENBQUM7d0JBQ25CLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDakUsQ0FBQztvQkFDRCxnREFBZ0Q7b0JBQ2hELE9BQU8sV0FBVyxJQUFJLENBQUMsZ0JBQWdCLHlCQUF5QixDQUFDO2dCQUNuRSxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQUcsV0FBVyxNQUFNLGtEQUFrRCxNQUFNLFVBQVUsU0FBUyxZQUFZLENBQUM7UUFDaEksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELDRCQUE0QixDQUFDLGNBQXNCO1FBQ2pELE1BQU0sY0FBYyxHQUFHLGlFQUFpRSxjQUFjLEVBQUUsQ0FB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TUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLFdBQVcsTUFBTSw4Q0FBOEMsTUFBTSxZQUFZLFFBQVEsRUFBRSxDQUFDO1FBQ25ILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxjQUFjLENBQUMsVUFBa0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLGdEQUFnRCxVQUFVLFdBQVcsTUFBTSxjQUFjLENBQUM7UUFDakgsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08seUJBQXlCLENBQ2pDLE9BQXdCLEVBQ3hCLGNBQXNCO1FBRXRCLElBQUksbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUUxRCxJQUFJLE9BQU8sbUJBQW1CLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUMsZ0VBQWdFO1lBQ2hFLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDOztBQXBMSCxvREFxTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUmVzb2x2ZUNvbnRleHQsIExhenkgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IHsgRWxhc3RpQ2FjaGVDbHVzdGVyVHlwZSB9IGZyb20gXCIuLi8uLi9tb25pdG9yaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ29uc29sZVVybEZhY3RvcnlQcm9wcyB7XG4gIHJlYWRvbmx5IGF3c0FjY291bnRJZDogc3RyaW5nO1xuICByZWFkb25seSBhd3NBY2NvdW50UmVnaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBd3NDb25zb2xlVXJsRmFjdG9yeSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBhd3NBY2NvdW50SWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF3c0FjY291bnRSZWdpb246IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQXdzQ29uc29sZVVybEZhY3RvcnlQcm9wcykge1xuICAgIHRoaXMuYXdzQWNjb3VudElkID0gcHJvcHMuYXdzQWNjb3VudElkO1xuICAgIHRoaXMuYXdzQWNjb3VudFJlZ2lvbiA9IHByb3BzLmF3c0FjY291bnRSZWdpb247XG4gIH1cblxuICBnZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5hd3NBY2NvdW50SWQpIHtcbiAgICAgIHJldHVybiBMYXp5LnVuY2FjaGVkU3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKGNvbnRleHQpID0+IHtcbiAgICAgICAgICBpZiAoZGVzdGluYXRpb25VcmwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFJlc29sdmVkRGVzdGluYXRpb25VcmwoY29udGV4dCwgZGVzdGluYXRpb25VcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzaW1wbHkgZ28gdG8gdGhlIGhvbWUgcGFnZSBvZiB0aGUgQVdTIGNvbnNvbGVcbiAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vJHt0aGlzLmF3c0FjY291bnRSZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb21gO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBcGlHYXRld2F5VXJsKHJlc3RBcGlJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvYXBpcy8ke3Jlc3RBcGlJZH0vZGFzaGJvYXJkYDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldENsb3VkRnJvbnREaXN0cmlidXRpb25VcmwoZGlzdHJpYnV0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly9jb25zb2xlLmF3cy5hbWF6b24uY29tL2Nsb3VkZnJvbnQvdjIvaG9tZSMvbW9uaXRvcmluZy8ke2Rpc3RyaWJ1dGlvbklkfWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRDbG91ZFdhdGNoTG9nR3JvdXBVcmwobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2Nsb3Vkd2F0Y2gvaG9tZT9yZWdpb249JHtyZWdpb259I2xvZ3NWMjpsb2ctZ3JvdXBzL2xvZy1ncm91cC8ke2xvZ0dyb3VwTmFtZX1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0Q29kZUJ1aWxkUHJvamVjdFVybChwcm9qZWN0TmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9jb2RlYnVpbGQvaG9tZT9yZWdpb249JHtyZWdpb259Iy9wcm9qZWN0cy8ke3Byb2plY3ROYW1lfWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXREb2N1bWVudERiQ2x1c3RlclVybChjbHVzdGVySWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vZG9jZGIvaG9tZT9yZWdpb249JHtyZWdpb259I2NsdXN0ZXItZGV0YWlscy8ke2NsdXN0ZXJJZH1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0RHluYW1vVGFibGVVcmwodGFibGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2R5bmFtb2RiL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSN0YWJsZXM6c2VsZWN0ZWQ9JHt0YWJsZU5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldEVsYXN0aUNhY2hlQ2x1c3RlclVybChcbiAgICBjbHVzdGVySWQ6IHN0cmluZyxcbiAgICBjbHVzdGVyVHlwZTogRWxhc3RpQ2FjaGVDbHVzdGVyVHlwZSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgc3dpdGNoIChjbHVzdGVyVHlwZSkge1xuICAgICAgY2FzZSBFbGFzdGlDYWNoZUNsdXN0ZXJUeXBlLk1FTUNBQ0hFRDpcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25VcmxNZW1jYWNoZWQgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9lbGFzdGljYWNoZS9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL21lbWNhY2hlZC8ke2NsdXN0ZXJJZH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsTWVtY2FjaGVkKTtcbiAgICAgIGNhc2UgRWxhc3RpQ2FjaGVDbHVzdGVyVHlwZS5SRURJUzpcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25VcmxSZWRpcyA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2VsYXN0aWNhY2hlL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvcmVkaXMvJHtjbHVzdGVySWR9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybFJlZGlzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjYWNoZSB0eXBlOiAke2NsdXN0ZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldEtpbmVzaXNBbmFseXRpY3NVcmwoYXBwbGljYXRpb246IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20va2luZXNpc2FuYWx5dGljcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL2RldGFpbHM/YXBwbGljYXRpb25OYW1lPSR7YXBwbGljYXRpb259YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldEtpbmVzaXNEYXRhU3RyZWFtVXJsKHN0cmVhbU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20va2luZXNpcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL3N0cmVhbXMvZGV0YWlscy8ke3N0cmVhbU5hbWV9L21vbml0b3JpbmdgO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0S2luZXNpc0ZpcmVob3NlRGVsaXZlcnlTdHJlYW1Vcmwoc3RyZWFtTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9maXJlaG9zZS9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL2RldGFpbHMvJHtzdHJlYW1OYW1lfS9tb25pdG9yaW5nYDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldExhbWJkYUZ1bmN0aW9uVXJsKGZ1bmN0aW9uTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9sYW1iZGEvaG9tZT9yZWdpb249JHtyZWdpb259Iy9mdW5jdGlvbnMvJHtmdW5jdGlvbk5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldE9wZW5TZWFyY2hDbHVzdGVyVXJsKGRvbWFpbk5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vZXMvaG9tZT9yZWdpb249JHtyZWdpb259I2RvbWFpbjpyZXNvdXJjZT0ke2RvbWFpbk5hbWV9O2FjdGlvbj1kYXNoYm9hcmQ7dGFiPVRBQl9DTFVTVEVSX0hFQUxUSF9JRF9WMmA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRPcGVuU2VhcmNoU2VydmVybGVzc0NvbGxlY3Rpb25VcmwoXG4gICAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9hb3MvaG9tZT9yZWdpb249JHtyZWdpb259I29wZW5zZWFyY2gvY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uTmFtZX1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0T3Npc1BpcGVsaW5lVXJsKHBpcGVsaW5lTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9hb3Mvb3Npcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jb3Npcy9pbmdlc3Rpb24tcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRSZHNDbHVzdGVyVXJsKGNsdXN0ZXJJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9yZHMvaG9tZT9yZWdpb249JHtyZWdpb259I2RhdGFiYXNlOmlkPSR7Y2x1c3RlcklkfTtpcy1jbHVzdGVyPXRydWU7dGFiPW1vbml0b3JpbmdgO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0UmRzSW5zdGFuY2VVcmwoaW5zdGFuY2VJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9yZHMvaG9tZT9yZWdpb249JHtyZWdpb259I2RhdGFiYXNlOmlkPSR7aW5zdGFuY2VJZH07aXMtY2x1c3Rlcj1mYWxzZTt0YWI9bW9uaXRvcmluZ2A7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRSZWRzaGlmdENsdXN0ZXJVcmwoY2x1c3RlcklkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0djIvaG9tZT9yZWdpb249JHtyZWdpb259I2NsdXN0ZXItZGV0YWlscz9jbHVzdGVyPSR7Y2x1c3RlcklkfWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRTbnNUb3BpY1VybCh0b3BpY0Fybjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9zbnMvdjMvaG9tZT9yZWdpb249JHtyZWdpb259Iy90b3BpYy8ke3RvcGljQXJufWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRTdGF0ZU1hY2hpbmVVcmwoc3RhdGVNYWNoaW5lQXJuOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3N0YXRlcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL3N0YXRlbWFjaGluZXMvdmlldy8ke3N0YXRlTWFjaGluZUFybn1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0U3FzUXVldWVVcmwocXVldWVVcmw6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vc3FzL3YzL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvcXVldWVzLyR7cXVldWVVcmx9YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldFMzQnVja2V0VXJsKGJ1Y2tldE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vczMuY29uc29sZS5hd3MuYW1hem9uLmNvbS9zMy9idWNrZXRzLyR7YnVja2V0TmFtZX0/cmVnaW9uPSR7cmVnaW9ufSZ0YWI9bWV0cmljc2A7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBkZXN0aW5hdGlvbiBVUkwgd2l0aGluIGEgcmVzb2x1dGlvbiBjb250ZXh0LlxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgcmVzb2x1dGlvbiBjb250ZXh0LlxuICAgKiBAcGFyYW0gZGVzdGluYXRpb25VcmwgVGhlIGRlc3RpbmF0aW9uIFVSTCB0byByZXNvbHZlIHNpbmNlIGl0IG1heSBjb250YWluIENESyB0b2tlbnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9sYXRlc3QvZ3VpZGUvdG9rZW5zLmh0bWxcbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZXNvbHZlZERlc3RpbmF0aW9uVXJsKFxuICAgIGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCxcbiAgICBkZXN0aW5hdGlvblVybDogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIGxldCByZXNvbHZlZERlc3RpbmF0aW9uID0gY29udGV4dC5yZXNvbHZlKGRlc3RpbmF0aW9uVXJsKTtcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWREZXN0aW5hdGlvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8ga2VlcCB1bnJlc29sdmVkIHNpbmNlIHdlIGRvIG5vdCBrbm93IGhvdyB0byBkZWFsIHdpdGggb2JqZWN0c1xuICAgICAgcmVzb2x2ZWREZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uVXJsO1xuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZERlc3RpbmF0aW9uO1xuICB9XG59XG4iXX0=