UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

2,325 lines 246 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Partnercentral = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [partnercentral](https://docs.aws.amazon.com/service-authorization/latest/reference/list_partner-central.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class Partnercentral extends shared_1.PolicyStatement {
    /**
     * Grants permission to accept channel handshakes in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_AcceptChannelHandshake.html
     */
    toAcceptChannelHandshake() {
        return this.to('AcceptChannelHandshake');
    }
    /**
     * Grants permission to accept connection invitations in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_AcceptConnectionInvitation.html
     */
    toAcceptConnectionInvitation() {
        return this.to('AcceptConnectionInvitation');
    }
    /**
     * Grants permission to accept Engagement Invitations on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_AcceptEngagementInvitation.html
     */
    toAcceptEngagementInvitation() {
        return this.to('AcceptEngagementInvitation');
    }
    /**
     * Grants permission to amend benefit applications in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_AmendBenefitApplication.html
     */
    toAmendBenefitApplication() {
        return this.to('AmendBenefitApplication');
    }
    /**
     * Grants permission to assign Opportunities on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_AssignOpportunity.html
     */
    toAssignOpportunity() {
        return this.to('AssignOpportunity');
    }
    /**
     * Grants permission to associate AWS Training and Certification email domains in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_AssociateAwsTrainingCertificationEmailDomain.html
     */
    toAssociateAwsTrainingCertificationEmailDomain() {
        return this.to('AssociateAwsTrainingCertificationEmailDomain');
    }
    /**
     * Grants permission to associate benefit application resources in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_AssociateBenefitApplicationResource.html
     */
    toAssociateBenefitApplicationResource() {
        return this.to('AssociateBenefitApplicationResource');
    }
    /**
     * Grants permission to associate Opportunities on AWS Partner Central with other entities
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_AssociateOpportunity.html
     */
    toAssociateOpportunity() {
        return this.to('AssociateOpportunity');
    }
    /**
     * Grants permission to cancel benefit applications in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_CancelBenefitApplication.html
     */
    toCancelBenefitApplication() {
        return this.to('CancelBenefitApplication');
    }
    /**
     * Grants permission to cancel channel handshakes in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_CancelChannelHandshake.html
     */
    toCancelChannelHandshake() {
        return this.to('CancelChannelHandshake');
    }
    /**
     * Grants permission to cancel connections in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_CancelConnection.html
     */
    toCancelConnection() {
        return this.to('CancelConnection');
    }
    /**
     * Grants permission to cancel connection invitations in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_CancelConnectionInvitation.html
     */
    toCancelConnectionInvitation() {
        return this.to('CancelConnectionInvitation');
    }
    /**
     * Grants permission to cancel profile update tasks in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_CancelProfileUpdateTask.html
     */
    toCancelProfileUpdateTask() {
        return this.to('CancelProfileUpdateTask');
    }
    /**
     * Grants permission to create benefit applications in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifCatalog()
     * - .ifFulfillmentTypes()
     * - .ifPrograms()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_CreateBenefitApplication.html
     */
    toCreateBenefitApplication() {
        return this.to('CreateBenefitApplication');
    }
    /**
     * Grants permission to create channel handshakes in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_CreateChannelHandshake.html
     */
    toCreateChannelHandshake() {
        return this.to('CreateChannelHandshake');
    }
    /**
     * Grants permission to create connection invitations in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_CreateConnectionInvitation.html
     */
    toCreateConnectionInvitation() {
        return this.to('CreateConnectionInvitation');
    }
    /**
     * Grants permission to creating engagements in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_CreateEngagement.html
     */
    toCreateEngagement() {
        return this.to('CreateEngagement');
    }
    /**
     * Grants permission to create engagement contexts in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_CreateEngagementContext.html
     */
    toCreateEngagementContext() {
        return this.to('CreateEngagementContext');
    }
    /**
     * Grants permission to creating engagement invitations in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_CreateEngagementInvitation.html
     */
    toCreateEngagementInvitation() {
        return this.to('CreateEngagementInvitation');
    }
    /**
     * Grants permission to create marketplace revenue shares in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_CreateMarketplaceRevenueShare.html
     */
    toCreateMarketplaceRevenueShare() {
        return this.to('CreateMarketplaceRevenueShare');
    }
    /**
     * Grants permission to create marketplace revenue share allocations in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_CreateMarketplaceRevenueShareAllocation.html
     */
    toCreateMarketplaceRevenueShareAllocation() {
        return this.to('CreateMarketplaceRevenueShareAllocation');
    }
    /**
     * Grants permission to create new Opportunities on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_CreateOpportunity.html
     */
    toCreateOpportunity() {
        return this.to('CreateOpportunity');
    }
    /**
     * Grants permission to create partners in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_CreatePartner.html
     */
    toCreatePartner() {
        return this.to('CreatePartner');
    }
    /**
     * Grants permission to create program management accounts in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_CreateProgramManagementAccount.html
     */
    toCreateProgramManagementAccount() {
        return this.to('CreateProgramManagementAccount');
    }
    /**
     * Grants permission to create relationships in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_CreateRelationship.html
     */
    toCreateRelationship() {
        return this.to('CreateRelationship');
    }
    /**
     * Grants permission to creating resource snapshots in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_CreateResourceSnapshot.html
     */
    toCreateResourceSnapshot() {
        return this.to('CreateResourceSnapshot');
    }
    /**
     * Grants permission to creating resource snapshot jobs in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_CreateResourceSnapshotJob.html
     */
    toCreateResourceSnapshotJob() {
        return this.to('CreateResourceSnapshotJob');
    }
    /**
     * Grants permission to create revenue attributions in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_CreateRevenueAttribution.html
     */
    toCreateRevenueAttribution() {
        return this.to('CreateRevenueAttribution');
    }
    /**
     * Grants permission to delete program management accounts in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_DeleteProgramManagementAccount.html
     */
    toDeleteProgramManagementAccount() {
        return this.to('DeleteProgramManagementAccount');
    }
    /**
     * Grants permission to delete relationships in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_DeleteRelationship.html
     */
    toDeleteRelationship() {
        return this.to('DeleteRelationship');
    }
    /**
     * Grants permission to deleting resource snapshot jobs on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_DeleteResourceSnapshotJob.html
     */
    toDeleteResourceSnapshotJob() {
        return this.to('DeleteResourceSnapshotJob');
    }
    /**
     * Grants permission to disassociate AWS Training and Certification email domains in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_DisassociateAwsTrainingCertificationEmailDomain.html
     */
    toDisassociateAwsTrainingCertificationEmailDomain() {
        return this.to('DisassociateAwsTrainingCertificationEmailDomain');
    }
    /**
     * Grants permission to disassociate benefit application resources in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_DisassociateBenefitApplicationResource.html
     */
    toDisassociateBenefitApplicationResource() {
        return this.to('DisassociateBenefitApplicationResource');
    }
    /**
     * Grants permission to disassociate Opportunities on AWS Partner Central from other entities
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_DisassociateOpportunity.html
     */
    toDisassociateOpportunity() {
        return this.to('DisassociateOpportunity');
    }
    /**
     * Grants permission to retrieve alliance lead contact information in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetAllianceLeadContact.html
     */
    toGetAllianceLeadContact() {
        return this.to('GetAllianceLeadContact');
    }
    /**
     * Grants permission to retrieve AWS Opportunity Summaries for Opportunities on AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetAwsOpportunitySummary.html
     */
    toGetAwsOpportunitySummary() {
        return this.to('GetAwsOpportunitySummary');
    }
    /**
     * Grants permission to retrieve benefit details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_GetBenefit.html
     */
    toGetBenefit() {
        return this.to('GetBenefit');
    }
    /**
     * Grants permission to retrieve benefit allocation details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_GetBenefitAllocation.html
     */
    toGetBenefitAllocation() {
        return this.to('GetBenefitAllocation');
    }
    /**
     * Grants permission to retrieve benefit application details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_GetBenefitApplication.html
     */
    toGetBenefitApplication() {
        return this.to('GetBenefitApplication');
    }
    /**
     * Grants permission to retrieve connection details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetConnection.html
     */
    toGetConnection() {
        return this.to('GetConnection');
    }
    /**
     * Grants permission to retrieve connection invitation details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetConnectionInvitation.html
     */
    toGetConnectionInvitation() {
        return this.to('GetConnectionInvitation');
    }
    /**
     * Grants permission to retrieve connection preferences in AWS Partner Central
     *
     * Access Level: Read
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetConnectionPreferences.html
     */
    toGetConnectionPreferences() {
        return this.to('GetConnectionPreferences');
    }
    /**
     * Grants permission to retrieval of engagement details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetEngagement.html
     */
    toGetEngagement() {
        return this.to('GetEngagement');
    }
    /**
     * Grants permission to retrieve details of Engagement Invitations on AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetEngagementInvitation.html
     */
    toGetEngagementInvitation() {
        return this.to('GetEngagementInvitation');
    }
    /**
     * Grants permission to retrieve marketplace revenue share details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_GetMarketplaceRevenueShare.html
     */
    toGetMarketplaceRevenueShare() {
        return this.to('GetMarketplaceRevenueShare');
    }
    /**
     * Grants permission to retrieve marketplace revenue share allocation details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_GetMarketplaceRevenueShareAllocation.html
     */
    toGetMarketplaceRevenueShareAllocation() {
        return this.to('GetMarketplaceRevenueShareAllocation');
    }
    /**
     * Grants permission to retrieve details of Opportunities on AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetOpportunity.html
     */
    toGetOpportunity() {
        return this.to('GetOpportunity');
    }
    /**
     * Grants permission to retrieve partner details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetPartner.html
     */
    toGetPartner() {
        return this.to('GetPartner');
    }
    /**
     * Grants permission to retrieve partner dashboard information in AWS Partner Central
     *
     * Access Level: Read
     */
    toGetPartnerDashboard() {
        return this.to('GetPartnerDashboard');
    }
    /**
     * Grants permission to retrieve profile update task details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetProfileUpdateTask.html
     */
    toGetProfileUpdateTask() {
        return this.to('GetProfileUpdateTask');
    }
    /**
     * Grants permission to retrieve profile visibility settings in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetProfileVisibility.html
     */
    toGetProfileVisibility() {
        return this.to('GetProfileVisibility');
    }
    /**
     * Grants permission to retrieve prospecting from engagement task details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetProspectingFromEngagementTask.html
     */
    toGetProspectingFromEngagementTask() {
        return this.to('GetProspectingFromEngagementTask');
    }
    /**
     * Grants permission to retrieve qualifications association details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetQualificationsAssociationDetails.html
     */
    toGetQualificationsAssociationDetails() {
        return this.to('GetQualificationsAssociationDetails');
    }
    /**
     * Grants permission to retrieve qualifications association task details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetQualificationsAssociationTask.html
     */
    toGetQualificationsAssociationTask() {
        return this.to('GetQualificationsAssociationTask');
    }
    /**
     * Grants permission to retrieve qualifications disassociation task details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetQualificationsDisassociationTask.html
     */
    toGetQualificationsDisassociationTask() {
        return this.to('GetQualificationsDisassociationTask');
    }
    /**
     * Grants permission to retrieve relationship details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_GetRelationship.html
     */
    toGetRelationship() {
        return this.to('GetRelationship');
    }
    /**
     * Grants permission to retrieving resource snapshot details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetResourceSnapshot.html
     */
    toGetResourceSnapshot() {
        return this.to('GetResourceSnapshot');
    }
    /**
     * Grants permission to retrieving resource snapshot job details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetResourceSnapshotJob.html
     */
    toGetResourceSnapshotJob() {
        return this.to('GetResourceSnapshotJob');
    }
    /**
     * Grants permission to retrieve revenue attribution details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_GetRevenueAttribution.html
     */
    toGetRevenueAttribution() {
        return this.to('GetRevenueAttribution');
    }
    /**
     * Grants permission to retrieve revenue attribution allocation details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_GetRevenueAttributionAllocation.html
     */
    toGetRevenueAttributionAllocation() {
        return this.to('GetRevenueAttributionAllocation');
    }
    /**
     * Grants permission to retrieve revenue attribution allocations task details in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_GetRevenueAttributionAllocationsTask.html
     */
    toGetRevenueAttributionAllocationsTask() {
        return this.to('GetRevenueAttributionAllocationsTask');
    }
    /**
     * Grants permission to retrieving selling system settings in AWS Partner Central
     *
     * Access Level: Read
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_GetSellingSystemSettings.html
     */
    toGetSellingSystemSettings() {
        return this.to('GetSellingSystemSettings');
    }
    /**
     * Grants permission to retrieve verification details in AWS Partner Central
     *
     * Access Level: Read
     *
     * Possible conditions:
     * - .ifCatalog()
     * - .ifVerificationType()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_GetVerification.html
     */
    toGetVerification() {
        return this.to('GetVerification');
    }
    /**
     * Grants permission to list benefit allocations in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_ListBenefitAllocations.html
     */
    toListBenefitAllocations() {
        return this.to('ListBenefitAllocations');
    }
    /**
     * Grants permission to list benefit applications in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_ListBenefitApplications.html
     */
    toListBenefitApplications() {
        return this.to('ListBenefitApplications');
    }
    /**
     * Grants permission to list benefits in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_ListBenefits.html
     */
    toListBenefits() {
        return this.to('ListBenefits');
    }
    /**
     * Grants permission to list channel handshakes in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_ListChannelHandshakes.html
     */
    toListChannelHandshakes() {
        return this.to('ListChannelHandshakes');
    }
    /**
     * Grants permission to list connection invitations in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_ListConnectionInvitations.html
     */
    toListConnectionInvitations() {
        return this.to('ListConnectionInvitations');
    }
    /**
     * Grants permission to list connections in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_ListConnections.html
     */
    toListConnections() {
        return this.to('ListConnections');
    }
    /**
     * Grants permission to listing engagements by accepting invitation tasks in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListEngagementByAcceptingInvitationTasks.html
     */
    toListEngagementByAcceptingInvitationTasks() {
        return this.to('ListEngagementByAcceptingInvitationTasks');
    }
    /**
     * Grants permission to listing engagements from opportunity tasks in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListEngagementFromOpportunityTasks.html
     */
    toListEngagementFromOpportunityTasks() {
        return this.to('ListEngagementFromOpportunityTasks');
    }
    /**
     * Grants permission to list Engagement Invitations on AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListEngagementInvitations.html
     */
    toListEngagementInvitations() {
        return this.to('ListEngagementInvitations');
    }
    /**
     * Grants permission to listing engagement members in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListEngagementMembers.html
     */
    toListEngagementMembers() {
        return this.to('ListEngagementMembers');
    }
    /**
     * Grants permission to listing engagement resource associations in AWS Partner Central
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListEngagementResourceAssociations.html
     */
    toListEngagementResourceAssociations() {
        return this.to('ListEngagementResourceAssociations');
    }
    /**
     * Grants permission to listing engagements in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListEngagements.html
     */
    toListEngagements() {
        return this.to('ListEngagements');
    }
    /**
     * Grants permission to list marketplace revenue share allocations in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_ListMarketplaceRevenueShareAllocations.html
     */
    toListMarketplaceRevenueShareAllocations() {
        return this.to('ListMarketplaceRevenueShareAllocations');
    }
    /**
     * Grants permission to list marketplace revenue shares in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_ListMarketplaceRevenueShares.html
     */
    toListMarketplaceRevenueShares() {
        return this.to('ListMarketplaceRevenueShares');
    }
    /**
     * Grants permission to list Opportunities on AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListOpportunities.html
     */
    toListOpportunities() {
        return this.to('ListOpportunities');
    }
    /**
     * Grants permission to list opportunity from engagement tasks in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListOpportunityFromEngagementTasks.html
     */
    toListOpportunityFromEngagementTasks() {
        return this.to('ListOpportunityFromEngagementTasks');
    }
    /**
     * Grants permission to list partners in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_ListPartners.html
     */
    toListPartners() {
        return this.to('ListPartners');
    }
    /**
     * Grants permission to list program management accounts in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_ListProgramManagementAccounts.html
     */
    toListProgramManagementAccounts() {
        return this.to('ListProgramManagementAccounts');
    }
    /**
     * Grants permission to list prospecting from engagement tasks in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListProspectingFromEngagementTasks.html
     */
    toListProspectingFromEngagementTasks() {
        return this.to('ListProspectingFromEngagementTasks');
    }
    /**
     * Grants permission to list relationships in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_ListRelationships.html
     */
    toListRelationships() {
        return this.to('ListRelationships');
    }
    /**
     * Grants permission to listing resource snapshot jobs in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListResourceSnapshotJobs.html
     */
    toListResourceSnapshotJobs() {
        return this.to('ListResourceSnapshotJobs');
    }
    /**
     * Grants permission to listing resource snapshots in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListResourceSnapshots.html
     */
    toListResourceSnapshots() {
        return this.to('ListResourceSnapshots');
    }
    /**
     * Grants permission to list revenue attribution allocations in AWS Partner Central
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_ListRevenueAttributionAllocations.html
     */
    toListRevenueAttributionAllocations() {
        return this.to('ListRevenueAttributionAllocations');
    }
    /**
     * Grants permission to list revenue attributions in AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_ListRevenueAttributions.html
     */
    toListRevenueAttributions() {
        return this.to('ListRevenueAttributions');
    }
    /**
     * Grants permission to list Solutions on AWS Partner Central
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListSolutions.html
     */
    toListSolutions() {
        return this.to('ListSolutions');
    }
    /**
     * Grants permission to list tags for a resource in AWS Partner Central
     *
     * Access Level: Read
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     * - .ifAwsTagKeys()
     * - .ifCatalog()
     * - .ifFulfillmentTypes()
     * - .ifPrograms()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListTagsForResource.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to set alliance lead contact information in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_PutAllianceLeadContact.html
     */
    toPutAllianceLeadContact() {
        return this.to('PutAllianceLeadContact');
    }
    /**
     * Grants permission to set profile visibility in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_PutProfileVisibility.html
     */
    toPutProfileVisibility() {
        return this.to('PutProfileVisibility');
    }
    /**
     * Grants permission to put selling system settings in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_PutSellingSystemSettings.html
     */
    toPutSellingSystemSettings() {
        return this.to('PutSellingSystemSettings');
    }
    /**
     * Grants permission to recall benefit applications in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_RecallBenefitApplication.html
     */
    toRecallBenefitApplication() {
        return this.to('RecallBenefitApplication');
    }
    /**
     * Grants permission to reject channel handshakes in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_RejectChannelHandshake.html
     */
    toRejectChannelHandshake() {
        return this.to('RejectChannelHandshake');
    }
    /**
     * Grants permission to reject connection invitations in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_RejectConnectionInvitation.html
     */
    toRejectConnectionInvitation() {
        return this.to('RejectConnectionInvitation');
    }
    /**
     * Grants permission to reject Engagement Invitations on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_RejectEngagementInvitation.html
     */
    toRejectEngagementInvitation() {
        return this.to('RejectEngagementInvitation');
    }
    /**
     * Grants permission to send email verification codes in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_SendEmailVerificationCode.html
     */
    toSendEmailVerificationCode() {
        return this.to('SendEmailVerificationCode');
    }
    /**
     * Grants permission to initiate tasks that start Engagements on AWS Partner Central by accepting an Engagement Invitation
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_StartEngagementByAcceptingInvitationTask.html
     */
    toStartEngagementByAcceptingInvitationTask() {
        return this.to('StartEngagementByAcceptingInvitationTask');
    }
    /**
     * Grants permission to initiate tasks that start Engagements from Opportunities on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_StartEngagementFromOpportunityTask.html
     */
    toStartEngagementFromOpportunityTask() {
        return this.to('StartEngagementFromOpportunityTask');
    }
    /**
     * Grants permission to initiate tasks that start Opportunities from Engagements on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_StartOpportunityFromEngagementTask.html
     */
    toStartOpportunityFromEngagementTask() {
        return this.to('StartOpportunityFromEngagementTask');
    }
    /**
     * Grants permission to start profile update tasks in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_StartProfileUpdateTask.html
     */
    toStartProfileUpdateTask() {
        return this.to('StartProfileUpdateTask');
    }
    /**
     * Grants permission to initiate tasks that start prospecting from an engagement in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_StartProspectingFromEngagementTask.html
     */
    toStartProspectingFromEngagementTask() {
        return this.to('StartProspectingFromEngagementTask');
    }
    /**
     * Grants permission to initiate tasks that start qualifications association in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_StartQualificationsAssociationTask.html
     */
    toStartQualificationsAssociationTask() {
        return this.to('StartQualificationsAssociationTask');
    }
    /**
     * Grants permission to initiate tasks that start qualifications disassociation in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_StartQualificationsDisassociationTask.html
     */
    toStartQualificationsDisassociationTask() {
        return this.to('StartQualificationsDisassociationTask');
    }
    /**
     * Grants permission to starting resource snapshot jobs in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_StartResourceSnapshotJob.html
     */
    toStartResourceSnapshotJob() {
        return this.to('StartResourceSnapshotJob');
    }
    /**
     * Grants permission to initiate tasks that manage revenue attribution allocations in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_StartRevenueAttributionAllocationsTask.html
     */
    toStartRevenueAttributionAllocationsTask() {
        return this.to('StartRevenueAttributionAllocationsTask');
    }
    /**
     * Grants permission to start verification processes in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifCatalog()
     * - .ifVerificationType()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_StartVerification.html
     */
    toStartVerification() {
        return this.to('StartVerification');
    }
    /**
     * Grants permission to stopping resource snapshot jobs in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_StopResourceSnapshotJob.html
     */
    toStopResourceSnapshotJob() {
        return this.to('StopResourceSnapshotJob');
    }
    /**
     * Grants permission to submit benefit applications in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_SubmitBenefitApplication.html
     */
    toSubmitBenefitApplication() {
        return this.to('SubmitBenefitApplication');
    }
    /**
     * Grants permission to submit Opportunities on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_SubmitOpportunity.html
     */
    toSubmitOpportunity() {
        return this.to('SubmitOpportunity');
    }
    /**
     * Grants permission to add new tags to a resource. Supported resource: ResourceSnapshotJob
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_TagResource.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to remove tags from a resource. Supported resource: ResourceSnapshotJob
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_UntagResource.html
     */
    toUntagResource() {
        return this.to('UntagResource');
    }
    /**
     * Grants permission to update benefit applications in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_benefits_UpdateBenefitApplication.html
     */
    toUpdateBenefitApplication() {
        return this.to('UpdateBenefitApplication');
    }
    /**
     * Grants permission to update connection preferences in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifCatalog()
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_account_UpdateConnectionPreferences.html
     */
    toUpdateConnectionPreferences() {
        return this.to('UpdateConnectionPreferences');
    }
    /**
     * Grants permission to update engagement contexts in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_UpdateEngagementContext.html
     */
    toUpdateEngagementContext() {
        return this.to('UpdateEngagementContext');
    }
    /**
     * Grants permission to update marketplace revenue share allocations in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_UpdateMarketplaceRevenueShareAllocation.html
     */
    toUpdateMarketplaceRevenueShareAllocation() {
        return this.to('UpdateMarketplaceRevenueShareAllocation');
    }
    /**
     * Grants permission to update Opportunities on AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_UpdateOpportunity.html
     */
    toUpdateOpportunity() {
        return this.to('UpdateOpportunity');
    }
    /**
     * Grants permission to update program management accounts in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_UpdateProgramManagementAccount.html
     */
    toUpdateProgramManagementAccount() {
        return this.to('UpdateProgramManagementAccount');
    }
    /**
     * Grants permission to update relationships in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_channel_UpdateRelationship.html
     */
    toUpdateRelationship() {
        return this.to('UpdateRelationship');
    }
    /**
     * Grants permission to update revenue attributions in AWS Partner Central
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_prm_UpdateRevenueAttribution.html
     */
    toUpdateRevenueAttribution() {
        return this.to('UpdateRevenueAttribution');
    }
    /**
     * Grants permission to create business plans in AWS Partner Central
     *
     * Access Level: Write
     */
    toCreateBusinessPlan() {
        return this.to('CreateBusinessPlan');
    }
    /**
     * Grants permission to create collaboration channel members in AWS Partner Central
     *
     * Access Level: Write
     */
    toCreateCollaborationChannelMembers() {
        return this.to('CreateCollaborationChannelMembers');
    }
    /**
     * Grants permission to create collaboration channel requests in AWS Partner Central
     *
     * Access Level: Write
     */
    toCreateCollaborationChannelRequest() {
        return this.to('CreateCollaborationChannelRequest');
    }
    /**
     * Grants permission to enroll in partner paths in AWS Partner Central
     *
     * Access Level: Write
     */
    toEnrollInPartnerPath() {
        return this.to('EnrollInPartnerPath');
    }
    /**
     * Grants permission to retrieve business plan details in AWS Partner Central
     *
     * Access Level: Read
     */
    toGetBusinessPlan() {
        return this.to('GetBusinessPlan');
    }
    /**
     * Grants permission to retrieve collaboration channel details in AWS Partner Central
     *
     * Access Level: Read
     */
    toGetCollaborationChannel() {
        return this.to('GetCollaborationChannel');
    }
    /**
     * Grants permission to retrieve public partner profile details in AWS Partner Central
     *
     * Access Level: Read
     */
    toGetPartnerProfile() {
        return this.to('GetPartnerProfile');
    }
    /**
     * Grants permission to retrieve program management account details in AWS Partner Central
     *
     * Access Level: Read
     *
     * Possible conditions:
     * - .ifCatalog()
     */
    toGetProgramManagementAccount() {
        return this.to('GetProgramManagementAccount');
    }
    /**
     * Grants permission to list business plans in AWS Partner Central
     *
     * Access Level: List
     */
    toListBusinessPlans() {
        return this.to('ListBusinessPlans');
    }
    /**
     * Grants permission to list collaboration channels in AWS Partner Central
     *
     * Access Level: List
     */
    toListCollaborationChannels() {
        return this.to('ListCollaborationChannels');
    }
    /**
     * Grants permission to list partner paths in AWS Partner Central
     *
     * Access Level: List
     */
    toListPartnerPaths() {
        return this.to('ListPartnerPaths');
    }
    /**
     * Grants permission to update business plans in AWS Partner Central
     *
     * Access Level: Write
     */
    toPutBusinessPlan() {
        return this.to('PutBusinessPlan');
    }
    /**
     * Grants permission to search public partner profiles in AWS Partner Central
     *
     * Access Level: List
     */
    toSearchPartnerProfiles() {
        return this.to('SearchPartnerProfiles');
    }
    /**
     * Grants permission to use Partner Central Agents sessions in AWS Partner Central
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifCatalog()
     */
    toUseSession() {
        return this.to('UseSession');
    }
    /**
     * Adds a resource of type Benefit to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/using-the-benefits-api.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @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.
     */
    onBenefit(catalog, identifier, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/benefit/${identifier}`);
    }
    /**
     * Adds a resource of type BenefitAllocation to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-benefit-allocations.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @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.
     */
    onBenefitAllocation(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/benefit-allocation/${identifier}`);
    }
    /**
     * Adds a resource of type BenefitApplication to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-benefit-applications.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onBenefitApplication(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/benefit-application/${identifier}`);
    }
    /**
     * Adds a resource of type ChannelHandshake to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-channel-management.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onChannelHandshake(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/channel-handshake/${identifier}`);
    }
    /**
     * Adds a resource of type Connection to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-account-connections.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @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.
     */
    onConnection(catalog, identifier, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/connection/${identifier}`);
    }
    /**
     * Adds a resource of type ConnectionInvitation to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-account-connections.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @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.
     */
    onConnectionInvitation(catalog, identifier, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/connection-invitation/${identifier}`);
    }
    /**
     * Adds a resource of type ConnectionPreferences to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-account-connections.html
     *
     * @param catalog - Identifier for the catalog.
     * @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.
     */
    onConnectionPreferences(catalog, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/connection-preferences`);
    }
    /**
     * Adds a resource of type Dashboard to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/getting-started/partner-analytics.html
     *
     * @param catalog - Identifier for the catalog.
     * @param tableId - Identifier for the tableId.
     * @param dashboardId - Identifier for the dashboardId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @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.
     */
    onDashboard(catalog, tableId, dashboardId, account, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral::${account ?? this.defaultAccount}:catalog/${catalog}/ReportingData/${tableId}/Dashboard/${dashboardId}`);
    }
    /**
     * Adds a resource of type Engagement to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-multi-partner-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @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.
     */
    onEngagement(catalog, identifier, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/engagement/${identifier}`);
    }
    /**
     * Adds a resource of type MarketplaceRevenueShare to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-marketplace-revenue-share.html
     *
     * @param catalog - Identifier for the catalog.
     * @param marketplaceProductId - Identifier for the marketplaceProductId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onMarketplaceRevenueShare(catalog, marketplaceProductId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/marketplace-revenue-share/${marketplaceProductId}`);
    }
    /**
     * Adds a resource of type Opportunity to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-your-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onOpportunity(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/opportunity/${identifier}`);
    }
    /**
     * Adds a resource of type OpportunityFromEngagementTask to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-multi-partner-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param taskId - Identifier for the taskId.
     * @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.
     */
    onOpportunityFromEngagementTask(catalog, taskId, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/opportunity-from-engagement-task/${taskId}`);
    }
    /**
     * Adds a resource of type Partner to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-partner-registration.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onPartner(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/partner/${identifier}`);
    }
    /**
     * Adds a resource of type ProgramManagementAccount to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-channel-management.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onProgramManagementAccount(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/program-management-account/${identifier}`);
    }
    /**
     * Adds a resource of type ProspectingFromEngagementTask to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-your-leads.html
     *
     * @param catalog - Identifier for the catalog.
     * @param taskIdentifier - Identifier for the taskIdentifier.
     * @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.
     */
    onProspectingFromEngagementTask(catalog, taskIdentifier, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/prospecting-from-engagement-task/${taskIdentifier}`);
    }
    /**
     * Adds a resource of type Relationship to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-channel-management.html
     *
     * @param catalog - Identifier for the catalog.
     * @param programManagementAccountId - Identifier for the programManagementAccountId.
     * @param relationshipId - Identifier for the relationshipId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onRelationship(catalog, programManagementAccountId, relationshipId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/program-management-account/${programManagementAccountId}/relationship/${relationshipId}`);
    }
    /**
     * Adds a resource of type ResourceSnapshot to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-multi-partner-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param engagementIdentifier - Identifier for the engagementIdentifier.
     * @param resourceType - Identifier for the resourceType.
     * @param resourceIdentifier - Identifier for the resourceIdentifier.
     * @param templateIdentifier - Identifier for the templateIdentifier.
     * @param snapshotRevision - Identifier for the snapshotRevision.
     * @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.
     */
    onResourceSnapshot(catalog, engagementIdentifier, resourceType, resourceIdentifier, templateIdentifier, snapshotRevision, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/engagement/${engagementIdentifier}/resource/${resourceType}/${resourceIdentifier}/template/${templateIdentifier}/resource-snapshot/${snapshotRevision}`);
    }
    /**
     * Adds a resource of type RevenueAttribution to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-revenue-attribution.html
     *
     * @param catalog - Identifier for the catalog.
     * @param revenueAttributionId - Identifier for the revenueAttributionId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onRevenueAttribution(catalog, revenueAttributionId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/revenue-attribution/${revenueAttributionId}`);
    }
    /**
     * Adds a resource of type Solution to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/API_ListSolutions.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @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.
     */
    onSolution(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/solution/${identifier}`);
    }
    /**
     * Adds a resource of type engagement-by-accepting-invitation-task to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-multi-partner-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param taskId - Identifier for the taskId.
     * @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.
     */
    onEngagementByAcceptingInvitationTask(catalog, taskId, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/engagement-by-accepting-invitation-task/${taskId}`);
    }
    /**
     * Adds a resource of type engagement-from-opportunity-task to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-multi-partner-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param taskId - Identifier for the taskId.
     * @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.
     */
    onEngagementFromOpportunityTask(catalog, taskId, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/engagement-from-opportunity-task/${taskId}`);
    }
    /**
     * Adds a resource of type engagement-invitation to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-multi-partner-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @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.
     */
    onEngagementInvitation(catalog, identifier, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}::catalog/${catalog}/engagement-invitation/${identifier}`);
    }
    /**
     * Adds a resource of type resource-snapshot-job to the statement
     *
     * https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-multi-partner-opportunities.html
     *
     * @param catalog - Identifier for the catalog.
     * @param identifier - Identifier for the identifier.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onResourceSnapshotJob(catalog, identifier, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:partnercentral:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/resource-snapshot-job/${identifier}`);
    }
    /**
     * Filters access by the tags that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toCreateBenefitApplication()
     * - .toCreateChannelHandshake()
     * - .toCreateMarketplaceRevenueShare()
     * - .toCreateOpportunity()
     * - .toCreatePartner()
     * - .toCreateProgramManagementAccount()
     * - .toCreateRelationship()
     * - .toCreateResourceSnapshotJob()
     * - .toCreateRevenueAttribution()
     * - .toStartEngagementByAcceptingInvitationTask()
     * - .toStartEngagementFromOpportunityTask()
     * - .toStartOpportunityFromEngagementTask()
     * - .toTagResource()
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsRequestTag(tagKey, value, operator) {
        return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tags associated with the resource
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
     *
     * Applies to actions:
     * - .toAcceptChannelHandshake()
     * - .toAmendBenefitApplication()
     * - .toAssignOpportunity()
     * - .toAssociateAwsTrainingCertificationEmailDomain()
     * - .toAssociateBenefitApplicationResource()
     * - .toAssociateOpportunity()
     * - .toCancelBenefitApplication()
     * - .toCancelChannelHandshake()
     * - .toCancelProfileUpdateTask()
     * - .toCreateBenefitApplication()
     * - .toCreateChannelHandshake()
     * - .toCreateMarketplaceRevenueShareAllocation()
     * - .toCreateOpportunity()
     * - .toCreatePartner()
     * - .toCreateProgramManagementAccount()
     * - .toCreateRelationship()
     * - .toCreateResourceSnapshotJob()
     * - .toDeleteProgramManagementAccount()
     * - .toDeleteRelationship()
     * - .toDeleteResourceSnapshotJob()
     * - .toDisassociateAwsTrainingCertificationEmailDomain()
     * - .toDisassociateBenefitApplicationResource()
     * - .toDisassociateOpportunity()
     * - .toGetAllianceLeadContact()
     * - .toGetAwsOpportunitySummary()
     * - .toGetBenefit()
     * - .toGetBenefitAllocation()
     * - .toGetBenefitApplication()
     * - .toGetMarketplaceRevenueShare()
     * - .toGetMarketplaceRevenueShareAllocation()
     * - .toGetOpportunity()
     * - .toGetPartner()
     * - .toGetProfileUpdateTask()
     * - .toGetProfileVisibility()
     * - .toGetQualificationsAssociationDetails()
     * - .toGetQualificationsAssociationTask()
     * - .toGetQualificationsDisassociationTask()
     * - .toGetRelationship()
     * - .toGetResourceSnapshotJob()
     * - .toGetRevenueAttribution()
     * - .toGetRevenueAttributionAllocation()
     * - .toGetRevenueAttributionAllocationsTask()
     * - .toListBenefitApplications()
     * - .toListChannelHandshakes()
     * - .toListMarketplaceRevenueShareAllocations()
     * - .toListProgramManagementAccounts()
     * - .toListRelationships()
     * - .toListRevenueAttributionAllocations()
     * - .toListTagsForResource()
     * - .toPutAllianceLeadContact()
     * - .toPutProfileVisibility()
     * - .toRecallBenefitApplication()
     * - .toRejectChannelHandshake()
     * - .toStartEngagementByAcceptingInvitationTask()
     * - .toStartEngagementFromOpportunityTask()
     * - .toStartOpportunityFromEngagementTask()
     * - .toStartProfileUpdateTask()
     * - .toStartQualificationsAssociationTask()
     * - .toStartQualificationsDisassociationTask()
     * - .toStartResourceSnapshotJob()
     * - .toStartRevenueAttributionAllocationsTask()
     * - .toStopResourceSnapshotJob()
     * - .toSubmitBenefitApplication()
     * - .toSubmitOpportunity()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateBenefitApplication()
     * - .toUpdateMarketplaceRevenueShareAllocation()
     * - .toUpdateOpportunity()
     * - .toUpdateProgramManagementAccount()
     * - .toUpdateRelationship()
     * - .toUpdateRevenueAttribution()
     *
     * Applies to resource types:
     * - BenefitApplication
     * - ChannelHandshake
     * - MarketplaceRevenueShare
     * - Opportunity
     * - Partner
     * - ProgramManagementAccount
     * - Relationship
     * - RevenueAttribution
     * - resource-snapshot-job
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsResourceTag(tagKey, value, operator) {
        return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tag keys that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
     *
     * Applies to actions:
     * - .toCreateBenefitApplication()
     * - .toCreateChannelHandshake()
     * - .toCreateMarketplaceRevenueShare()
     * - .toCreateOpportunity()
     * - .toCreatePartner()
     * - .toCreateProgramManagementAccount()
     * - .toCreateRelationship()
     * - .toCreateResourceSnapshotJob()
     * - .toCreateRevenueAttribution()
     * - .toListTagsForResource()
     * - .toStartEngagementByAcceptingInvitationTask()
     * - .toStartEngagementFromOpportunityTask()
     * - .toStartOpportunityFromEngagementTask()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsTagKeys(value, operator) {
        return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by a specific Catalog
     *
     * https://docs.aws.amazon.com/partner-central/latest/getting-started/controlling-access-in-aws-partner-central.html#condition-keys-for-aws-partner-central
     *
     * Applies to actions:
     * - .toAcceptChannelHandshake()
     * - .toAcceptConnectionInvitation()
     * - .toAcceptEngagementInvitation()
     * - .toAmendBenefitApplication()
     * - .toAssignOpportunity()
     * - .toAssociateAwsTrainingCertificationEmailDomain()
     * - .toAssociateBenefitApplicationResource()
     * - .toAssociateOpportunity()
     * - .toCancelBenefitApplication()
     * - .toCancelChannelHandshake()
     * - .toCancelConnection()
     * - .toCancelConnectionInvitation()
     * - .toCancelProfileUpdateTask()
     * - .toCreateBenefitApplication()
     * - .toCreateChannelHandshake()
     * - .toCreateConnectionInvitation()
     * - .toCreateEngagement()
     * - .toCreateEngagementContext()
     * - .toCreateEngagementInvitation()
     * - .toCreateMarketplaceRevenueShare()
     * - .toCreateMarketplaceRevenueShareAllocation()
     * - .toCreateOpportunity()
     * - .toCreatePartner()
     * - .toCreateProgramManagementAccount()
     * - .toCreateRelationship()
     * - .toCreateResourceSnapshot()
     * - .toCreateResourceSnapshotJob()
     * - .toCreateRevenueAttribution()
     * - .toDeleteProgramManagementAccount()
     * - .toDeleteRelationship()
     * - .toDeleteResourceSnapshotJob()
     * - .toDisassociateAwsTrainingCertificationEmailDomain()
     * - .toDisassociateBenefitApplicationResource()
     * - .toDisassociateOpportunity()
     * - .toGetAllianceLeadContact()
     * - .toGetAwsOpportunitySummary()
     * - .toGetBenefit()
     * - .toGetBenefitAllocation()
     * - .toGetBenefitApplication()
     * - .toGetConnection()
     * - .toGetConnectionInvitation()
     * - .toGetConnectionPreferences()
     * - .toGetEngagement()
     * - .toGetEngagementInvitation()
     * - .toGetMarketplaceRevenueShare()
     * - .toGetMarketplaceRevenueShareAllocation()
     * - .toGetOpportunity()
     * - .toGetPartner()
     * - .toGetPartnerDashboard()
     * - .toGetProfileUpdateTask()
     * - .toGetProfileVisibility()
     * - .toGetProspectingFromEngagementTask()
     * - .toGetQualificationsAssociationDetails()
     * - .toGetQualificationsAssociationTask()
     * - .toGetQualificationsDisassociationTask()
     * - .toGetRelationship()
     * - .toGetResourceSnapshot()
     * - .toGetResourceSnapshotJob()
     * - .toGetRevenueAttribution()
     * - .toGetRevenueAttributionAllocation()
     * - .toGetRevenueAttributionAllocationsTask()
     * - .toGetSellingSystemSettings()
     * - .toGetVerification()
     * - .toListBenefitAllocations()
     * - .toListBenefitApplications()
     * - .toListBenefits()
     * - .toListChannelHandshakes()
     * - .toListConnectionInvitations()
     * - .toListConnections()
     * - .toListEngagementByAcceptingInvitationTasks()
     * - .toListEngagementFromOpportunityTasks()
     * - .toListEngagementInvitations()
     * - .toListEngagementMembers()
     * - .toListEngagementResourceAssociations()
     * - .toListEngagements()
     * - .toListMarketplaceRevenueShareAllocations()
     * - .toListMarketplaceRevenueShares()
     * - .toListOpportunities()
     * - .toListOpportunityFromEngagementTasks()
     * - .toListPartners()
     * - .toListProgramManagementAccounts()
     * - .toListProspectingFromEngagementTasks()
     * - .toListRelationships()
     * - .toListResourceSnapshotJobs()
     * - .toListResourceSnapshots()
     * - .toListRevenueAttributionAllocations()
     * - .toListRevenueAttributions()
     * - .toListSolutions()
     * - .toListTagsForResource()
     * - .toPutAllianceLeadContact()
     * - .toPutProfileVisibility()
     * - .toPutSellingSystemSettings()
     * - .toRecallBenefitApplication()
     * - .toRejectChannelHandshake()
     * - .toRejectConnectionInvitation()
     * - .toRejectEngagementInvitation()
     * - .toSendEmailVerificationCode()
     * - .toStartEngagementByAcceptingInvitationTask()
     * - .toStartEngagementFromOpportunityTask()
     * - .toStartOpportunityFromEngagementTask()
     * - .toStartProfileUpdateTask()
     * - .toStartProspectingFromEngagementTask()
     * - .toStartQualificationsAssociationTask()
     * - .toStartQualificationsDisassociationTask()
     * - .toStartResourceSnapshotJob()
     * - .toStartRevenueAttributionAllocationsTask()
     * - .toStartVerification()
     * - .toStopResourceSnapshotJob()
     * - .toSubmitBenefitApplication()
     * - .toSubmitOpportunity()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateBenefitApplication()
     * - .toUpdateConnectionPreferences()
     * - .toUpdateEngagementContext()
     * - .toUpdateMarketplaceRevenueShareAllocation()
     * - .toUpdateOpportunity()
     * - .toUpdateProgramManagementAccount()
     * - .toUpdateRelationship()
     * - .toUpdateRevenueAttribution()
     * - .toGetProgramManagementAccount()
     * - .toUseSession()
     *
     * @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`
     */
    ifCatalog(value, operator) {
        return this.if(`Catalog`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by channel handshake types
     *
     * https://docs.aws.amazon.com/partner-central/latest/getting-started/controlling-access-in-aws-partner-central.html#condition-keys-for-aws-partner-central
     *
     * Applies to actions:
     * - .toAcceptChannelHandshake()
     * - .toCancelChannelHandshake()
     * - .toCreateChannelHandshake()
     * - .toListChannelHandshakes()
     * - .toRejectChannelHandshake()
     *
     * @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`
     */
    ifChannelHandshakeType(value, operator) {
        return this.if(`ChannelHandshakeType`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by benefit fulfillment types
     *
     * https://docs.aws.amazon.com/partner-central/latest/getting-started/controlling-access-in-aws-partner-central.html#condition-keys-for-aws-partner-central
     *
     * Applies to actions:
     * - .toAmendBenefitApplication()
     * - .toAssociateBenefitApplicationResource()
     * - .toCancelBenefitApplication()
     * - .toCreateBenefitApplication()
     * - .toDisassociateBenefitApplicationResource()
     * - .toGetBenefit()
     * - .toGetBenefitAllocation()
     * - .toGetBenefitApplication()
     * - .toListBenefitAllocations()
     * - .toListBenefitApplications()
     * - .toListBenefits()
     * - .toListTagsForResource()
     * - .toRecallBenefitApplication()
     * - .toSubmitBenefitApplication()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateBenefitApplication()
     *
     * @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`
     */
    ifFulfillmentTypes(value, operator) {
        return this.if(`FulfillmentTypes`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by program
     *
     * https://docs.aws.amazon.com/partner-central/latest/getting-started/controlling-access-in-aws-partner-central.html#condition-keys-for-aws-partner-central
     *
     * Applies to actions:
     * - .toAmendBenefitApplication()
     * - .toAssociateBenefitApplicationResource()
     * - .toCancelBenefitApplication()
     * - .toCreateBenefitApplication()
     * - .toDisassociateBenefitApplicationResource()
     * - .toGetBenefit()
     * - .toGetBenefitApplication()
     * - .toListBenefitApplications()
     * - .toListBenefits()
     * - .toListTagsForResource()
     * - .toRecallBenefitApplication()
     * - .toSubmitBenefitApplication()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateBenefitApplication()
     *
     * @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`
     */
    ifPrograms(value, operator) {
        return this.if(`Programs`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by entity types for Opportunity association
     *
     * https://docs.aws.amazon.com/partner-central/latest/getting-started/controlling-access-in-aws-partner-central.html#condition-keys-for-aws-partner-central
     *
     * Applies to actions:
     * - .toAssociateOpportunity()
     * - .toDisassociateOpportunity()
     *
     * @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`
     */
    ifRelatedEntityType(value, operator) {
        return this.if(`RelatedEntityType`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the type of verification being performed
     *
     * https://docs.aws.amazon.com/partner-central/latest/getting-started/controlling-access-in-aws-partner-central.html#condition-keys-for-aws-partner-central
     *
     * Applies to actions:
     * - .toGetVerification()
     * - .toStartVerification()
     *
     * @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`
     */
    ifVerificationType(value, operator) {
        return this.if(`VerificationType`, value, operator ?? 'StringLike');
    }
    /**
     * Statement provider for service [partnercentral](https://docs.aws.amazon.com/service-authorization/latest/reference/list_partner-central.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 'partnercentral';
        this.accessLevelList = {
            Write: [
                'AcceptChannelHandshake',
                'AcceptConnectionInvitation',
                'AcceptEngagementInvitation',
                'AmendBenefitApplication',
                'AssignOpportunity',
                'AssociateAwsTrainingCertificationEmailDomain',
                'AssociateBenefitApplicationResource',
                'AssociateOpportunity',
                'CancelBenefitApplication',
                'CancelChannelHandshake',
                'CancelConnection',
                'CancelConnectionInvitation',
                'CancelProfileUpdateTask',
                'CreateBenefitApplication',
                'CreateChannelHandshake',
                'CreateConnectionInvitation',
                'CreateEngagement',
                'CreateEngagementContext',
                'CreateEngagementInvitation',
                'CreateMarketplaceRevenueShare',
                'CreateMarketplaceRevenueShareAllocation',
                'CreateOpportunity',
                'CreatePartner',
                'CreateProgramManagementAccount',
                'CreateRelationship',
                'CreateResourceSnapshot',
                'CreateResourceSnapshotJob',
                'CreateRevenueAttribution',
                'DeleteProgramManagementAccount',
                'DeleteRelationship',
                'DeleteResourceSnapshotJob',
                'DisassociateAwsTrainingCertificationEmailDomain',
                'DisassociateBenefitApplicationResource',
                'DisassociateOpportunity',
                'PutAllianceLeadContact',
                'PutProfileVisibility',
                'PutSellingSystemSettings',
                'RecallBenefitApplication',
                'RejectChannelHandshake',
                'RejectConnectionInvitation',
                'RejectEngagementInvitation',
                'SendEmailVerificationCode',
                'StartEngagementByAcceptingInvitationTask',
                'StartEngagementFromOpportunityTask',
                'StartOpportunityFromEngagementTask',
                'StartProfileUpdateTask',
                'StartProspectingFromEngagementTask',
                'StartQualificationsAssociationTask',
                'StartQualificationsDisassociationTask',
                'StartResourceSnapshotJob',
                'StartRevenueAttributionAllocationsTask',
                'StartVerification',
                'StopResourceSnapshotJob',
                'SubmitBenefitApplication',
                'SubmitOpportunity',
                'TagResource',
                'UntagResource',
                'UpdateBenefitApplication',
                'UpdateConnectionPreferences',
                'UpdateEngagementContext',
                'UpdateMarketplaceRevenueShareAllocation',
                'UpdateOpportunity',
                'UpdateProgramManagementAccount',
                'UpdateRelationship',
                'UpdateRevenueAttribution',
                'CreateBusinessPlan',
                'CreateCollaborationChannelMembers',
                'CreateCollaborationChannelRequest',
                'EnrollInPartnerPath',
                'PutBusinessPlan',
                'UseSession'
            ],
            Read: [
                'GetAllianceLeadContact',
                'GetAwsOpportunitySummary',
                'GetBenefit',
                'GetBenefitAllocation',
                'GetBenefitApplication',
                'GetConnection',
                'GetConnectionInvitation',
                'GetConnectionPreferences',
                'GetEngagement',
                'GetEngagementInvitation',
                'GetMarketplaceRevenueShare',
                'GetMarketplaceRevenueShareAllocation',
                'GetOpportunity',
                'GetPartner',
                'GetPartnerDashboard',
                'GetProfileUpdateTask',
                'GetProfileVisibility',
                'GetProspectingFromEngagementTask',
                'GetQualificationsAssociationDetails',
                'GetQualificationsAssociationTask',
                'GetQualificationsDisassociationTask',
                'GetRelationship',
                'GetResourceSnapshot',
                'GetResourceSnapshotJob',
                'GetRevenueAttribution',
                'GetRevenueAttributionAllocation',
                'GetRevenueAttributionAllocationsTask',
                'GetSellingSystemSettings',
                'GetVerification',
                'ListEngagementMembers',
                'ListEngagementResourceAssociations',
                'ListTagsForResource',
                'GetBusinessPlan',
                'GetCollaborationChannel',
                'GetPartnerProfile',
                'GetProgramManagementAccount'
            ],
            List: [
                'ListBenefitAllocations',
                'ListBenefitApplications',
                'ListBenefits',
                'ListChannelHandshakes',
                'ListConnectionInvitations',
                'ListConnections',
                'ListEngagementByAcceptingInvitationTasks',
                'ListEngagementFromOpportunityTasks',
                'ListEngagementInvitations',
                'ListEngagements',
                'ListMarketplaceRevenueShareAllocations',
                'ListMarketplaceRevenueShares',
                'ListOpportunities',
                'ListOpportunityFromEngagementTasks',
                'ListPartners',
                'ListProgramManagementAccounts',
                'ListProspectingFromEngagementTasks',
                'ListRelationships',
                'ListResourceSnapshotJobs',
                'ListResourceSnapshots',
                'ListRevenueAttributionAllocations',
                'ListRevenueAttributions',
                'ListSolutions',
                'ListBusinessPlans',
                'ListCollaborationChannels',
                'ListPartnerPaths',
                'SearchPartnerProfiles'
            ],
            Tagging: [
                'TagResource',
                'UntagResource'
            ]
        };
    }
}
exports.Partnercentral = Partnercentral;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydG5lci1jZW50cmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicGFydG5lci1jZW50cmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsd0JBQWU7SUFHakQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDRCQUE0QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kseUJBQXlCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDhDQUE4QztRQUNuRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUNBQXFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDBCQUEwQjtRQUMvQixPQUFPLElBQUks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LGlCQUFpQjtnQkFDakIsd0NBQXdDO2dCQUN4Qyw4QkFBOEI7Z0JBQzlCLG1CQUFtQjtnQkFDbkIsb0NBQW9DO2dCQUNwQyxjQUFjO2dCQUNkLCtCQUErQjtnQkFDL0Isb0NBQW9DO2dCQUNwQyxtQkFBbUI7Z0JBQ25CLDBCQUEwQjtnQkFDMUIsdUJBQXVCO2dCQUN2QixtQ0FBbUM7Z0JBQ25DLHlCQUF5QjtnQkFDekIsZUFBZTtnQkFDZixtQkFBbUI7Z0JBQ25CLDJCQUEyQjtnQkFDM0Isa0JBQWtCO2dCQUNsQix1QkFBdUI7YUFDeEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQXl3QkYsQ0FBQztDQUNGO0FBajdFRCx3Q0FpN0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtwYXJ0bmVyY2VudHJhbF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfcGFydG5lci1jZW50cmFsLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgUGFydG5lcmNlbnRyYWwgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdwYXJ0bmVyY2VudHJhbCc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFjY2VwdCBjaGFubmVsIGhhbmRzaGFrZXMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfY2hhbm5lbF9BY2NlcHRDaGFubmVsSGFuZHNoYWtlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjY2VwdENoYW5uZWxIYW5kc2hha2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FjY2VwdENoYW5uZWxIYW5kc2hha2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhY2NlcHQgY29ubmVjdGlvbiBpbnZpdGF0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X0FjY2VwdENvbm5lY3Rpb25JbnZpdGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjY2VwdENvbm5lY3Rpb25JbnZpdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBY2NlcHRDb25uZWN0aW9uSW52aXRhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFjY2VwdCBFbmdhZ2VtZW50IEludml0YXRpb25zIG9uIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0FjY2VwdEVuZ2FnZW1lbnRJbnZpdGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjY2VwdEVuZ2FnZW1lbnRJbnZpdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBY2NlcHRFbmdhZ2VtZW50SW52aXRhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFtZW5kIGJlbmVmaXQgYXBwbGljYXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2JlbmVmaXRzX0FtZW5kQmVuZWZpdEFwcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FtZW5kQmVuZWZpdEFwcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBbWVuZEJlbmVmaXRBcHBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc2lnbiBPcHBvcnR1bml0aWVzIG9uIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc2lnbk9wcG9ydHVuaXR5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc2lnbk9wcG9ydHVuaXR5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NpZ25PcHBvcnR1bml0eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBBV1MgVHJhaW5pbmcgYW5kIENlcnRpZmljYXRpb24gZW1haWwgZG9tYWlucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X0Fzc29jaWF0ZUF3c1RyYWluaW5nQ2VydGlmaWNhdGlvbkVtYWlsRG9tYWluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZUF3c1RyYWluaW5nQ2VydGlmaWNhdGlvbkVtYWlsRG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVBd3NUcmFpbmluZ0NlcnRpZmljYXRpb25FbWFpbERvbWFpbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBiZW5lZml0IGFwcGxpY2F0aW9uIHJlc291cmNlcyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9iZW5lZml0c19Bc3NvY2lhdGVCZW5lZml0QXBwbGljYXRpb25SZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVCZW5lZml0QXBwbGljYXRpb25SZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlQmVuZWZpdEFwcGxpY2F0aW9uUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgT3Bwb3J0dW5pdGllcyBvbiBBV1MgUGFydG5lciBDZW50cmFsIHdpdGggb3RoZXIgZW50aXRpZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZU9wcG9ydHVuaXR5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZU9wcG9ydHVuaXR5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVPcHBvcnR1bml0eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBiZW5lZml0IGFwcGxpY2F0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9iZW5lZml0c19DYW5jZWxCZW5lZml0QXBwbGljYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsQmVuZWZpdEFwcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxCZW5lZml0QXBwbGljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgY2hhbm5lbCBoYW5kc2hha2VzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2NoYW5uZWxfQ2FuY2VsQ2hhbm5lbEhhbmRzaGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxDaGFubmVsSGFuZHNoYWtlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxDaGFubmVsSGFuZHNoYWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGNvbm5lY3Rpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfQ2FuY2VsQ29ubmVjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGNvbm5lY3Rpb24gaW52aXRhdGlvbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9DYW5jZWxDb25uZWN0aW9uSW52aXRhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxDb25uZWN0aW9uSW52aXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsQ29ubmVjdGlvbkludml0YXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgcHJvZmlsZSB1cGRhdGUgdGFza3MgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9DYW5jZWxQcm9maWxlVXBkYXRlVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxQcm9maWxlVXBkYXRlVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsUHJvZmlsZVVwZGF0ZVRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYmVuZWZpdCBhcHBsaWNhdGlvbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkNhdGFsb2coKVxuICAgKiAtIC5pZkZ1bGZpbGxtZW50VHlwZXMoKVxuICAgKiAtIC5pZlByb2dyYW1zKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9iZW5lZml0c19DcmVhdGVCZW5lZml0QXBwbGljYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQmVuZWZpdEFwcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVCZW5lZml0QXBwbGljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgY2hhbm5lbCBoYW5kc2hha2VzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2NoYW5uZWxfQ3JlYXRlQ2hhbm5lbEhhbmRzaGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDaGFubmVsSGFuZHNoYWtlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDaGFubmVsSGFuZHNoYWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGNvbm5lY3Rpb24gaW52aXRhdGlvbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9DcmVhdGVDb25uZWN0aW9uSW52aXRhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDb25uZWN0aW9uSW52aXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ29ubmVjdGlvbkludml0YXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGluZyBlbmdhZ2VtZW50cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVFbmdhZ2VtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUVuZ2FnZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUVuZ2FnZW1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgZW5nYWdlbWVudCBjb250ZXh0cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVFbmdhZ2VtZW50Q29udGV4dC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVFbmdhZ2VtZW50Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRW5nYWdlbWVudENvbnRleHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGluZyBlbmdhZ2VtZW50IGludml0YXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUVuZ2FnZW1lbnRJbnZpdGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUVuZ2FnZW1lbnRJbnZpdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVFbmdhZ2VtZW50SW52aXRhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBtYXJrZXRwbGFjZSByZXZlbnVlIHNoYXJlcyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9wcm1fQ3JlYXRlTWFya2V0cGxhY2VSZXZlbnVlU2hhcmUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTWFya2V0cGxhY2VSZXZlbnVlU2hhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIG1hcmtldHBsYWNlIHJldmVudWUgc2hhcmUgYWxsb2NhdGlvbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcHJtX0NyZWF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVNYXJrZXRwbGFjZVJldmVudWVTaGFyZUFsbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBuZXcgT3Bwb3J0dW5pdGllcyBvbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVPcHBvcnR1bml0eS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVPcHBvcnR1bml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlT3Bwb3J0dW5pdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgcGFydG5lcnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkNhdGFsb2coKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfQ3JlYXRlUGFydG5lci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVQYXJ0bmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVQYXJ0bmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIHByb2dyYW0gbWFuYWdlbWVudCBhY2NvdW50cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfY2hhbm5lbF9DcmVhdGVQcm9ncmFtTWFuYWdlbWVudEFjY291bnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUHJvZ3JhbU1hbmFnZW1lbnRBY2NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVQcm9ncmFtTWFuYWdlbWVudEFjY291bnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgcmVsYXRpb25zaGlwcyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9jaGFubmVsX0NyZWF0ZVJlbGF0aW9uc2hpcC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZWxhdGlvbnNoaXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlbGF0aW9uc2hpcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0aW5nIHJlc291cmNlIHNuYXBzaG90cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVSZXNvdXJjZVNuYXBzaG90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVJlc291cmNlU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlc291cmNlU25hcHNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGluZyByZXNvdXJjZSBzbmFwc2hvdCBqb2JzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVJlc291cmNlU25hcHNob3RKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUmVzb3VyY2VTbmFwc2hvdEpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUmVzb3VyY2VTbmFwc2hvdEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSByZXZlbnVlIGF0dHJpYnV0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9wcm1fQ3JlYXRlUmV2ZW51ZUF0dHJpYnV0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVJldmVudWVBdHRyaWJ1dGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUmV2ZW51ZUF0dHJpYnV0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHByb2dyYW0gbWFuYWdlbWVudCBhY2NvdW50cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9jaGFubmVsX0RlbGV0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVQcm9ncmFtTWFuYWdlbWVudEFjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSByZWxhdGlvbnNoaXBzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2NoYW5uZWxfRGVsZXRlUmVsYXRpb25zaGlwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlbGF0aW9uc2hpcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVsYXRpb25zaGlwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRpbmcgcmVzb3VyY2Ugc25hcHNob3Qgam9icyBvbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVSZXNvdXJjZVNuYXBzaG90Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlc291cmNlU25hcHNob3RKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJlc291cmNlU25hcHNob3RKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgQVdTIFRyYWluaW5nIGFuZCBDZXJ0aWZpY2F0aW9uIGVtYWlsIGRvbWFpbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9EaXNhc3NvY2lhdGVBd3NUcmFpbmluZ0NlcnRpZmljYXRpb25FbWFpbERvbWFpbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVBd3NUcmFpbmluZ0NlcnRpZmljYXRpb25FbWFpbERvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlQXdzVHJhaW5pbmdDZXJ0aWZpY2F0aW9uRW1haWxEb21haW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYmVuZWZpdCBhcHBsaWNhdGlvbiByZXNvdXJjZXMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYmVuZWZpdHNfRGlzYXNzb2NpYXRlQmVuZWZpdEFwcGxpY2F0aW9uUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlQmVuZWZpdEFwcGxpY2F0aW9uUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUJlbmVmaXRBcHBsaWNhdGlvblJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIE9wcG9ydHVuaXRpZXMgb24gQVdTIFBhcnRuZXIgQ2VudHJhbCBmcm9tIG90aGVyIGVudGl0aWVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVPcHBvcnR1bml0eS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVPcHBvcnR1bml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlT3Bwb3J0dW5pdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhbGxpYW5jZSBsZWFkIGNvbnRhY3QgaW5mb3JtYXRpb24gaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X0dldEFsbGlhbmNlTGVhZENvbnRhY3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QWxsaWFuY2VMZWFkQ29udGFjdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QWxsaWFuY2VMZWFkQ29udGFjdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIEFXUyBPcHBvcnR1bml0eSBTdW1tYXJpZXMgZm9yIE9wcG9ydHVuaXRpZXMgb24gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRBd3NPcHBvcnR1bml0eVN1bW1hcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QXdzT3Bwb3J0dW5pdHlTdW1tYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBd3NPcHBvcnR1bml0eVN1bW1hcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBiZW5lZml0IGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9iZW5lZml0c19HZXRCZW5lZml0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEJlbmVmaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEJlbmVmaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBiZW5lZml0IGFsbG9jYXRpb24gZGV0YWlscyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2JlbmVmaXRzX0dldEJlbmVmaXRBbGxvY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEJlbmVmaXRBbGxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRCZW5lZml0QWxsb2NhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGJlbmVmaXQgYXBwbGljYXRpb24gZGV0YWlscyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2JlbmVmaXRzX0dldEJlbmVmaXRBcHBsaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRCZW5lZml0QXBwbGljYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEJlbmVmaXRBcHBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGNvbm5lY3Rpb24gZGV0YWlscyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfR2V0Q29ubmVjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgY29ubmVjdGlvbiBpbnZpdGF0aW9uIGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X0dldENvbm5lY3Rpb25JbnZpdGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbm5lY3Rpb25JbnZpdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25uZWN0aW9uSW52aXRhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGNvbm5lY3Rpb24gcHJlZmVyZW5jZXMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X0dldENvbm5lY3Rpb25QcmVmZXJlbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb25uZWN0aW9uUHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENvbm5lY3Rpb25QcmVmZXJlbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZhbCBvZiBlbmdhZ2VtZW50IGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRFbmdhZ2VtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEVuZ2FnZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEVuZ2FnZW1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBkZXRhaWxzIG9mIEVuZ2FnZW1lbnQgSW52aXRhdGlvbnMgb24gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRFbmdhZ2VtZW50SW52aXRhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFbmdhZ2VtZW50SW52aXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RW5nYWdlbWVudEludml0YXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBtYXJrZXRwbGFjZSByZXZlbnVlIHNoYXJlIGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9wcm1fR2V0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbWFya2V0cGxhY2UgcmV2ZW51ZSBzaGFyZSBhbGxvY2F0aW9uIGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9wcm1fR2V0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgZGV0YWlscyBvZiBPcHBvcnR1bml0aWVzIG9uIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0T3Bwb3J0dW5pdHkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0T3Bwb3J0dW5pdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE9wcG9ydHVuaXR5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcGFydG5lciBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9HZXRQYXJ0bmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFBhcnRuZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFBhcnRuZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBwYXJ0bmVyIGRhc2hib2FyZCBpbmZvcm1hdGlvbiBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0UGFydG5lckRhc2hib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UGFydG5lckRhc2hib2FyZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHByb2ZpbGUgdXBkYXRlIHRhc2sgZGV0YWlscyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfR2V0UHJvZmlsZVVwZGF0ZVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UHJvZmlsZVVwZGF0ZVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFByb2ZpbGVVcGRhdGVUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcHJvZmlsZSB2aXNpYmlsaXR5IHNldHRpbmdzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9HZXRQcm9maWxlVmlzaWJpbGl0eS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQcm9maWxlVmlzaWJpbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UHJvZmlsZVZpc2liaWxpdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBwcm9zcGVjdGluZyBmcm9tIGVuZ2FnZW1lbnQgdGFzayBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFByb3NwZWN0aW5nRnJvbUVuZ2FnZW1lbnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcXVhbGlmaWNhdGlvbnMgYXNzb2NpYXRpb24gZGV0YWlscyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfR2V0UXVhbGlmaWNhdGlvbnNBc3NvY2lhdGlvbkRldGFpbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVhbGlmaWNhdGlvbnNBc3NvY2lhdGlvbkRldGFpbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1YWxpZmljYXRpb25zQXNzb2NpYXRpb25EZXRhaWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcXVhbGlmaWNhdGlvbnMgYXNzb2NpYXRpb24gdGFzayBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9HZXRRdWFsaWZpY2F0aW9uc0Fzc29jaWF0aW9uVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRRdWFsaWZpY2F0aW9uc0Fzc29jaWF0aW9uVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVhbGlmaWNhdGlvbnNBc3NvY2lhdGlvblRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBxdWFsaWZpY2F0aW9ucyBkaXNhc3NvY2lhdGlvbiB0YXNrIGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X0dldFF1YWxpZmljYXRpb25zRGlzYXNzb2NpYXRpb25UYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1YWxpZmljYXRpb25zRGlzYXNzb2NpYXRpb25UYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRRdWFsaWZpY2F0aW9uc0Rpc2Fzc29jaWF0aW9uVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHJlbGF0aW9uc2hpcCBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfY2hhbm5lbF9HZXRSZWxhdGlvbnNoaXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVsYXRpb25zaGlwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZWxhdGlvbnNoaXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2aW5nIHJlc291cmNlIHNuYXBzaG90IGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRSZXNvdXJjZVNuYXBzaG90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFJlc291cmNlU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJlc291cmNlU25hcHNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2aW5nIHJlc291cmNlIHNuYXBzaG90IGpvYiBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UmVzb3VyY2VTbmFwc2hvdEpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZXNvdXJjZVNuYXBzaG90Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZXNvdXJjZVNuYXBzaG90Sm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcmV2ZW51ZSBhdHRyaWJ1dGlvbiBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcHJtX0dldFJldmVudWVBdHRyaWJ1dGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZXZlbnVlQXR0cmlidXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJldmVudWVBdHRyaWJ1dGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHJldmVudWUgYXR0cmlidXRpb24gYWxsb2NhdGlvbiBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcHJtX0dldFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmV2ZW51ZUF0dHJpYnV0aW9uQWxsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmV2ZW51ZUF0dHJpYnV0aW9uQWxsb2NhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHJldmVudWUgYXR0cmlidXRpb24gYWxsb2NhdGlvbnMgdGFzayBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcHJtX0dldFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb25zVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9uc1Rhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb25zVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZpbmcgc2VsbGluZyBzeXN0ZW0gc2V0dGluZ3MgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTZWxsaW5nU3lzdGVtU2V0dGluZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2VsbGluZ1N5c3RlbVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTZWxsaW5nU3lzdGVtU2V0dGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB2ZXJpZmljYXRpb24gZGV0YWlscyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkNhdGFsb2coKVxuICAgKiAtIC5pZlZlcmlmaWNhdGlvblR5cGUoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfR2V0VmVyaWZpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFZlcmlmaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VmVyaWZpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBiZW5lZml0IGFsbG9jYXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYmVuZWZpdHNfTGlzdEJlbmVmaXRBbGxvY2F0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QmVuZWZpdEFsbG9jYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QmVuZWZpdEFsbG9jYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBiZW5lZml0IGFwcGxpY2F0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2JlbmVmaXRzX0xpc3RCZW5lZml0QXBwbGljYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RCZW5lZml0QXBwbGljYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QmVuZWZpdEFwcGxpY2F0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYmVuZWZpdHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9iZW5lZml0c19MaXN0QmVuZWZpdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJlbmVmaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QmVuZWZpdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGNoYW5uZWwgaGFuZHNoYWtlcyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2NoYW5uZWxfTGlzdENoYW5uZWxIYW5kc2hha2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDaGFubmVsSGFuZHNoYWtlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdENoYW5uZWxIYW5kc2hha2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBjb25uZWN0aW9uIGludml0YXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9MaXN0Q29ubmVjdGlvbkludml0YXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb25uZWN0aW9uSW52aXRhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb25uZWN0aW9uSW52aXRhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGNvbm5lY3Rpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9MaXN0Q29ubmVjdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbm5lY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29ubmVjdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0aW5nIGVuZ2FnZW1lbnRzIGJ5IGFjY2VwdGluZyBpbnZpdGF0aW9uIHRhc2tzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEVuZ2FnZW1lbnRCeUFjY2VwdGluZ0ludml0YXRpb25UYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RW5nYWdlbWVudEJ5QWNjZXB0aW5nSW52aXRhdGlvblRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RW5nYWdlbWVudEJ5QWNjZXB0aW5nSW52aXRhdGlvblRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdGluZyBlbmdhZ2VtZW50cyBmcm9tIG9wcG9ydHVuaXR5IHRhc2tzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEVuZ2FnZW1lbnRGcm9tT3Bwb3J0dW5pdHlUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RW5nYWdlbWVudEZyb21PcHBvcnR1bml0eVRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RW5nYWdlbWVudEZyb21PcHBvcnR1bml0eVRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBFbmdhZ2VtZW50IEludml0YXRpb25zIG9uIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEVuZ2FnZW1lbnRJbnZpdGF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RW5nYWdlbWVudEludml0YXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RW5nYWdlbWVudEludml0YXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdGluZyBlbmdhZ2VtZW50IG1lbWJlcnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0RW5nYWdlbWVudE1lbWJlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEVuZ2FnZW1lbnRNZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RW5nYWdlbWVudE1lbWJlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0aW5nIGVuZ2FnZW1lbnQgcmVzb3VyY2UgYXNzb2NpYXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEVuZ2FnZW1lbnRSZXNvdXJjZUFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RW5nYWdlbWVudFJlc291cmNlQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RW5nYWdlbWVudFJlc291cmNlQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdGluZyBlbmdhZ2VtZW50cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkNhdGFsb2coKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RFbmdhZ2VtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RW5nYWdlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RFbmdhZ2VtZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgbWFya2V0cGxhY2UgcmV2ZW51ZSBzaGFyZSBhbGxvY2F0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX3BybV9MaXN0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IG1hcmtldHBsYWNlIHJldmVudWUgc2hhcmVzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcHJtX0xpc3RNYXJrZXRwbGFjZVJldmVudWVTaGFyZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgT3Bwb3J0dW5pdGllcyBvbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkNhdGFsb2coKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RPcHBvcnR1bml0aWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RPcHBvcnR1bml0aWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0T3Bwb3J0dW5pdGllcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgb3Bwb3J0dW5pdHkgZnJvbSBlbmdhZ2VtZW50IHRhc2tzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdE9wcG9ydHVuaXR5RnJvbUVuZ2FnZW1lbnRUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0T3Bwb3J0dW5pdHlGcm9tRW5nYWdlbWVudFRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0T3Bwb3J0dW5pdHlGcm9tRW5nYWdlbWVudFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBwYXJ0bmVycyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkNhdGFsb2coKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfTGlzdFBhcnRuZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQYXJ0bmVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFBhcnRuZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBwcm9ncmFtIG1hbmFnZW1lbnQgYWNjb3VudHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9jaGFubmVsX0xpc3RQcm9ncmFtTWFuYWdlbWVudEFjY291bnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQcm9ncmFtTWFuYWdlbWVudEFjY291bnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UHJvZ3JhbU1hbmFnZW1lbnRBY2NvdW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcHJvc3BlY3RpbmcgZnJvbSBlbmdhZ2VtZW50IHRhc2tzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFByb3NwZWN0aW5nRnJvbUVuZ2FnZW1lbnRUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCByZWxhdGlvbnNoaXBzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfY2hhbm5lbF9MaXN0UmVsYXRpb25zaGlwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UmVsYXRpb25zaGlwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFJlbGF0aW9uc2hpcHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0aW5nIHJlc291cmNlIHNuYXBzaG90IGpvYnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UmVzb3VyY2VTbmFwc2hvdEpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFJlc291cmNlU25hcHNob3RKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UmVzb3VyY2VTbmFwc2hvdEpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0aW5nIHJlc291cmNlIHNuYXBzaG90cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RSZXNvdXJjZVNuYXBzaG90cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UmVzb3VyY2VTbmFwc2hvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RSZXNvdXJjZVNuYXBzaG90cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcmV2ZW51ZSBhdHRyaWJ1dGlvbiBhbGxvY2F0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX3BybV9MaXN0UmV2ZW51ZUF0dHJpYnV0aW9uQWxsb2NhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UmV2ZW51ZUF0dHJpYnV0aW9uQWxsb2NhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHJldmVudWUgYXR0cmlidXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcHJtX0xpc3RSZXZlbnVlQXR0cmlidXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RSZXZlbnVlQXR0cmlidXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UmV2ZW51ZUF0dHJpYnV0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgU29sdXRpb25zIG9uIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFNvbHV0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U29sdXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U29sdXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YWdzIGZvciBhIHJlc291cmNlIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkNhdGFsb2coKVxuICAgKiAtIC5pZkZ1bGZpbGxtZW50VHlwZXMoKVxuICAgKiAtIC5pZlByb2dyYW1zKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgYWxsaWFuY2UgbGVhZCBjb250YWN0IGluZm9ybWF0aW9uIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfUHV0QWxsaWFuY2VMZWFkQ29udGFjdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRBbGxpYW5jZUxlYWRDb250YWN0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRBbGxpYW5jZUxlYWRDb250YWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IHByb2ZpbGUgdmlzaWJpbGl0eSBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X1B1dFByb2ZpbGVWaXNpYmlsaXR5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFByb2ZpbGVWaXNpYmlsaXR5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRQcm9maWxlVmlzaWJpbGl0eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHB1dCBzZWxsaW5nIHN5c3RlbSBzZXR0aW5ncyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QdXRTZWxsaW5nU3lzdGVtU2V0dGluZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0U2VsbGluZ1N5c3RlbVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRTZWxsaW5nU3lzdGVtU2V0dGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWNhbGwgYmVuZWZpdCBhcHBsaWNhdGlvbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYmVuZWZpdHNfUmVjYWxsQmVuZWZpdEFwcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlY2FsbEJlbmVmaXRBcHBsaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVjYWxsQmVuZWZpdEFwcGxpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVqZWN0IGNoYW5uZWwgaGFuZHNoYWtlcyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9jaGFubmVsX1JlamVjdENoYW5uZWxIYW5kc2hha2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVqZWN0Q2hhbm5lbEhhbmRzaGFrZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVqZWN0Q2hhbm5lbEhhbmRzaGFrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlamVjdCBjb25uZWN0aW9uIGludml0YXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfUmVqZWN0Q29ubmVjdGlvbkludml0YXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVqZWN0Q29ubmVjdGlvbkludml0YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlamVjdENvbm5lY3Rpb25JbnZpdGF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVqZWN0IEVuZ2FnZW1lbnQgSW52aXRhdGlvbnMgb24gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVqZWN0RW5nYWdlbWVudEludml0YXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVqZWN0RW5nYWdlbWVudEludml0YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlamVjdEVuZ2FnZW1lbnRJbnZpdGF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VuZCBlbWFpbCB2ZXJpZmljYXRpb24gY29kZXMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9TZW5kRW1haWxWZXJpZmljYXRpb25Db2RlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlbmRFbWFpbFZlcmlmaWNhdGlvbkNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlbmRFbWFpbFZlcmlmaWNhdGlvbkNvZGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbml0aWF0ZSB0YXNrcyB0aGF0IHN0YXJ0IEVuZ2FnZW1lbnRzIG9uIEFXUyBQYXJ0bmVyIENlbnRyYWwgYnkgYWNjZXB0aW5nIGFuIEVuZ2FnZW1lbnQgSW52aXRhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRFbmdhZ2VtZW50QnlBY2NlcHRpbmdJbnZpdGF0aW9uVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydEVuZ2FnZW1lbnRCeUFjY2VwdGluZ0ludml0YXRpb25UYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEVuZ2FnZW1lbnRCeUFjY2VwdGluZ0ludml0YXRpb25UYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5pdGlhdGUgdGFza3MgdGhhdCBzdGFydCBFbmdhZ2VtZW50cyBmcm9tIE9wcG9ydHVuaXRpZXMgb24gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRFbmdhZ2VtZW50RnJvbU9wcG9ydHVuaXR5VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydEVuZ2FnZW1lbnRGcm9tT3Bwb3J0dW5pdHlUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEVuZ2FnZW1lbnRGcm9tT3Bwb3J0dW5pdHlUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5pdGlhdGUgdGFza3MgdGhhdCBzdGFydCBPcHBvcnR1bml0aWVzIGZyb20gRW5nYWdlbWVudHMgb24gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRPcHBvcnR1bml0eUZyb21FbmdhZ2VtZW50VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydE9wcG9ydHVuaXR5RnJvbUVuZ2FnZW1lbnRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydE9wcG9ydHVuaXR5RnJvbUVuZ2FnZW1lbnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgcHJvZmlsZSB1cGRhdGUgdGFza3MgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9TdGFydFByb2ZpbGVVcGRhdGVUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0UHJvZmlsZVVwZGF0ZVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0UHJvZmlsZVVwZGF0ZVRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbml0aWF0ZSB0YXNrcyB0aGF0IHN0YXJ0IHByb3NwZWN0aW5nIGZyb20gYW4gZW5nYWdlbWVudCBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydFByb3NwZWN0aW5nRnJvbUVuZ2FnZW1lbnRUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbml0aWF0ZSB0YXNrcyB0aGF0IHN0YXJ0IHF1YWxpZmljYXRpb25zIGFzc29jaWF0aW9uIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2FjY291bnRfU3RhcnRRdWFsaWZpY2F0aW9uc0Fzc29jaWF0aW9uVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFF1YWxpZmljYXRpb25zQXNzb2NpYXRpb25UYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFF1YWxpZmljYXRpb25zQXNzb2NpYXRpb25UYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5pdGlhdGUgdGFza3MgdGhhdCBzdGFydCBxdWFsaWZpY2F0aW9ucyBkaXNhc3NvY2lhdGlvbiBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X1N0YXJ0UXVhbGlmaWNhdGlvbnNEaXNhc3NvY2lhdGlvblRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRRdWFsaWZpY2F0aW9uc0Rpc2Fzc29jaWF0aW9uVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRRdWFsaWZpY2F0aW9uc0Rpc2Fzc29jaWF0aW9uVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0aW5nIHJlc291cmNlIHNuYXBzaG90IGpvYnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRSZXNvdXJjZVNuYXBzaG90Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0UmVzb3VyY2VTbmFwc2hvdEpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRSZXNvdXJjZVNuYXBzaG90Sm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5pdGlhdGUgdGFza3MgdGhhdCBtYW5hZ2UgcmV2ZW51ZSBhdHRyaWJ1dGlvbiBhbGxvY2F0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9wcm1fU3RhcnRSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9uc1Rhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9uc1Rhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0UmV2ZW51ZUF0dHJpYnV0aW9uQWxsb2NhdGlvbnNUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgdmVyaWZpY2F0aW9uIHByb2Nlc3NlcyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICogLSAuaWZWZXJpZmljYXRpb25UeXBlKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9hY2NvdW50X1N0YXJ0VmVyaWZpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0VmVyaWZpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFZlcmlmaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3BwaW5nIHJlc291cmNlIHNuYXBzaG90IGpvYnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RvcFJlc291cmNlU25hcHNob3RKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RvcFJlc291cmNlU25hcHNob3RKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0b3BSZXNvdXJjZVNuYXBzaG90Sm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3VibWl0IGJlbmVmaXQgYXBwbGljYXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2JlbmVmaXRzX1N1Ym1pdEJlbmVmaXRBcHBsaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdWJtaXRCZW5lZml0QXBwbGljYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N1Ym1pdEJlbmVmaXRBcHBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN1Ym1pdCBPcHBvcnR1bml0aWVzIG9uIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N1Ym1pdE9wcG9ydHVuaXR5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N1Ym1pdE9wcG9ydHVuaXR5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdWJtaXRPcHBvcnR1bml0eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCBuZXcgdGFncyB0byBhIHJlc291cmNlLiBTdXBwb3J0ZWQgcmVzb3VyY2U6IFJlc291cmNlU25hcHNob3RKb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1RhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSB0YWdzIGZyb20gYSByZXNvdXJjZS4gU3VwcG9ydGVkIHJlc291cmNlOiBSZXNvdXJjZVNuYXBzaG90Sm9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYmVuZWZpdCBhcHBsaWNhdGlvbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYmVuZWZpdHNfVXBkYXRlQmVuZWZpdEFwcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUJlbmVmaXRBcHBsaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQmVuZWZpdEFwcGxpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGNvbm5lY3Rpb24gcHJlZmVyZW5jZXMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfYWNjb3VudF9VcGRhdGVDb25uZWN0aW9uUHJlZmVyZW5jZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ29ubmVjdGlvblByZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVDb25uZWN0aW9uUHJlZmVyZW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgZW5nYWdlbWVudCBjb250ZXh0cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVFbmdhZ2VtZW50Q29udGV4dC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVFbmdhZ2VtZW50Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRW5nYWdlbWVudENvbnRleHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgbWFya2V0cGxhY2UgcmV2ZW51ZSBzaGFyZSBhbGxvY2F0aW9ucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9wcm1fVXBkYXRlTWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIE9wcG9ydHVuaXRpZXMgb24gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlT3Bwb3J0dW5pdHkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlT3Bwb3J0dW5pdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU9wcG9ydHVuaXR5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHByb2dyYW0gbWFuYWdlbWVudCBhY2NvdW50cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9jaGFubmVsX1VwZGF0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVQcm9ncmFtTWFuYWdlbWVudEFjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSByZWxhdGlvbnNoaXBzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2NoYW5uZWxfVXBkYXRlUmVsYXRpb25zaGlwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVJlbGF0aW9uc2hpcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUmVsYXRpb25zaGlwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHJldmVudWUgYXR0cmlidXRpb25zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX3BybV9VcGRhdGVSZXZlbnVlQXR0cmlidXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUmV2ZW51ZUF0dHJpYnV0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVSZXZlbnVlQXR0cmlidXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYnVzaW5lc3MgcGxhbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVCdXNpbmVzc1BsYW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUJ1c2luZXNzUGxhbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBjb2xsYWJvcmF0aW9uIGNoYW5uZWwgbWVtYmVycyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNvbGxhYm9yYXRpb25DaGFubmVsTWVtYmVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ29sbGFib3JhdGlvbkNoYW5uZWxNZW1iZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGNvbGxhYm9yYXRpb24gY2hhbm5lbCByZXF1ZXN0cyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNvbGxhYm9yYXRpb25DaGFubmVsUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ29sbGFib3JhdGlvbkNoYW5uZWxSZXF1ZXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5yb2xsIGluIHBhcnRuZXIgcGF0aHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9FbnJvbGxJblBhcnRuZXJQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbnJvbGxJblBhcnRuZXJQYXRoJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYnVzaW5lc3MgcGxhbiBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRCdXNpbmVzc1BsYW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEJ1c2luZXNzUGxhbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGNvbGxhYm9yYXRpb24gY2hhbm5lbCBkZXRhaWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb2xsYWJvcmF0aW9uQ2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29sbGFib3JhdGlvbkNoYW5uZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBwdWJsaWMgcGFydG5lciBwcm9maWxlIGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldFBhcnRuZXJQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRQYXJ0bmVyUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHByb2dyYW0gbWFuYWdlbWVudCBhY2NvdW50IGRldGFpbHMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZDYXRhbG9nKClcbiAgICovXG4gIHB1YmxpYyB0b0dldFByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UHJvZ3JhbU1hbmFnZW1lbnRBY2NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBidXNpbmVzcyBwbGFucyBpbiBBV1MgUGFydG5lciBDZW50cmFsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJ1c2luZXNzUGxhbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCdXNpbmVzc1BsYW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBjb2xsYWJvcmF0aW9uIGNoYW5uZWxzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q29sbGFib3JhdGlvbkNoYW5uZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29sbGFib3JhdGlvbkNoYW5uZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBwYXJ0bmVyIHBhdGhzIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UGFydG5lclBhdGhzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UGFydG5lclBhdGhzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGJ1c2luZXNzIHBsYW5zIGluIEFXUyBQYXJ0bmVyIENlbnRyYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvUHV0QnVzaW5lc3NQbGFuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRCdXNpbmVzc1BsYW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggcHVibGljIHBhcnRuZXIgcHJvZmlsZXMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaFBhcnRuZXJQcm9maWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoUGFydG5lclByb2ZpbGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXNlIFBhcnRuZXIgQ2VudHJhbCBBZ2VudHMgc2Vzc2lvbnMgaW4gQVdTIFBhcnRuZXIgQ2VudHJhbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ2F0YWxvZygpXG4gICAqL1xuICBwdWJsaWMgdG9Vc2VTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVc2VTZXNzaW9uJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgV3JpdGU6IFtcbiAgICAgICdBY2NlcHRDaGFubmVsSGFuZHNoYWtlJyxcbiAgICAgICdBY2NlcHRDb25uZWN0aW9uSW52aXRhdGlvbicsXG4gICAgICAnQWNjZXB0RW5nYWdlbWVudEludml0YXRpb24nLFxuICAgICAgJ0FtZW5kQmVuZWZpdEFwcGxpY2F0aW9uJyxcbiAgICAgICdBc3NpZ25PcHBvcnR1bml0eScsXG4gICAgICAnQXNzb2NpYXRlQXdzVHJhaW5pbmdDZXJ0aWZpY2F0aW9uRW1haWxEb21haW4nLFxuICAgICAgJ0Fzc29jaWF0ZUJlbmVmaXRBcHBsaWNhdGlvblJlc291cmNlJyxcbiAgICAgICdBc3NvY2lhdGVPcHBvcnR1bml0eScsXG4gICAgICAnQ2FuY2VsQmVuZWZpdEFwcGxpY2F0aW9uJyxcbiAgICAgICdDYW5jZWxDaGFubmVsSGFuZHNoYWtlJyxcbiAgICAgICdDYW5jZWxDb25uZWN0aW9uJyxcbiAgICAgICdDYW5jZWxDb25uZWN0aW9uSW52aXRhdGlvbicsXG4gICAgICAnQ2FuY2VsUHJvZmlsZVVwZGF0ZVRhc2snLFxuICAgICAgJ0NyZWF0ZUJlbmVmaXRBcHBsaWNhdGlvbicsXG4gICAgICAnQ3JlYXRlQ2hhbm5lbEhhbmRzaGFrZScsXG4gICAgICAnQ3JlYXRlQ29ubmVjdGlvbkludml0YXRpb24nLFxuICAgICAgJ0NyZWF0ZUVuZ2FnZW1lbnQnLFxuICAgICAgJ0NyZWF0ZUVuZ2FnZW1lbnRDb250ZXh0JyxcbiAgICAgICdDcmVhdGVFbmdhZ2VtZW50SW52aXRhdGlvbicsXG4gICAgICAnQ3JlYXRlTWFya2V0cGxhY2VSZXZlbnVlU2hhcmUnLFxuICAgICAgJ0NyZWF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbicsXG4gICAgICAnQ3JlYXRlT3Bwb3J0dW5pdHknLFxuICAgICAgJ0NyZWF0ZVBhcnRuZXInLFxuICAgICAgJ0NyZWF0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCcsXG4gICAgICAnQ3JlYXRlUmVsYXRpb25zaGlwJyxcbiAgICAgICdDcmVhdGVSZXNvdXJjZVNuYXBzaG90JyxcbiAgICAgICdDcmVhdGVSZXNvdXJjZVNuYXBzaG90Sm9iJyxcbiAgICAgICdDcmVhdGVSZXZlbnVlQXR0cmlidXRpb24nLFxuICAgICAgJ0RlbGV0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCcsXG4gICAgICAnRGVsZXRlUmVsYXRpb25zaGlwJyxcbiAgICAgICdEZWxldGVSZXNvdXJjZVNuYXBzaG90Sm9iJyxcbiAgICAgICdEaXNhc3NvY2lhdGVBd3NUcmFpbmluZ0NlcnRpZmljYXRpb25FbWFpbERvbWFpbicsXG4gICAgICAnRGlzYXNzb2NpYXRlQmVuZWZpdEFwcGxpY2F0aW9uUmVzb3VyY2UnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZU9wcG9ydHVuaXR5JyxcbiAgICAgICdQdXRBbGxpYW5jZUxlYWRDb250YWN0JyxcbiAgICAgICdQdXRQcm9maWxlVmlzaWJpbGl0eScsXG4gICAgICAnUHV0U2VsbGluZ1N5c3RlbVNldHRpbmdzJyxcbiAgICAgICdSZWNhbGxCZW5lZml0QXBwbGljYXRpb24nLFxuICAgICAgJ1JlamVjdENoYW5uZWxIYW5kc2hha2UnLFxuICAgICAgJ1JlamVjdENvbm5lY3Rpb25JbnZpdGF0aW9uJyxcbiAgICAgICdSZWplY3RFbmdhZ2VtZW50SW52aXRhdGlvbicsXG4gICAgICAnU2VuZEVtYWlsVmVyaWZpY2F0aW9uQ29kZScsXG4gICAgICAnU3RhcnRFbmdhZ2VtZW50QnlBY2NlcHRpbmdJbnZpdGF0aW9uVGFzaycsXG4gICAgICAnU3RhcnRFbmdhZ2VtZW50RnJvbU9wcG9ydHVuaXR5VGFzaycsXG4gICAgICAnU3RhcnRPcHBvcnR1bml0eUZyb21FbmdhZ2VtZW50VGFzaycsXG4gICAgICAnU3RhcnRQcm9maWxlVXBkYXRlVGFzaycsXG4gICAgICAnU3RhcnRQcm9zcGVjdGluZ0Zyb21FbmdhZ2VtZW50VGFzaycsXG4gICAgICAnU3RhcnRRdWFsaWZpY2F0aW9uc0Fzc29jaWF0aW9uVGFzaycsXG4gICAgICAnU3RhcnRRdWFsaWZpY2F0aW9uc0Rpc2Fzc29jaWF0aW9uVGFzaycsXG4gICAgICAnU3RhcnRSZXNvdXJjZVNuYXBzaG90Sm9iJyxcbiAgICAgICdTdGFydFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb25zVGFzaycsXG4gICAgICAnU3RhcnRWZXJpZmljYXRpb24nLFxuICAgICAgJ1N0b3BSZXNvdXJjZVNuYXBzaG90Sm9iJyxcbiAgICAgICdTdWJtaXRCZW5lZml0QXBwbGljYXRpb24nLFxuICAgICAgJ1N1Ym1pdE9wcG9ydHVuaXR5JyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlQmVuZWZpdEFwcGxpY2F0aW9uJyxcbiAgICAgICdVcGRhdGVDb25uZWN0aW9uUHJlZmVyZW5jZXMnLFxuICAgICAgJ1VwZGF0ZUVuZ2FnZW1lbnRDb250ZXh0JyxcbiAgICAgICdVcGRhdGVNYXJrZXRwbGFjZVJldmVudWVTaGFyZUFsbG9jYXRpb24nLFxuICAgICAgJ1VwZGF0ZU9wcG9ydHVuaXR5JyxcbiAgICAgICdVcGRhdGVQcm9ncmFtTWFuYWdlbWVudEFjY291bnQnLFxuICAgICAgJ1VwZGF0ZVJlbGF0aW9uc2hpcCcsXG4gICAgICAnVXBkYXRlUmV2ZW51ZUF0dHJpYnV0aW9uJyxcbiAgICAgICdDcmVhdGVCdXNpbmVzc1BsYW4nLFxuICAgICAgJ0NyZWF0ZUNvbGxhYm9yYXRpb25DaGFubmVsTWVtYmVycycsXG4gICAgICAnQ3JlYXRlQ29sbGFib3JhdGlvbkNoYW5uZWxSZXF1ZXN0JyxcbiAgICAgICdFbnJvbGxJblBhcnRuZXJQYXRoJyxcbiAgICAgICdQdXRCdXNpbmVzc1BsYW4nLFxuICAgICAgJ1VzZVNlc3Npb24nXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnR2V0QWxsaWFuY2VMZWFkQ29udGFjdCcsXG4gICAgICAnR2V0QXdzT3Bwb3J0dW5pdHlTdW1tYXJ5JyxcbiAgICAgICdHZXRCZW5lZml0JyxcbiAgICAgICdHZXRCZW5lZml0QWxsb2NhdGlvbicsXG4gICAgICAnR2V0QmVuZWZpdEFwcGxpY2F0aW9uJyxcbiAgICAgICdHZXRDb25uZWN0aW9uJyxcbiAgICAgICdHZXRDb25uZWN0aW9uSW52aXRhdGlvbicsXG4gICAgICAnR2V0Q29ubmVjdGlvblByZWZlcmVuY2VzJyxcbiAgICAgICdHZXRFbmdhZ2VtZW50JyxcbiAgICAgICdHZXRFbmdhZ2VtZW50SW52aXRhdGlvbicsXG4gICAgICAnR2V0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmUnLFxuICAgICAgJ0dldE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbicsXG4gICAgICAnR2V0T3Bwb3J0dW5pdHknLFxuICAgICAgJ0dldFBhcnRuZXInLFxuICAgICAgJ0dldFBhcnRuZXJEYXNoYm9hcmQnLFxuICAgICAgJ0dldFByb2ZpbGVVcGRhdGVUYXNrJyxcbiAgICAgICdHZXRQcm9maWxlVmlzaWJpbGl0eScsXG4gICAgICAnR2V0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2snLFxuICAgICAgJ0dldFF1YWxpZmljYXRpb25zQXNzb2NpYXRpb25EZXRhaWxzJyxcbiAgICAgICdHZXRRdWFsaWZpY2F0aW9uc0Fzc29jaWF0aW9uVGFzaycsXG4gICAgICAnR2V0UXVhbGlmaWNhdGlvbnNEaXNhc3NvY2lhdGlvblRhc2snLFxuICAgICAgJ0dldFJlbGF0aW9uc2hpcCcsXG4gICAgICAnR2V0UmVzb3VyY2VTbmFwc2hvdCcsXG4gICAgICAnR2V0UmVzb3VyY2VTbmFwc2hvdEpvYicsXG4gICAgICAnR2V0UmV2ZW51ZUF0dHJpYnV0aW9uJyxcbiAgICAgICdHZXRSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9uJyxcbiAgICAgICdHZXRSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9uc1Rhc2snLFxuICAgICAgJ0dldFNlbGxpbmdTeXN0ZW1TZXR0aW5ncycsXG4gICAgICAnR2V0VmVyaWZpY2F0aW9uJyxcbiAgICAgICdMaXN0RW5nYWdlbWVudE1lbWJlcnMnLFxuICAgICAgJ0xpc3RFbmdhZ2VtZW50UmVzb3VyY2VBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0xpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgJ0dldEJ1c2luZXNzUGxhbicsXG4gICAgICAnR2V0Q29sbGFib3JhdGlvbkNoYW5uZWwnLFxuICAgICAgJ0dldFBhcnRuZXJQcm9maWxlJyxcbiAgICAgICdHZXRQcm9ncmFtTWFuYWdlbWVudEFjY291bnQnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEJlbmVmaXRBbGxvY2F0aW9ucycsXG4gICAgICAnTGlzdEJlbmVmaXRBcHBsaWNhdGlvbnMnLFxuICAgICAgJ0xpc3RCZW5lZml0cycsXG4gICAgICAnTGlzdENoYW5uZWxIYW5kc2hha2VzJyxcbiAgICAgICdMaXN0Q29ubmVjdGlvbkludml0YXRpb25zJyxcbiAgICAgICdMaXN0Q29ubmVjdGlvbnMnLFxuICAgICAgJ0xpc3RFbmdhZ2VtZW50QnlBY2NlcHRpbmdJbnZpdGF0aW9uVGFza3MnLFxuICAgICAgJ0xpc3RFbmdhZ2VtZW50RnJvbU9wcG9ydHVuaXR5VGFza3MnLFxuICAgICAgJ0xpc3RFbmdhZ2VtZW50SW52aXRhdGlvbnMnLFxuICAgICAgJ0xpc3RFbmdhZ2VtZW50cycsXG4gICAgICAnTGlzdE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbnMnLFxuICAgICAgJ0xpc3RNYXJrZXRwbGFjZVJldmVudWVTaGFyZXMnLFxuICAgICAgJ0xpc3RPcHBvcnR1bml0aWVzJyxcbiAgICAgICdMaXN0T3Bwb3J0dW5pdHlGcm9tRW5nYWdlbWVudFRhc2tzJyxcbiAgICAgICdMaXN0UGFydG5lcnMnLFxuICAgICAgJ0xpc3RQcm9ncmFtTWFuYWdlbWVudEFjY291bnRzJyxcbiAgICAgICdMaXN0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2tzJyxcbiAgICAgICdMaXN0UmVsYXRpb25zaGlwcycsXG4gICAgICAnTGlzdFJlc291cmNlU25hcHNob3RKb2JzJyxcbiAgICAgICdMaXN0UmVzb3VyY2VTbmFwc2hvdHMnLFxuICAgICAgJ0xpc3RSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9ucycsXG4gICAgICAnTGlzdFJldmVudWVBdHRyaWJ1dGlvbnMnLFxuICAgICAgJ0xpc3RTb2x1dGlvbnMnLFxuICAgICAgJ0xpc3RCdXNpbmVzc1BsYW5zJyxcbiAgICAgICdMaXN0Q29sbGFib3JhdGlvbkNoYW5uZWxzJyxcbiAgICAgICdMaXN0UGFydG5lclBhdGhzJyxcbiAgICAgICdTZWFyY2hQYXJ0bmVyUHJvZmlsZXMnXG4gICAgXSxcbiAgICBUYWdnaW5nOiBbXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBCZW5lZml0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL3VzaW5nLXRoZS1iZW5lZml0cy1hcGkuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2F0YWxvZyAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXRhbG9nLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIElkZW50aWZpZXIgZm9yIHRoZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25CZW5lZml0KGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vYmVuZWZpdC8keyBpZGVudGlmaWVyIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBCZW5lZml0QWxsb2NhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtYmVuZWZpdC1hbGxvY2F0aW9ucy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gSWRlbnRpZmllciBmb3IgdGhlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uQmVuZWZpdEFsbG9jYXRpb24oY2F0YWxvZzogc3RyaW5nLCBpZGVudGlmaWVyOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cGFydG5lcmNlbnRyYWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNhdGFsb2cvJHsgY2F0YWxvZyB9L2JlbmVmaXQtYWxsb2NhdGlvbi8keyBpZGVudGlmaWVyIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBCZW5lZml0QXBwbGljYXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2Uvd29ya2luZy13aXRoLWJlbmVmaXQtYXBwbGljYXRpb25zLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGNhdGFsb2cgLSBJZGVudGlmaWVyIGZvciB0aGUgY2F0YWxvZy5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBJZGVudGlmaWVyIGZvciB0aGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQmVuZWZpdEFwcGxpY2F0aW9uKGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjYXRhbG9nLyR7IGNhdGFsb2cgfS9iZW5lZml0LWFwcGxpY2F0aW9uLyR7IGlkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIENoYW5uZWxIYW5kc2hha2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2Uvd29ya2luZy13aXRoLWNoYW5uZWwtbWFuYWdlbWVudC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gSWRlbnRpZmllciBmb3IgdGhlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkNoYW5uZWxIYW5kc2hha2UoY2F0YWxvZzogc3RyaW5nLCBpZGVudGlmaWVyOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cGFydG5lcmNlbnRyYWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNhdGFsb2cvJHsgY2F0YWxvZyB9L2NoYW5uZWwtaGFuZHNoYWtlLyR7IGlkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIENvbm5lY3Rpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2Uvd29ya2luZy13aXRoLWFjY291bnQtY29ubmVjdGlvbnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2F0YWxvZyAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXRhbG9nLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIElkZW50aWZpZXIgZm9yIHRoZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25Db25uZWN0aW9uKGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vY29ubmVjdGlvbi8keyBpZGVudGlmaWVyIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBDb25uZWN0aW9uSW52aXRhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtYWNjb3VudC1jb25uZWN0aW9ucy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gSWRlbnRpZmllciBmb3IgdGhlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkNvbm5lY3Rpb25JbnZpdGF0aW9uKGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vY29ubmVjdGlvbi1pbnZpdGF0aW9uLyR7IGlkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIENvbm5lY3Rpb25QcmVmZXJlbmNlcyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtYWNjb3VudC1jb25uZWN0aW9ucy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uQ29ubmVjdGlvblByZWZlcmVuY2VzKGNhdGFsb2c6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXJ0bmVyY2VudHJhbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y2F0YWxvZy8keyBjYXRhbG9nIH0vY29ubmVjdGlvbi1wcmVmZXJlbmNlc2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIERhc2hib2FyZCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9wYXJ0bmVyLWFuYWx5dGljcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSB0YWJsZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHRhYmxlSWQuXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBkYXNoYm9hcmRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uRGFzaGJvYXJkKGNhdGFsb2c6IHN0cmluZywgdGFibGVJZDogc3RyaW5nLCBkYXNoYm9hcmRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXJ0bmVyY2VudHJhbDo6JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y2F0YWxvZy8keyBjYXRhbG9nIH0vUmVwb3J0aW5nRGF0YS8keyB0YWJsZUlkIH0vRGFzaGJvYXJkLyR7IGRhc2hib2FyZElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBFbmdhZ2VtZW50IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL3dvcmtpbmctd2l0aC1tdWx0aS1wYXJ0bmVyLW9wcG9ydHVuaXRpZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2F0YWxvZyAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXRhbG9nLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIElkZW50aWZpZXIgZm9yIHRoZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25FbmdhZ2VtZW50KGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vZW5nYWdlbWVudC8keyBpZGVudGlmaWVyIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBNYXJrZXRwbGFjZVJldmVudWVTaGFyZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtbWFya2V0cGxhY2UtcmV2ZW51ZS1zaGFyZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSBtYXJrZXRwbGFjZVByb2R1Y3RJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBtYXJrZXRwbGFjZVByb2R1Y3RJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTWFya2V0cGxhY2VSZXZlbnVlU2hhcmUoY2F0YWxvZzogc3RyaW5nLCBtYXJrZXRwbGFjZVByb2R1Y3RJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjYXRhbG9nLyR7IGNhdGFsb2cgfS9tYXJrZXRwbGFjZS1yZXZlbnVlLXNoYXJlLyR7IG1hcmtldHBsYWNlUHJvZHVjdElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBPcHBvcnR1bml0eSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgteW91ci1vcHBvcnR1bml0aWVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGNhdGFsb2cgLSBJZGVudGlmaWVyIGZvciB0aGUgY2F0YWxvZy5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBJZGVudGlmaWVyIGZvciB0aGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uT3Bwb3J0dW5pdHkoY2F0YWxvZzogc3RyaW5nLCBpZGVudGlmaWVyOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cGFydG5lcmNlbnRyYWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNhdGFsb2cvJHsgY2F0YWxvZyB9L29wcG9ydHVuaXR5LyR7IGlkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIE9wcG9ydHVuaXR5RnJvbUVuZ2FnZW1lbnRUYXNrIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL3dvcmtpbmctd2l0aC1tdWx0aS1wYXJ0bmVyLW9wcG9ydHVuaXRpZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2F0YWxvZyAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXRhbG9nLlxuICAgKiBAcGFyYW0gdGFza0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIHRhc2tJZC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uT3Bwb3J0dW5pdHlGcm9tRW5nYWdlbWVudFRhc2soY2F0YWxvZzogc3RyaW5nLCB0YXNrSWQ6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXJ0bmVyY2VudHJhbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06OmNhdGFsb2cvJHsgY2F0YWxvZyB9L29wcG9ydHVuaXR5LWZyb20tZW5nYWdlbWVudC10YXNrLyR7IHRhc2tJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgUGFydG5lciB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtcGFydG5lci1yZWdpc3RyYXRpb24uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2F0YWxvZyAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXRhbG9nLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIElkZW50aWZpZXIgZm9yIHRoZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25QYXJ0bmVyKGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjYXRhbG9nLyR7IGNhdGFsb2cgfS9wYXJ0bmVyLyR7IGlkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIFByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtY2hhbm5lbC1tYW5hZ2VtZW50Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGNhdGFsb2cgLSBJZGVudGlmaWVyIGZvciB0aGUgY2F0YWxvZy5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBJZGVudGlmaWVyIGZvciB0aGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUHJvZ3JhbU1hbmFnZW1lbnRBY2NvdW50KGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjYXRhbG9nLyR7IGNhdGFsb2cgfS9wcm9ncmFtLW1hbmFnZW1lbnQtYWNjb3VudC8keyBpZGVudGlmaWVyIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBQcm9zcGVjdGluZ0Zyb21FbmdhZ2VtZW50VGFzayB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgteW91ci1sZWFkcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSB0YXNrSWRlbnRpZmllciAtIElkZW50aWZpZXIgZm9yIHRoZSB0YXNrSWRlbnRpZmllci5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uUHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2soY2F0YWxvZzogc3RyaW5nLCB0YXNrSWRlbnRpZmllcjogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vcHJvc3BlY3RpbmctZnJvbS1lbmdhZ2VtZW50LXRhc2svJHsgdGFza0lkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIFJlbGF0aW9uc2hpcCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtY2hhbm5lbC1tYW5hZ2VtZW50Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGNhdGFsb2cgLSBJZGVudGlmaWVyIGZvciB0aGUgY2F0YWxvZy5cbiAgICogQHBhcmFtIHByb2dyYW1NYW5hZ2VtZW50QWNjb3VudElkIC0gSWRlbnRpZmllciBmb3IgdGhlIHByb2dyYW1NYW5hZ2VtZW50QWNjb3VudElkLlxuICAgKiBAcGFyYW0gcmVsYXRpb25zaGlwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVsYXRpb25zaGlwSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblJlbGF0aW9uc2hpcChjYXRhbG9nOiBzdHJpbmcsIHByb2dyYW1NYW5hZ2VtZW50QWNjb3VudElkOiBzdHJpbmcsIHJlbGF0aW9uc2hpcElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cGFydG5lcmNlbnRyYWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNhdGFsb2cvJHsgY2F0YWxvZyB9L3Byb2dyYW0tbWFuYWdlbWVudC1hY2NvdW50LyR7IHByb2dyYW1NYW5hZ2VtZW50QWNjb3VudElkIH0vcmVsYXRpb25zaGlwLyR7IHJlbGF0aW9uc2hpcElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBSZXNvdXJjZVNuYXBzaG90IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvQVBJUmVmZXJlbmNlL3dvcmtpbmctd2l0aC1tdWx0aS1wYXJ0bmVyLW9wcG9ydHVuaXRpZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2F0YWxvZyAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXRhbG9nLlxuICAgKiBAcGFyYW0gZW5nYWdlbWVudElkZW50aWZpZXIgLSBJZGVudGlmaWVyIGZvciB0aGUgZW5nYWdlbWVudElkZW50aWZpZXIuXG4gICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VUeXBlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZGVudGlmaWVyIC0gSWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlSWRlbnRpZmllci5cbiAgICogQHBhcmFtIHRlbXBsYXRlSWRlbnRpZmllciAtIElkZW50aWZpZXIgZm9yIHRoZSB0ZW1wbGF0ZUlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBzbmFwc2hvdFJldmlzaW9uIC0gSWRlbnRpZmllciBmb3IgdGhlIHNuYXBzaG90UmV2aXNpb24uXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uUmVzb3VyY2VTbmFwc2hvdChjYXRhbG9nOiBzdHJpbmcsIGVuZ2FnZW1lbnRJZGVudGlmaWVyOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nLCByZXNvdXJjZUlkZW50aWZpZXI6IHN0cmluZywgdGVtcGxhdGVJZGVudGlmaWVyOiBzdHJpbmcsIHNuYXBzaG90UmV2aXNpb246IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXJ0bmVyY2VudHJhbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y2F0YWxvZy8keyBjYXRhbG9nIH0vZW5nYWdlbWVudC8keyBlbmdhZ2VtZW50SWRlbnRpZmllciB9L3Jlc291cmNlLyR7IHJlc291cmNlVHlwZSB9LyR7IHJlc291cmNlSWRlbnRpZmllciB9L3RlbXBsYXRlLyR7IHRlbXBsYXRlSWRlbnRpZmllciB9L3Jlc291cmNlLXNuYXBzaG90LyR7IHNuYXBzaG90UmV2aXNpb24gfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIFJldmVudWVBdHRyaWJ1dGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtcmV2ZW51ZS1hdHRyaWJ1dGlvbi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSByZXZlbnVlQXR0cmlidXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZXZlbnVlQXR0cmlidXRpb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUmV2ZW51ZUF0dHJpYnV0aW9uKGNhdGFsb2c6IHN0cmluZywgcmV2ZW51ZUF0dHJpYnV0aW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXJ0bmVyY2VudHJhbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y2F0YWxvZy8keyBjYXRhbG9nIH0vcmV2ZW51ZS1hdHRyaWJ1dGlvbi8keyByZXZlbnVlQXR0cmlidXRpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgU29sdXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTb2x1dGlvbnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2F0YWxvZyAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXRhbG9nLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIElkZW50aWZpZXIgZm9yIHRoZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvblNvbHV0aW9uKGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjYXRhbG9nLyR7IGNhdGFsb2cgfS9zb2x1dGlvbi8keyBpZGVudGlmaWVyIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBlbmdhZ2VtZW50LWJ5LWFjY2VwdGluZy1pbnZpdGF0aW9uLXRhc2sgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2Uvd29ya2luZy13aXRoLW11bHRpLXBhcnRuZXItb3Bwb3J0dW5pdGllcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSB0YXNrSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdGFza0lkLlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25FbmdhZ2VtZW50QnlBY2NlcHRpbmdJbnZpdGF0aW9uVGFzayhjYXRhbG9nOiBzdHJpbmcsIHRhc2tJZDogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vZW5nYWdlbWVudC1ieS1hY2NlcHRpbmctaW52aXRhdGlvbi10YXNrLyR7IHRhc2tJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZW5nYWdlbWVudC1mcm9tLW9wcG9ydHVuaXR5LXRhc2sgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2Uvd29ya2luZy13aXRoLW11bHRpLXBhcnRuZXItb3Bwb3J0dW5pdGllcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSB0YXNrSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdGFza0lkLlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25FbmdhZ2VtZW50RnJvbU9wcG9ydHVuaXR5VGFzayhjYXRhbG9nOiBzdHJpbmcsIHRhc2tJZDogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vZW5nYWdlbWVudC1mcm9tLW9wcG9ydHVuaXR5LXRhc2svJHsgdGFza0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBlbmdhZ2VtZW50LWludml0YXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGFydG5lci1jZW50cmFsL2xhdGVzdC9BUElSZWZlcmVuY2Uvd29ya2luZy13aXRoLW11bHRpLXBhcnRuZXItb3Bwb3J0dW5pdGllcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjYXRhbG9nIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhdGFsb2cuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gSWRlbnRpZmllciBmb3IgdGhlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkVuZ2FnZW1lbnRJbnZpdGF0aW9uKGNhdGFsb2c6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnBhcnRuZXJjZW50cmFsOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6Y2F0YWxvZy8keyBjYXRhbG9nIH0vZW5nYWdlbWVudC1pbnZpdGF0aW9uLyR7IGlkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHJlc291cmNlLXNuYXBzaG90LWpvYiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS93b3JraW5nLXdpdGgtbXVsdGktcGFydG5lci1vcHBvcnR1bml0aWVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGNhdGFsb2cgLSBJZGVudGlmaWVyIGZvciB0aGUgY2F0YWxvZy5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBJZGVudGlmaWVyIGZvciB0aGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUmVzb3VyY2VTbmFwc2hvdEpvYihjYXRhbG9nOiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXJ0bmVyY2VudHJhbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y2F0YWxvZy8keyBjYXRhbG9nIH0vcmVzb3VyY2Utc25hcHNob3Qtam9iLyR7IGlkZW50aWZpZXIgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIHRoYXQgYXJlIHBhc3NlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9DcmVhdGVDaGFubmVsSGFuZHNoYWtlKClcbiAgICogLSAudG9DcmVhdGVNYXJrZXRwbGFjZVJldmVudWVTaGFyZSgpXG4gICAqIC0gLnRvQ3JlYXRlT3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b0NyZWF0ZVBhcnRuZXIoKVxuICAgKiAtIC50b0NyZWF0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVsYXRpb25zaGlwKClcbiAgICogLSAudG9DcmVhdGVSZXNvdXJjZVNuYXBzaG90Sm9iKClcbiAgICogLSAudG9DcmVhdGVSZXZlbnVlQXR0cmlidXRpb24oKVxuICAgKiAtIC50b1N0YXJ0RW5nYWdlbWVudEJ5QWNjZXB0aW5nSW52aXRhdGlvblRhc2soKVxuICAgKiAtIC50b1N0YXJ0RW5nYWdlbWVudEZyb21PcHBvcnR1bml0eVRhc2soKVxuICAgKiAtIC50b1N0YXJ0T3Bwb3J0dW5pdHlGcm9tRW5nYWdlbWVudFRhc2soKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1JlcXVlc3RUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVxdWVzdFRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRDaGFubmVsSGFuZHNoYWtlKClcbiAgICogLSAudG9BbWVuZEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvQXNzaWduT3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUF3c1RyYWluaW5nQ2VydGlmaWNhdGlvbkVtYWlsRG9tYWluKClcbiAgICogLSAudG9Bc3NvY2lhdGVCZW5lZml0QXBwbGljYXRpb25SZXNvdXJjZSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlT3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b0NhbmNlbEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvQ2FuY2VsQ2hhbm5lbEhhbmRzaGFrZSgpXG4gICAqIC0gLnRvQ2FuY2VsUHJvZmlsZVVwZGF0ZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZUJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2hhbm5lbEhhbmRzaGFrZSgpXG4gICAqIC0gLnRvQ3JlYXRlTWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9uKClcbiAgICogLSAudG9DcmVhdGVPcHBvcnR1bml0eSgpXG4gICAqIC0gLnRvQ3JlYXRlUGFydG5lcigpXG4gICAqIC0gLnRvQ3JlYXRlUHJvZ3JhbU1hbmFnZW1lbnRBY2NvdW50KClcbiAgICogLSAudG9DcmVhdGVSZWxhdGlvbnNoaXAoKVxuICAgKiAtIC50b0NyZWF0ZVJlc291cmNlU25hcHNob3RKb2IoKVxuICAgKiAtIC50b0RlbGV0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpXG4gICAqIC0gLnRvRGVsZXRlUmVsYXRpb25zaGlwKClcbiAgICogLSAudG9EZWxldGVSZXNvdXJjZVNuYXBzaG90Sm9iKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVBd3NUcmFpbmluZ0NlcnRpZmljYXRpb25FbWFpbERvbWFpbigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQmVuZWZpdEFwcGxpY2F0aW9uUmVzb3VyY2UoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU9wcG9ydHVuaXR5KClcbiAgICogLSAudG9HZXRBbGxpYW5jZUxlYWRDb250YWN0KClcbiAgICogLSAudG9HZXRBd3NPcHBvcnR1bml0eVN1bW1hcnkoKVxuICAgKiAtIC50b0dldEJlbmVmaXQoKVxuICAgKiAtIC50b0dldEJlbmVmaXRBbGxvY2F0aW9uKClcbiAgICogLSAudG9HZXRCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b0dldE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlKClcbiAgICogLSAudG9HZXRNYXJrZXRwbGFjZVJldmVudWVTaGFyZUFsbG9jYXRpb24oKVxuICAgKiAtIC50b0dldE9wcG9ydHVuaXR5KClcbiAgICogLSAudG9HZXRQYXJ0bmVyKClcbiAgICogLSAudG9HZXRQcm9maWxlVXBkYXRlVGFzaygpXG4gICAqIC0gLnRvR2V0UHJvZmlsZVZpc2liaWxpdHkoKVxuICAgKiAtIC50b0dldFF1YWxpZmljYXRpb25zQXNzb2NpYXRpb25EZXRhaWxzKClcbiAgICogLSAudG9HZXRRdWFsaWZpY2F0aW9uc0Fzc29jaWF0aW9uVGFzaygpXG4gICAqIC0gLnRvR2V0UXVhbGlmaWNhdGlvbnNEaXNhc3NvY2lhdGlvblRhc2soKVxuICAgKiAtIC50b0dldFJlbGF0aW9uc2hpcCgpXG4gICAqIC0gLnRvR2V0UmVzb3VyY2VTbmFwc2hvdEpvYigpXG4gICAqIC0gLnRvR2V0UmV2ZW51ZUF0dHJpYnV0aW9uKClcbiAgICogLSAudG9HZXRSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9uKClcbiAgICogLSAudG9HZXRSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9uc1Rhc2soKVxuICAgKiAtIC50b0xpc3RCZW5lZml0QXBwbGljYXRpb25zKClcbiAgICogLSAudG9MaXN0Q2hhbm5lbEhhbmRzaGFrZXMoKVxuICAgKiAtIC50b0xpc3RNYXJrZXRwbGFjZVJldmVudWVTaGFyZUFsbG9jYXRpb25zKClcbiAgICogLSAudG9MaXN0UHJvZ3JhbU1hbmFnZW1lbnRBY2NvdW50cygpXG4gICAqIC0gLnRvTGlzdFJlbGF0aW9uc2hpcHMoKVxuICAgKiAtIC50b0xpc3RSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9ucygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0QWxsaWFuY2VMZWFkQ29udGFjdCgpXG4gICAqIC0gLnRvUHV0UHJvZmlsZVZpc2liaWxpdHkoKVxuICAgKiAtIC50b1JlY2FsbEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvUmVqZWN0Q2hhbm5lbEhhbmRzaGFrZSgpXG4gICAqIC0gLnRvU3RhcnRFbmdhZ2VtZW50QnlBY2NlcHRpbmdJbnZpdGF0aW9uVGFzaygpXG4gICAqIC0gLnRvU3RhcnRFbmdhZ2VtZW50RnJvbU9wcG9ydHVuaXR5VGFzaygpXG4gICAqIC0gLnRvU3RhcnRPcHBvcnR1bml0eUZyb21FbmdhZ2VtZW50VGFzaygpXG4gICAqIC0gLnRvU3RhcnRQcm9maWxlVXBkYXRlVGFzaygpXG4gICAqIC0gLnRvU3RhcnRRdWFsaWZpY2F0aW9uc0Fzc29jaWF0aW9uVGFzaygpXG4gICAqIC0gLnRvU3RhcnRRdWFsaWZpY2F0aW9uc0Rpc2Fzc29jaWF0aW9uVGFzaygpXG4gICAqIC0gLnRvU3RhcnRSZXNvdXJjZVNuYXBzaG90Sm9iKClcbiAgICogLSAudG9TdGFydFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb25zVGFzaygpXG4gICAqIC0gLnRvU3RvcFJlc291cmNlU25hcHNob3RKb2IoKVxuICAgKiAtIC50b1N1Ym1pdEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvU3VibWl0T3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlT3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b1VwZGF0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpXG4gICAqIC0gLnRvVXBkYXRlUmVsYXRpb25zaGlwKClcbiAgICogLSAudG9VcGRhdGVSZXZlbnVlQXR0cmlidXRpb24oKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIEJlbmVmaXRBcHBsaWNhdGlvblxuICAgKiAtIENoYW5uZWxIYW5kc2hha2VcbiAgICogLSBNYXJrZXRwbGFjZVJldmVudWVTaGFyZVxuICAgKiAtIE9wcG9ydHVuaXR5XG4gICAqIC0gUGFydG5lclxuICAgKiAtIFByb2dyYW1NYW5hZ2VtZW50QWNjb3VudFxuICAgKiAtIFJlbGF0aW9uc2hpcFxuICAgKiAtIFJldmVudWVBdHRyaWJ1dGlvblxuICAgKiAtIHJlc291cmNlLXNuYXBzaG90LWpvYlxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFnIGtleXMgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy10YWdrZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNoYW5uZWxIYW5kc2hha2UoKVxuICAgKiAtIC50b0NyZWF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlKClcbiAgICogLSAudG9DcmVhdGVPcHBvcnR1bml0eSgpXG4gICAqIC0gLnRvQ3JlYXRlUGFydG5lcigpXG4gICAqIC0gLnRvQ3JlYXRlUHJvZ3JhbU1hbmFnZW1lbnRBY2NvdW50KClcbiAgICogLSAudG9DcmVhdGVSZWxhdGlvbnNoaXAoKVxuICAgKiAtIC50b0NyZWF0ZVJlc291cmNlU25hcHNob3RKb2IoKVxuICAgKiAtIC50b0NyZWF0ZVJldmVudWVBdHRyaWJ1dGlvbigpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvU3RhcnRFbmdhZ2VtZW50QnlBY2NlcHRpbmdJbnZpdGF0aW9uVGFzaygpXG4gICAqIC0gLnRvU3RhcnRFbmdhZ2VtZW50RnJvbU9wcG9ydHVuaXR5VGFzaygpXG4gICAqIC0gLnRvU3RhcnRPcHBvcnR1bml0eUZyb21FbmdhZ2VtZW50VGFzaygpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSBzcGVjaWZpYyBDYXRhbG9nXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9jb250cm9sbGluZy1hY2Nlc3MtaW4tYXdzLXBhcnRuZXItY2VudHJhbC5odG1sI2NvbmRpdGlvbi1rZXlzLWZvci1hd3MtcGFydG5lci1jZW50cmFsXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRDaGFubmVsSGFuZHNoYWtlKClcbiAgICogLSAudG9BY2NlcHRDb25uZWN0aW9uSW52aXRhdGlvbigpXG4gICAqIC0gLnRvQWNjZXB0RW5nYWdlbWVudEludml0YXRpb24oKVxuICAgKiAtIC50b0FtZW5kQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9Bc3NpZ25PcHBvcnR1bml0eSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlQXdzVHJhaW5pbmdDZXJ0aWZpY2F0aW9uRW1haWxEb21haW4oKVxuICAgKiAtIC50b0Fzc29jaWF0ZUJlbmVmaXRBcHBsaWNhdGlvblJlc291cmNlKClcbiAgICogLSAudG9Bc3NvY2lhdGVPcHBvcnR1bml0eSgpXG4gICAqIC0gLnRvQ2FuY2VsQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9DYW5jZWxDaGFubmVsSGFuZHNoYWtlKClcbiAgICogLSAudG9DYW5jZWxDb25uZWN0aW9uKClcbiAgICogLSAudG9DYW5jZWxDb25uZWN0aW9uSW52aXRhdGlvbigpXG4gICAqIC0gLnRvQ2FuY2VsUHJvZmlsZVVwZGF0ZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZUJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2hhbm5lbEhhbmRzaGFrZSgpXG4gICAqIC0gLnRvQ3JlYXRlQ29ubmVjdGlvbkludml0YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUVuZ2FnZW1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZUVuZ2FnZW1lbnRDb250ZXh0KClcbiAgICogLSAudG9DcmVhdGVFbmdhZ2VtZW50SW52aXRhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTWFya2V0cGxhY2VSZXZlbnVlU2hhcmUoKVxuICAgKiAtIC50b0NyZWF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlT3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b0NyZWF0ZVBhcnRuZXIoKVxuICAgKiAtIC50b0NyZWF0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVsYXRpb25zaGlwKClcbiAgICogLSAudG9DcmVhdGVSZXNvdXJjZVNuYXBzaG90KClcbiAgICogLSAudG9DcmVhdGVSZXNvdXJjZVNuYXBzaG90Sm9iKClcbiAgICogLSAudG9DcmVhdGVSZXZlbnVlQXR0cmlidXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpXG4gICAqIC0gLnRvRGVsZXRlUmVsYXRpb25zaGlwKClcbiAgICogLSAudG9EZWxldGVSZXNvdXJjZVNuYXBzaG90Sm9iKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVBd3NUcmFpbmluZ0NlcnRpZmljYXRpb25FbWFpbERvbWFpbigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQmVuZWZpdEFwcGxpY2F0aW9uUmVzb3VyY2UoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU9wcG9ydHVuaXR5KClcbiAgICogLSAudG9HZXRBbGxpYW5jZUxlYWRDb250YWN0KClcbiAgICogLSAudG9HZXRBd3NPcHBvcnR1bml0eVN1bW1hcnkoKVxuICAgKiAtIC50b0dldEJlbmVmaXQoKVxuICAgKiAtIC50b0dldEJlbmVmaXRBbGxvY2F0aW9uKClcbiAgICogLSAudG9HZXRCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b0dldENvbm5lY3Rpb24oKVxuICAgKiAtIC50b0dldENvbm5lY3Rpb25JbnZpdGF0aW9uKClcbiAgICogLSAudG9HZXRDb25uZWN0aW9uUHJlZmVyZW5jZXMoKVxuICAgKiAtIC50b0dldEVuZ2FnZW1lbnQoKVxuICAgKiAtIC50b0dldEVuZ2FnZW1lbnRJbnZpdGF0aW9uKClcbiAgICogLSAudG9HZXRNYXJrZXRwbGFjZVJldmVudWVTaGFyZSgpXG4gICAqIC0gLnRvR2V0TWFya2V0cGxhY2VSZXZlbnVlU2hhcmVBbGxvY2F0aW9uKClcbiAgICogLSAudG9HZXRPcHBvcnR1bml0eSgpXG4gICAqIC0gLnRvR2V0UGFydG5lcigpXG4gICAqIC0gLnRvR2V0UGFydG5lckRhc2hib2FyZCgpXG4gICAqIC0gLnRvR2V0UHJvZmlsZVVwZGF0ZVRhc2soKVxuICAgKiAtIC50b0dldFByb2ZpbGVWaXNpYmlsaXR5KClcbiAgICogLSAudG9HZXRQcm9zcGVjdGluZ0Zyb21FbmdhZ2VtZW50VGFzaygpXG4gICAqIC0gLnRvR2V0UXVhbGlmaWNhdGlvbnNBc3NvY2lhdGlvbkRldGFpbHMoKVxuICAgKiAtIC50b0dldFF1YWxpZmljYXRpb25zQXNzb2NpYXRpb25UYXNrKClcbiAgICogLSAudG9HZXRRdWFsaWZpY2F0aW9uc0Rpc2Fzc29jaWF0aW9uVGFzaygpXG4gICAqIC0gLnRvR2V0UmVsYXRpb25zaGlwKClcbiAgICogLSAudG9HZXRSZXNvdXJjZVNuYXBzaG90KClcbiAgICogLSAudG9HZXRSZXNvdXJjZVNuYXBzaG90Sm9iKClcbiAgICogLSAudG9HZXRSZXZlbnVlQXR0cmlidXRpb24oKVxuICAgKiAtIC50b0dldFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb24oKVxuICAgKiAtIC50b0dldFJldmVudWVBdHRyaWJ1dGlvbkFsbG9jYXRpb25zVGFzaygpXG4gICAqIC0gLnRvR2V0U2VsbGluZ1N5c3RlbVNldHRpbmdzKClcbiAgICogLSAudG9HZXRWZXJpZmljYXRpb24oKVxuICAgKiAtIC50b0xpc3RCZW5lZml0QWxsb2NhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RCZW5lZml0QXBwbGljYXRpb25zKClcbiAgICogLSAudG9MaXN0QmVuZWZpdHMoKVxuICAgKiAtIC50b0xpc3RDaGFubmVsSGFuZHNoYWtlcygpXG4gICAqIC0gLnRvTGlzdENvbm5lY3Rpb25JbnZpdGF0aW9ucygpXG4gICAqIC0gLnRvTGlzdENvbm5lY3Rpb25zKClcbiAgICogLSAudG9MaXN0RW5nYWdlbWVudEJ5QWNjZXB0aW5nSW52aXRhdGlvblRhc2tzKClcbiAgICogLSAudG9MaXN0RW5nYWdlbWVudEZyb21PcHBvcnR1bml0eVRhc2tzKClcbiAgICogLSAudG9MaXN0RW5nYWdlbWVudEludml0YXRpb25zKClcbiAgICogLSAudG9MaXN0RW5nYWdlbWVudE1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RFbmdhZ2VtZW50UmVzb3VyY2VBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RFbmdhZ2VtZW50cygpXG4gICAqIC0gLnRvTGlzdE1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RNYXJrZXRwbGFjZVJldmVudWVTaGFyZXMoKVxuICAgKiAtIC50b0xpc3RPcHBvcnR1bml0aWVzKClcbiAgICogLSAudG9MaXN0T3Bwb3J0dW5pdHlGcm9tRW5nYWdlbWVudFRhc2tzKClcbiAgICogLSAudG9MaXN0UGFydG5lcnMoKVxuICAgKiAtIC50b0xpc3RQcm9ncmFtTWFuYWdlbWVudEFjY291bnRzKClcbiAgICogLSAudG9MaXN0UHJvc3BlY3RpbmdGcm9tRW5nYWdlbWVudFRhc2tzKClcbiAgICogLSAudG9MaXN0UmVsYXRpb25zaGlwcygpXG4gICAqIC0gLnRvTGlzdFJlc291cmNlU25hcHNob3RKb2JzKClcbiAgICogLSAudG9MaXN0UmVzb3VyY2VTbmFwc2hvdHMoKVxuICAgKiAtIC50b0xpc3RSZXZlbnVlQXR0cmlidXRpb25BbGxvY2F0aW9ucygpXG4gICAqIC0gLnRvTGlzdFJldmVudWVBdHRyaWJ1dGlvbnMoKVxuICAgKiAtIC50b0xpc3RTb2x1dGlvbnMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1B1dEFsbGlhbmNlTGVhZENvbnRhY3QoKVxuICAgKiAtIC50b1B1dFByb2ZpbGVWaXNpYmlsaXR5KClcbiAgICogLSAudG9QdXRTZWxsaW5nU3lzdGVtU2V0dGluZ3MoKVxuICAgKiAtIC50b1JlY2FsbEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvUmVqZWN0Q2hhbm5lbEhhbmRzaGFrZSgpXG4gICAqIC0gLnRvUmVqZWN0Q29ubmVjdGlvbkludml0YXRpb24oKVxuICAgKiAtIC50b1JlamVjdEVuZ2FnZW1lbnRJbnZpdGF0aW9uKClcbiAgICogLSAudG9TZW5kRW1haWxWZXJpZmljYXRpb25Db2RlKClcbiAgICogLSAudG9TdGFydEVuZ2FnZW1lbnRCeUFjY2VwdGluZ0ludml0YXRpb25UYXNrKClcbiAgICogLSAudG9TdGFydEVuZ2FnZW1lbnRGcm9tT3Bwb3J0dW5pdHlUYXNrKClcbiAgICogLSAudG9TdGFydE9wcG9ydHVuaXR5RnJvbUVuZ2FnZW1lbnRUYXNrKClcbiAgICogLSAudG9TdGFydFByb2ZpbGVVcGRhdGVUYXNrKClcbiAgICogLSAudG9TdGFydFByb3NwZWN0aW5nRnJvbUVuZ2FnZW1lbnRUYXNrKClcbiAgICogLSAudG9TdGFydFF1YWxpZmljYXRpb25zQXNzb2NpYXRpb25UYXNrKClcbiAgICogLSAudG9TdGFydFF1YWxpZmljYXRpb25zRGlzYXNzb2NpYXRpb25UYXNrKClcbiAgICogLSAudG9TdGFydFJlc291cmNlU25hcHNob3RKb2IoKVxuICAgKiAtIC50b1N0YXJ0UmV2ZW51ZUF0dHJpYnV0aW9uQWxsb2NhdGlvbnNUYXNrKClcbiAgICogLSAudG9TdGFydFZlcmlmaWNhdGlvbigpXG4gICAqIC0gLnRvU3RvcFJlc291cmNlU25hcHNob3RKb2IoKVxuICAgKiAtIC50b1N1Ym1pdEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvU3VibWl0T3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZUNvbm5lY3Rpb25QcmVmZXJlbmNlcygpXG4gICAqIC0gLnRvVXBkYXRlRW5nYWdlbWVudENvbnRleHQoKVxuICAgKiAtIC50b1VwZGF0ZU1hcmtldHBsYWNlUmV2ZW51ZVNoYXJlQWxsb2NhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlT3Bwb3J0dW5pdHkoKVxuICAgKiAtIC50b1VwZGF0ZVByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpXG4gICAqIC0gLnRvVXBkYXRlUmVsYXRpb25zaGlwKClcbiAgICogLSAudG9VcGRhdGVSZXZlbnVlQXR0cmlidXRpb24oKVxuICAgKiAtIC50b0dldFByb2dyYW1NYW5hZ2VtZW50QWNjb3VudCgpXG4gICAqIC0gLnRvVXNlU2Vzc2lvbigpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ2F0YWxvZyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQ2F0YWxvZ2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGNoYW5uZWwgaGFuZHNoYWtlIHR5cGVzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9jb250cm9sbGluZy1hY2Nlc3MtaW4tYXdzLXBhcnRuZXItY2VudHJhbC5odG1sI2NvbmRpdGlvbi1rZXlzLWZvci1hd3MtcGFydG5lci1jZW50cmFsXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRDaGFubmVsSGFuZHNoYWtlKClcbiAgICogLSAudG9DYW5jZWxDaGFubmVsSGFuZHNoYWtlKClcbiAgICogLSAudG9DcmVhdGVDaGFubmVsSGFuZHNoYWtlKClcbiAgICogLSAudG9MaXN0Q2hhbm5lbEhhbmRzaGFrZXMoKVxuICAgKiAtIC50b1JlamVjdENoYW5uZWxIYW5kc2hha2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkNoYW5uZWxIYW5kc2hha2VUeXBlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDaGFubmVsSGFuZHNoYWtlVHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGJlbmVmaXQgZnVsZmlsbG1lbnQgdHlwZXNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2NvbnRyb2xsaW5nLWFjY2Vzcy1pbi1hd3MtcGFydG5lci1jZW50cmFsLmh0bWwjY29uZGl0aW9uLWtleXMtZm9yLWF3cy1wYXJ0bmVyLWNlbnRyYWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FtZW5kQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9Bc3NvY2lhdGVCZW5lZml0QXBwbGljYXRpb25SZXNvdXJjZSgpXG4gICAqIC0gLnRvQ2FuY2VsQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9DcmVhdGVCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUJlbmVmaXRBcHBsaWNhdGlvblJlc291cmNlKClcbiAgICogLSAudG9HZXRCZW5lZml0KClcbiAgICogLSAudG9HZXRCZW5lZml0QWxsb2NhdGlvbigpXG4gICAqIC0gLnRvR2V0QmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9MaXN0QmVuZWZpdEFsbG9jYXRpb25zKClcbiAgICogLSAudG9MaXN0QmVuZWZpdEFwcGxpY2F0aW9ucygpXG4gICAqIC0gLnRvTGlzdEJlbmVmaXRzKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9SZWNhbGxCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b1N1Ym1pdEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmRnVsZmlsbG1lbnRUeXBlcyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgRnVsZmlsbG1lbnRUeXBlc2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHByb2dyYW1cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2NvbnRyb2xsaW5nLWFjY2Vzcy1pbi1hd3MtcGFydG5lci1jZW50cmFsLmh0bWwjY29uZGl0aW9uLWtleXMtZm9yLWF3cy1wYXJ0bmVyLWNlbnRyYWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FtZW5kQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9Bc3NvY2lhdGVCZW5lZml0QXBwbGljYXRpb25SZXNvdXJjZSgpXG4gICAqIC0gLnRvQ2FuY2VsQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9DcmVhdGVCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUJlbmVmaXRBcHBsaWNhdGlvblJlc291cmNlKClcbiAgICogLSAudG9HZXRCZW5lZml0KClcbiAgICogLSAudG9HZXRCZW5lZml0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b0xpc3RCZW5lZml0QXBwbGljYXRpb25zKClcbiAgICogLSAudG9MaXN0QmVuZWZpdHMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1JlY2FsbEJlbmVmaXRBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvU3VibWl0QmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQmVuZWZpdEFwcGxpY2F0aW9uKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQcm9ncmFtcyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUHJvZ3JhbXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBlbnRpdHkgdHlwZXMgZm9yIE9wcG9ydHVuaXR5IGFzc29jaWF0aW9uXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXJ0bmVyLWNlbnRyYWwvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9jb250cm9sbGluZy1hY2Nlc3MtaW4tYXdzLXBhcnRuZXItY2VudHJhbC5odG1sI2NvbmRpdGlvbi1rZXlzLWZvci1hd3MtcGFydG5lci1jZW50cmFsXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVPcHBvcnR1bml0eSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlT3Bwb3J0dW5pdHkoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlJlbGF0ZWRFbnRpdHlUeXBlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZWxhdGVkRW50aXR5VHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0eXBlIG9mIHZlcmlmaWNhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BhcnRuZXItY2VudHJhbC9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2NvbnRyb2xsaW5nLWFjY2Vzcy1pbi1hd3MtcGFydG5lci1jZW50cmFsLmh0bWwjY29uZGl0aW9uLWtleXMtZm9yLWF3cy1wYXJ0bmVyLWNlbnRyYWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0dldFZlcmlmaWNhdGlvbigpXG4gICAqIC0gLnRvU3RhcnRWZXJpZmljYXRpb24oKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlZlcmlmaWNhdGlvblR5cGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFZlcmlmaWNhdGlvblR5cGVgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3BhcnRuZXJjZW50cmFsXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9wYXJ0bmVyLWNlbnRyYWwuaHRtbCkuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxufVxuIl19