UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

1,086 lines 104 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Nimble = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [nimble](https://docs.aws.amazon.com/service-authorization/latest/reference/list_nimble.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class Nimble extends shared_1.PolicyStatement {
    /**
     * Grants permission to accept EULAs
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_AcceptEulas.html
     */
    toAcceptEulas() {
        return this.to('AcceptEulas');
    }
    /**
     * Grants permission to create a launch profile
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_CreateLaunchProfile.html
     */
    toCreateLaunchProfile() {
        return this.to('CreateLaunchProfile');
    }
    /**
     * Grants permission to create a streaming image
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_CreateStreamingImage.html
     */
    toCreateStreamingImage() {
        return this.to('CreateStreamingImage');
    }
    /**
     * Grants permission to create a streaming session
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_CreateStreamingSession.html
     */
    toCreateStreamingSession() {
        return this.to('CreateStreamingSession');
    }
    /**
     * Grants permission to create a StreamingSessionStream
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_CreateStreamingSessionStream.html
     */
    toCreateStreamingSessionStream() {
        return this.to('CreateStreamingSessionStream');
    }
    /**
     * Grants permission to create a studio
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_CreateStudio.html
     */
    toCreateStudio() {
        return this.to('CreateStudio');
    }
    /**
     * Grants permission to create a studio component. A studio component designates a network resource to which a launch profile will provide access
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_CreateStudioComponent.html
     */
    toCreateStudioComponent() {
        return this.to('CreateStudioComponent');
    }
    /**
     * Grants permission to delete a launch profile
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_DeleteLaunchProfile.html
     */
    toDeleteLaunchProfile() {
        return this.to('DeleteLaunchProfile');
    }
    /**
     * Grants permission to delete a launch profile member
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_DeleteLaunchProfileMember.html
     */
    toDeleteLaunchProfileMember() {
        return this.to('DeleteLaunchProfileMember');
    }
    /**
     * Grants permission to delete a streaming image
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_DeleteStreamingImage.html
     */
    toDeleteStreamingImage() {
        return this.to('DeleteStreamingImage');
    }
    /**
     * Grants permission to delete a streaming session
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_DeleteStreamingSession.html
     */
    toDeleteStreamingSession() {
        return this.to('DeleteStreamingSession');
    }
    /**
     * Grants permission to delete a studio
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_DeleteStudio.html
     */
    toDeleteStudio() {
        return this.to('DeleteStudio');
    }
    /**
     * Grants permission to delete a studio component
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_DeleteStudioComponent.html
     */
    toDeleteStudioComponent() {
        return this.to('DeleteStudioComponent');
    }
    /**
     * Grants permission to delete a studio member
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_DeleteStudioMember.html
     */
    toDeleteStudioMember() {
        return this.to('DeleteStudioMember');
    }
    /**
     * Grants permission to get a EULA
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetEula.html
     */
    toGetEula() {
        return this.to('GetEula');
    }
    /**
     * Grants permission to get a launch profile
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetLaunchProfile.html
     */
    toGetLaunchProfile() {
        return this.to('GetLaunchProfile');
    }
    /**
     * Grants permission to get a launch profile's details, which includes the summary of studio components and streaming images used by the launch profile
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetLaunchProfileDetails.html
     */
    toGetLaunchProfileDetails() {
        return this.to('GetLaunchProfileDetails');
    }
    /**
     * Grants permission to get a launch profile initialization. A launch profile initialization is a dereferenced version of a launch profile, including attached studio component connection information
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetLaunchProfileInitialization.html
     */
    toGetLaunchProfileInitialization() {
        return this.to('GetLaunchProfileInitialization');
    }
    /**
     * Grants permission to get a launch profile member
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetLaunchProfileMember.html
     */
    toGetLaunchProfileMember() {
        return this.to('GetLaunchProfileMember');
    }
    /**
     * Grants permission to get a streaming image
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetStreamingImage.html
     */
    toGetStreamingImage() {
        return this.to('GetStreamingImage');
    }
    /**
     * Grants permission to get a streaming session
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetStreamingSession.html
     */
    toGetStreamingSession() {
        return this.to('GetStreamingSession');
    }
    /**
     * Grants permission to get a streaming session backup
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetStreamingSessionBackup.html
     */
    toGetStreamingSessionBackup() {
        return this.to('GetStreamingSessionBackup');
    }
    /**
     * Grants permission to get a streaming session stream
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetStreamingSessionStream.html
     */
    toGetStreamingSessionStream() {
        return this.to('GetStreamingSessionStream');
    }
    /**
     * Grants permission to get a studio
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetStudio.html
     */
    toGetStudio() {
        return this.to('GetStudio');
    }
    /**
     * Grants permission to get a studio component
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetStudioComponent.html
     */
    toGetStudioComponent() {
        return this.to('GetStudioComponent');
    }
    /**
     * Grants permission to get a studio member
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_GetStudioMember.html
     */
    toGetStudioMember() {
        return this.to('GetStudioMember');
    }
    /**
     * Grants permission to list EULA acceptances
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListEulaAcceptances.html
     */
    toListEulaAcceptances() {
        return this.to('ListEulaAcceptances');
    }
    /**
     * Grants permission to list EULAs
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListEulas.html
     */
    toListEulas() {
        return this.to('ListEulas');
    }
    /**
     * Grants permission to list launch profile members
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListLaunchProfileMembers.html
     */
    toListLaunchProfileMembers() {
        return this.to('ListLaunchProfileMembers');
    }
    /**
     * Grants permission to list launch profiles
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListLaunchProfiles.html
     */
    toListLaunchProfiles() {
        return this.to('ListLaunchProfiles');
    }
    /**
     * Grants permission to list streaming images
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListStreamingImages.html
     */
    toListStreamingImages() {
        return this.to('ListStreamingImages');
    }
    /**
     * Grants permission to list streaming session backups
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListStreamingSessionBackups.html
     */
    toListStreamingSessionBackups() {
        return this.to('ListStreamingSessionBackups');
    }
    /**
     * Grants permission to list streaming sessions
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListStreamingSessions.html
     */
    toListStreamingSessions() {
        return this.to('ListStreamingSessions');
    }
    /**
     * Grants permission to list studio components
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListStudioComponents.html
     */
    toListStudioComponents() {
        return this.to('ListStudioComponents');
    }
    /**
     * Grants permission to list studio members
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListStudioMembers.html
     */
    toListStudioMembers() {
        return this.to('ListStudioMembers');
    }
    /**
     * Grants permission to list all studios
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListStudios.html
     */
    toListStudios() {
        return this.to('ListStudios');
    }
    /**
     * Grants permission to list all tags on a Nimble Studio resource
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_ListTagsForResource.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to add/update launch profile members
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_PutLaunchProfileMembers.html
     */
    toPutLaunchProfileMembers() {
        return this.to('PutLaunchProfileMembers');
    }
    /**
     * Grants permission to add/update studio members
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_PutStudioMembers.html
     */
    toPutStudioMembers() {
        return this.to('PutStudioMembers');
    }
    /**
     * Grants permission to start a streaming session
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_StartStreamingSession.html
     */
    toStartStreamingSession() {
        return this.to('StartStreamingSession');
    }
    /**
     * Grants permission to repair the studio's AWS IAM Identity Center configuration
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_StartStudioSSOConfigurationRepair.html
     */
    toStartStudioSSOConfigurationRepair() {
        return this.to('StartStudioSSOConfigurationRepair');
    }
    /**
     * Grants permission to stop a streaming session
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_StopStreamingSession.html
     */
    toStopStreamingSession() {
        return this.to('StopStreamingSession');
    }
    /**
     * Grants permission to add or overwrite one or more tags for the specified Nimble Studio resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_TagResource.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to disassociate one or more tags from the specified Nimble Studio resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_UntagResource.html
     */
    toUntagResource() {
        return this.to('UntagResource');
    }
    /**
     * Grants permission to update a launch profile
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_UpdateLaunchProfile.html
     */
    toUpdateLaunchProfile() {
        return this.to('UpdateLaunchProfile');
    }
    /**
     * Grants permission to update a launch profile member
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_UpdateLaunchProfileMember.html
     */
    toUpdateLaunchProfileMember() {
        return this.to('UpdateLaunchProfileMember');
    }
    /**
     * Grants permission to update a streaming image
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_UpdateStreamingImage.html
     */
    toUpdateStreamingImage() {
        return this.to('UpdateStreamingImage');
    }
    /**
     * Grants permission to update a studio
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_UpdateStudio.html
     */
    toUpdateStudio() {
        return this.to('UpdateStudio');
    }
    /**
     * Grants permission to update a studio component
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_UpdateStudioComponent.html
     */
    toUpdateStudioComponent() {
        return this.to('UpdateStudioComponent');
    }
    /**
     * Grants permission to allow Nimble Studio portal to show the appropriate features for this account
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/userguide/security-iam-service-with-iam.html
     */
    toGetFeatureMap() {
        return this.to('GetFeatureMap');
    }
    /**
     * Grants permission to report metrics and logs for the Nimble Studio portal to monitor application health
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/userguide/security-iam-service-with-iam.html
     */
    toPutStudioLogEvents() {
        return this.to('PutStudioLogEvents');
    }
    /**
     * Adds a resource of type eula to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_Eula.html
     *
     * @param eulaId - Identifier for the eulaId.
     * @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.
     */
    onEula(eulaId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:eula/${eulaId}`);
    }
    /**
     * Adds a resource of type eula-acceptance to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_EulaAcceptance.html
     *
     * @param eulaAcceptanceId - Identifier for the eulaAcceptanceId.
     * @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:
     * - .ifStudioId()
     */
    onEulaAcceptance(eulaAcceptanceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:eula-acceptance/${eulaAcceptanceId}`);
    }
    /**
     * Adds a resource of type launch-profile to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_LaunchProfile.html
     *
     * @param launchProfileId - Identifier for the launchProfileId.
     * @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:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifStudioId()
     */
    onLaunchProfile(launchProfileId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:launch-profile/${launchProfileId}`);
    }
    /**
     * Adds a resource of type streaming-image to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_StreamingImage.html
     *
     * @param streamingImageId - Identifier for the streamingImageId.
     * @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:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifStudioId()
     */
    onStreamingImage(streamingImageId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:streaming-image/${streamingImageId}`);
    }
    /**
     * Adds a resource of type streaming-session to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_StreamingSession.html
     *
     * @param streamingSessionId - Identifier for the streamingSessionId.
     * @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:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifCreatedBy()
     * - .ifOwnedBy()
     */
    onStreamingSession(streamingSessionId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:streaming-session/${streamingSessionId}`);
    }
    /**
     * Adds a resource of type streaming-session-backup to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_StreamingSessionBackup.html
     *
     * @param streamingSessionBackupId - Identifier for the streamingSessionBackupId.
     * @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:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifOwnedBy()
     */
    onStreamingSessionBackup(streamingSessionBackupId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:streaming-session-backup/${streamingSessionBackupId}`);
    }
    /**
     * Adds a resource of type studio to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_Studio.html
     *
     * @param studioId - Identifier for the studioId.
     * @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:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifStudioId()
     */
    onStudio(studioId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:studio/${studioId}`);
    }
    /**
     * Adds a resource of type studio-component to the statement
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/APIReference/API_StudioComponent.html
     *
     * @param studioComponentId - Identifier for the studioComponentId.
     * @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:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifStudioId()
     */
    onStudioComponent(studioComponentId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:nimble:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:studio-component/${studioComponentId}`);
    }
    /**
     * Filters access by a tag key and value pair that is allowed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toCreateLaunchProfile()
     * - .toCreateStreamingImage()
     * - .toCreateStreamingSession()
     * - .toCreateStreamingSessionStream()
     * - .toCreateStudio()
     * - .toCreateStudioComponent()
     * - .toDeleteLaunchProfile()
     * - .toDeleteLaunchProfileMember()
     * - .toDeleteStreamingImage()
     * - .toDeleteStreamingSession()
     * - .toDeleteStudio()
     * - .toDeleteStudioComponent()
     * - .toDeleteStudioMember()
     * - .toGetLaunchProfile()
     * - .toGetLaunchProfileDetails()
     * - .toGetLaunchProfileInitialization()
     * - .toGetLaunchProfileMember()
     * - .toGetStreamingImage()
     * - .toGetStreamingSession()
     * - .toGetStreamingSessionBackup()
     * - .toGetStreamingSessionStream()
     * - .toGetStudio()
     * - .toGetStudioComponent()
     * - .toGetStudioMember()
     * - .toListLaunchProfileMembers()
     * - .toListLaunchProfiles()
     * - .toListStreamingImages()
     * - .toListStreamingSessionBackups()
     * - .toListStreamingSessions()
     * - .toListStudioComponents()
     * - .toListStudioMembers()
     * - .toListTagsForResource()
     * - .toPutLaunchProfileMembers()
     * - .toPutStudioMembers()
     * - .toStartStreamingSession()
     * - .toStartStudioSSOConfigurationRepair()
     * - .toStopStreamingSession()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLaunchProfile()
     * - .toUpdateLaunchProfileMember()
     * - .toUpdateStreamingImage()
     * - .toUpdateStudio()
     * - .toUpdateStudioComponent()
     * - .toPutStudioLogEvents()
     *
     * Applies to resource types:
     * - launch-profile
     * - streaming-image
     * - streaming-session
     * - streaming-session-backup
     * - studio
     * - studio-component
     *
     * @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 a tag key and value pair of a resource
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
     *
     * Applies to actions:
     * - .toCreateLaunchProfile()
     * - .toCreateStreamingImage()
     * - .toCreateStreamingSession()
     * - .toCreateStreamingSessionStream()
     * - .toCreateStudio()
     * - .toCreateStudioComponent()
     * - .toDeleteLaunchProfile()
     * - .toDeleteLaunchProfileMember()
     * - .toDeleteStreamingImage()
     * - .toDeleteStreamingSession()
     * - .toDeleteStudio()
     * - .toDeleteStudioComponent()
     * - .toDeleteStudioMember()
     * - .toGetLaunchProfile()
     * - .toGetLaunchProfileDetails()
     * - .toGetLaunchProfileInitialization()
     * - .toGetLaunchProfileMember()
     * - .toGetStreamingImage()
     * - .toGetStreamingSession()
     * - .toGetStreamingSessionBackup()
     * - .toGetStreamingSessionStream()
     * - .toGetStudio()
     * - .toGetStudioComponent()
     * - .toGetStudioMember()
     * - .toListLaunchProfileMembers()
     * - .toListLaunchProfiles()
     * - .toListStreamingImages()
     * - .toListStreamingSessionBackups()
     * - .toListStreamingSessions()
     * - .toListStudioComponents()
     * - .toListStudioMembers()
     * - .toListTagsForResource()
     * - .toPutLaunchProfileMembers()
     * - .toPutStudioMembers()
     * - .toStartStreamingSession()
     * - .toStartStudioSSOConfigurationRepair()
     * - .toStopStreamingSession()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLaunchProfile()
     * - .toUpdateLaunchProfileMember()
     * - .toUpdateStreamingImage()
     * - .toUpdateStudio()
     * - .toUpdateStudioComponent()
     * - .toPutStudioLogEvents()
     *
     * Applies to resource types:
     * - launch-profile
     * - streaming-image
     * - streaming-session
     * - streaming-session-backup
     * - studio
     * - studio-component
     *
     * @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 a list of tag keys that are allowed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
     *
     * Applies to actions:
     * - .toCreateLaunchProfile()
     * - .toCreateStreamingImage()
     * - .toCreateStreamingSession()
     * - .toCreateStreamingSessionStream()
     * - .toCreateStudio()
     * - .toCreateStudioComponent()
     * - .toDeleteLaunchProfile()
     * - .toDeleteLaunchProfileMember()
     * - .toDeleteStreamingImage()
     * - .toDeleteStreamingSession()
     * - .toDeleteStudio()
     * - .toDeleteStudioComponent()
     * - .toDeleteStudioMember()
     * - .toGetLaunchProfile()
     * - .toGetLaunchProfileDetails()
     * - .toGetLaunchProfileInitialization()
     * - .toGetLaunchProfileMember()
     * - .toGetStreamingImage()
     * - .toGetStreamingSession()
     * - .toGetStreamingSessionBackup()
     * - .toGetStreamingSessionStream()
     * - .toGetStudio()
     * - .toGetStudioComponent()
     * - .toGetStudioMember()
     * - .toListLaunchProfileMembers()
     * - .toListLaunchProfiles()
     * - .toListStreamingImages()
     * - .toListStreamingSessionBackups()
     * - .toListStreamingSessions()
     * - .toListStudioComponents()
     * - .toListStudioMembers()
     * - .toListTagsForResource()
     * - .toPutLaunchProfileMembers()
     * - .toPutStudioMembers()
     * - .toStartStreamingSession()
     * - .toStartStudioSSOConfigurationRepair()
     * - .toStopStreamingSession()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLaunchProfile()
     * - .toUpdateLaunchProfileMember()
     * - .toUpdateStreamingImage()
     * - .toUpdateStudio()
     * - .toUpdateStudioComponent()
     * - .toPutStudioLogEvents()
     *
     * Applies to resource types:
     * - launch-profile
     * - streaming-image
     * - streaming-session
     * - streaming-session-backup
     * - studio
     * - studio-component
     *
     * @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 the createdBy request parameter or the ID of the creator of the resource
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toCreateStreamingSessionStream()
     * - .toDeleteStreamingSession()
     * - .toGetStreamingSession()
     * - .toGetStreamingSessionStream()
     * - .toListStreamingSessions()
     * - .toListTagsForResource()
     * - .toStartStreamingSession()
     * - .toStopStreamingSession()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * Applies to resource types:
     * - streaming-session
     *
     * @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`
     */
    ifCreatedBy(value, operator) {
        return this.if(`createdBy`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the ownedBy request parameter or the ID of the owner of the resource
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toCreateStreamingSessionStream()
     * - .toDeleteStreamingSession()
     * - .toGetStreamingSession()
     * - .toGetStreamingSessionBackup()
     * - .toGetStreamingSessionStream()
     * - .toListStreamingSessions()
     * - .toListTagsForResource()
     * - .toStartStreamingSession()
     * - .toStopStreamingSession()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * Applies to resource types:
     * - streaming-session
     * - streaming-session-backup
     *
     * @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`
     */
    ifOwnedBy(value, operator) {
        return this.if(`ownedBy`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the principalId request parameter
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toListLaunchProfiles()
     *
     * @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`
     */
    ifPrincipalId(value, operator) {
        return this.if(`principalId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the ID of the logged in user
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toCreateStreamingSessionStream()
     * - .toDeleteStreamingSession()
     * - .toGetStreamingSession()
     * - .toGetStreamingSessionBackup()
     * - .toGetStreamingSessionStream()
     * - .toListLaunchProfiles()
     * - .toListStreamingSessionBackups()
     * - .toListStreamingSessions()
     * - .toStartStreamingSession()
     * - .toStopStreamingSession()
     *
     * @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`
     */
    ifRequesterPrincipalId(value, operator) {
        return this.if(`requesterPrincipalId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by a specific studio
     *
     * https://docs.aws.amazon.com/nimble-studio/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toCreateLaunchProfile()
     * - .toCreateStreamingImage()
     * - .toCreateStreamingSession()
     * - .toCreateStudio()
     * - .toCreateStudioComponent()
     * - .toDeleteLaunchProfile()
     * - .toDeleteLaunchProfileMember()
     * - .toDeleteStreamingImage()
     * - .toDeleteStudio()
     * - .toDeleteStudioComponent()
     * - .toDeleteStudioMember()
     * - .toGetLaunchProfile()
     * - .toGetLaunchProfileDetails()
     * - .toGetLaunchProfileInitialization()
     * - .toGetLaunchProfileMember()
     * - .toGetStreamingImage()
     * - .toGetStudio()
     * - .toGetStudioComponent()
     * - .toGetStudioMember()
     * - .toListEulaAcceptances()
     * - .toListLaunchProfileMembers()
     * - .toListLaunchProfiles()
     * - .toListStreamingImages()
     * - .toListStreamingSessionBackups()
     * - .toListStreamingSessions()
     * - .toListStudioComponents()
     * - .toListStudioMembers()
     * - .toListTagsForResource()
     * - .toPutLaunchProfileMembers()
     * - .toPutStudioMembers()
     * - .toStartStudioSSOConfigurationRepair()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLaunchProfile()
     * - .toUpdateLaunchProfileMember()
     * - .toUpdateStreamingImage()
     * - .toUpdateStudio()
     * - .toUpdateStudioComponent()
     * - .toPutStudioLogEvents()
     *
     * Applies to resource types:
     * - eula-acceptance
     * - launch-profile
     * - streaming-image
     * - studio
     * - studio-component
     *
     * @param value The value(s) to check
     * @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
     */
    ifStudioId(value, operator) {
        return this.if(`studioId`, value, operator ?? 'ArnLike');
    }
    /**
     * Statement provider for service [nimble](https://docs.aws.amazon.com/service-authorization/latest/reference/list_nimble.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 'nimble';
        this.accessLevelList = {
            Write: [
                'AcceptEulas',
                'CreateLaunchProfile',
                'CreateStreamingImage',
                'CreateStreamingSession',
                'CreateStreamingSessionStream',
                'CreateStudio',
                'CreateStudioComponent',
                'DeleteLaunchProfile',
                'DeleteLaunchProfileMember',
                'DeleteStreamingImage',
                'DeleteStreamingSession',
                'DeleteStudio',
                'DeleteStudioComponent',
                'DeleteStudioMember',
                'PutLaunchProfileMembers',
                'PutStudioMembers',
                'StartStreamingSession',
                'StartStudioSSOConfigurationRepair',
                'StopStreamingSession',
                'TagResource',
                'UntagResource',
                'UpdateLaunchProfile',
                'UpdateLaunchProfileMember',
                'UpdateStreamingImage',
                'UpdateStudio',
                'UpdateStudioComponent',
                'PutStudioLogEvents'
            ],
            Read: [
                'GetEula',
                'GetLaunchProfile',
                'GetLaunchProfileDetails',
                'GetLaunchProfileInitialization',
                'GetLaunchProfileMember',
                'GetStreamingImage',
                'GetStreamingSession',
                'GetStreamingSessionBackup',
                'GetStreamingSessionStream',
                'GetStudio',
                'GetStudioComponent',
                'GetStudioMember',
                'ListEulaAcceptances',
                'ListEulas',
                'ListLaunchProfileMembers',
                'ListLaunchProfiles',
                'ListStreamingImages',
                'ListStreamingSessionBackups',
                'ListStreamingSessions',
                'ListStudioComponents',
                'ListStudioMembers',
                'ListStudios',
                'ListTagsForResource',
                'GetFeatureMap'
            ],
            Tagging: [
                'TagResource',
                'UntagResource'
            ]
        };
    }
}
exports.Nimble = Nimble;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmltYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibmltYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxNQUFPLFNBQVEsd0JBQWU7SUFHekM7Ozs7OztPQU1HO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDhCQUE4QjtRQUNuQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwyQkFBMkI7UUFDaEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFD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QUF1QjtnQkFDdkIsb0JBQW9CO2dCQUNwQix5QkFBeUI7Z0JBQ3pCLGtCQUFrQjtnQkFDbEIsdUJBQXVCO2dCQUN2QixtQ0FBbUM7Z0JBQ25DLHNCQUFzQjtnQkFDdEIsYUFBYTtnQkFDYixlQUFlO2dCQUNmLHFCQUFxQjtnQkFDckIsMkJBQTJCO2dCQUMzQixzQkFBc0I7Z0JBQ3RCLGNBQWM7Z0JBQ2QsdUJBQXVCO2dCQUN2QixvQkFBb0I7YUFDckI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osU0FBUztnQkFDVCxrQkFBa0I7Z0JBQ2xCLHlCQUF5QjtnQkFDekIsZ0NBQWdDO2dCQUNoQyx3QkFBd0I7Z0JBQ3hCLG1CQUFtQjtnQkFDbkIscUJBQXFCO2dCQUNyQiwyQkFBMkI7Z0JBQzNCLDJCQUEyQjtnQkFDM0IsV0FBVztnQkFDWCxvQkFBb0I7Z0JBQ3BCLGlCQUFpQjtnQkFDakIscUJBQXFCO2dCQUNyQixXQUFXO2dCQUNYLDBCQUEwQjtnQkFDMUIsb0JBQW9CO2dCQUNwQixxQkFBcUI7Z0JBQ3JCLDZCQUE2QjtnQkFDN0IsdUJBQXVCO2dCQUN2QixzQkFBc0I7Z0JBQ3RCLG1CQUFtQjtnQkFDbkIsYUFBYTtnQkFDYixxQkFBcUI7Z0JBQ3JCLGVBQWU7YUFDaEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQXNnQkYsQ0FBQztDQUNGO0FBdm5DRCx3QkF1bkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtuaW1ibGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X25pbWJsZS5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbWJsZSBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ25pbWJsZSc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFjY2VwdCBFVUxBc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0FjY2VwdEV1bGFzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjY2VwdEV1bGFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBY2NlcHRFdWxhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxhdW5jaCBwcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlTGF1bmNoUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMYXVuY2hQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVMYXVuY2hQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc3RyZWFtaW5nIGltYWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlU3RyZWFtaW5nSW1hZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlU3RyZWFtaW5nSW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVN0cmVhbWluZ0ltYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc3RyZWFtaW5nIHNlc3Npb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVTdHJlYW1pbmdTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVN0cmVhbWluZ1Nlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVN0cmVhbWluZ1Nlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBTdHJlYW1pbmdTZXNzaW9uU3RyZWFtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlU3RyZWFtaW5nU2Vzc2lvblN0cmVhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTdHJlYW1pbmdTZXNzaW9uU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTdHJlYW1pbmdTZXNzaW9uU3RyZWFtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc3R1ZGlvXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlU3R1ZGlvLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVN0dWRpbygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlU3R1ZGlvJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc3R1ZGlvIGNvbXBvbmVudC4gQSBzdHVkaW8gY29tcG9uZW50IGRlc2lnbmF0ZXMgYSBuZXR3b3JrIHJlc291cmNlIHRvIHdoaWNoIGEgbGF1bmNoIHByb2ZpbGUgd2lsbCBwcm92aWRlIGFjY2Vzc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVN0dWRpb0NvbXBvbmVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTdHVkaW9Db21wb25lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVN0dWRpb0NvbXBvbmVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGxhdW5jaCBwcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTGF1bmNoUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMYXVuY2hQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMYXVuY2hQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbGF1bmNoIHByb2ZpbGUgbWVtYmVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTGF1bmNoUHJvZmlsZU1lbWJlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMYXVuY2hQcm9maWxlTWVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMYXVuY2hQcm9maWxlTWVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc3RyZWFtaW5nIGltYWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU3RyZWFtaW5nSW1hZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU3RyZWFtaW5nSW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVN0cmVhbWluZ0ltYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc3RyZWFtaW5nIHNlc3Npb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVTdHJlYW1pbmdTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVN0cmVhbWluZ1Nlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVN0cmVhbWluZ1Nlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBzdHVkaW9cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVTdHVkaW8uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU3R1ZGlvKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTdHVkaW8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBzdHVkaW8gY29tcG9uZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU3R1ZGlvQ29tcG9uZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVN0dWRpb0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlU3R1ZGlvQ29tcG9uZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc3R1ZGlvIG1lbWJlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVN0dWRpb01lbWJlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTdHVkaW9NZW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVN0dWRpb01lbWJlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIEVVTEFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEV1bGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RXVsYSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RXVsYScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxhdW5jaCBwcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRMYXVuY2hQcm9maWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldExhdW5jaFByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldExhdW5jaFByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsYXVuY2ggcHJvZmlsZSdzIGRldGFpbHMsIHdoaWNoIGluY2x1ZGVzIHRoZSBzdW1tYXJ5IG9mIHN0dWRpbyBjb21wb25lbnRzIGFuZCBzdHJlYW1pbmcgaW1hZ2VzIHVzZWQgYnkgdGhlIGxhdW5jaCBwcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRMYXVuY2hQcm9maWxlRGV0YWlscy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMYXVuY2hQcm9maWxlRGV0YWlscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TGF1bmNoUHJvZmlsZURldGFpbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsYXVuY2ggcHJvZmlsZSBpbml0aWFsaXphdGlvbi4gQSBsYXVuY2ggcHJvZmlsZSBpbml0aWFsaXphdGlvbiBpcyBhIGRlcmVmZXJlbmNlZCB2ZXJzaW9uIG9mIGEgbGF1bmNoIHByb2ZpbGUsIGluY2x1ZGluZyBhdHRhY2hlZCBzdHVkaW8gY29tcG9uZW50IGNvbm5lY3Rpb24gaW5mb3JtYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldExhdW5jaFByb2ZpbGVJbml0aWFsaXphdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMYXVuY2hQcm9maWxlSW5pdGlhbGl6YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldExhdW5jaFByb2ZpbGVJbml0aWFsaXphdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxhdW5jaCBwcm9maWxlIG1lbWJlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TGF1bmNoUHJvZmlsZU1lbWJlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMYXVuY2hQcm9maWxlTWVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMYXVuY2hQcm9maWxlTWVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgc3RyZWFtaW5nIGltYWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdHJlYW1pbmdJbWFnZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTdHJlYW1pbmdJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3RyZWFtaW5nSW1hZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzdHJlYW1pbmcgc2Vzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0U3RyZWFtaW5nU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTdHJlYW1pbmdTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTdHJlYW1pbmdTZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgc3RyZWFtaW5nIHNlc3Npb24gYmFja3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdHJlYW1pbmdTZXNzaW9uQmFja3VwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0cmVhbWluZ1Nlc3Npb25CYWNrdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN0cmVhbWluZ1Nlc3Npb25CYWNrdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzdHJlYW1pbmcgc2Vzc2lvbiBzdHJlYW1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFN0cmVhbWluZ1Nlc3Npb25TdHJlYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3RyZWFtaW5nU2Vzc2lvblN0cmVhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHN0dWRpb1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0U3R1ZGlvLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0dWRpbygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3R1ZGlvJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgc3R1ZGlvIGNvbXBvbmVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0U3R1ZGlvQ29tcG9uZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0dWRpb0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3R1ZGlvQ29tcG9uZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgc3R1ZGlvIG1lbWJlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0U3R1ZGlvTWVtYmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0dWRpb01lbWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3R1ZGlvTWVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBFVUxBIGFjY2VwdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0RXVsYUFjY2VwdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RFdWxhQWNjZXB0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RFdWxhQWNjZXB0YW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IEVVTEFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0RXVsYXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEV1bGFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RXVsYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGxhdW5jaCBwcm9maWxlIG1lbWJlcnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RMYXVuY2hQcm9maWxlTWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TGF1bmNoUHJvZmlsZU1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RMYXVuY2hQcm9maWxlTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgbGF1bmNoIHByb2ZpbGVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0TGF1bmNoUHJvZmlsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdExhdW5jaFByb2ZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TGF1bmNoUHJvZmlsZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHN0cmVhbWluZyBpbWFnZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdHJlYW1pbmdJbWFnZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN0cmVhbWluZ0ltYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFN0cmVhbWluZ0ltYWdlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc3RyZWFtaW5nIHNlc3Npb24gYmFja3Vwc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFN0cmVhbWluZ1Nlc3Npb25CYWNrdXBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTdHJlYW1pbmdTZXNzaW9uQmFja3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFN0cmVhbWluZ1Nlc3Npb25CYWNrdXBzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBzdHJlYW1pbmcgc2Vzc2lvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdHJlYW1pbmdTZXNzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U3RyZWFtaW5nU2Vzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTdHJlYW1pbmdTZXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc3R1ZGlvIGNvbXBvbmVudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdHVkaW9Db21wb25lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTdHVkaW9Db21wb25lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U3R1ZGlvQ29tcG9uZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc3R1ZGlvIG1lbWJlcnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdHVkaW9NZW1iZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTdHVkaW9NZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U3R1ZGlvTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHN0dWRpb3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdHVkaW9zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTdHVkaW9zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U3R1ZGlvcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRhZ3Mgb24gYSBOaW1ibGUgU3R1ZGlvIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQvdXBkYXRlIGxhdW5jaCBwcm9maWxlIG1lbWJlcnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QdXRMYXVuY2hQcm9maWxlTWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRMYXVuY2hQcm9maWxlTWVtYmVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0TGF1bmNoUHJvZmlsZU1lbWJlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQvdXBkYXRlIHN0dWRpbyBtZW1iZXJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0U3R1ZGlvTWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRTdHVkaW9NZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRTdHVkaW9NZW1iZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYSBzdHJlYW1pbmcgc2Vzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0U3RyZWFtaW5nU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFN0cmVhbWluZ1Nlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0U3RyZWFtaW5nU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlcGFpciB0aGUgc3R1ZGlvJ3MgQVdTIElBTSBJZGVudGl0eSBDZW50ZXIgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0U3R1ZGlvU1NPQ29uZmlndXJhdGlvblJlcGFpci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFN0dWRpb1NTT0NvbmZpZ3VyYXRpb25SZXBhaXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0U3R1ZGlvU1NPQ29uZmlndXJhdGlvblJlcGFpcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgYSBzdHJlYW1pbmcgc2Vzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0b3BTdHJlYW1pbmdTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3BTdHJlYW1pbmdTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9wU3RyZWFtaW5nU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCBvciBvdmVyd3JpdGUgb25lIG9yIG1vcmUgdGFncyBmb3IgdGhlIHNwZWNpZmllZCBOaW1ibGUgU3R1ZGlvIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIG9uZSBvciBtb3JlIHRhZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIE5pbWJsZSBTdHVkaW8gcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBsYXVuY2ggcHJvZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZUxhdW5jaFByb2ZpbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTGF1bmNoUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTGF1bmNoUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIGxhdW5jaCBwcm9maWxlIG1lbWJlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZUxhdW5jaFByb2ZpbGVNZW1iZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTGF1bmNoUHJvZmlsZU1lbWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTGF1bmNoUHJvZmlsZU1lbWJlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHN0cmVhbWluZyBpbWFnZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVN0cmVhbWluZ0ltYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVN0cmVhbWluZ0ltYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVTdHJlYW1pbmdJbWFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHN0dWRpb1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVN0dWRpby5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVTdHVkaW8oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVN0dWRpbycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHN0dWRpbyBjb21wb25lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVTdHVkaW9Db21wb25lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU3R1ZGlvQ29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVTdHVkaW9Db21wb25lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhbGxvdyBOaW1ibGUgU3R1ZGlvIHBvcnRhbCB0byBzaG93IHRoZSBhcHByb3ByaWF0ZSBmZWF0dXJlcyBmb3IgdGhpcyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5LWlhbS1zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEZlYXR1cmVNYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEZlYXR1cmVNYXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXBvcnQgbWV0cmljcyBhbmQgbG9ncyBmb3IgdGhlIE5pbWJsZSBTdHVkaW8gcG9ydGFsIHRvIG1vbml0b3IgYXBwbGljYXRpb24gaGVhbHRoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRTdHVkaW9Mb2dFdmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFN0dWRpb0xvZ0V2ZW50cycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQWNjZXB0RXVsYXMnLFxuICAgICAgJ0NyZWF0ZUxhdW5jaFByb2ZpbGUnLFxuICAgICAgJ0NyZWF0ZVN0cmVhbWluZ0ltYWdlJyxcbiAgICAgICdDcmVhdGVTdHJlYW1pbmdTZXNzaW9uJyxcbiAgICAgICdDcmVhdGVTdHJlYW1pbmdTZXNzaW9uU3RyZWFtJyxcbiAgICAgICdDcmVhdGVTdHVkaW8nLFxuICAgICAgJ0NyZWF0ZVN0dWRpb0NvbXBvbmVudCcsXG4gICAgICAnRGVsZXRlTGF1bmNoUHJvZmlsZScsXG4gICAgICAnRGVsZXRlTGF1bmNoUHJvZmlsZU1lbWJlcicsXG4gICAgICAnRGVsZXRlU3RyZWFtaW5nSW1hZ2UnLFxuICAgICAgJ0RlbGV0ZVN0cmVhbWluZ1Nlc3Npb24nLFxuICAgICAgJ0RlbGV0ZVN0dWRpbycsXG4gICAgICAnRGVsZXRlU3R1ZGlvQ29tcG9uZW50JyxcbiAgICAgICdEZWxldGVTdHVkaW9NZW1iZXInLFxuICAgICAgJ1B1dExhdW5jaFByb2ZpbGVNZW1iZXJzJyxcbiAgICAgICdQdXRTdHVkaW9NZW1iZXJzJyxcbiAgICAgICdTdGFydFN0cmVhbWluZ1Nlc3Npb24nLFxuICAgICAgJ1N0YXJ0U3R1ZGlvU1NPQ29uZmlndXJhdGlvblJlcGFpcicsXG4gICAgICAnU3RvcFN0cmVhbWluZ1Nlc3Npb24nLFxuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJyxcbiAgICAgICdVcGRhdGVMYXVuY2hQcm9maWxlJyxcbiAgICAgICdVcGRhdGVMYXVuY2hQcm9maWxlTWVtYmVyJyxcbiAgICAgICdVcGRhdGVTdHJlYW1pbmdJbWFnZScsXG4gICAgICAnVXBkYXRlU3R1ZGlvJyxcbiAgICAgICdVcGRhdGVTdHVkaW9Db21wb25lbnQnLFxuICAgICAgJ1B1dFN0dWRpb0xvZ0V2ZW50cydcbiAgICBdLFxuICAgIFJlYWQ6IFtcbiAgICAgICdHZXRFdWxhJyxcbiAgICAgICdHZXRMYXVuY2hQcm9maWxlJyxcbiAgICAgICdHZXRMYXVuY2hQcm9maWxlRGV0YWlscycsXG4gICAgICAnR2V0TGF1bmNoUHJvZmlsZUluaXRpYWxpemF0aW9uJyxcbiAgICAgICdHZXRMYXVuY2hQcm9maWxlTWVtYmVyJyxcbiAgICAgICdHZXRTdHJlYW1pbmdJbWFnZScsXG4gICAgICAnR2V0U3RyZWFtaW5nU2Vzc2lvbicsXG4gICAgICAnR2V0U3RyZWFtaW5nU2Vzc2lvbkJhY2t1cCcsXG4gICAgICAnR2V0U3RyZWFtaW5nU2Vzc2lvblN0cmVhbScsXG4gICAgICAnR2V0U3R1ZGlvJyxcbiAgICAgICdHZXRTdHVkaW9Db21wb25lbnQnLFxuICAgICAgJ0dldFN0dWRpb01lbWJlcicsXG4gICAgICAnTGlzdEV1bGFBY2NlcHRhbmNlcycsXG4gICAgICAnTGlzdEV1bGFzJyxcbiAgICAgICdMaXN0TGF1bmNoUHJvZmlsZU1lbWJlcnMnLFxuICAgICAgJ0xpc3RMYXVuY2hQcm9maWxlcycsXG4gICAgICAnTGlzdFN0cmVhbWluZ0ltYWdlcycsXG4gICAgICAnTGlzdFN0cmVhbWluZ1Nlc3Npb25CYWNrdXBzJyxcbiAgICAgICdMaXN0U3RyZWFtaW5nU2Vzc2lvbnMnLFxuICAgICAgJ0xpc3RTdHVkaW9Db21wb25lbnRzJyxcbiAgICAgICdMaXN0U3R1ZGlvTWVtYmVycycsXG4gICAgICAnTGlzdFN0dWRpb3MnLFxuICAgICAgJ0xpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgJ0dldEZlYXR1cmVNYXAnXG4gICAgXSxcbiAgICBUYWdnaW5nOiBbXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBldWxhIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRXVsYS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBldWxhSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZXVsYUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkV1bGEoZXVsYUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bmltYmxlOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpldWxhLyR7IGV1bGFJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZXVsYS1hY2NlcHRhbmNlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRXVsYUFjY2VwdGFuY2UuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZXVsYUFjY2VwdGFuY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBldWxhQWNjZXB0YW5jZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZTdHVkaW9JZCgpXG4gICAqL1xuICBwdWJsaWMgb25FdWxhQWNjZXB0YW5jZShldWxhQWNjZXB0YW5jZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bmltYmxlOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpldWxhLWFjY2VwdGFuY2UvJHsgZXVsYUFjY2VwdGFuY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbGF1bmNoLXByb2ZpbGUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MYXVuY2hQcm9maWxlLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGxhdW5jaFByb2ZpbGVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsYXVuY2hQcm9maWxlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZTdHVkaW9JZCgpXG4gICAqL1xuICBwdWJsaWMgb25MYXVuY2hQcm9maWxlKGxhdW5jaFByb2ZpbGVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om5pbWJsZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bGF1bmNoLXByb2ZpbGUvJHsgbGF1bmNoUHJvZmlsZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBzdHJlYW1pbmctaW1hZ2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdHJlYW1pbmdJbWFnZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBzdHJlYW1pbmdJbWFnZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHN0cmVhbWluZ0ltYWdlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZTdHVkaW9JZCgpXG4gICAqL1xuICBwdWJsaWMgb25TdHJlYW1pbmdJbWFnZShzdHJlYW1pbmdJbWFnZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bmltYmxlOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpzdHJlYW1pbmctaW1hZ2UvJHsgc3RyZWFtaW5nSW1hZ2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgc3RyZWFtaW5nLXNlc3Npb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdHJlYW1pbmdTZXNzaW9uLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHN0cmVhbWluZ1Nlc3Npb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzdHJlYW1pbmdTZXNzaW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZDcmVhdGVkQnkoKVxuICAgKiAtIC5pZk93bmVkQnkoKVxuICAgKi9cbiAgcHVibGljIG9uU3RyZWFtaW5nU2Vzc2lvbihzdHJlYW1pbmdTZXNzaW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpuaW1ibGU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnN0cmVhbWluZy1zZXNzaW9uLyR7IHN0cmVhbWluZ1Nlc3Npb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgc3RyZWFtaW5nLXNlc3Npb24tYmFja3VwIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RyZWFtaW5nU2Vzc2lvbkJhY2t1cC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBzdHJlYW1pbmdTZXNzaW9uQmFja3VwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgc3RyZWFtaW5nU2Vzc2lvbkJhY2t1cElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmT3duZWRCeSgpXG4gICAqL1xuICBwdWJsaWMgb25TdHJlYW1pbmdTZXNzaW9uQmFja3VwKHN0cmVhbWluZ1Nlc3Npb25CYWNrdXBJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om5pbWJsZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06c3RyZWFtaW5nLXNlc3Npb24tYmFja3VwLyR7IHN0cmVhbWluZ1Nlc3Npb25CYWNrdXBJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgc3R1ZGlvIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3R1ZGlvLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHN0dWRpb0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIHN0dWRpb0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmU3R1ZGlvSWQoKVxuICAgKi9cbiAgcHVibGljIG9uU3R1ZGlvKHN0dWRpb0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bmltYmxlOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpzdHVkaW8vJHsgc3R1ZGlvSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHN0dWRpby1jb21wb25lbnQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmltYmxlLXN0dWRpby9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdHVkaW9Db21wb25lbnQuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gc3R1ZGlvQ29tcG9uZW50SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgc3R1ZGlvQ29tcG9uZW50SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZTdHVkaW9JZCgpXG4gICAqL1xuICBwdWJsaWMgb25TdHVkaW9Db21wb25lbnQoc3R1ZGlvQ29tcG9uZW50SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpuaW1ibGU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnN0dWRpby1jb21wb25lbnQvJHsgc3R1ZGlvQ29tcG9uZW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGEgdGFnIGtleSBhbmQgdmFsdWUgcGFpciB0aGF0IGlzIGFsbG93ZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlcXVlc3R0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUxhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b0NyZWF0ZVN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9DcmVhdGVTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVTdHJlYW1pbmdTZXNzaW9uU3RyZWFtKClcbiAgICogLSAudG9DcmVhdGVTdHVkaW8oKVxuICAgKiAtIC50b0NyZWF0ZVN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvRGVsZXRlTGF1bmNoUHJvZmlsZSgpXG4gICAqIC0gLnRvRGVsZXRlTGF1bmNoUHJvZmlsZU1lbWJlcigpXG4gICAqIC0gLnRvRGVsZXRlU3RyZWFtaW5nSW1hZ2UoKVxuICAgKiAtIC50b0RlbGV0ZVN0cmVhbWluZ1Nlc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZVN0dWRpbygpXG4gICAqIC0gLnRvRGVsZXRlU3R1ZGlvQ29tcG9uZW50KClcbiAgICogLSAudG9EZWxldGVTdHVkaW9NZW1iZXIoKVxuICAgKiAtIC50b0dldExhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b0dldExhdW5jaFByb2ZpbGVEZXRhaWxzKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlSW5pdGlhbGl6YXRpb24oKVxuICAgKiAtIC50b0dldExhdW5jaFByb2ZpbGVNZW1iZXIoKVxuICAgKiAtIC50b0dldFN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdTZXNzaW9uQmFja3VwKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdTZXNzaW9uU3RyZWFtKClcbiAgICogLSAudG9HZXRTdHVkaW8oKVxuICAgKiAtIC50b0dldFN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvR2V0U3R1ZGlvTWVtYmVyKClcbiAgICogLSAudG9MaXN0TGF1bmNoUHJvZmlsZU1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RMYXVuY2hQcm9maWxlcygpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ0ltYWdlcygpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ1Nlc3Npb25CYWNrdXBzKClcbiAgICogLSAudG9MaXN0U3RyZWFtaW5nU2Vzc2lvbnMoKVxuICAgKiAtIC50b0xpc3RTdHVkaW9Db21wb25lbnRzKClcbiAgICogLSAudG9MaXN0U3R1ZGlvTWVtYmVycygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0TGF1bmNoUHJvZmlsZU1lbWJlcnMoKVxuICAgKiAtIC50b1B1dFN0dWRpb01lbWJlcnMoKVxuICAgKiAtIC50b1N0YXJ0U3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvU3RhcnRTdHVkaW9TU09Db25maWd1cmF0aW9uUmVwYWlyKClcbiAgICogLSAudG9TdG9wU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUxhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b1VwZGF0ZUxhdW5jaFByb2ZpbGVNZW1iZXIoKVxuICAgKiAtIC50b1VwZGF0ZVN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9VcGRhdGVTdHVkaW8oKVxuICAgKiAtIC50b1VwZGF0ZVN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvUHV0U3R1ZGlvTG9nRXZlbnRzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBsYXVuY2gtcHJvZmlsZVxuICAgKiAtIHN0cmVhbWluZy1pbWFnZVxuICAgKiAtIHN0cmVhbWluZy1zZXNzaW9uXG4gICAqIC0gc3RyZWFtaW5nLXNlc3Npb24tYmFja3VwXG4gICAqIC0gc3R1ZGlvXG4gICAqIC0gc3R1ZGlvLWNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyIG9mIGEgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVMYXVuY2hQcm9maWxlKClcbiAgICogLSAudG9DcmVhdGVTdHJlYW1pbmdJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlU3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvQ3JlYXRlU3R1ZGlvKClcbiAgICogLSAudG9DcmVhdGVTdHVkaW9Db21wb25lbnQoKVxuICAgKiAtIC50b0RlbGV0ZUxhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b0RlbGV0ZUxhdW5jaFByb2ZpbGVNZW1iZXIoKVxuICAgKiAtIC50b0RlbGV0ZVN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9EZWxldGVTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9EZWxldGVTdHVkaW8oKVxuICAgKiAtIC50b0RlbGV0ZVN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvRGVsZXRlU3R1ZGlvTWVtYmVyKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlRGV0YWlscygpXG4gICAqIC0gLnRvR2V0TGF1bmNoUHJvZmlsZUluaXRpYWxpemF0aW9uKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlTWVtYmVyKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdJbWFnZSgpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvbkJhY2t1cCgpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvR2V0U3R1ZGlvKClcbiAgICogLSAudG9HZXRTdHVkaW9Db21wb25lbnQoKVxuICAgKiAtIC50b0dldFN0dWRpb01lbWJlcigpXG4gICAqIC0gLnRvTGlzdExhdW5jaFByb2ZpbGVNZW1iZXJzKClcbiAgICogLSAudG9MaXN0TGF1bmNoUHJvZmlsZXMoKVxuICAgKiAtIC50b0xpc3RTdHJlYW1pbmdJbWFnZXMoKVxuICAgKiAtIC50b0xpc3RTdHJlYW1pbmdTZXNzaW9uQmFja3VwcygpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ1Nlc3Npb25zKClcbiAgICogLSAudG9MaXN0U3R1ZGlvQ29tcG9uZW50cygpXG4gICAqIC0gLnRvTGlzdFN0dWRpb01lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1B1dExhdW5jaFByb2ZpbGVNZW1iZXJzKClcbiAgICogLSAudG9QdXRTdHVkaW9NZW1iZXJzKClcbiAgICogLSAudG9TdGFydFN0cmVhbWluZ1Nlc3Npb24oKVxuICAgKiAtIC50b1N0YXJ0U3R1ZGlvU1NPQ29uZmlndXJhdGlvblJlcGFpcigpXG4gICAqIC0gLnRvU3RvcFN0cmVhbWluZ1Nlc3Npb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVMYXVuY2hQcm9maWxlKClcbiAgICogLSAudG9VcGRhdGVMYXVuY2hQcm9maWxlTWVtYmVyKClcbiAgICogLSAudG9VcGRhdGVTdHJlYW1pbmdJbWFnZSgpXG4gICAqIC0gLnRvVXBkYXRlU3R1ZGlvKClcbiAgICogLSAudG9VcGRhdGVTdHVkaW9Db21wb25lbnQoKVxuICAgKiAtIC50b1B1dFN0dWRpb0xvZ0V2ZW50cygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gbGF1bmNoLXByb2ZpbGVcbiAgICogLSBzdHJlYW1pbmctaW1hZ2VcbiAgICogLSBzdHJlYW1pbmctc2Vzc2lvblxuICAgKiAtIHN0cmVhbWluZy1zZXNzaW9uLWJhY2t1cFxuICAgKiAtIHN0dWRpb1xuICAgKiAtIHN0dWRpby1jb21wb25lbnRcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSBsaXN0IG9mIHRhZyBrZXlzIHRoYXQgYXJlIGFsbG93ZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXRhZ2tleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUxhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b0NyZWF0ZVN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9DcmVhdGVTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVTdHJlYW1pbmdTZXNzaW9uU3RyZWFtKClcbiAgICogLSAudG9DcmVhdGVTdHVkaW8oKVxuICAgKiAtIC50b0NyZWF0ZVN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvRGVsZXRlTGF1bmNoUHJvZmlsZSgpXG4gICAqIC0gLnRvRGVsZXRlTGF1bmNoUHJvZmlsZU1lbWJlcigpXG4gICAqIC0gLnRvRGVsZXRlU3RyZWFtaW5nSW1hZ2UoKVxuICAgKiAtIC50b0RlbGV0ZVN0cmVhbWluZ1Nlc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZVN0dWRpbygpXG4gICAqIC0gLnRvRGVsZXRlU3R1ZGlvQ29tcG9uZW50KClcbiAgICogLSAudG9EZWxldGVTdHVkaW9NZW1iZXIoKVxuICAgKiAtIC50b0dldExhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b0dldExhdW5jaFByb2ZpbGVEZXRhaWxzKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlSW5pdGlhbGl6YXRpb24oKVxuICAgKiAtIC50b0dldExhdW5jaFByb2ZpbGVNZW1iZXIoKVxuICAgKiAtIC50b0dldFN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdTZXNzaW9uQmFja3VwKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdTZXNzaW9uU3RyZWFtKClcbiAgICogLSAudG9HZXRTdHVkaW8oKVxuICAgKiAtIC50b0dldFN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvR2V0U3R1ZGlvTWVtYmVyKClcbiAgICogLSAudG9MaXN0TGF1bmNoUHJvZmlsZU1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RMYXVuY2hQcm9maWxlcygpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ0ltYWdlcygpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ1Nlc3Npb25CYWNrdXBzKClcbiAgICogLSAudG9MaXN0U3RyZWFtaW5nU2Vzc2lvbnMoKVxuICAgKiAtIC50b0xpc3RTdHVkaW9Db21wb25lbnRzKClcbiAgICogLSAudG9MaXN0U3R1ZGlvTWVtYmVycygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0TGF1bmNoUHJvZmlsZU1lbWJlcnMoKVxuICAgKiAtIC50b1B1dFN0dWRpb01lbWJlcnMoKVxuICAgKiAtIC50b1N0YXJ0U3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvU3RhcnRTdHVkaW9TU09Db25maWd1cmF0aW9uUmVwYWlyKClcbiAgICogLSAudG9TdG9wU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUxhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b1VwZGF0ZUxhdW5jaFByb2ZpbGVNZW1iZXIoKVxuICAgKiAtIC50b1VwZGF0ZVN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9VcGRhdGVTdHVkaW8oKVxuICAgKiAtIC50b1VwZGF0ZVN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvUHV0U3R1ZGlvTG9nRXZlbnRzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBsYXVuY2gtcHJvZmlsZVxuICAgKiAtIHN0cmVhbWluZy1pbWFnZVxuICAgKiAtIHN0cmVhbWluZy1zZXNzaW9uXG4gICAqIC0gc3RyZWFtaW5nLXNlc3Npb24tYmFja3VwXG4gICAqIC0gc3R1ZGlvXG4gICAqIC0gc3R1ZGlvLWNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGNyZWF0ZWRCeSByZXF1ZXN0IHBhcmFtZXRlciBvciB0aGUgSUQgb2YgdGhlIGNyZWF0b3Igb2YgdGhlIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlU3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvRGVsZXRlU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ1Nlc3Npb25zKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9TdGFydFN0cmVhbWluZ1Nlc3Npb24oKVxuICAgKiAtIC50b1N0b3BTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gc3RyZWFtaW5nLXNlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZDcmVhdGVkQnkodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGNyZWF0ZWRCeWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBvd25lZEJ5IHJlcXVlc3QgcGFyYW1ldGVyIG9yIHRoZSBJRCBvZiB0aGUgb3duZXIgb2YgdGhlIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlU3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvRGVsZXRlU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvbkJhY2t1cCgpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ1Nlc3Npb25zKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9TdGFydFN0cmVhbWluZ1Nlc3Npb24oKVxuICAgKiAtIC50b1N0b3BTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gc3RyZWFtaW5nLXNlc3Npb25cbiAgICogLSBzdHJlYW1pbmctc2Vzc2lvbi1iYWNrdXBcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZPd25lZEJ5KHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBvd25lZEJ5YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHByaW5jaXBhbElkIHJlcXVlc3QgcGFyYW1ldGVyXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvTGlzdExhdW5jaFByb2ZpbGVzKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQcmluY2lwYWxJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgcHJpbmNpcGFsSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgSUQgb2YgdGhlIGxvZ2dlZCBpbiB1c2VyXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uaW1ibGUtc3R1ZGlvL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlU3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvRGVsZXRlU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvbkJhY2t1cCgpXG4gICAqIC0gLnRvR2V0U3RyZWFtaW5nU2Vzc2lvblN0cmVhbSgpXG4gICAqIC0gLnRvTGlzdExhdW5jaFByb2ZpbGVzKClcbiAgICogLSAudG9MaXN0U3RyZWFtaW5nU2Vzc2lvbkJhY2t1cHMoKVxuICAgKiAtIC50b0xpc3RTdHJlYW1pbmdTZXNzaW9ucygpXG4gICAqIC0gLnRvU3RhcnRTdHJlYW1pbmdTZXNzaW9uKClcbiAgICogLSAudG9TdG9wU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVxdWVzdGVyUHJpbmNpcGFsSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYHJlcXVlc3RlclByaW5jaXBhbElkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSBzcGVjaWZpYyBzdHVkaW9cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25pbWJsZS1zdHVkaW8vbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVMYXVuY2hQcm9maWxlKClcbiAgICogLSAudG9DcmVhdGVTdHJlYW1pbmdJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlU3RyZWFtaW5nU2Vzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlU3R1ZGlvKClcbiAgICogLSAudG9DcmVhdGVTdHVkaW9Db21wb25lbnQoKVxuICAgKiAtIC50b0RlbGV0ZUxhdW5jaFByb2ZpbGUoKVxuICAgKiAtIC50b0RlbGV0ZUxhdW5jaFByb2ZpbGVNZW1iZXIoKVxuICAgKiAtIC50b0RlbGV0ZVN0cmVhbWluZ0ltYWdlKClcbiAgICogLSAudG9EZWxldGVTdHVkaW8oKVxuICAgKiAtIC50b0RlbGV0ZVN0dWRpb0NvbXBvbmVudCgpXG4gICAqIC0gLnRvRGVsZXRlU3R1ZGlvTWVtYmVyKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlRGV0YWlscygpXG4gICAqIC0gLnRvR2V0TGF1bmNoUHJvZmlsZUluaXRpYWxpemF0aW9uKClcbiAgICogLSAudG9HZXRMYXVuY2hQcm9maWxlTWVtYmVyKClcbiAgICogLSAudG9HZXRTdHJlYW1pbmdJbWFnZSgpXG4gICAqIC0gLnRvR2V0U3R1ZGlvKClcbiAgICogLSAudG9HZXRTdHVkaW9Db21wb25lbnQoKVxuICAgKiAtIC50b0dldFN0dWRpb01lbWJlcigpXG4gICAqIC0gLnRvTGlzdEV1bGFBY2NlcHRhbmNlcygpXG4gICAqIC0gLnRvTGlzdExhdW5jaFByb2ZpbGVNZW1iZXJzKClcbiAgICogLSAudG9MaXN0TGF1bmNoUHJvZmlsZXMoKVxuICAgKiAtIC50b0xpc3RTdHJlYW1pbmdJbWFnZXMoKVxuICAgKiAtIC50b0xpc3RTdHJlYW1pbmdTZXNzaW9uQmFja3VwcygpXG4gICAqIC0gLnRvTGlzdFN0cmVhbWluZ1Nlc3Npb25zKClcbiAgICogLSAudG9MaXN0U3R1ZGlvQ29tcG9uZW50cygpXG4gICAqIC0gLnRvTGlzdFN0dWRpb01lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1B1dExhdW5jaFByb2ZpbGVNZW1iZXJzKClcbiAgICogLSAudG9QdXRTdHVkaW9NZW1iZXJzKClcbiAgICogLSAudG9TdGFydFN0dWRpb1NTT0NvbmZpZ3VyYXRpb25SZXBhaXIoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVMYXVuY2hQcm9maWxlKClcbiAgICogLSAudG9VcGRhdGVMYXVuY2hQcm9maWxlTWVtYmVyKClcbiAgICogLSAudG9VcGRhdGVTdHJlYW1pbmdJbWFnZSgpXG4gICAqIC0gLnRvVXBkYXRlU3R1ZGlvKClcbiAgICogLSAudG9VcGRhdGVTdHVkaW9Db21wb25lbnQoKVxuICAgKiAtIC50b1B1dFN0dWRpb0xvZ0V2ZW50cygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZXVsYS1hY2NlcHRhbmNlXG4gICAqIC0gbGF1bmNoLXByb2ZpbGVcbiAgICogLSBzdHJlYW1pbmctaW1hZ2VcbiAgICogLSBzdHVkaW9cbiAgICogLSBzdHVkaW8tY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU3R1ZGlvSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYHN0dWRpb0lkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtuaW1ibGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X25pbWJsZS5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=