UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

870 lines 82.3 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransformCustom = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [transform-custom](https://docs.aws.amazon.com/service-authorization/latest/reference/list_transform-custom.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class TransformCustom extends shared_1.PolicyStatement {
    /**
     * Grants permission to invoke BatchCreateFindings on AWS Transform custom
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toBatchCreateFindings() {
        return this.to('BatchCreateFindings');
    }
    /**
     * Grants permission to invoke BatchUpdateFindings on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toBatchUpdateFindings() {
        return this.to('BatchUpdateFindings');
    }
    /**
     * Grants permission to invoke CompleteTransformationPackageUpload on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toCompleteTransformationPackageUpload() {
        return this.to('CompleteTransformationPackageUpload');
    }
    /**
     * Grants permission to invoke ConverseStream on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toConverseStream() {
        return this.to('ConverseStream');
    }
    /**
     * Grants permission to invoke CreateAnalysis on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toCreateAnalysis() {
        return this.to('CreateAnalysis');
    }
    /**
     * Grants permission to invoke CreateCampaign on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toCreateCampaign() {
        return this.to('CreateCampaign');
    }
    /**
     * Grants permission to invoke CreateRemediation on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toCreateRemediation() {
        return this.to('CreateRemediation');
    }
    /**
     * Grants permission to invoke CreateRepository on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toCreateRepository() {
        return this.to('CreateRepository');
    }
    /**
     * Grants permission to invoke CreateSource on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toCreateSource() {
        return this.to('CreateSource');
    }
    /**
     * Grants permission to invoke CreateTransformationPackageUrl on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toCreateTransformationPackageUrl() {
        return this.to('CreateTransformationPackageUrl');
    }
    /**
     * Grants permission to invoke DeleteAnalysis on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteAnalysis() {
        return this.to('DeleteAnalysis');
    }
    /**
     * Grants permission to invoke DeleteCampaign on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteCampaign() {
        return this.to('DeleteCampaign');
    }
    /**
     * Grants permission to invoke DeleteFinding on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteFinding() {
        return this.to('DeleteFinding');
    }
    /**
     * Grants permission to invoke DeleteKnowledgeItem on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteKnowledgeItem() {
        return this.to('DeleteKnowledgeItem');
    }
    /**
     * Grants permission to invoke DeleteRemediation on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteRemediation() {
        return this.to('DeleteRemediation');
    }
    /**
     * Grants permission to invoke DeleteRepository on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteRepository() {
        return this.to('DeleteRepository');
    }
    /**
     * Grants permission to invoke DeleteSource on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteSource() {
        return this.to('DeleteSource');
    }
    /**
     * Grants permission to invoke DeleteTransformationPackage on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toDeleteTransformationPackage() {
        return this.to('DeleteTransformationPackage');
    }
    /**
     * Grants permission to invoke ExecuteTransformation on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toExecuteTransformation() {
        return this.to('ExecuteTransformation');
    }
    /**
     * Grants permission to invoke GetAnalysis on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetAnalysis() {
        return this.to('GetAnalysis');
    }
    /**
     * Grants permission to invoke GetAnalysisArtifactDownloadUrl on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetAnalysisArtifactDownloadUrl() {
        return this.to('GetAnalysisArtifactDownloadUrl');
    }
    /**
     * Grants permission to invoke GetCampaign on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetCampaign() {
        return this.to('GetCampaign');
    }
    /**
     * Grants permission to invoke GetFinding on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetFinding() {
        return this.to('GetFinding');
    }
    /**
     * Grants permission to invoke GetFindingGroups on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetFindingGroups() {
        return this.to('GetFindingGroups');
    }
    /**
     * Grants permission to invoke GetKnowledgeItem on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetKnowledgeItem() {
        return this.to('GetKnowledgeItem');
    }
    /**
     * Grants permission to invoke GetRemediation on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetRemediation() {
        return this.to('GetRemediation');
    }
    /**
     * Grants permission to invoke GetRepository on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetRepository() {
        return this.to('GetRepository');
    }
    /**
     * Grants permission to invoke GetSource on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetSource() {
        return this.to('GetSource');
    }
    /**
     * Grants permission to invoke GetTransformationPackageUrl on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toGetTransformationPackageUrl() {
        return this.to('GetTransformationPackageUrl');
    }
    /**
     * Grants permission to invoke ListAnalyses on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListAnalyses() {
        return this.to('ListAnalyses');
    }
    /**
     * Grants permission to invoke ListAnalysisArtifacts on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListAnalysisArtifacts() {
        return this.to('ListAnalysisArtifacts');
    }
    /**
     * Grants permission to invoke ListCampaignRepositories on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListCampaignRepositories() {
        return this.to('ListCampaignRepositories');
    }
    /**
     * Grants permission to invoke ListCampaign on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListCampaigns() {
        return this.to('ListCampaigns');
    }
    /**
     * Grants permission to invoke ListFindings on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListFindings() {
        return this.to('ListFindings');
    }
    /**
     * Grants permission to invoke ListKnowledgeItems on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListKnowledgeItems() {
        return this.to('ListKnowledgeItems');
    }
    /**
     * Grants permission to invoke ListRemediations on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListRemediations() {
        return this.to('ListRemediations');
    }
    /**
     * Grants permission to invoke ListRepositories on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListRepositories() {
        return this.to('ListRepositories');
    }
    /**
     * Grants permission to invoke ListSources on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListSources() {
        return this.to('ListSources');
    }
    /**
     * Grants permission to invoke ListTagsForResource on AWS Transform custom
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to invoke ListTransformationPackageMetadata on AWS Transform custom
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListTransformationPackageMetadata() {
        return this.to('ListTransformationPackageMetadata');
    }
    /**
     * Grants permission to list active shares of a Transformation Package
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toListTransformationPackageShares() {
        return this.to('ListTransformationPackageShares');
    }
    /**
     * Grants permission to send a CLI telemetry event
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toSendTelemetryEvent() {
        return this.to('SendTelemetryEvent');
    }
    /**
     * Grants permission to share a Transformation Package with another AWS account or AWS Organization
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toShareTransformationPackage() {
        return this.to('ShareTransformationPackage');
    }
    /**
     * Grants permission to invoke TagResource on AWS Transform custom
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to revoke an existing share of a Transformation Package
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUnshareTransformationPackage() {
        return this.to('UnshareTransformationPackage');
    }
    /**
     * Grants permission to invoke UntagResource on AWS Transform custom
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUntagResource() {
        return this.to('UntagResource');
    }
    /**
     * Grants permission to invoke UpdateAnalysis on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateAnalysis() {
        return this.to('UpdateAnalysis');
    }
    /**
     * Grants permission to invoke UpdateCampaign on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateCampaign() {
        return this.to('UpdateCampaign');
    }
    /**
     * Grants permission to invoke UpdateCampaignRepositories on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateCampaignRepositoryStatus() {
        return this.to('UpdateCampaignRepositoryStatus');
    }
    /**
     * Grants permission to invoke UpdateKnowledgeItemConfiguration on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateKnowledgeItemConfiguration() {
        return this.to('UpdateKnowledgeItemConfiguration');
    }
    /**
     * Grants permission to invoke UpdateKnowledgeItemStatus on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateKnowledgeItemStatus() {
        return this.to('UpdateKnowledgeItemStatus');
    }
    /**
     * Grants permission to invoke UpdateRemediation on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateRemediation() {
        return this.to('UpdateRemediation');
    }
    /**
     * Grants permission to invoke UpdateRepository on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateRepository() {
        return this.to('UpdateRepository');
    }
    /**
     * Grants permission to invoke UpdateSource on AWS Transform custom
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     */
    toUpdateSource() {
        return this.to('UpdateSource');
    }
    /**
     * Adds a resource of type analysis to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param analysisId - Identifier for the analysisId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onAnalysis(analysisId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:analysis/${analysisId}`);
    }
    /**
     * Adds a resource of type campaign to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param name - Identifier for the name.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onCampaign(name, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:campaign/${name}`);
    }
    /**
     * Adds a resource of type finding to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param findingId - Identifier for the findingId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onFinding(findingId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:finding/${findingId}`);
    }
    /**
     * Adds a resource of type knowledge-item to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param transformationPackageName - Identifier for the transformationPackageName.
     * @param id - Identifier for the id.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onKnowledgeItem(transformationPackageName, id, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:package/${transformationPackageName}/knowledge-item/${id}`);
    }
    /**
     * Adds a resource of type package to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param name - Identifier for the name.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onPackage(name, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:package/${name}`);
    }
    /**
     * Adds a resource of type remediation to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param remediationId - Identifier for the remediationId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onRemediation(remediationId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:remediation/${remediationId}`);
    }
    /**
     * Adds a resource of type repository to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param repositoryId - Identifier for the repositoryId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onRepository(repositoryId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:repository/${repositoryId}`);
    }
    /**
     * Adds a resource of type source to the statement
     *
     * https://docs.aws.amazon.com/transform/latest/userguide/custom.html
     *
     * @param name - Identifier for the name.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onSource(name, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:transform-custom:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:source/${name}`);
    }
    /**
     * Filters access by the tags that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toBatchCreateFindings()
     * - .toCreateAnalysis()
     * - .toCreateCampaign()
     * - .toCreateRemediation()
     * - .toCreateRepository()
     * - .toCreateSource()
     * - .toCreateTransformationPackageUrl()
     * - .toTagResource()
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsRequestTag(tagKey, value, operator) {
        return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tags associated with the resource
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
     *
     * Applies to actions:
     * - .toBatchCreateFindings()
     * - .toCompleteTransformationPackageUpload()
     * - .toCreateAnalysis()
     * - .toCreateCampaign()
     * - .toCreateRemediation()
     * - .toCreateRepository()
     * - .toCreateSource()
     * - .toCreateTransformationPackageUrl()
     * - .toDeleteAnalysis()
     * - .toDeleteCampaign()
     * - .toDeleteFinding()
     * - .toDeleteKnowledgeItem()
     * - .toDeleteRemediation()
     * - .toDeleteRepository()
     * - .toDeleteSource()
     * - .toDeleteTransformationPackage()
     * - .toExecuteTransformation()
     * - .toGetAnalysis()
     * - .toGetAnalysisArtifactDownloadUrl()
     * - .toGetCampaign()
     * - .toGetFinding()
     * - .toGetKnowledgeItem()
     * - .toGetRemediation()
     * - .toGetRepository()
     * - .toGetSource()
     * - .toGetTransformationPackageUrl()
     * - .toListAnalysisArtifacts()
     * - .toListCampaignRepositories()
     * - .toListTransformationPackageShares()
     * - .toShareTransformationPackage()
     * - .toTagResource()
     * - .toUnshareTransformationPackage()
     * - .toUntagResource()
     * - .toUpdateAnalysis()
     * - .toUpdateCampaign()
     * - .toUpdateCampaignRepositoryStatus()
     * - .toUpdateKnowledgeItemConfiguration()
     * - .toUpdateKnowledgeItemStatus()
     * - .toUpdateRemediation()
     * - .toUpdateRepository()
     * - .toUpdateSource()
     *
     * Applies to resource types:
     * - analysis
     * - campaign
     * - finding
     * - knowledge-item
     * - package
     * - remediation
     * - repository
     * - source
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsResourceTag(tagKey, value, operator) {
        return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tag keys that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
     *
     * Applies to actions:
     * - .toBatchCreateFindings()
     * - .toCreateAnalysis()
     * - .toCreateCampaign()
     * - .toCreateRemediation()
     * - .toCreateRepository()
     * - .toCreateSource()
     * - .toCreateTransformationPackageUrl()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsTagKeys(value, operator) {
        return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
    }
    /**
     * Statement provider for service [transform-custom](https://docs.aws.amazon.com/service-authorization/latest/reference/list_transform-custom.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 'transform-custom';
        this.accessLevelList = {
            Write: [
                'BatchCreateFindings',
                'BatchUpdateFindings',
                'CompleteTransformationPackageUpload',
                'ConverseStream',
                'CreateAnalysis',
                'CreateCampaign',
                'CreateRemediation',
                'CreateRepository',
                'CreateSource',
                'CreateTransformationPackageUrl',
                'DeleteAnalysis',
                'DeleteCampaign',
                'DeleteFinding',
                'DeleteKnowledgeItem',
                'DeleteRemediation',
                'DeleteRepository',
                'DeleteSource',
                'DeleteTransformationPackage',
                'ExecuteTransformation',
                'SendTelemetryEvent',
                'ShareTransformationPackage',
                'TagResource',
                'UnshareTransformationPackage',
                'UntagResource',
                'UpdateAnalysis',
                'UpdateCampaign',
                'UpdateCampaignRepositoryStatus',
                'UpdateKnowledgeItemConfiguration',
                'UpdateKnowledgeItemStatus',
                'UpdateRemediation',
                'UpdateRepository',
                'UpdateSource'
            ],
            Read: [
                'GetAnalysis',
                'GetAnalysisArtifactDownloadUrl',
                'GetCampaign',
                'GetFinding',
                'GetFindingGroups',
                'GetKnowledgeItem',
                'GetRemediation',
                'GetRepository',
                'GetSource',
                'GetTransformationPackageUrl',
                'ListAnalysisArtifacts',
                'ListCampaignRepositories',
                'ListTagsForResource',
                'ListTransformationPackageShares'
            ],
            List: [
                'ListAnalyses',
                'ListCampaigns',
                'ListFindings',
                'ListKnowledgeItems',
                'ListRemediations',
                'ListRepositories',
                'ListSources',
                'ListTransformationPackageMetadata'
            ],
            Tagging: [
                'TagResource',
                'UntagResource'
            ]
        };
    }
}
exports.TransformCustom = TransformCustom;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLWN1c3RvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRyYW5zZm9ybS1jdXN0b20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsd0JBQWU7SUFHbEQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUNBQXFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdDQUFnQztRQUNyQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksNkJBQTZCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQ0FBZ0M7UUFDckMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw2QkFBNkI7UUFDbEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDBCQUEwQjtRQUMvQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQ0FBbUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlDQUFpQztRQUN0QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw4QkFBOEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0NBQWdDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQ0FBa0M7UUFDdkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFxRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksVUFBVSxDQUFDLFVBQWtCLEVBQUUsT0FBZ0IsRUFBRSxNQUFlLEVBQUUsU0FBa0I7UUFDekYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQVEsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBaUIscUJBQXNCLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYyxJQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBZSxhQUFjLFVBQVcsRUFBRSxDQUFDLENBQUM7SUFDaEwsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFVBQVUsQ0FBQyxJQUFZLEVBQUUsT0FBZ0IsRUFBRSxNQUFlLEVBQUUsU0FBa0I7UUFDbkYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQVEsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBaUIscUJBQXNCLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYyxJQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBZSxhQUFjLElBQUssRUFBRSxDQUFDLENBQUM7SUFDMUssQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFNBQVMsQ0FBQyxTQUFpQixFQUFFLE9BQWdCLEVBQUUsTUFBZSxFQUFFLFNBQWtCO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLHFCQUFzQixNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsWUFBYSxTQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzlLLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksZUFBZSxDQUFDLHlCQUFpQyxFQUFFLEVBQVUsRUFBRSxPQUFnQixFQUFFLE1BQWUsRUFBRSxTQUFrQjtRQUN6SCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBUSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFpQixxQkFBc0IsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFjLElBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFlLFlBQWEseUJBQTBCLG1CQUFvQixFQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JOLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxTQUFTLENBQUMsSUFBWSxFQUFFLE9BQWdCLEVBQUUsTUFBZSxFQUFFLFNBQWtCO1FBQ2xGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLHFCQUFzQixNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsWUFBYSxJQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pLLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxhQUFhLENBQUMsYUFBcUIsRUFBRSxPQUFnQixFQUFFLE1BQWUsRUFBRSxTQUFrQjtRQUMvRixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBUSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFpQixxQkFBc0IsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFjLElBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFlLGdCQUFpQixhQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3RMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxZQUFZLENBQUMsWUFBb0IsRUFBRSxPQUFnQixFQUFFLE1BQWUsRUFBRSxTQUFrQjtRQUM3RixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBUSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFpQixxQkFBc0IsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFjLElBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFlLGVBQWdCLFlBQWEsRUFBRSxDQUFDLENBQUM7SUFDcEwsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFFBQVEsQ0FBQyxJQUFZLEVBQUUsT0FBZ0IsRUFBRSxNQUFlLEVBQUUsU0FBa0I7UUFDakYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQVEsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBaUIscUJBQXNCLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYyxJQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBZSxXQUFZLElBQUssRUFBRSxDQUFDLENBQUM7SUFDeEssQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSSxlQUFlLENBQUMsTUFBYyxFQUFFLEtBQXdCLEVBQUUsUUFBNEI7UUFDM0YsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFtQixNQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZERztJQUNJLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxLQUF3QixFQUFFLFFBQTRCO1FBQzVGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBb0IsTUFBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNJLFlBQVksQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxLQUFnQztRQUMxQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUExNUJSLGtCQUFhLEdBQUcsa0JBQWtCLENBQUM7UUF5bEJoQyxvQkFBZSxHQUFvQjtZQUMzQyxLQUFLLEVBQUU7Z0JBQ0wscUJBQXFCO2dCQUNyQixxQkFBcUI7Z0JBQ3JCLHFDQUFxQztnQkFDckMsZ0JBQWdCO2dCQUNoQixnQkFBZ0I7Z0JBQ2hCLGdCQUFnQjtnQkFDaEIsbUJBQW1CO2dCQUNuQixrQkFBa0I7Z0JBQ2xCLGNBQWM7Z0JBQ2QsZ0NBQWdDO2dCQUNoQyxnQkFBZ0I7Z0JBQ2hCLGdCQUFnQjtnQkFDaEIsZUFBZTtnQkFDZixxQkFBcUI7Z0JBQ3JCLG1CQUFtQjtnQkFDbkIsa0JBQWtCO2dCQUNsQixjQUFjO2dCQUNkLDZCQUE2QjtnQkFDN0IsdUJBQXVCO2dCQUN2QixvQkFBb0I7Z0JBQ3BCLDRCQUE0QjtnQkFDNUIsYUFBYTtnQkFDYiw4QkFBOEI7Z0JBQzlCLGVBQWU7Z0JBQ2YsZ0JBQWdCO2dCQUNoQixnQkFBZ0I7Z0JBQ2hCLGdDQUFnQztnQkFDaEMsa0NBQWtDO2dCQUNsQywyQkFBMkI7Z0JBQzNCLG1CQUFtQjtnQkFDbkIsa0JBQWtCO2dCQUNsQixjQUFjO2FBQ2Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osYUFBYTtnQkFDYixnQ0FBZ0M7Z0JBQ2hDLGFBQWE7Z0JBQ2IsWUFBWTtnQkFDWixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsZ0JBQWdCO2dCQUNoQixlQUFlO2dCQUNmLFdBQVc7Z0JBQ1gsNkJBQTZCO2dCQUM3Qix1QkFBdUI7Z0JBQ3ZCLDBCQUEwQjtnQkFDMUIscUJBQXFCO2dCQUNyQixpQ0FBaUM7YUFDbEM7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osY0FBYztnQkFDZCxlQUFlO2dCQUNmLGNBQWM7Z0JBQ2Qsb0JBQW9CO2dCQUNwQixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsYUFBYTtnQkFDYixtQ0FBbUM7YUFDcEM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQWlRRixDQUFDO0NBQ0Y7QUE3NUJELDBDQTY1QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3RyYW5zZm9ybS1jdXN0b21dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X3RyYW5zZm9ybS1jdXN0b20uaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1DdXN0b20gZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICd0cmFuc2Zvcm0tY3VzdG9tJztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIEJhdGNoQ3JlYXRlRmluZGluZ3Mgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaENyZWF0ZUZpbmRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaENyZWF0ZUZpbmRpbmdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIEJhdGNoVXBkYXRlRmluZGluZ3Mgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoVXBkYXRlRmluZGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoVXBkYXRlRmluZGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgQ29tcGxldGVUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcGxvYWQgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NvbXBsZXRlVHJhbnNmb3JtYXRpb25QYWNrYWdlVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDb21wbGV0ZVRyYW5zZm9ybWF0aW9uUGFja2FnZVVwbG9hZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBDb252ZXJzZVN0cmVhbSBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ29udmVyc2VTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NvbnZlcnNlU3RyZWFtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIENyZWF0ZUFuYWx5c2lzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVBbmFseXNpcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQW5hbHlzaXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgQ3JlYXRlQ2FtcGFpZ24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNhbXBhaWduKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDYW1wYWlnbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBDcmVhdGVSZW1lZGlhdGlvbiBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUmVtZWRpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlbWVkaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIENyZWF0ZVJlcG9zaXRvcnkgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVJlcG9zaXRvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlcG9zaXRvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgQ3JlYXRlU291cmNlIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBDcmVhdGVUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcmwgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYW5zZm9ybWF0aW9uUGFja2FnZVVybCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVHJhbnNmb3JtYXRpb25QYWNrYWdlVXJsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIERlbGV0ZUFuYWx5c2lzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBbmFseXNpcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQW5hbHlzaXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgRGVsZXRlQ2FtcGFpZ24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNhbXBhaWduKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDYW1wYWlnbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBEZWxldGVGaW5kaW5nIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVGaW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVGaW5kaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIERlbGV0ZUtub3dsZWRnZUl0ZW0gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUtub3dsZWRnZUl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUtub3dsZWRnZUl0ZW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgRGVsZXRlUmVtZWRpYXRpb24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlbWVkaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSZW1lZGlhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBEZWxldGVSZXBvc2l0b3J5IG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZXBvc2l0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSZXBvc2l0b3J5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIERlbGV0ZVNvdXJjZSBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgRGVsZXRlVHJhbnNmb3JtYXRpb25QYWNrYWdlIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2Zvcm1hdGlvblBhY2thZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYW5zZm9ybWF0aW9uUGFja2FnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBFeGVjdXRlVHJhbnNmb3JtYXRpb24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0V4ZWN1dGVUcmFuc2Zvcm1hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRXhlY3V0ZVRyYW5zZm9ybWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIEdldEFuYWx5c2lzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEFuYWx5c2lzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBbmFseXNpcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBHZXRBbmFseXNpc0FydGlmYWN0RG93bmxvYWRVcmwgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QW5hbHlzaXNBcnRpZmFjdERvd25sb2FkVXJsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBbmFseXNpc0FydGlmYWN0RG93bmxvYWRVcmwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgR2V0Q2FtcGFpZ24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q2FtcGFpZ24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENhbXBhaWduJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIEdldEZpbmRpbmcgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RmluZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RmluZGluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBHZXRGaW5kaW5nR3JvdXBzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEZpbmRpbmdHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEZpbmRpbmdHcm91cHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgR2V0S25vd2xlZGdlSXRlbSBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRLbm93bGVkZ2VJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRLbm93bGVkZ2VJdGVtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIEdldFJlbWVkaWF0aW9uIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFJlbWVkaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZW1lZGlhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBHZXRSZXBvc2l0b3J5IG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFJlcG9zaXRvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJlcG9zaXRvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgR2V0U291cmNlIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIEdldFRyYW5zZm9ybWF0aW9uUGFja2FnZVVybCBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRyYW5zZm9ybWF0aW9uUGFja2FnZVVybCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBMaXN0QW5hbHlzZXMgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEFuYWx5c2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QW5hbHlzZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgTGlzdEFuYWx5c2lzQXJ0aWZhY3RzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBbmFseXNpc0FydGlmYWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEFuYWx5c2lzQXJ0aWZhY3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIExpc3RDYW1wYWlnblJlcG9zaXRvcmllcyBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q2FtcGFpZ25SZXBvc2l0b3JpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDYW1wYWlnblJlcG9zaXRvcmllcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBMaXN0Q2FtcGFpZ24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENhbXBhaWducygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdENhbXBhaWducycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBMaXN0RmluZGluZ3Mgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEZpbmRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RmluZGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgTGlzdEtub3dsZWRnZUl0ZW1zIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RLbm93bGVkZ2VJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEtub3dsZWRnZUl0ZW1zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIExpc3RSZW1lZGlhdGlvbnMgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFJlbWVkaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFJlbWVkaWF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBMaXN0UmVwb3NpdG9yaWVzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RSZXBvc2l0b3JpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RSZXBvc2l0b3JpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgTGlzdFNvdXJjZXMgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTb3VyY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIExpc3RUYWdzRm9yUmVzb3VyY2Ugb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBMaXN0VHJhbnNmb3JtYXRpb25QYWNrYWdlTWV0YWRhdGEgb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRyYW5zZm9ybWF0aW9uUGFja2FnZU1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VHJhbnNmb3JtYXRpb25QYWNrYWdlTWV0YWRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFjdGl2ZSBzaGFyZXMgb2YgYSBUcmFuc2Zvcm1hdGlvbiBQYWNrYWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUcmFuc2Zvcm1hdGlvblBhY2thZ2VTaGFyZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUcmFuc2Zvcm1hdGlvblBhY2thZ2VTaGFyZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZW5kIGEgQ0xJIHRlbGVtZXRyeSBldmVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VuZFRlbGVtZXRyeUV2ZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZW5kVGVsZW1ldHJ5RXZlbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzaGFyZSBhIFRyYW5zZm9ybWF0aW9uIFBhY2thZ2Ugd2l0aCBhbm90aGVyIEFXUyBhY2NvdW50IG9yIEFXUyBPcmdhbml6YXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NoYXJlVHJhbnNmb3JtYXRpb25QYWNrYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTaGFyZVRyYW5zZm9ybWF0aW9uUGFja2FnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBUYWdSZXNvdXJjZSBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV2b2tlIGFuIGV4aXN0aW5nIHNoYXJlIG9mIGEgVHJhbnNmb3JtYXRpb24gUGFja2FnZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW5zaGFyZVRyYW5zZm9ybWF0aW9uUGFja2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW5zaGFyZVRyYW5zZm9ybWF0aW9uUGFja2FnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBVbnRhZ1Jlc291cmNlIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VbnRhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVbnRhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIFVwZGF0ZUFuYWx5c2lzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVBbmFseXNpcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQW5hbHlzaXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgVXBkYXRlQ2FtcGFpZ24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUNhbXBhaWduKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVDYW1wYWlnbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBVcGRhdGVDYW1wYWlnblJlcG9zaXRvcmllcyBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ2FtcGFpZ25SZXBvc2l0b3J5U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVDYW1wYWlnblJlcG9zaXRvcnlTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgVXBkYXRlS25vd2xlZGdlSXRlbUNvbmZpZ3VyYXRpb24gb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUtub3dsZWRnZUl0ZW1Db25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVLbm93bGVkZ2VJdGVtQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBVcGRhdGVLbm93bGVkZ2VJdGVtU3RhdHVzIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVLbm93bGVkZ2VJdGVtU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVLbm93bGVkZ2VJdGVtU3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIFVwZGF0ZVJlbWVkaWF0aW9uIG9uIEFXUyBUcmFuc2Zvcm0gY3VzdG9tXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVSZW1lZGlhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUmVtZWRpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbnZva2UgVXBkYXRlUmVwb3NpdG9yeSBvbiBBV1MgVHJhbnNmb3JtIGN1c3RvbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUmVwb3NpdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUmVwb3NpdG9yeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBVcGRhdGVTb3VyY2Ugb24gQVdTIFRyYW5zZm9ybSBjdXN0b21cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlU291cmNlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgV3JpdGU6IFtcbiAgICAgICdCYXRjaENyZWF0ZUZpbmRpbmdzJyxcbiAgICAgICdCYXRjaFVwZGF0ZUZpbmRpbmdzJyxcbiAgICAgICdDb21wbGV0ZVRyYW5zZm9ybWF0aW9uUGFja2FnZVVwbG9hZCcsXG4gICAgICAnQ29udmVyc2VTdHJlYW0nLFxuICAgICAgJ0NyZWF0ZUFuYWx5c2lzJyxcbiAgICAgICdDcmVhdGVDYW1wYWlnbicsXG4gICAgICAnQ3JlYXRlUmVtZWRpYXRpb24nLFxuICAgICAgJ0NyZWF0ZVJlcG9zaXRvcnknLFxuICAgICAgJ0NyZWF0ZVNvdXJjZScsXG4gICAgICAnQ3JlYXRlVHJhbnNmb3JtYXRpb25QYWNrYWdlVXJsJyxcbiAgICAgICdEZWxldGVBbmFseXNpcycsXG4gICAgICAnRGVsZXRlQ2FtcGFpZ24nLFxuICAgICAgJ0RlbGV0ZUZpbmRpbmcnLFxuICAgICAgJ0RlbGV0ZUtub3dsZWRnZUl0ZW0nLFxuICAgICAgJ0RlbGV0ZVJlbWVkaWF0aW9uJyxcbiAgICAgICdEZWxldGVSZXBvc2l0b3J5JyxcbiAgICAgICdEZWxldGVTb3VyY2UnLFxuICAgICAgJ0RlbGV0ZVRyYW5zZm9ybWF0aW9uUGFja2FnZScsXG4gICAgICAnRXhlY3V0ZVRyYW5zZm9ybWF0aW9uJyxcbiAgICAgICdTZW5kVGVsZW1ldHJ5RXZlbnQnLFxuICAgICAgJ1NoYXJlVHJhbnNmb3JtYXRpb25QYWNrYWdlJyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW5zaGFyZVRyYW5zZm9ybWF0aW9uUGFja2FnZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlQW5hbHlzaXMnLFxuICAgICAgJ1VwZGF0ZUNhbXBhaWduJyxcbiAgICAgICdVcGRhdGVDYW1wYWlnblJlcG9zaXRvcnlTdGF0dXMnLFxuICAgICAgJ1VwZGF0ZUtub3dsZWRnZUl0ZW1Db25maWd1cmF0aW9uJyxcbiAgICAgICdVcGRhdGVLbm93bGVkZ2VJdGVtU3RhdHVzJyxcbiAgICAgICdVcGRhdGVSZW1lZGlhdGlvbicsXG4gICAgICAnVXBkYXRlUmVwb3NpdG9yeScsXG4gICAgICAnVXBkYXRlU291cmNlJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0dldEFuYWx5c2lzJyxcbiAgICAgICdHZXRBbmFseXNpc0FydGlmYWN0RG93bmxvYWRVcmwnLFxuICAgICAgJ0dldENhbXBhaWduJyxcbiAgICAgICdHZXRGaW5kaW5nJyxcbiAgICAgICdHZXRGaW5kaW5nR3JvdXBzJyxcbiAgICAgICdHZXRLbm93bGVkZ2VJdGVtJyxcbiAgICAgICdHZXRSZW1lZGlhdGlvbicsXG4gICAgICAnR2V0UmVwb3NpdG9yeScsXG4gICAgICAnR2V0U291cmNlJyxcbiAgICAgICdHZXRUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcmwnLFxuICAgICAgJ0xpc3RBbmFseXNpc0FydGlmYWN0cycsXG4gICAgICAnTGlzdENhbXBhaWduUmVwb3NpdG9yaWVzJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJyxcbiAgICAgICdMaXN0VHJhbnNmb3JtYXRpb25QYWNrYWdlU2hhcmVzJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RBbmFseXNlcycsXG4gICAgICAnTGlzdENhbXBhaWducycsXG4gICAgICAnTGlzdEZpbmRpbmdzJyxcbiAgICAgICdMaXN0S25vd2xlZGdlSXRlbXMnLFxuICAgICAgJ0xpc3RSZW1lZGlhdGlvbnMnLFxuICAgICAgJ0xpc3RSZXBvc2l0b3JpZXMnLFxuICAgICAgJ0xpc3RTb3VyY2VzJyxcbiAgICAgICdMaXN0VHJhbnNmb3JtYXRpb25QYWNrYWdlTWV0YWRhdGEnXG4gICAgXSxcbiAgICBUYWdnaW5nOiBbXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBhbmFseXNpcyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gYW5hbHlzaXNJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhbmFseXNpc0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25BbmFseXNpcyhhbmFseXNpc0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06dHJhbnNmb3JtLWN1c3RvbTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YW5hbHlzaXMvJHsgYW5hbHlzaXNJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgY2FtcGFpZ24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBJZGVudGlmaWVyIGZvciB0aGUgbmFtZS5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQ2FtcGFpZ24obmFtZTogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnRyYW5zZm9ybS1jdXN0b206JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNhbXBhaWduLyR7IG5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGZpbmRpbmcgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZpbmRpbmdJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmaW5kaW5nSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkZpbmRpbmcoZmluZGluZ0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06dHJhbnNmb3JtLWN1c3RvbTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmluZGluZy8keyBmaW5kaW5nSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGtub3dsZWRnZS1pdGVtIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvblBhY2thZ2VOYW1lIC0gSWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uUGFja2FnZU5hbWUuXG4gICAqIEBwYXJhbSBpZCAtIElkZW50aWZpZXIgZm9yIHRoZSBpZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uS25vd2xlZGdlSXRlbSh0cmFuc2Zvcm1hdGlvblBhY2thZ2VOYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06dHJhbnNmb3JtLWN1c3RvbTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06cGFja2FnZS8keyB0cmFuc2Zvcm1hdGlvblBhY2thZ2VOYW1lIH0va25vd2xlZGdlLWl0ZW0vJHsgaWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHBhY2thZ2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdHJhbnNmb3JtL2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBJZGVudGlmaWVyIGZvciB0aGUgbmFtZS5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUGFja2FnZShuYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06dHJhbnNmb3JtLWN1c3RvbTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06cGFja2FnZS8keyBuYW1lIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSByZW1lZGlhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcmVtZWRpYXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZW1lZGlhdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25SZW1lZGlhdGlvbihyZW1lZGlhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06dHJhbnNmb3JtLWN1c3RvbTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06cmVtZWRpYXRpb24vJHsgcmVtZWRpYXRpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgcmVwb3NpdG9yeSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS90cmFuc2Zvcm0vbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnlJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUmVwb3NpdG9yeShyZXBvc2l0b3J5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTp0cmFuc2Zvcm0tY3VzdG9tOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpyZXBvc2l0b3J5LyR7IHJlcG9zaXRvcnlJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgc291cmNlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3RyYW5zZm9ybS9sYXRlc3QvdXNlcmd1aWRlL2N1c3RvbS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gSWRlbnRpZmllciBmb3IgdGhlIG5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblNvdXJjZShuYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06dHJhbnNmb3JtLWN1c3RvbTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06c291cmNlLyR7IG5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIHRoYXQgYXJlIHBhc3NlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQmF0Y2hDcmVhdGVGaW5kaW5ncygpXG4gICAqIC0gLnRvQ3JlYXRlQW5hbHlzaXMoKVxuICAgKiAtIC50b0NyZWF0ZUNhbXBhaWduKClcbiAgICogLSAudG9DcmVhdGVSZW1lZGlhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlUmVwb3NpdG9yeSgpXG4gICAqIC0gLnRvQ3JlYXRlU291cmNlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcmwoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1JlcXVlc3RUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVxdWVzdFRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9CYXRjaENyZWF0ZUZpbmRpbmdzKClcbiAgICogLSAudG9Db21wbGV0ZVRyYW5zZm9ybWF0aW9uUGFja2FnZVVwbG9hZCgpXG4gICAqIC0gLnRvQ3JlYXRlQW5hbHlzaXMoKVxuICAgKiAtIC50b0NyZWF0ZUNhbXBhaWduKClcbiAgICogLSAudG9DcmVhdGVSZW1lZGlhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlUmVwb3NpdG9yeSgpXG4gICAqIC0gLnRvQ3JlYXRlU291cmNlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcmwoKVxuICAgKiAtIC50b0RlbGV0ZUFuYWx5c2lzKClcbiAgICogLSAudG9EZWxldGVDYW1wYWlnbigpXG4gICAqIC0gLnRvRGVsZXRlRmluZGluZygpXG4gICAqIC0gLnRvRGVsZXRlS25vd2xlZGdlSXRlbSgpXG4gICAqIC0gLnRvRGVsZXRlUmVtZWRpYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVJlcG9zaXRvcnkoKVxuICAgKiAtIC50b0RlbGV0ZVNvdXJjZSgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNmb3JtYXRpb25QYWNrYWdlKClcbiAgICogLSAudG9FeGVjdXRlVHJhbnNmb3JtYXRpb24oKVxuICAgKiAtIC50b0dldEFuYWx5c2lzKClcbiAgICogLSAudG9HZXRBbmFseXNpc0FydGlmYWN0RG93bmxvYWRVcmwoKVxuICAgKiAtIC50b0dldENhbXBhaWduKClcbiAgICogLSAudG9HZXRGaW5kaW5nKClcbiAgICogLSAudG9HZXRLbm93bGVkZ2VJdGVtKClcbiAgICogLSAudG9HZXRSZW1lZGlhdGlvbigpXG4gICAqIC0gLnRvR2V0UmVwb3NpdG9yeSgpXG4gICAqIC0gLnRvR2V0U291cmNlKClcbiAgICogLSAudG9HZXRUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcmwoKVxuICAgKiAtIC50b0xpc3RBbmFseXNpc0FydGlmYWN0cygpXG4gICAqIC0gLnRvTGlzdENhbXBhaWduUmVwb3NpdG9yaWVzKClcbiAgICogLSAudG9MaXN0VHJhbnNmb3JtYXRpb25QYWNrYWdlU2hhcmVzKClcbiAgICogLSAudG9TaGFyZVRyYW5zZm9ybWF0aW9uUGFja2FnZSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1Vuc2hhcmVUcmFuc2Zvcm1hdGlvblBhY2thZ2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUFuYWx5c2lzKClcbiAgICogLSAudG9VcGRhdGVDYW1wYWlnbigpXG4gICAqIC0gLnRvVXBkYXRlQ2FtcGFpZ25SZXBvc2l0b3J5U3RhdHVzKClcbiAgICogLSAudG9VcGRhdGVLbm93bGVkZ2VJdGVtQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlS25vd2xlZGdlSXRlbVN0YXR1cygpXG4gICAqIC0gLnRvVXBkYXRlUmVtZWRpYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVJlcG9zaXRvcnkoKVxuICAgKiAtIC50b1VwZGF0ZVNvdXJjZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gYW5hbHlzaXNcbiAgICogLSBjYW1wYWlnblxuICAgKiAtIGZpbmRpbmdcbiAgICogLSBrbm93bGVkZ2UtaXRlbVxuICAgKiAtIHBhY2thZ2VcbiAgICogLSByZW1lZGlhdGlvblxuICAgKiAtIHJlcG9zaXRvcnlcbiAgICogLSBzb3VyY2VcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZyBrZXlzIHRoYXQgYXJlIHBhc3NlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtdGFna2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQmF0Y2hDcmVhdGVGaW5kaW5ncygpXG4gICAqIC0gLnRvQ3JlYXRlQW5hbHlzaXMoKVxuICAgKiAtIC50b0NyZWF0ZUNhbXBhaWduKClcbiAgICogLSAudG9DcmVhdGVSZW1lZGlhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlUmVwb3NpdG9yeSgpXG4gICAqIC0gLnRvQ3JlYXRlU291cmNlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2Zvcm1hdGlvblBhY2thZ2VVcmwoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NUYWdLZXlzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6VGFnS2V5c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbdHJhbnNmb3JtLWN1c3RvbV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfdHJhbnNmb3JtLWN1c3RvbS5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=