cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
1,102 lines • 114 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CleanroomsMl = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [cleanrooms-ml](https://docs.aws.amazon.com/service-authorization/latest/reference/list_cleanroomsml.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class CleanroomsMl extends shared_1.PolicyStatement {
/**
* Grants permission to cancel a trained model
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CancelTrainedModel.html
*/
toCancelTrainedModel() {
return this.to('CancelTrainedModel');
}
/**
* Grants permission to cancel a trained model inference job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CancelTrainedModelInferenceJob.html
*/
toCancelTrainedModelInferenceJob() {
return this.to('CancelTrainedModelInferenceJob');
}
/**
* Grants permission to create an audience model
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateAudienceModel.html
*/
toCreateAudienceModel() {
return this.to('CreateAudienceModel');
}
/**
* Grants permission to create a configured audience model
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateConfiguredAudienceModel.html
*/
toCreateConfiguredAudienceModel() {
return this.to('CreateConfiguredAudienceModel');
}
/**
* Grants permission to create a configured model algorithm
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateConfiguredModelAlgorithm.html
*/
toCreateConfiguredModelAlgorithm() {
return this.to('CreateConfiguredModelAlgorithm');
}
/**
* Grants permission to create a configured model algorithm association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateConfiguredModelAlgorithmAssociation.html
*/
toCreateConfiguredModelAlgorithmAssociation() {
return this.to('CreateConfiguredModelAlgorithmAssociation');
}
/**
* Grants permission to create an ML input channel
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateMLInputChannel.html
*/
toCreateMLInputChannel() {
return this.to('CreateMLInputChannel');
}
/**
* Grants permission to create a trained model
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateTrainedModel.html
*/
toCreateTrainedModel() {
return this.to('CreateTrainedModel');
}
/**
* Grants permission to create a training dataset, or seed audience. In Clean Rooms ML, the TrainingDataset is metadata that points to a Glue table, which is read only during AudienceModel creation
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateTrainingDataset.html
*/
toCreateTrainingDataset() {
return this.to('CreateTrainingDataset');
}
/**
* Grants permission to delete the specified audience generation job, and removes all data associated with the job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteAudienceGenerationJob.html
*/
toDeleteAudienceGenerationJob() {
return this.to('DeleteAudienceGenerationJob');
}
/**
* Grants permission to delete the specified audience generation job, and removes all data associated with the job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteAudienceModel.html
*/
toDeleteAudienceModel() {
return this.to('DeleteAudienceModel');
}
/**
* Grants permission to delete the specified configured audience model
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredAudienceModel.html
*/
toDeleteConfiguredAudienceModel() {
return this.to('DeleteConfiguredAudienceModel');
}
/**
* Grants permission to delete the specified configured audience model policy
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredAudienceModelPolicy.html
*/
toDeleteConfiguredAudienceModelPolicy() {
return this.to('DeleteConfiguredAudienceModelPolicy');
}
/**
* Grants permission to delete a configured model algorithm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredModelAlgorithm.html
*/
toDeleteConfiguredModelAlgorithm() {
return this.to('DeleteConfiguredModelAlgorithm');
}
/**
* Grants permission to delete a configured model algorithm association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredModelAlgorithmAssociation.html
*/
toDeleteConfiguredModelAlgorithmAssociation() {
return this.to('DeleteConfiguredModelAlgorithmAssociation');
}
/**
* Grants permission to delete an ML configuration
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteMLConfiguration.html
*/
toDeleteMLConfiguration() {
return this.to('DeleteMLConfiguration');
}
/**
* Grants permission to delete all data associated with the ML input channel
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteMLInputChannelData.html
*/
toDeleteMLInputChannelData() {
return this.to('DeleteMLInputChannelData');
}
/**
* Grants permission to delete all output associated with the trained model
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteTrainedModelOutput.html
*/
toDeleteTrainedModelOutput() {
return this.to('DeleteTrainedModelOutput');
}
/**
* Grants permission to delete a training dataset
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteTrainingDataset.html
*/
toDeleteTrainingDataset() {
return this.to('DeleteTrainingDataset');
}
/**
* Grants permission to return information about an audience generation job
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetAudienceGenerationJob.html
*/
toGetAudienceGenerationJob() {
return this.to('GetAudienceGenerationJob');
}
/**
* Grants permission to return information about an audience model
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetAudienceModel.html
*/
toGetAudienceModel() {
return this.to('GetAudienceModel');
}
/**
* Grants permission to return information about a configured model algorithm association created by any member in the collaboration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetCollaborationConfiguredModelAlgorithmAssociation.html
*/
toGetCollaborationConfiguredModelAlgorithmAssociation() {
return this.to('GetCollaborationConfiguredModelAlgorithmAssociation');
}
/**
* Grants permission to return information about an ML input channel created by any member in the collaboration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetCollaborationMLInputChannel.html
*/
toGetCollaborationMLInputChannel() {
return this.to('GetCollaborationMLInputChannel');
}
/**
* Grants permission to return information about a trained model created by any member in the collaboration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetCollaborationTrainedModel.html
*/
toGetCollaborationTrainedModel() {
return this.to('GetCollaborationTrainedModel');
}
/**
* Grants permission to return information about a configured audience model
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredAudienceModel.html
*/
toGetConfiguredAudienceModel() {
return this.to('GetConfiguredAudienceModel');
}
/**
* Grants permission to return information about a configured audience model policy
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredAudienceModelPolicy.html
*/
toGetConfiguredAudienceModelPolicy() {
return this.to('GetConfiguredAudienceModelPolicy');
}
/**
* Grants permission to return information about a configured model algorithm
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredModelAlgorithm.html
*/
toGetConfiguredModelAlgorithm() {
return this.to('GetConfiguredModelAlgorithm');
}
/**
* Grants permission to return information about a configured model algorithm association
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredModelAlgorithmAssociation.html
*/
toGetConfiguredModelAlgorithmAssociation() {
return this.to('GetConfiguredModelAlgorithmAssociation');
}
/**
* Grants permission to return information about an ML configuration
*
* Access Level: Read
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetMLConfiguration.html
*/
toGetMLConfiguration() {
return this.to('GetMLConfiguration');
}
/**
* Grants permission to return information about an ML input channel
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetMLInputChannel.html
*/
toGetMLInputChannel() {
return this.to('GetMLInputChannel');
}
/**
* Grants permission to return information about a trained model
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetTrainedModel.html
*/
toGetTrainedModel() {
return this.to('GetTrainedModel');
}
/**
* Grants permission to return information about a trained model inference job
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetTrainedModelInferenceJob.html
*/
toGetTrainedModelInferenceJob() {
return this.to('GetTrainedModelInferenceJob');
}
/**
* Grants permission to return information about a training dataset
*
* Access Level: Read
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetTrainingDataset.html
*/
toGetTrainingDataset() {
return this.to('GetTrainingDataset');
}
/**
* Grants permission to return a list of the audience export jobs
*
* Access Level: List
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListAudienceExportJobs.html
*/
toListAudienceExportJobs() {
return this.to('ListAudienceExportJobs');
}
/**
* Grants permission to return a list of audience generation jobs
*
* Access Level: List
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListAudienceGenerationJobs.html
*/
toListAudienceGenerationJobs() {
return this.to('ListAudienceGenerationJobs');
}
/**
* Grants permission to return a list of audience models
*
* Access Level: List
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListAudienceModels.html
*/
toListAudienceModels() {
return this.to('ListAudienceModels');
}
/**
* Grants permission to return a list of configured model algorithms created by any member in the collaboration
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
* - .ifCollaborationId()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationConfiguredModelAlgorithmAssociations.html
*/
toListCollaborationConfiguredModelAlgorithmAssociations() {
return this.to('ListCollaborationConfiguredModelAlgorithmAssociations');
}
/**
* Grants permission to return a list of ML input channels created by any member in the collaboration
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
* - .ifCollaborationId()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationMLInputChannels.html
*/
toListCollaborationMLInputChannels() {
return this.to('ListCollaborationMLInputChannels');
}
/**
* Grants permission to return a list of trained model export jobs started by any member in the collaboration
*
* Access Level: List
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationTrainedModelExportJobs.html
*/
toListCollaborationTrainedModelExportJobs() {
return this.to('ListCollaborationTrainedModelExportJobs');
}
/**
* Grants permission to return a list of trained model inference jobs started by any member in the collaboration
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
* - .ifCollaborationId()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationTrainedModelInferenceJobs.html
*/
toListCollaborationTrainedModelInferenceJobs() {
return this.to('ListCollaborationTrainedModelInferenceJobs');
}
/**
* Grants permission to return a list of trained models created by any member in the collaboration
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
* - .ifCollaborationId()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationTrainedModels.html
*/
toListCollaborationTrainedModels() {
return this.to('ListCollaborationTrainedModels');
}
/**
* Grants permission to return a list of configured audience models
*
* Access Level: List
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListConfiguredAudienceModels.html
*/
toListConfiguredAudienceModels() {
return this.to('ListConfiguredAudienceModels');
}
/**
* Grants permission to return a list of configured model algorithm associations
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListConfiguredModelAlgorithmAssociations.html
*/
toListConfiguredModelAlgorithmAssociations() {
return this.to('ListConfiguredModelAlgorithmAssociations');
}
/**
* Grants permission to return a list of configured model algorithms
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListConfiguredModelAlgorithms.html
*/
toListConfiguredModelAlgorithms() {
return this.to('ListConfiguredModelAlgorithms');
}
/**
* Grants permission to return a list of ML input channels
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListMLInputChannels.html
*/
toListMLInputChannels() {
return this.to('ListMLInputChannels');
}
/**
* Grants permission to return a list of tags for a provided resource
*
* Access Level: List
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to return a list of trained model inference jobs
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainedModelInferenceJobs.html
*/
toListTrainedModelInferenceJobs() {
return this.to('ListTrainedModelInferenceJobs');
}
/**
* Grants permission to return a list of trained model versions
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainedModelVersions.html
*/
toListTrainedModelVersions() {
return this.to('ListTrainedModelVersions');
}
/**
* Grants permission to return a list of trained models
*
* Access Level: List
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainedModels.html
*/
toListTrainedModels() {
return this.to('ListTrainedModels');
}
/**
* Grants permission to return a list of training datasets
*
* Access Level: List
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainingDatasets.html
*/
toListTrainingDatasets() {
return this.to('ListTrainingDatasets');
}
/**
* Grants permission to create or update the resource policy for a configured audience model
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_PutConfiguredAudienceModelPolicy.html
*/
toPutConfiguredAudienceModelPolicy() {
return this.to('PutConfiguredAudienceModelPolicy');
}
/**
* Grants permission to put an ML configuration
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_PutMLConfiguration.html
*/
toPutMLConfiguration() {
return this.to('PutMLConfiguration');
}
/**
* Grants permission to export an audience of a specified size after you have generated an audience
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartAudienceExportJob.html
*/
toStartAudienceExportJob() {
return this.to('StartAudienceExportJob');
}
/**
* Grants permission to start the audience generation job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartAudienceGenerationJob.html
*/
toStartAudienceGenerationJob() {
return this.to('StartAudienceGenerationJob');
}
/**
* Grants permission to start a trained model export job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartTrainedModelExportJob.html
*/
toStartTrainedModelExportJob() {
return this.to('StartTrainedModelExportJob');
}
/**
* Grants permission to start a trained model inference job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartTrainedModelInferenceJob.html
*/
toStartTrainedModelInferenceJob() {
return this.to('StartTrainedModelInferenceJob');
}
/**
* Grants permission to tag a specific resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to untag a specific resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_UntagResource.html
*/
toUnTagResource() {
return this.to('UnTagResource');
}
/**
* Grants permission to update a configured audience model.
*
* Access Level: Write
*
* https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_UpdateConfiguredAudienceModel.html
*/
toUpdateConfiguredAudienceModel() {
return this.to('UpdateConfiguredAudienceModel');
}
/**
* Adds a resource of type ConfiguredModelAlgorithm to the statement
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onConfiguredModelAlgorithm(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:configured-model-algorithm/${resourceId}`);
}
/**
* Adds a resource of type ConfiguredModelAlgorithmAssociation to the statement
*
* @param membershipId - Identifier for the membershipId.
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onConfiguredModelAlgorithmAssociation(membershipId, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/configured-model-algorithm-association/${resourceId}`);
}
/**
* Adds a resource of type MLInputChannel to the statement
*
* @param membershipId - Identifier for the membershipId.
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onMLInputChannel(membershipId, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/ml-input-channel/${resourceId}`);
}
/**
* Adds a resource of type TrainedModel to the statement
*
* @param membershipId - Identifier for the membershipId.
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onTrainedModel(membershipId, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/trained-model/${resourceId}`);
}
/**
* Adds a resource of type TrainedModelInferenceJob to the statement
*
* @param membershipId - Identifier for the membershipId.
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onTrainedModelInferenceJob(membershipId, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/trained-model-inference-job/${resourceId}`);
}
/**
* Adds a resource of type audiencegenerationjob to the statement
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onAudiencegenerationjob(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:audience-generation-job/${resourceId}`);
}
/**
* Adds a resource of type audiencemodel to the statement
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onAudiencemodel(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:audience-model/${resourceId}`);
}
/**
* Adds a resource of type configuredaudiencemodel to the statement
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onConfiguredaudiencemodel(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:configured-audience-model/${resourceId}`);
}
/**
* Adds a resource of type trainingdataset to the statement
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onTrainingdataset(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:training-dataset/${resourceId}`);
}
/**
* Filters access by the presence of tag key-value pairs in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCancelTrainedModel()
* - .toCancelTrainedModelInferenceJob()
* - .toCreateAudienceModel()
* - .toCreateConfiguredAudienceModel()
* - .toCreateConfiguredModelAlgorithm()
* - .toCreateConfiguredModelAlgorithmAssociation()
* - .toCreateMLInputChannel()
* - .toCreateTrainedModel()
* - .toCreateTrainingDataset()
* - .toDeleteAudienceGenerationJob()
* - .toDeleteAudienceModel()
* - .toDeleteConfiguredAudienceModel()
* - .toDeleteConfiguredAudienceModelPolicy()
* - .toDeleteConfiguredModelAlgorithm()
* - .toDeleteConfiguredModelAlgorithmAssociation()
* - .toDeleteMLConfiguration()
* - .toDeleteMLInputChannelData()
* - .toDeleteTrainedModelOutput()
* - .toDeleteTrainingDataset()
* - .toGetAudienceGenerationJob()
* - .toGetAudienceModel()
* - .toGetCollaborationConfiguredModelAlgorithmAssociation()
* - .toGetCollaborationMLInputChannel()
* - .toGetCollaborationTrainedModel()
* - .toGetConfiguredAudienceModel()
* - .toGetConfiguredAudienceModelPolicy()
* - .toGetConfiguredModelAlgorithm()
* - .toGetConfiguredModelAlgorithmAssociation()
* - .toGetMLConfiguration()
* - .toGetMLInputChannel()
* - .toGetTrainedModel()
* - .toGetTrainedModelInferenceJob()
* - .toGetTrainingDataset()
* - .toListAudienceExportJobs()
* - .toListAudienceGenerationJobs()
* - .toListCollaborationConfiguredModelAlgorithmAssociations()
* - .toListCollaborationMLInputChannels()
* - .toListCollaborationTrainedModelExportJobs()
* - .toListCollaborationTrainedModelInferenceJobs()
* - .toListCollaborationTrainedModels()
* - .toListConfiguredModelAlgorithmAssociations()
* - .toListConfiguredModelAlgorithms()
* - .toListMLInputChannels()
* - .toListTrainedModelInferenceJobs()
* - .toListTrainedModelVersions()
* - .toListTrainedModels()
* - .toPutMLConfiguration()
* - .toStartAudienceExportJob()
* - .toStartAudienceGenerationJob()
* - .toStartTrainedModelExportJob()
* - .toStartTrainedModelInferenceJob()
* - .toTagResource()
* - .toUpdateConfiguredAudienceModel()
*
* @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 tag key-value pairs attached to the resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toCancelTrainedModel()
* - .toCancelTrainedModelInferenceJob()
* - .toCreateAudienceModel()
* - .toCreateConfiguredAudienceModel()
* - .toCreateConfiguredModelAlgorithmAssociation()
* - .toCreateMLInputChannel()
* - .toCreateTrainedModel()
* - .toDeleteAudienceGenerationJob()
* - .toDeleteAudienceModel()
* - .toDeleteConfiguredAudienceModel()
* - .toDeleteConfiguredAudienceModelPolicy()
* - .toDeleteConfiguredModelAlgorithm()
* - .toDeleteConfiguredModelAlgorithmAssociation()
* - .toDeleteMLInputChannelData()
* - .toDeleteTrainedModelOutput()
* - .toDeleteTrainingDataset()
* - .toGetAudienceGenerationJob()
* - .toGetAudienceModel()
* - .toGetCollaborationConfiguredModelAlgorithmAssociation()
* - .toGetCollaborationMLInputChannel()
* - .toGetCollaborationTrainedModel()
* - .toGetConfiguredAudienceModel()
* - .toGetConfiguredAudienceModelPolicy()
* - .toGetConfiguredModelAlgorithm()
* - .toGetConfiguredModelAlgorithmAssociation()
* - .toGetMLInputChannel()
* - .toGetTrainedModel()
* - .toGetTrainedModelInferenceJob()
* - .toGetTrainingDataset()
* - .toListAudienceExportJobs()
* - .toListAudienceGenerationJobs()
* - .toListCollaborationTrainedModelExportJobs()
* - .toListTagsForResource()
* - .toPutConfiguredAudienceModelPolicy()
* - .toStartAudienceExportJob()
* - .toStartAudienceGenerationJob()
* - .toStartTrainedModelExportJob()
* - .toStartTrainedModelInferenceJob()
* - .toTagResource()
* - .toUnTagResource()
* - .toUpdateConfiguredAudienceModel()
*
* Applies to resource types:
* - ConfiguredModelAlgorithm
* - ConfiguredModelAlgorithmAssociation
* - MLInputChannel
* - TrainedModel
* - TrainedModelInferenceJob
* - audiencegenerationjob
* - audiencemodel
* - configuredaudiencemodel
* - trainingdataset
*
* @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 presence of tag keys in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCancelTrainedModel()
* - .toCancelTrainedModelInferenceJob()
* - .toCreateAudienceModel()
* - .toCreateConfiguredAudienceModel()
* - .toCreateConfiguredModelAlgorithm()
* - .toCreateConfiguredModelAlgorithmAssociation()
* - .toCreateMLInputChannel()
* - .toCreateTrainedModel()
* - .toCreateTrainingDataset()
* - .toDeleteAudienceGenerationJob()
* - .toDeleteAudienceModel()
* - .toDeleteConfiguredAudienceModel()
* - .toDeleteConfiguredAudienceModelPolicy()
* - .toDeleteConfiguredModelAlgorithm()
* - .toDeleteConfiguredModelAlgorithmAssociation()
* - .toDeleteMLConfiguration()
* - .toDeleteMLInputChannelData()
* - .toDeleteTrainedModelOutput()
* - .toDeleteTrainingDataset()
* - .toGetAudienceGenerationJob()
* - .toGetAudienceModel()
* - .toGetCollaborationConfiguredModelAlgorithmAssociation()
* - .toGetCollaborationMLInputChannel()
* - .toGetCollaborationTrainedModel()
* - .toGetConfiguredAudienceModel()
* - .toGetConfiguredAudienceModelPolicy()
* - .toGetConfiguredModelAlgorithm()
* - .toGetConfiguredModelAlgorithmAssociation()
* - .toGetMLConfiguration()
* - .toGetMLInputChannel()
* - .toGetTrainedModel()
* - .toGetTrainedModelInferenceJob()
* - .toGetTrainingDataset()
* - .toListAudienceExportJobs()
* - .toListAudienceGenerationJobs()
* - .toListCollaborationConfiguredModelAlgorithmAssociations()
* - .toListCollaborationMLInputChannels()
* - .toListCollaborationTrainedModelExportJobs()
* - .toListCollaborationTrainedModelInferenceJobs()
* - .toListCollaborationTrainedModels()
* - .toListConfiguredModelAlgorithmAssociations()
* - .toListConfiguredModelAlgorithms()
* - .toListMLInputChannels()
* - .toListTagsForResource()
* - .toListTrainedModelInferenceJobs()
* - .toListTrainedModelVersions()
* - .toListTrainedModels()
* - .toPutMLConfiguration()
* - .toStartAudienceExportJob()
* - .toStartAudienceGenerationJob()
* - .toStartTrainedModelExportJob()
* - .toStartTrainedModelInferenceJob()
* - .toTagResource()
* - .toUnTagResource()
* - .toUpdateConfiguredAudienceModel()
*
* @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');
}
/**
* Filters access by Clean rooms collaboration id
*
* https://docs.aws.amazon.com/TBD
*
* Applies to actions:
* - .toGetCollaborationConfiguredModelAlgorithmAssociation()
* - .toGetCollaborationMLInputChannel()
* - .toGetCollaborationTrainedModel()
* - .toListCollaborationConfiguredModelAlgorithmAssociations()
* - .toListCollaborationMLInputChannels()
* - .toListCollaborationTrainedModelExportJobs()
* - .toListCollaborationTrainedModelInferenceJobs()
* - .toListCollaborationTrainedModels()
* - .toStartAudienceGenerationJob()
*
* @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`
*/
ifCollaborationId(value, operator) {
return this.if(`CollaborationId`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [cleanrooms-ml](https://docs.aws.amazon.com/service-authorization/latest/reference/list_cleanroomsml.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'cleanrooms-ml';
this.accessLevelList = {
Write: [
'CancelTrainedModel',
'CancelTrainedModelInferenceJob',
'CreateAudienceModel',
'CreateConfiguredAudienceModel',
'CreateConfiguredModelAlgorithm',
'CreateConfiguredModelAlgorithmAssociation',
'CreateMLInputChannel',
'CreateTrainedModel',
'CreateTrainingDataset',
'DeleteAudienceGenerationJob',
'DeleteAudienceModel',
'DeleteConfiguredAudienceModel',
'DeleteConfiguredAudienceModelPolicy',
'DeleteConfiguredModelAlgorithm',
'DeleteConfiguredModelAlgorithmAssociation',
'DeleteMLConfiguration',
'DeleteMLInputChannelData',
'DeleteTrainedModelOutput',
'DeleteTrainingDataset',
'PutConfiguredAudienceModelPolicy',
'PutMLConfiguration',
'StartAudienceExportJob',
'StartAudienceGenerationJob',
'StartTrainedModelExportJob',
'StartTrainedModelInferenceJob',
'TagResource',
'UnTagResource',
'UpdateConfiguredAudienceModel'
],
Read: [
'GetAudienceGenerationJob',
'GetAudienceModel',
'GetCollaborationConfiguredModelAlgorithmAssociation',
'GetCollaborationMLInputChannel',
'GetCollaborationTrainedModel',
'GetConfiguredAudienceModel',
'GetConfiguredAudienceModelPolicy',
'GetConfiguredModelAlgorithm',
'GetConfiguredModelAlgorithmAssociation',
'GetMLConfiguration',
'GetMLInputChannel',
'GetTrainedModel',
'GetTrainedModelInferenceJob',
'GetTrainingDataset'
],
List: [
'ListAudienceExportJobs',
'ListAudienceGenerationJobs',
'ListAudienceModels',
'ListCollaborationConfiguredModelAlgorithmAssociations',
'ListCollaborationMLInputChannels',
'ListCollaborationTrainedModelExportJobs',
'ListCollaborationTrainedModelInferenceJobs',
'ListCollaborationTrainedModels',
'ListConfiguredAudienceModels',
'ListConfiguredModelAlgorithmAssociations',
'ListConfiguredModelAlgorithms',
'ListMLInputChannels',
'ListTagsForResource',
'ListTrainedModelInferenceJobs',
'ListTrainedModelVersions',
'ListTrainedModels',
'ListTrainingDatasets'
],
'Permissions management': [
'PutConfiguredAudienceModelPolicy'
],
Tagging: [
'TagResource',
'UnTagResource'
]
};
}
}
exports.CleanroomsMl = CleanroomsMl;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5yb29tc21sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xlYW5yb29tc21sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsd0JBQWU7SUFHL0M7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQ0FBZ0M7UUFDckMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksZ0NBQWdDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwyQ0FBMkM7UUFDaEQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFB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QUM3QixvQkFBb0I7YUFDckI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osd0JBQXdCO2dCQUN4Qiw0QkFBNEI7Z0JBQzVCLG9CQUFvQjtnQkFDcEIsdURBQXVEO2dCQUN2RCxrQ0FBa0M7Z0JBQ2xDLHlDQUF5QztnQkFDekMsNENBQTRDO2dCQUM1QyxnQ0FBZ0M7Z0JBQ2hDLDhCQUE4QjtnQkFDOUIsMENBQTBDO2dCQUMxQywrQkFBK0I7Z0JBQy9CLHFCQUFxQjtnQkFDckIscUJBQXFCO2dCQUNyQiwrQkFBK0I7Z0JBQy9CLDBCQUEwQjtnQkFDMUIsbUJBQW1CO2dCQUNuQixzQkFBc0I7YUFDdkI7WUFDRCx3QkFBd0IsRUFBRTtnQkFDeEIsa0NBQWtDO2FBQ25DO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUFzWEYsQ0FBQztDQUNGO0FBNW9DRCxvQ0E0b0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtjbGVhbnJvb21zLW1sXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9jbGVhbnJvb21zbWwuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbnJvb21zTWwgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdjbGVhbnJvb21zLW1sJztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGEgdHJhaW5lZCBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NhbmNlbFRyYWluZWRNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxUcmFpbmVkTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFRyYWluZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhIHRyYWluZWQgbW9kZWwgaW5mZXJlbmNlIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NhbmNlbFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBhdWRpZW5jZSBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUF1ZGllbmNlTW9kZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQXVkaWVuY2VNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQXVkaWVuY2VNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtIGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIE1MIGlucHV0IGNoYW5uZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVNTElucHV0Q2hhbm5lbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVNTElucHV0Q2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTUxJbnB1dENoYW5uZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0cmFpbmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVHJhaW5lZE1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYWluZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVHJhaW5lZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgdHJhaW5pbmcgZGF0YXNldCwgb3Igc2VlZCBhdWRpZW5jZS4gSW4gQ2xlYW4gUm9vbXMgTUwsIHRoZSBUcmFpbmluZ0RhdGFzZXQgaXMgbWV0YWRhdGEgdGhhdCBwb2ludHMgdG8gYSBHbHVlIHRhYmxlLCB3aGljaCBpcyByZWFkIG9ubHkgZHVyaW5nIEF1ZGllbmNlTW9kZWwgY3JlYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFpbmluZ0RhdGFzZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVHJhaW5pbmdEYXRhc2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUcmFpbmluZ0RhdGFzZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYiwgYW5kIHJlbW92ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQXVkaWVuY2VHZW5lcmF0aW9uSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYiwgYW5kIHJlbW92ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVBdWRpZW5jZU1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBjb25maWd1cmVkIGF1ZGllbmNlIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgY29uZmlndXJlZCBhdWRpZW5jZSBtb2RlbCBwb2xpY3lcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtIGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIE1MIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVNTENvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTUxDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVNTENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTCBpbnB1dCBjaGFubmVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTUxJbnB1dENoYW5uZWxEYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1MSW5wdXRDaGFubmVsRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTUxJbnB1dENoYW5uZWxEYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFsbCBvdXRwdXQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpbmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhaW5lZE1vZGVsT3V0cHV0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhaW5lZE1vZGVsT3V0cHV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhaW5pbmcgZGF0YXNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYWluaW5nRGF0YXNldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFpbmluZ0RhdGFzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYWluaW5nRGF0YXNldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGFuIGF1ZGllbmNlIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRBdWRpZW5jZU1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEF1ZGllbmNlTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobSBhc3NvY2lhdGlvbiBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbiBNTCBpbnB1dCBjaGFubmVsIGNyZWF0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhaW5lZCBtb2RlbCBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWwgcG9saWN5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgY29uZmlndXJlZCBtb2RlbCBhbGdvcml0aG0gYXNzb2NpYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbiBNTCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRNTENvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TUxDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRNTENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYW4gTUwgaW5wdXQgY2hhbm5lbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TUxJbnB1dENoYW5uZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TUxJbnB1dENoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1MSW5wdXRDaGFubmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhaW5lZCBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VHJhaW5lZE1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRyYWluZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VHJhaW5lZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhaW5lZCBtb2RlbCBpbmZlcmVuY2Ugam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFpbmluZyBkYXRhc2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUcmFpbmluZ0RhdGFzZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhaW5pbmdEYXRhc2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFpbmluZ0RhdGFzZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIHRoZSBhdWRpZW5jZSBleHBvcnQgam9ic1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEF1ZGllbmNlRXhwb3J0Sm9icy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXVkaWVuY2VFeHBvcnRKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXVkaWVuY2VFeHBvcnRKb2JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXVkaWVuY2VHZW5lcmF0aW9uSm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgYXVkaWVuY2UgbW9kZWxzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QXVkaWVuY2VNb2RlbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEF1ZGllbmNlTW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXVkaWVuY2VNb2RlbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtcyBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQ29sbGFib3JhdGlvbklkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBNTCBpbnB1dCBjaGFubmVscyBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQ29sbGFib3JhdGlvbklkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb2xsYWJvcmF0aW9uTUxJbnB1dENoYW5uZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiB0cmFpbmVkIG1vZGVsIGV4cG9ydCBqb2JzIHN0YXJ0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxFeHBvcnRKb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxFeHBvcnRKb2JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiB0cmFpbmVkIG1vZGVsIGluZmVyZW5jZSBqb2JzIHN0YXJ0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZDb2xsYWJvcmF0aW9uSWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIHRyYWluZWQgbW9kZWxzIGNyZWF0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZDb2xsYWJvcmF0aW9uSWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWxzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb25maWd1cmVkQXVkaWVuY2VNb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb25maWd1cmVkQXVkaWVuY2VNb2RlbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtIGFzc29jaWF0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgTUwgaW5wdXQgY2hhbm5lbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RNTElucHV0Q2hhbm5lbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdE1MSW5wdXRDaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdE1MSW5wdXRDaGFubmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgdGFncyBmb3IgYSBwcm92aWRlZCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiB0cmFpbmVkIG1vZGVsIGluZmVyZW5jZSBqb2JzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIHRyYWluZWQgbW9kZWwgdmVyc2lvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUcmFpbmVkTW9kZWxWZXJzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VHJhaW5lZE1vZGVsVmVyc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUcmFpbmVkTW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgdHJhaW5lZCBtb2RlbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUcmFpbmVkTW9kZWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUcmFpbmVkTW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VHJhaW5lZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgdHJhaW5pbmcgZGF0YXNldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUcmFpbmluZ0RhdGFzZXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUcmFpbmluZ0RhdGFzZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VHJhaW5pbmdEYXRhc2V0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBvciB1cGRhdGUgdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBjb25maWd1cmVkIGF1ZGllbmNlIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHV0IGFuIE1MIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QdXRNTENvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0TUxDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRNTENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBleHBvcnQgYW4gYXVkaWVuY2Ugb2YgYSBzcGVjaWZpZWQgc2l6ZSBhZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgYW4gYXVkaWVuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEF1ZGllbmNlRXhwb3J0Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0QXVkaWVuY2VFeHBvcnRKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0QXVkaWVuY2VFeHBvcnRKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCB0aGUgYXVkaWVuY2UgZ2VuZXJhdGlvbiBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRBdWRpZW5jZUdlbmVyYXRpb25Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHRyYWluZWQgbW9kZWwgZXhwb3J0IGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0VHJhaW5lZE1vZGVsRXhwb3J0Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0VHJhaW5lZE1vZGVsRXhwb3J0Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFRyYWluZWRNb2RlbEV4cG9ydEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgdHJhaW5lZCBtb2RlbCBpbmZlcmVuY2Ugam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdGFnIGEgc3BlY2lmaWMgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bnRhZyBhIHNwZWNpZmljIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVW50YWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VblRhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVblRhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgY29uZmlndXJlZCBhdWRpZW5jZSBtb2RlbC5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0NhbmNlbFRyYWluZWRNb2RlbCcsXG4gICAgICAnQ2FuY2VsVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iJyxcbiAgICAgICdDcmVhdGVBdWRpZW5jZU1vZGVsJyxcbiAgICAgICdDcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCcsXG4gICAgICAnQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtJyxcbiAgICAgICdDcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicsXG4gICAgICAnQ3JlYXRlTUxJbnB1dENoYW5uZWwnLFxuICAgICAgJ0NyZWF0ZVRyYWluZWRNb2RlbCcsXG4gICAgICAnQ3JlYXRlVHJhaW5pbmdEYXRhc2V0JyxcbiAgICAgICdEZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2InLFxuICAgICAgJ0RlbGV0ZUF1ZGllbmNlTW9kZWwnLFxuICAgICAgJ0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsJyxcbiAgICAgICdEZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeScsXG4gICAgICAnRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtJyxcbiAgICAgICdEZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicsXG4gICAgICAnRGVsZXRlTUxDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZWxldGVNTElucHV0Q2hhbm5lbERhdGEnLFxuICAgICAgJ0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCcsXG4gICAgICAnRGVsZXRlVHJhaW5pbmdEYXRhc2V0JyxcbiAgICAgICdQdXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeScsXG4gICAgICAnUHV0TUxDb25maWd1cmF0aW9uJyxcbiAgICAgICdTdGFydEF1ZGllbmNlRXhwb3J0Sm9iJyxcbiAgICAgICdTdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYicsXG4gICAgICAnU3RhcnRUcmFpbmVkTW9kZWxFeHBvcnRKb2InLFxuICAgICAgJ1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iJyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW5UYWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwnXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iJyxcbiAgICAgICdHZXRBdWRpZW5jZU1vZGVsJyxcbiAgICAgICdHZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24nLFxuICAgICAgJ0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCcsXG4gICAgICAnR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCcsXG4gICAgICAnR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWwnLFxuICAgICAgJ0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5JyxcbiAgICAgICdHZXRDb25maWd1cmVkTW9kZWxBbGdvcml0aG0nLFxuICAgICAgJ0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uJyxcbiAgICAgICdHZXRNTENvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0dldE1MSW5wdXRDaGFubmVsJyxcbiAgICAgICdHZXRUcmFpbmVkTW9kZWwnLFxuICAgICAgJ0dldFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYicsXG4gICAgICAnR2V0VHJhaW5pbmdEYXRhc2V0J1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RBdWRpZW5jZUV4cG9ydEpvYnMnLFxuICAgICAgJ0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzJyxcbiAgICAgICdMaXN0QXVkaWVuY2VNb2RlbHMnLFxuICAgICAgJ0xpc3RDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zJyxcbiAgICAgICdMaXN0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVscycsXG4gICAgICAnTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxFeHBvcnRKb2JzJyxcbiAgICAgICdMaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMnLFxuICAgICAgJ0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVscycsXG4gICAgICAnTGlzdENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVscycsXG4gICAgICAnTGlzdENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucycsXG4gICAgICAnTGlzdENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobXMnLFxuICAgICAgJ0xpc3RNTElucHV0Q2hhbm5lbHMnLFxuICAgICAgJ0xpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgJ0xpc3RUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzJyxcbiAgICAgICdMaXN0VHJhaW5lZE1vZGVsVmVyc2lvbnMnLFxuICAgICAgJ0xpc3RUcmFpbmVkTW9kZWxzJyxcbiAgICAgICdMaXN0VHJhaW5pbmdEYXRhc2V0cydcbiAgICBdLFxuICAgICdQZXJtaXNzaW9ucyBtYW5hZ2VtZW50JzogW1xuICAgICAgJ1B1dENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5J1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVblRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKHJlc291cmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpjbGVhbnJvb21zLW1sOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjb25maWd1cmVkLW1vZGVsLWFsZ29yaXRobS8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBtZW1iZXJzaGlwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbWVtYmVyc2hpcElkLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbihtZW1iZXJzaGlwSWQ6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmNsZWFucm9vbXMtbWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om1lbWJlcnNoaXAvJHsgbWVtYmVyc2hpcElkIH0vY29uZmlndXJlZC1tb2RlbC1hbGdvcml0aG0tYXNzb2NpYXRpb24vJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgTUxJbnB1dENoYW5uZWwgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gbWVtYmVyc2hpcElkIC0gSWRlbnRpZmllciBmb3IgdGhlIG1lbWJlcnNoaXBJZC5cbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTUxJbnB1dENoYW5uZWwobWVtYmVyc2hpcElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpjbGVhbnJvb21zLW1sOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptZW1iZXJzaGlwLyR7IG1lbWJlcnNoaXBJZCB9L21sLWlucHV0LWNoYW5uZWwvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgVHJhaW5lZE1vZGVsIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIG1lbWJlcnNoaXBJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBtZW1iZXJzaGlwSWQuXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblRyYWluZWRNb2RlbChtZW1iZXJzaGlwSWQ6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmNsZWFucm9vbXMtbWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om1lbWJlcnNoaXAvJHsgbWVtYmVyc2hpcElkIH0vdHJhaW5lZC1tb2RlbC8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gbWVtYmVyc2hpcElkIC0gSWRlbnRpZmllciBmb3IgdGhlIG1lbWJlcnNoaXBJZC5cbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKG1lbWJlcnNoaXBJZDogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06Y2xlYW5yb29tcy1tbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bWVtYmVyc2hpcC8keyBtZW1iZXJzaGlwSWQgfS90cmFpbmVkLW1vZGVsLWluZmVyZW5jZS1qb2IvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgYXVkaWVuY2VnZW5lcmF0aW9uam9iIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQXVkaWVuY2VnZW5lcmF0aW9uam9iKHJlc291cmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpjbGVhbnJvb21zLW1sOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTphdWRpZW5jZS1nZW5lcmF0aW9uLWpvYi8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBhdWRpZW5jZW1vZGVsIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQXVkaWVuY2Vtb2RlbChyZXNvdXJjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06Y2xlYW5yb29tcy1tbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YXVkaWVuY2UtbW9kZWwvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgY29uZmlndXJlZGF1ZGllbmNlbW9kZWwgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Db25maWd1cmVkYXVkaWVuY2Vtb2RlbChyZXNvdXJjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06Y2xlYW5yb29tcy1tbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y29uZmlndXJlZC1hdWRpZW5jZS1tb2RlbC8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB0cmFpbmluZ2RhdGFzZXQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25UcmFpbmluZ2RhdGFzZXQocmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmNsZWFucm9vbXMtbWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnRyYWluaW5nLWRhdGFzZXQvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHByZXNlbmNlIG9mIHRhZyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlcXVlc3R0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NhbmNlbFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ2FuY2VsVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9DcmVhdGVBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0NyZWF0ZVRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZWxldGVNTElucHV0Q2hhbm5lbERhdGEoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9HZXRBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0dldEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsKClcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobSgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldE1MQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0TUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0dldFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9HZXRUcmFpbmluZ0RhdGFzZXQoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUV4cG9ydEpvYnMoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvbkNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zKClcbiAgICogLSAudG9MaXN0TUxJbnB1dENoYW5uZWxzKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpXG4gICAqIC0gLnRvTGlzdFRyYWluZWRNb2RlbFZlcnNpb25zKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVscygpXG4gICAqIC0gLnRvUHV0TUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlRXhwb3J0Sm9iKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpXG4gICAqIC0gLnRvU3RhcnRUcmFpbmVkTW9kZWxFeHBvcnRKb2IoKVxuICAgKiAtIC50b1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGFnIGtleS12YWx1ZSBwYWlycyBhdHRhY2hlZCB0byB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DYW5jZWxUcmFpbmVkTW9kZWwoKVxuICAgKiAtIC50b0NhbmNlbFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYigpXG4gICAqIC0gLnRvQ3JlYXRlQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVNTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTUxJbnB1dENoYW5uZWxEYXRhKClcbiAgICogLSAudG9EZWxldGVUcmFpbmVkTW9kZWxPdXRwdXQoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWluaW5nRGF0YXNldCgpXG4gICAqIC0gLnRvR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iKClcbiAgICogLSAudG9HZXRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5KClcbiAgICogLSAudG9HZXRDb25maWd1cmVkTW9kZWxBbGdvcml0aG0oKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRNTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvR2V0VHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9HZXRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKVxuICAgKiAtIC50b0dldFRyYWluaW5nRGF0YXNldCgpXG4gICAqIC0gLnRvTGlzdEF1ZGllbmNlRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdEF1ZGllbmNlR2VuZXJhdGlvbkpvYnMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKVxuICAgKiAtIC50b1N0YXJ0QXVkaWVuY2VFeHBvcnRKb2IoKVxuICAgKiAtIC50b1N0YXJ0QXVkaWVuY2VHZW5lcmF0aW9uSm9iKClcbiAgICogLSAudG9TdGFydFRyYWluZWRNb2RlbEV4cG9ydEpvYigpXG4gICAqIC0gLnRvU3RhcnRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VblRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtXG4gICAqIC0gQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25cbiAgICogLSBNTElucHV0Q2hhbm5lbFxuICAgKiAtIFRyYWluZWRNb2RlbFxuICAgKiAtIFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYlxuICAgKiAtIGF1ZGllbmNlZ2VuZXJhdGlvbmpvYlxuICAgKiAtIGF1ZGllbmNlbW9kZWxcbiAgICogLSBjb25maWd1cmVkYXVkaWVuY2Vtb2RlbFxuICAgKiAtIHRyYWluaW5nZGF0YXNldFxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGFnIGtleXMgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXRhZ2tleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NhbmNlbFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ2FuY2VsVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9DcmVhdGVBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0NyZWF0ZVRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZWxldGVNTElucHV0Q2hhbm5lbERhdGEoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9HZXRBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0dldEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsKClcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobSgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldE1MQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0TUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0dldFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9HZXRUcmFpbmluZ0RhdGFzZXQoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUV4cG9ydEpvYnMoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvbkNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zKClcbiAgICogLSAudG9MaXN0TUxJbnB1dENoYW5uZWxzKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpXG4gICAqIC0gLnRvTGlzdFRyYWluZWRNb2RlbFZlcnNpb25zKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVscygpXG4gICAqIC0gLnRvUHV0TUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlRXhwb3J0Sm9iKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpXG4gICAqIC0gLnRvU3RhcnRUcmFpbmVkTW9kZWxFeHBvcnRKb2IoKVxuICAgKiAtIC50b1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW5UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgQ2xlYW4gcm9vbXMgY29sbGFib3JhdGlvbiBpZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vVEJEXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uTUxJbnB1dENoYW5uZWxzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEV4cG9ydEpvYnMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxzKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ29sbGFib3JhdGlvbklkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDb2xsYWJvcmF0aW9uSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2NsZWFucm9vbXMtbWxdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2NsZWFucm9vbXNtbC5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=