UNPKG

iam-floyd

Version:

AWS IAM policy statement generator with fluent interface

841 lines 82.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Securityagent = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [securityagent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssecurityagent.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class Securityagent extends shared_1.PolicyStatement { /** * Statement provider for service [securityagent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssecurityagent.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ constructor(sid) { super(sid); this.servicePrefix = 'securityagent'; this.accessLevelList = { Write: [ 'AddArtifact', 'AddControl', 'BatchDeletePentests', 'CreateAgentInstance', 'CreateApplication', 'CreateDocumentReview', 'CreateIntegration', 'CreateMembership', 'CreateOneTimeLoginSession', 'CreatePentest', 'DeleteAgentInstance', 'DeleteApplication', 'DeleteArtifact', 'DeleteControl', 'DeleteIntegration', 'DeleteMembership', 'HandleOneTimeLoginSession', 'InitiateProviderRegistration', 'StartCodeRemediation', 'StartPentestExecution', 'StopPentestExecution', 'ToggleManagedControl', 'UpdateAgentInstance', 'UpdateApplication', 'UpdateControl', 'UpdateFinding', 'UpdateIntegratedResources', 'UpdatePentest', 'VerifyTargetDomain' ], Read: [ 'BatchGetAgentInstances', 'BatchGetArtifactMetadata', 'BatchGetFindings', 'BatchGetPentestJobs', 'BatchGetPentests', 'BatchGetSecurityTestContentMetadata', 'BatchGetTasks', 'DescribeFindings', 'GetApplication', 'GetArtifact', 'GetCodeReviewTask', 'GetControl', 'GetDocReviewTask', 'GetDocumentReview', 'GetDocumentReviewArtifact', 'GetIntegration', 'GetLoginSessionCredentials' ], List: [ 'ListAgentInstanceTasks', 'ListAgentInstances', 'ListApplications', 'ListArtifacts', 'ListControls', 'ListDiscoveredEndpoints', 'ListDocumentReviewComments', 'ListDocumentReviews', 'ListFindings', 'ListIntegratedResources', 'ListIntegrations', 'ListMemberships', 'ListPentestJobsForPentest', 'ListPentests', 'ListResourcesFromIntegration', 'ListTasks' ] }; } /** * Grants permission to add an Artifact for the given Agent Instance * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_AddArtifact.html */ toAddArtifact() { return this.to('AddArtifact'); } /** * Grants permission to add a customer managed Control * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_AddControl.html */ toAddControl() { return this.to('AddControl'); } /** * Grants permission to delete multiple penetration tests in a single request * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_BatchDeletePentests.html */ toBatchDeletePentests() { return this.to('BatchDeletePentests'); } /** * Grants permission to retrieve multiple agent instances in a single request * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_BatchGetAgentInstances.html */ toBatchGetAgentInstances() { return this.to('BatchGetAgentInstances'); } /** * Grants permission to retrieve one or more Artifact Metadata records for the given Agent Instance * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_BatchGetArtifactMetadata.html */ toBatchGetArtifactMetadata() { return this.to('BatchGetArtifactMetadata'); } /** * Grants permission to retrieve multiple security testing findings in a single request * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_BatchGetFindings.html */ toBatchGetFindings() { return this.to('BatchGetFindings'); } /** * Grants permission to retrieve multiple security testing jobs in a single request * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_BatchGetPentestJobs.html */ toBatchGetPentestJobs() { return this.to('BatchGetPentestJobs'); } /** * Grants permission to retrieve multiple penetration tests in a single request * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_BatchGetPentests.html */ toBatchGetPentests() { return this.to('BatchGetPentests'); } /** * Grants permission to retrieve multiple security testing contents metadata in a single request * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_BatchGetSecurityTestContentMetadata.html */ toBatchGetSecurityTestContentMetadata() { return this.to('BatchGetSecurityTestContentMetadata'); } /** * Grants permission to retrieve multiple security testing tasks in a single request * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_BatchGetTasks.html */ toBatchGetTasks() { return this.to('BatchGetTasks'); } /** * Grants permission to create an agent instance record * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_CreateAgentInstance.html */ toCreateAgentInstance() { return this.to('CreateAgentInstance'); } /** * Grants permission to create a new application * * Access Level: Write * * Dependent actions: * - iam:PassRole * - sso:CreateApplication * * https://docs.aws.amazon.com/securityagent/API_CreateApplication.html */ toCreateApplication() { return this.to('CreateApplication'); } /** * Grants permission to create a document review * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_CreateDocumentReview.html */ toCreateDocumentReview() { return this.to('CreateDocumentReview'); } /** * Grants permission to create a security testing integration * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_CreateIntegration.html */ toCreateIntegration() { return this.to('CreateIntegration'); } /** * Grants permission to add a single member to a agent instance with specified role * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_CreateMembership.html */ toCreateMembership() { return this.to('CreateMembership'); } /** * Grants permission to create a one time login session * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_CreateOneTimeLoginSession.html */ toCreateOneTimeLoginSession() { return this.to('CreateOneTimeLoginSession'); } /** * Grants permission to create a new penetration test configuration * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_CreatePentest.html */ toCreatePentest() { return this.to('CreatePentest'); } /** * Grants permission to delete an agent instance record * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_DeleteAgentInstance.html */ toDeleteAgentInstance() { return this.to('DeleteAgentInstance'); } /** * Grants permission to delete application * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_DeleteApplication.html */ toDeleteApplication() { return this.to('DeleteApplication'); } /** * Grants permission to delete an Artifact * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_DeleteArtifact.html */ toDeleteArtifact() { return this.to('DeleteArtifact'); } /** * Grants permission to delete a customer managed Control * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_DeleteControl.html */ toDeleteControl() { return this.to('DeleteControl'); } /** * Grants permission to delete the integration of an application * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_DeleteIntegration.html */ toDeleteIntegration() { return this.to('DeleteIntegration'); } /** * Grants permission to remove a single member associated to an agent instance * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_DeleteMembership.html */ toDeleteMembership() { return this.to('DeleteMembership'); } /** * Grants permission to retrieve security findings for a penetration test or security testing tasks in a penetration test * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_DescribeFindings.html */ toDescribeFindings() { return this.to('DescribeFindings'); } /** * Grants permission to get application details by application ID * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetApplication.html */ toGetApplication() { return this.to('GetApplication'); } /** * Grants permission to retrieve an Artifact for the given Agent Instance * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetArtifact.html */ toGetArtifact() { return this.to('GetArtifact'); } /** * Grants permission to retrieve a Code Review Task * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetCodeReviewTask.html */ toGetCodeReviewTask() { return this.to('GetCodeReviewTask'); } /** * Grants permission to retrieve a Control * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetControl.html */ toGetControl() { return this.to('GetControl'); } /** * Grants permission to retrieve a document review task * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetDocReviewTask.html */ toGetDocReviewTask() { return this.to('GetDocReviewTask'); } /** * Grants permission to get the status of the associated agent instance document review * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetDocumentReview.html */ toGetDocumentReview() { return this.to('GetDocumentReview'); } /** * Grants permission to get document review artifact for a specific document * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetDocumentReviewArtifact.html */ toGetDocumentReviewArtifact() { return this.to('GetDocumentReviewArtifact'); } /** * Grants permission to get the integration metadata by ID * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetIntegration.html */ toGetIntegration() { return this.to('GetIntegration'); } /** * Grants permission to retrieve credentials for a one time login session * * Access Level: Read * * https://docs.aws.amazon.com/securityagent/API_GetLoginSessionCredentials.html */ toGetLoginSessionCredentials() { return this.to('GetLoginSessionCredentials'); } /** * Grants permission to process and invalidate a one time login session * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_HandleOneTimeLoginSession.html */ toHandleOneTimeLoginSession() { return this.to('HandleOneTimeLoginSession'); } /** * Grants permission to initiate the registration of Security Agent App for the given provider (eg: GitHub) * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_InitiateProviderRegistration.html */ toInitiateProviderRegistration() { return this.to('InitiateProviderRegistration'); } /** * Grants permission to list tasks for a specific agent instance * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListAgentInstanceTasks.html */ toListAgentInstanceTasks() { return this.to('ListAgentInstanceTasks'); } /** * Grants permission to list agent instances * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListAgentInstances.html */ toListAgentInstances() { return this.to('ListAgentInstances'); } /** * Grants permission to list all applications in the account * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListApplications.html */ toListApplications() { return this.to('ListApplications'); } /** * Grants permission to list all artifacts for the given project * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListArtifacts.html */ toListArtifacts() { return this.to('ListArtifacts'); } /** * Grants permission to list all Controls * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListControls.html */ toListControls() { return this.to('ListControls'); } /** * Grants permission to list discovered endpoints associated with a pentest job with optional URI prefix filtering * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListDiscoveredEndpoints.html */ toListDiscoveredEndpoints() { return this.to('ListDiscoveredEndpoints'); } /** * Grants permission to list document review comments * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListDocumentReviewComments.html */ toListDocumentReviewComments() { return this.to('ListDocumentReviewComments'); } /** * Grants permission to list all document reviews for the given project * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListDocumentReviews.html */ toListDocumentReviews() { return this.to('ListDocumentReviews'); } /** * Grants permission to list findings with filtering and pagination support * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListFindings.html */ toListFindings() { return this.to('ListFindings'); } /** * Grants permission to list integrated resources for an agent instance * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListIntegratedResources.html */ toListIntegratedResources() { return this.to('ListIntegratedResources'); } /** * Grants permission to get the integrations owned by the caller's AWS account * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListIntegrations.html */ toListIntegrations() { return this.to('ListIntegrations'); } /** * Grants permission to list all members associated to an agent instance with pagination support * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListMemberships.html */ toListMemberships() { return this.to('ListMemberships'); } /** * Grants permission to list penetration test jobs associated with a penetration test * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListPentestJobsForPentest.html */ toListPentestJobsForPentest() { return this.to('ListPentestJobsForPentest'); } /** * Grants permission to list penetration tests with optional filtering by status * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListPentests.html */ toListPentests() { return this.to('ListPentests'); } /** * Grants permission to list resources from Integration * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListResourcesFromIntegration.html */ toListResourcesFromIntegration() { return this.to('ListResourcesFromIntegration'); } /** * Grants permission to list security testing tasks associated with a pentest job * * Access Level: List * * https://docs.aws.amazon.com/securityagent/API_ListTasks.html */ toListTasks() { return this.to('ListTasks'); } /** * Grants permission to start code remediation for the findings * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_StartCodeRemediation.html */ toStartCodeRemediation() { return this.to('StartCodeRemediation'); } /** * Grants permission to initiate the execution of a penetration test * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_StartPentestExecution.html */ toStartPentestExecution() { return this.to('StartPentestExecution'); } /** * Grants permission to stop the execution of a running penetration test * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_StopPentestExecution.html */ toStopPentestExecution() { return this.to('StopPentestExecution'); } /** * Grants permission to toggle the status * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_ToggleManagedControl.html */ toToggleManagedControl() { return this.to('ToggleManagedControl'); } /** * Grants permission to update an agent instance record * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_UpdateAgentInstance.html */ toUpdateAgentInstance() { return this.to('UpdateAgentInstance'); } /** * Grants permission to update application configuration * * Access Level: Write * * Dependent actions: * - iam:PassRole * * https://docs.aws.amazon.com/securityagent/API_UpdateApplication.html */ toUpdateApplication() { return this.to('UpdateApplication'); } /** * Grants permission to update a customer managed Control * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_UpdateControl.html */ toUpdateControl() { return this.to('UpdateControl'); } /** * Grants permission to update an existing security finding with new details or status * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_UpdateFinding.html */ toUpdateFinding() { return this.to('UpdateFinding'); } /** * Grants permission to update integrated resources for an agent instance * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_UpdateIntegratedResources.html */ toUpdateIntegratedResources() { return this.to('UpdateIntegratedResources'); } /** * Grants permission to update an existing penetration test with new configuration or settings * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_UpdatePentest.html */ toUpdatePentest() { return this.to('UpdatePentest'); } /** * Grants permission to verify ownership for a registered target domain in an agent instance * * Access Level: Write * * https://docs.aws.amazon.com/securityagent/API_VerifyTargetDomain.html */ toVerifyTargetDomain() { return this.to('VerifyTargetDomain'); } /** * Adds a resource of type Application to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param applicationId - Identifier for the applicationId. * @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. */ onApplication(applicationId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:application/${applicationId}`); } /** * Adds a resource of type Control to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param controlId - Identifier for the controlId. * @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. */ onControl(controlId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:control/${controlId}`); } /** * Adds a resource of type Integration to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param integrationId - Identifier for the integrationId. * @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. */ onIntegration(integrationId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:integration/${integrationId}`); } /** * Adds a resource of type AgentInstance to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param agentId - Identifier for the agentId. * @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. */ onAgentInstance(agentId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agent-instance/${agentId}`); } /** * Adds a resource of type Artifact to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param agentId - Identifier for the agentId. * @param artifactId - Identifier for the artifactId. * @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. */ onArtifact(agentId, artifactId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agent-instance/${agentId}/artifact/${artifactId}`); } /** * Adds a resource of type Pentest to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param agentId - Identifier for the agentId. * @param pentestId - Identifier for the pentestId. * @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. */ onPentest(agentId, pentestId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agent-instance/${agentId}/pentest/${pentestId}`); } /** * Adds a resource of type PentestJob to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param agentId - Identifier for the agentId. * @param jobId - Identifier for the jobId. * @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. */ onPentestJob(agentId, jobId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agent-instance/${agentId}/pentest-job/${jobId}`); } /** * Adds a resource of type PentestTask to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param agentId - Identifier for the agentId. * @param taskId - Identifier for the taskId. * @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. */ onPentestTask(agentId, taskId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agent-instance/${agentId}/pentest-task/${taskId}`); } /** * Adds a resource of type Finding to the statement * * https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats * * @param agentId - Identifier for the agentId. * @param findingId - Identifier for the findingId. * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account. * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region. * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition. */ onFinding(agentId, findingId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agent-instance/${agentId}/finding/${findingId}`); } } exports.Securityagent = Securityagent; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlhZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5YWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQStDO0FBRS9DOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWMsU0FBUSx3QkFBZTtJQUdoRDs7OztPQUlHO0lBQ0gsWUFBWSxHQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQVJOLGtCQUFhLEdBQUcsZUFBZSxDQUFDO1FBNHJCN0Isb0JBQWUsR0FBb0I7WUFDM0MsS0FBSyxFQUFFO2dCQUNMLGFBQWE7Z0JBQ2IsWUFBWTtnQkFDWixxQkFBcUI7Z0JBQ3JCLHFCQUFxQjtnQkFDckIsbUJBQW1CO2dCQUNuQixzQkFBc0I7Z0JBQ3RCLG1CQUFtQjtnQkFDbkIsa0JBQWtCO2dCQUNsQiwyQkFBMkI7Z0JBQzNCLGVBQWU7Z0JBQ2YscUJBQXFCO2dCQUNyQixtQkFBbUI7Z0JBQ25CLGdCQUFnQjtnQkFDaEIsZUFBZTtnQkFDZixtQkFBbUI7Z0JBQ25CLGtCQUFrQjtnQkFDbEIsMkJBQTJCO2dCQUMzQiw4QkFBOEI7Z0JBQzlCLHNCQUFzQjtnQkFDdEIsdUJBQXVCO2dCQUN2QixzQkFBc0I7Z0JBQ3RCLHNCQUFzQjtnQkFDdEIscUJBQXFCO2dCQUNyQixtQkFBbUI7Z0JBQ25CLGVBQWU7Z0JBQ2YsZUFBZTtnQkFDZiwyQkFBMkI7Z0JBQzNCLGVBQWU7Z0JBQ2Ysb0JBQW9CO2FBQ3JCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLHdCQUF3QjtnQkFDeEIsMEJBQTBCO2dCQUMxQixrQkFBa0I7Z0JBQ2xCLHFCQUFxQjtnQkFDckIsa0JBQWtCO2dCQUNsQixxQ0FBcUM7Z0JBQ3JDLGVBQWU7Z0JBQ2Ysa0JBQWtCO2dCQUNsQixnQkFBZ0I7Z0JBQ2hCLGFBQWE7Z0JBQ2IsbUJBQW1CO2dCQUNuQixZQUFZO2dCQUNaLGtCQUFrQjtnQkFDbEIsbUJBQW1CO2dCQUNuQiwyQkFBMkI7Z0JBQzNCLGdC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Y0FBZSxtQkFBb0IsT0FBUSxnQkFBaUIsS0FBTSxFQUFFLENBQUMsQ0FBQztJQUN2TSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGFBQWEsQ0FBQyxPQUFlLEVBQUUsTUFBYyxFQUFFLE9BQWdCLEVBQUUsTUFBZSxFQUFFLFNBQWtCO1FBQ3pHLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLGtCQUFtQixNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsbUJBQW9CLE9BQVEsaUJBQWtCLE1BQU8sRUFBRSxDQUFDLENBQUM7SUFDek0sQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxTQUFTLENBQUMsT0FBZSxFQUFFLFNBQWlCLEVBQUUsT0FBZ0IsRUFBRSxNQUFlLEVBQUUsU0FBa0I7UUFDeEcsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQVEsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBaUIsa0JBQW1CLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYyxJQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBZSxtQkFBb0IsT0FBUSxZQUFhLFNBQVUsRUFBRSxDQUFDLENBQUM7SUFDdk0sQ0FBQztDQUNGO0FBdDRCRCxzQ0FzNEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbc2VjdXJpdHlhZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYXdzc2VjdXJpdHlhZ2VudC5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyaXR5YWdlbnQgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdzZWN1cml0eWFnZW50JztcblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtzZWN1cml0eWFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3NzZWN1cml0eWFnZW50Lmh0bWwpLlxuICAgKlxuICAgKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpZD86IHN0cmluZykge1xuICAgIHN1cGVyKHNpZCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIGFuIEFydGlmYWN0IGZvciB0aGUgZ2l2ZW4gQWdlbnQgSW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQWRkQXJ0aWZhY3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWRkQXJ0aWZhY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FkZEFydGlmYWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIGEgY3VzdG9tZXIgbWFuYWdlZCBDb250cm9sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0FkZENvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWRkQ29udHJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWRkQ29udHJvbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBtdWx0aXBsZSBwZW5ldHJhdGlvbiB0ZXN0cyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoRGVsZXRlUGVudGVzdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hEZWxldGVQZW50ZXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hEZWxldGVQZW50ZXN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG11bHRpcGxlIGFnZW50IGluc3RhbmNlcyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRBZ2VudEluc3RhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldEFnZW50SW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldEFnZW50SW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgb25lIG9yIG1vcmUgQXJ0aWZhY3QgTWV0YWRhdGEgcmVjb3JkcyBmb3IgdGhlIGdpdmVuIEFnZW50IEluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRBcnRpZmFjdE1ldGFkYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0QXJ0aWZhY3RNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRBcnRpZmFjdE1ldGFkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbXVsdGlwbGUgc2VjdXJpdHkgdGVzdGluZyBmaW5kaW5ncyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRGaW5kaW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldEZpbmRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldEZpbmRpbmdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbXVsdGlwbGUgc2VjdXJpdHkgdGVzdGluZyBqb2JzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldFBlbnRlc3RKb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0UGVudGVzdEpvYnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoR2V0UGVudGVzdEpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBtdWx0aXBsZSBwZW5ldHJhdGlvbiB0ZXN0cyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRQZW50ZXN0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldFBlbnRlc3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldFBlbnRlc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbXVsdGlwbGUgc2VjdXJpdHkgdGVzdGluZyBjb250ZW50cyBtZXRhZGF0YSBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRTZWN1cml0eVRlc3RDb250ZW50TWV0YWRhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRTZWN1cml0eVRlc3RDb250ZW50TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoR2V0U2VjdXJpdHlUZXN0Q29udGVudE1ldGFkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbXVsdGlwbGUgc2VjdXJpdHkgdGVzdGluZyB0YXNrcyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldFRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIGFnZW50IGluc3RhbmNlIHJlY29yZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVBZ2VudEluc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFnZW50SW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUFnZW50SW5zdGFuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBpYW06UGFzc1JvbGVcbiAgICogLSBzc286Q3JlYXRlQXBwbGljYXRpb25cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0NyZWF0ZUFwcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFwcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVBcHBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGRvY3VtZW50IHJldmlld1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVEb2N1bWVudFJldmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVEb2N1bWVudFJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRG9jdW1lbnRSZXZpZXcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBzZWN1cml0eSB0ZXN0aW5nIGludGVncmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0NyZWF0ZUludGVncmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUludGVncmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVJbnRlZ3JhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCBhIHNpbmdsZSBtZW1iZXIgdG8gYSBhZ2VudCBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCByb2xlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0NyZWF0ZU1lbWJlcnNoaXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTWVtYmVyc2hpcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTWVtYmVyc2hpcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG9uZSB0aW1lIGxvZ2luIHNlc3Npb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQ3JlYXRlT25lVGltZUxvZ2luU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVPbmVUaW1lTG9naW5TZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVPbmVUaW1lTG9naW5TZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IHBlbmV0cmF0aW9uIHRlc3QgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVQZW50ZXN