cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
2,100 lines • 184 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Deadline = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [deadline](https://docs.aws.amazon.com/service-authorization/latest/reference/list_deadline.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Deadline extends shared_1.PolicyStatement {
/**
* Grants permission to associate a member to a farm
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToFarm.html
*/
toAssociateMemberToFarm() {
return this.to('AssociateMemberToFarm');
}
/**
* Grants permission to associate a member to a fleet
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToFleet.html
*/
toAssociateMemberToFleet() {
return this.to('AssociateMemberToFleet');
}
/**
* Grants permission to associate a member to a job
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToJob.html
*/
toAssociateMemberToJob() {
return this.to('AssociateMemberToJob');
}
/**
* Grants permission to associate a member to a queue
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToQueue.html
*/
toAssociateMemberToQueue() {
return this.to('AssociateMemberToQueue');
}
/**
* Grants permission to assume a fleet role for read-only access
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeFleetRoleForRead.html
*/
toAssumeFleetRoleForRead() {
return this.to('AssumeFleetRoleForRead');
}
/**
* Grants permission to assume a fleet role for a worker
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeFleetRoleForWorker.html
*/
toAssumeFleetRoleForWorker() {
return this.to('AssumeFleetRoleForWorker');
}
/**
* Grants permission to assume a queue role for read-only access
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeQueueRoleForRead.html
*/
toAssumeQueueRoleForRead() {
return this.to('AssumeQueueRoleForRead');
}
/**
* Grants permission to assume a queue role for a user
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeQueueRoleForUser.html
*/
toAssumeQueueRoleForUser() {
return this.to('AssumeQueueRoleForUser');
}
/**
* Grants permission to assume a queue role for a worker
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeQueueRoleForWorker.html
*/
toAssumeQueueRoleForWorker() {
return this.to('AssumeQueueRoleForWorker');
}
/**
* Grants permission to get a job entity for a worker
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_BatchGetJobEntity.html
*/
toBatchGetJobEntity() {
return this.to('BatchGetJobEntity');
}
/**
* Grants permission to copy a job template to an Amazon S3 bucket
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CopyJobTemplate.html
*/
toCopyJobTemplate() {
return this.to('CopyJobTemplate');
}
/**
* Grants permission to create a budget
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateBudget.html
*/
toCreateBudget() {
return this.to('CreateBudget');
}
/**
* Grants permission to create a farm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateFarm.html
*/
toCreateFarm() {
return this.to('CreateFarm');
}
/**
* Grants permission to create a fleet
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateFleet.html
*/
toCreateFleet() {
return this.to('CreateFleet');
}
/**
* Grants permission to create a job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html
*/
toCreateJob() {
return this.to('CreateJob');
}
/**
* Grants permission to create a license endpoint for licensed software or products
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateLicenseEndpoint.html
*/
toCreateLicenseEndpoint() {
return this.to('CreateLicenseEndpoint');
}
/**
* Grants permission to create a limit for a farm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateLimit.html
*/
toCreateLimit() {
return this.to('CreateLimit');
}
/**
* Grants permission to create a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateMonitor.html
*/
toCreateMonitor() {
return this.to('CreateMonitor');
}
/**
* Grants permission to create a queue
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueue.html
*/
toCreateQueue() {
return this.to('CreateQueue');
}
/**
* Grants permission to create a queue environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueEnvironment.html
*/
toCreateQueueEnvironment() {
return this.to('CreateQueueEnvironment');
}
/**
* Grants permission to create a queue-fleet association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueFleetAssociation.html
*/
toCreateQueueFleetAssociation() {
return this.to('CreateQueueFleetAssociation');
}
/**
* Grants permission to create a queue-limit association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueLimitAssociation.html
*/
toCreateQueueLimitAssociation() {
return this.to('CreateQueueLimitAssociation');
}
/**
* Grants permission to create a storage profile for a farm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateStorageProfile.html
*/
toCreateStorageProfile() {
return this.to('CreateStorageProfile');
}
/**
* Grants permission to create a worker
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateWorker.html
*/
toCreateWorker() {
return this.to('CreateWorker');
}
/**
* Grants permission to delete a budget
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteBudget.html
*/
toDeleteBudget() {
return this.to('DeleteBudget');
}
/**
* Grants permission to delete a farm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteFarm.html
*/
toDeleteFarm() {
return this.to('DeleteFarm');
}
/**
* Grants permission to delete a fleet
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteFleet.html
*/
toDeleteFleet() {
return this.to('DeleteFleet');
}
/**
* Grants permission to delete a license endpoint
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteLicenseEndpoint.html
*/
toDeleteLicenseEndpoint() {
return this.to('DeleteLicenseEndpoint');
}
/**
* Grants permission to delete a limit
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteLimit.html
*/
toDeleteLimit() {
return this.to('DeleteLimit');
}
/**
* Grants permission to delete a metered product
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteMeteredProduct.html
*/
toDeleteMeteredProduct() {
return this.to('DeleteMeteredProduct');
}
/**
* Grants permission to delete a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteMonitor.html
*/
toDeleteMonitor() {
return this.to('DeleteMonitor');
}
/**
* Grants permission to delete a queue
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueue.html
*/
toDeleteQueue() {
return this.to('DeleteQueue');
}
/**
* Grants permission to delete a queue environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueueEnvironment.html
*/
toDeleteQueueEnvironment() {
return this.to('DeleteQueueEnvironment');
}
/**
* Grants permission to delete a queue-fleet association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueueFleetAssociation.html
*/
toDeleteQueueFleetAssociation() {
return this.to('DeleteQueueFleetAssociation');
}
/**
* Grants permission to delete a queue-limit association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueueLimitAssociation.html
*/
toDeleteQueueLimitAssociation() {
return this.to('DeleteQueueLimitAssociation');
}
/**
* Grants permission to delete a storage profile
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteStorageProfile.html
*/
toDeleteStorageProfile() {
return this.to('DeleteStorageProfile');
}
/**
* Grants permission to delete a volume
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteVolume.html
*/
toDeleteVolume() {
return this.to('DeleteVolume');
}
/**
* Grants permission to delete a worker
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteWorker.html
*/
toDeleteWorker() {
return this.to('DeleteWorker');
}
/**
* Grants permission to disassociate a member from a farm
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromFarm.html
*/
toDisassociateMemberFromFarm() {
return this.to('DisassociateMemberFromFarm');
}
/**
* Grants permission to disassociate a member from a fleet
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromFleet.html
*/
toDisassociateMemberFromFleet() {
return this.to('DisassociateMemberFromFleet');
}
/**
* Grants permission to disassociate a member from a job
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromJob.html
*/
toDisassociateMemberFromJob() {
return this.to('DisassociateMemberFromJob');
}
/**
* Grants permission to disassociate a member from a queue
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromQueue.html
*/
toDisassociateMemberFromQueue() {
return this.to('DisassociateMemberFromQueue');
}
/**
* Grants permission to get a budget
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetBudget.html
*/
toGetBudget() {
return this.to('GetBudget');
}
/**
* Grants permission to get a farm
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetFarm.html
*/
toGetFarm() {
return this.to('GetFarm');
}
/**
* Grants permission to get a fleet
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetFleet.html
*/
toGetFleet() {
return this.to('GetFleet');
}
/**
* Grants permission to get a job
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetJob.html
*/
toGetJob() {
return this.to('GetJob');
}
/**
* Grants permission to get a license endpoint
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetLicenseEndpoint.html
*/
toGetLicenseEndpoint() {
return this.to('GetLicenseEndpoint');
}
/**
* Grants permission to get a limit
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetLimit.html
*/
toGetLimit() {
return this.to('GetLimit');
}
/**
* Grants permission to get a monitor
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetMonitor.html
*/
toGetMonitor() {
return this.to('GetMonitor');
}
/**
* Grants permission to get settings for a monitor
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetMonitorSettings.html
*/
toGetMonitorSettings() {
return this.to('GetMonitorSettings');
}
/**
* Grants permission to get a queue
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueue.html
*/
toGetQueue() {
return this.to('GetQueue');
}
/**
* Grants permission to get a queue environment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueueEnvironment.html
*/
toGetQueueEnvironment() {
return this.to('GetQueueEnvironment');
}
/**
* Grants permission to get a queue-fleet association
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueueFleetAssociation.html
*/
toGetQueueFleetAssociation() {
return this.to('GetQueueFleetAssociation');
}
/**
* Grants permission to get a queue-limit association
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueueLimitAssociation.html
*/
toGetQueueLimitAssociation() {
return this.to('GetQueueLimitAssociation');
}
/**
* Grants permission to get a session for a job
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetSession.html
*/
toGetSession() {
return this.to('GetSession');
}
/**
* Grants permission to get a session action for a job
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetSessionAction.html
*/
toGetSessionAction() {
return this.to('GetSessionAction');
}
/**
* Grants permission to get all collected statistics for sessions
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetSessionsStatisticsAggregation.html
*/
toGetSessionsStatisticsAggregation() {
return this.to('GetSessionsStatisticsAggregation');
}
/**
* Grants permission to get a step in a job
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStep.html
*/
toGetStep() {
return this.to('GetStep');
}
/**
* Grants permission to get a storage profile
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStorageProfile.html
*/
toGetStorageProfile() {
return this.to('GetStorageProfile');
}
/**
* Grants permission to get a storage profile for a queue
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStorageProfileForQueue.html
*/
toGetStorageProfileForQueue() {
return this.to('GetStorageProfileForQueue');
}
/**
* Grants permission to get a job task
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetTask.html
*/
toGetTask() {
return this.to('GetTask');
}
/**
* Grants permission to get a volume
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetVolume.html
*/
toGetVolume() {
return this.to('GetVolume');
}
/**
* Grants permission to get a worker
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetWorker.html
*/
toGetWorker() {
return this.to('GetWorker');
}
/**
* Grants permission to list all available metered products within a license endpoint
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListAvailableMeteredProducts.html
*/
toListAvailableMeteredProducts() {
return this.to('ListAvailableMeteredProducts');
}
/**
* Grants permission to list all budgets for a farm
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListBudgets.html
*/
toListBudgets() {
return this.to('ListBudgets');
}
/**
* Grants permission to list all members of a farm
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFarmMembers.html
*/
toListFarmMembers() {
return this.to('ListFarmMembers');
}
/**
* Grants permission to list all farms
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFarms.html
*/
toListFarms() {
return this.to('ListFarms');
}
/**
* Grants permission to list all members of a fleet
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFleetMembers.html
*/
toListFleetMembers() {
return this.to('ListFleetMembers');
}
/**
* Grants permission to list all fleets
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFleets.html
*/
toListFleets() {
return this.to('ListFleets');
}
/**
* Grants permission to list all members of a job
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListJobMembers.html
*/
toListJobMembers() {
return this.to('ListJobMembers');
}
/**
* Grants permission to get a job's parameter definitions in the job template
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListJobParameterDefinitions.html
*/
toListJobParameterDefinitions() {
return this.to('ListJobParameterDefinitions');
}
/**
* Grants permission to list all jobs in a queue
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListJobs.html
*/
toListJobs() {
return this.to('ListJobs');
}
/**
* Grants permission to list all license endpoints
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListLicenseEndpoints.html
*/
toListLicenseEndpoints() {
return this.to('ListLicenseEndpoints');
}
/**
* Grants permission to list all limits in a farm
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListLimits.html
*/
toListLimits() {
return this.to('ListLimits');
}
/**
* Grants permission to list all metered products in a license endpoint
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListMeteredProducts.html
*/
toListMeteredProducts() {
return this.to('ListMeteredProducts');
}
/**
* Grants permission to list all monitors
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListMonitors.html
*/
toListMonitors() {
return this.to('ListMonitors');
}
/**
* Grants permission to list all queue environments to which a queue is associated
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueEnvironments.html
*/
toListQueueEnvironments() {
return this.to('ListQueueEnvironments');
}
/**
* Grants permission to list all queue-fleet associations
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueFleetAssociations.html
*/
toListQueueFleetAssociations() {
return this.to('ListQueueFleetAssociations');
}
/**
* Grants permission to list all queue-limit associations
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueLimitAssociations.html
*/
toListQueueLimitAssociations() {
return this.to('ListQueueLimitAssociations');
}
/**
* Grants permission to list all members in a queue
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueMembers.html
*/
toListQueueMembers() {
return this.to('ListQueueMembers');
}
/**
* Grants permission to list all queues on a farm
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueues.html
*/
toListQueues() {
return this.to('ListQueues');
}
/**
* Grants permission to list all session actions for a job
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSessionActions.html
*/
toListSessionActions() {
return this.to('ListSessionActions');
}
/**
* Grants permission to list all sessions for a job
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSessions.html
*/
toListSessions() {
return this.to('ListSessions');
}
/**
* Grants permission to list all sessions for a worker
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSessionsForWorker.html
*/
toListSessionsForWorker() {
return this.to('ListSessionsForWorker');
}
/**
* Grants permission to list the step consumers for a job step
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStepConsumers.html
*/
toListStepConsumers() {
return this.to('ListStepConsumers');
}
/**
* Grants permission to list dependencies for a job step
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStepDependencies.html
*/
toListStepDependencies() {
return this.to('ListStepDependencies');
}
/**
* Grants permission to list all steps for a job
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSteps.html
*/
toListSteps() {
return this.to('ListSteps');
}
/**
* Grants permission to list all storage profiles in a farm
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStorageProfiles.html
*/
toListStorageProfiles() {
return this.to('ListStorageProfiles');
}
/**
* Grants permission to list all storage profiles in a queue
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStorageProfilesForQueue.html
*/
toListStorageProfilesForQueue() {
return this.to('ListStorageProfilesForQueue');
}
/**
* Grants permission to list all tags on specified Deadline Cloud resources
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list all tasks for a job
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListTasks.html
*/
toListTasks() {
return this.to('ListTasks');
}
/**
* Grants permission to list volumes
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListVolumes.html
*/
toListVolumes() {
return this.to('ListVolumes');
}
/**
* Grants permission to list all workers in a fleet
*
* Access Level: List
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListWorkers.html
*/
toListWorkers() {
return this.to('ListWorkers');
}
/**
* Grants permission to add a metered product to a license endpoint
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_PutMeteredProduct.html
*/
toPutMeteredProduct() {
return this.to('PutMeteredProduct');
}
/**
* Grants permission to search for jobs in multiple queues
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchJobs.html
*/
toSearchJobs() {
return this.to('SearchJobs');
}
/**
* Grants permission to search the steps within a single job or to search the steps for multiple queues
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchSteps.html
*/
toSearchSteps() {
return this.to('SearchSteps');
}
/**
* Grants permission to search the tasks within a single job or to search the tasks for multiple queues
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchTasks.html
*/
toSearchTasks() {
return this.to('SearchTasks');
}
/**
* Grants permission to search for workers in multiple fleets
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchWorkers.html
*/
toSearchWorkers() {
return this.to('SearchWorkers');
}
/**
* Grants permission to get all collected statistics for sessions
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_StartSessionsStatisticsAggregation.html
*/
toStartSessionsStatisticsAggregation() {
return this.to('StartSessionsStatisticsAggregation');
}
/**
* Grants permission to add or overwrite one or more tags for the specified Deadline Cloud resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to disassociate one or more tags from the specified Deadline Cloud resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update a budget
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateBudget.html
*/
toUpdateBudget() {
return this.to('UpdateBudget');
}
/**
* Grants permission to update a farm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateFarm.html
*/
toUpdateFarm() {
return this.to('UpdateFarm');
}
/**
* Grants permission to update a fleet
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateFleet.html
*/
toUpdateFleet() {
return this.to('UpdateFleet');
}
/**
* Grants permission to update a job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateJob.html
*/
toUpdateJob() {
return this.to('UpdateJob');
}
/**
* Grants permission to update a limit for a farm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateLimit.html
*/
toUpdateLimit() {
return this.to('UpdateLimit');
}
/**
* Grants permission to update a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateMonitor.html
*/
toUpdateMonitor() {
return this.to('UpdateMonitor');
}
/**
* Grants permission to update settings for a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateMonitorSettings.html
*/
toUpdateMonitorSettings() {
return this.to('UpdateMonitorSettings');
}
/**
* Grants permission to update a queue
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueue.html
*/
toUpdateQueue() {
return this.to('UpdateQueue');
}
/**
* Grants permission to update a queue environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueueEnvironment.html
*/
toUpdateQueueEnvironment() {
return this.to('UpdateQueueEnvironment');
}
/**
* Grants permission to update a queue-fleet association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueueFleetAssociation.html
*/
toUpdateQueueFleetAssociation() {
return this.to('UpdateQueueFleetAssociation');
}
/**
* Grants permission to update a queue-limit association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueueLimitAssociation.html
*/
toUpdateQueueLimitAssociation() {
return this.to('UpdateQueueLimitAssociation');
}
/**
* Grants permission to update a session for a job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateSession.html
*/
toUpdateSession() {
return this.to('UpdateSession');
}
/**
* Grants permission to update a step for a job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateStep.html
*/
toUpdateStep() {
return this.to('UpdateStep');
}
/**
* Grants permission to update a storage profile for a farm
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateStorageProfile.html
*/
toUpdateStorageProfile() {
return this.to('UpdateStorageProfile');
}
/**
* Grants permission to update a task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateTask.html
*/
toUpdateTask() {
return this.to('UpdateTask');
}
/**
* Grants permission to update a worker
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateWorker.html
*/
toUpdateWorker() {
return this.to('UpdateWorker');
}
/**
* Grants permission to update the schedule for a worker
*
* Access Level: Write
*
* https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateWorkerSchedule.html
*/
toUpdateWorkerSchedule() {
return this.to('UpdateWorkerSchedule');
}
/**
* Grants permission to get the latest version of an application
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/deadline-cloud-jobs.html
*/
toGetApplicationVersion() {
return this.to('GetApplicationVersion');
}
/**
* Grants permission to read job template
*
* Access Level: Read
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/working-with-deadline-monitor.html
*/
toGetJobTemplate() {
return this.to('GetJobTemplate');
}
/**
* Adds a resource of type budget to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/manage-costs.html
*
* @param farmId - Identifier for the farmId.
* @param budgetId - Identifier for the budgetId.
* @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()
* - .ifFarmMembershipLevels()
*/
onBudget(farmId, budgetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/budget/${budgetId}`);
}
/**
* Adds a resource of type farm to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/farms.html
*
* @param farmId - Identifier for the farmId.
* @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()
* - .ifFarmMembershipLevels()
*/
onFarm(farmId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}`);
}
/**
* Adds a resource of type fleet to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/manage-fleets.html
*
* @param farmId - Identifier for the farmId.
* @param fleetId - Identifier for the fleetId.
* @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()
* - .ifFarmMembershipLevels()
* - .ifFleetMembershipLevels()
*/
onFleet(farmId, fleetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/fleet/${fleetId}`);
}
/**
* Adds a resource of type job to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/deadline-cloud-jobs.html
*
* @param farmId - Identifier for the farmId.
* @param queueId - Identifier for the queueId.
* @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.
*
* Possible conditions:
* - .ifAwsResourceTag()
* - .ifFarmMembershipLevels()
* - .ifJobMembershipLevels()
* - .ifQueueMembershipLevels()
*/
onJob(farmId, queueId, jobId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/queue/${queueId}/job/${jobId}`);
}
/**
* Adds a resource of type license-endpoint to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/cmf-ubl.html
*
* @param licenseEndpointId - Identifier for the licenseEndpointId.
* @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()
*/
onLicenseEndpoint(licenseEndpointId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:license-endpoint/${licenseEndpointId}`);
}
/**
* Adds a resource of type monitor to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/working-with-deadline-monitor.html
*
* @param monitorId - Identifier for the monitorId.
* @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()
*/
onMonitor(monitorId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:monitor/${monitorId}`);
}
/**
* Adds a resource of type queue to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/queues.html
*
* @param farmId - Identifier for the farmId.
* @param queueId - Identifier for the queueId.
* @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()
* - .ifFarmMembershipLevels()
* - .ifQueueMembershipLevels()
*/
onQueue(farmId, queueId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/queue/${queueId}`);
}
/**
* Adds a resource of type volume to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/volumes.html
*
* @param farmId - Identifier for the farmId.
* @param fleetId - Identifier for the fleetId.
* @param volumeId - Identifier for the volumeId.
* @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()
* - .ifFarmMembershipLevels()
* - .ifFleetMembershipLevels()
*/
onVolume(farmId, fleetId, volumeId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/fleet/${fleetId}/volume/${volumeId}`);
}
/**
* Adds a resource of type worker to the statement
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam.html
*
* @param farmId - Identifier for the farmId.
* @param fleetId - Identifier for the fleetId.
* @param workerId - Identifier for the workerId.
* @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()
* - .ifFarmMembershipLevels()
* - .ifFleetMembershipLevels()
*/
onWorker(farmId, fleetId, workerId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/fleet/${fleetId}/worker/${workerId}`);
}
/**
* 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:
* - .toCreateBudget()
* - .toCreateFarm()
* - .toCreateFleet()
* - .toCreateJob()
* - .toCreateLicenseEndpoint()
* - .toCreateMonitor()
* - .toCreateQueue()
* - .toCreateWorker()
* - .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:
* - .toAssociateMemberToFarm()
* - .toAssociateMemberToFleet()
* - .toAssociateMemberToJob()
* - .toAssociateMemberToQueue()
* - .toAssumeFleetRoleForRead()
* - .toAssumeFleetRoleForWorker()
* - .toAssumeQueueRoleForRead()
* - .toAssumeQueueRoleForUser()
* - .toAssumeQueueRoleForWorker()
* - .toBatchGetJobEntity()
* - .toCopyJobTemplate()
* - .toCreateBudget()
* - .toCreateFarm()
* - .toCreateFleet()
* - .toCreateJob()
* - .toCreateLicenseEndpoint()
* - .toCreateLimit()
* - .toCreateMonitor()
* - .toCreateQueue()
* - .toCreateQueueEnvironment()
* - .toCreateQueueFleetAssociation()
* - .toCreateQueueLimitAssociation()
* - .toCreateStorageProfile()
* - .toCreateWorker()
* - .toDeleteBudget()
* - .toDeleteFarm()
* - .toDeleteFleet()
* - .toDeleteLicenseEndpoint()
* - .toDeleteLimit()
* - .toDeleteMeteredProduct()
* - .toDeleteMonitor()
* - .toDeleteQueue()
* - .toDeleteQueueEnvironment()
* - .toDeleteQueueFleetAssociation()
* - .toDeleteQueueLimitAssociation()
* - .toDeleteStorageProfile()
* - .toDeleteVolume()
* - .toDeleteWorker()
* - .toDisassociateMemberFromFarm()
* - .toDisassociateMemberFromFleet()
* - .toDisassociateMemberFromJob()
* - .toDisassociateMemberFromQueue()
* - .toGetBudget()
* - .toGetFarm()
* - .toGetFleet()
* - .toGetJob()
* - .toGetLicenseEndpoint()
* - .toGetLimit()
* - .toGetMonitor()
* - .toGetMonitorSettings()
* - .toGetQueue()
* - .toGetQueueEnvironment()
* - .toGetQueueFleetAssociation()
* - .toGetQueueLimitAssociation()
* - .toGetSession()
* - .toGetSessionAction()
* - .toGetSessionsStatisticsAggregation()
* - .toGetStep()
* - .toGetStorageProfile()
* - .toGetStorageProfileForQueue()
* - .toGetTask()
* - .toGetVolume()
* - .toGetWorker()
* - .toListBudgets()
* - .toListFarmMembers()
* - .toListFarms()
* - .toListFleetMembers()
* - .toListFleets()
* - .toListJobMembers()
* - .toListJobParameterDefinitions()
* - .toListJobs()
* - .toListLicenseEndpoints()
* - .toListLimits()
* - .toListMeteredProducts()
* - .toListMonitors()
* - .toListQueueEnvironments()
* - .toListQueueFleetAssociations()
* - .toListQueueLimitAssociations()
* - .toListQueueMembers()
* - .toListQueues()
* - .toListSessionActions()
* - .toListSessions()
* - .toListSessionsForWorker()
* - .toListStepConsumers()
* - .toListStepDependencies()
* - .toListSteps()
* - .toListStorageProfiles()
* - .toListStorageProfilesForQueue()
* - .toListTagsForResource()
* - .toListTasks()
* - .toListVolumes()
* - .toListWorkers()
* - .toPutMeteredProduct()
* - .toSearchJobs()
* - .toSearchSteps()
* - .toSearchTasks()
* - .toStartSessionsStatisticsAggregation()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateBudget()
* - .toUpdateFarm()
* - .toUpdateFleet()
* - .toUpdateJob()
* - .toUpdateLimit()
* - .toUpdateMonitor()
* - .toUpdateMonitorSettings()
* - .toUpdateQueue()
* - .toUpdateQueueEnvironment()
* - .toUpdateQueueFleetAssociation()
* - .toUpdateQueueLimitAssociation()
* - .toUpdateSession()
* - .toUpdateStep()
* - .toUpdateStorageProfile()
* - .toUpdateTask()
* - .toUpdateWorker()
* - .toUpdateWorkerSchedule()
* - .toGetApplicationVersion()
* - .toGetJobTemplate()
*
* Applies to resource types:
* - budget
* - farm
* - fleet
* - job
* - license-endpoint
* - monitor
* - queue
* - volume
* - worker
*
* @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:
* - .toCreateBudget()
* - .toCreateFarm()
* - .toCreateFleet()
* - .toCreateJob()
* - .toCreateLicenseEndpoint()
* - .toCreateMonitor()
* - .toCreateQueue()
* - .toCreateWorker()
* - .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 the associated membership level of the principal provided in the request
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toAssociateMemberToFarm()
* - .toAssociateMemberToFleet()
* - .toAssociateMemberToJob()
* - .toAssociateMemberToQueue()
* - .toDisassociateMemberFromFarm()
* - .toDisassociateMemberFromFleet()
* - .toDisassociateMemberFromJob()
* - .toDisassociateMemberFromQueue()
*
* @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`
*/
ifAssociatedMembershipLevel(value, operator) {
return this.if(`AssociatedMembershipLevel`, value, operator ?? 'StringLike');
}
/**
* Filters access by the allowed action in the request
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toListTagsForResource()
* - .toTagResource()
*
* @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`
*/
ifCalledAction(value, operator) {
return this.if(`CalledAction`, value, operator ?? 'StringLike');
}
/**
* Filters access by membership levels on the farm
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toAssociateMemberToFarm()
* - .toAssociateMemberToFleet()
* - .toAssociateMemberToJob()
* - .toAssociateMemberToQueue()
* - .toAssumeFleetRoleForRead()
* - .toAssumeFleetRoleForWorker()
* - .toAssumeQueueRoleForRead()
* - .toAssumeQueueRoleForUser()
* - .toAssumeQueueRoleForWorker()
* - .toBatchGetJobEntity()
* - .toCopyJobTemplate()
* - .toCreateBudget()
* - .toCreateFarm()
* - .toCreateFleet()
* - .toCreateJob()
* - .toCreateLimit()
* - .toCreateQueue()
* - .toCreateQueueEnvironment()
* - .toCreateQueueFleetAssociation()
* - .toCreateQueueLimitAssociation()
* - .toCreateStorageProfile()
* - .toCreateWorker()
* - .toDeleteBudget()
* - .toDeleteFarm()
* - .toDeleteFleet()
* - .toDeleteLimit()
* - .toDeleteQueue()
* - .toDeleteQueueEnvironment()
* - .toDeleteQueueFleetAssociation()
* - .toDeleteQueueLimitAssociation()
* - .toDeleteStorageProfile()
* - .toDeleteVolume()
* - .toDeleteWorker()
* - .toDisassociateMemberFromFarm()
* - .toDisassociateMemberFromFleet()
* - .toDisassociateMemberFromJob()
* - .toDisassociateMemberFromQueue()
* - .toGetBudget()
* - .toGetFarm()
* - .toGetFleet()
* - .toGetJob()
* - .toGetLimit()
* - .toGetQueue()
* - .toGetQueueEnvironment()
* - .toGetQueueFleetAssociation()
* - .toGetQueueLimitAssociation()
* - .toGetSession()
* - .toGetSessionAction()
* - .toGetSessionsStatisticsAggregation()
* - .toGetStep()
* - .toGetStorageProfile()
* - .toGetStorageProfileForQueue()
* - .toGetTask()
* - .toGetVolume()
* - .toGetWorker()
* - .toListBudgets()
* - .toListFarmMembers()
* - .toListFarms()
* - .toListFleetMembers()
* - .toListFleets()
* - .toListJobMembers()
* - .toListJobParameterDefinitions()
* - .toListJobs()
* - .toListLimits()
* - .toListQueueEnvironments()
* - .toListQueueFleetAssociations()
* - .toListQueueLimitAssociations()
* - .toListQueueMembers()
* - .toListQueues()
* - .toListSessionActions()
* - .toListSessions()
* - .toListSessionsForWorker()
* - .toListStepConsumers()
* - .toListStepDependencies()
* - .toListSteps()
* - .toListStorageProfiles()
* - .toListStorageProfilesForQueue()
* - .toListTagsForResource()
* - .toListTasks()
* - .toListVolumes()
* - .toListWorkers()
* - .toSearchJobs()
* - .toSearchSteps()
* - .toSearchTasks()
* - .toStartSessionsStatisticsAggregation()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateBudget()
* - .toUpdateFarm()
* - .toUpdateFleet()
* - .toUpdateJob()
* - .toUpdateLimit()
* - .toUpdateQueue()
* - .toUpdateQueueEnvironment()
* - .toUpdateQueueFleetAssociation()
* - .toUpdateQueueLimitAssociation()
* - .toUpdateSession()
* - .toUpdateStep()
* - .toUpdateStorageProfile()
* - .toUpdateTask()
* - .toUpdateWorker()
* - .toUpdateWorkerSchedule()
* - .toGetJobTemplate()
*
* Applies to resource types:
* - budget
* - farm
* - fleet
* - job
* - queue
* - volume
* - worker
*
* @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`
*/
ifFarmMembershipLevels(value, operator) {
return this.if(`FarmMembershipLevels`, value, operator ?? 'StringLike');
}
/**
* Filters access by membership levels on the fleet
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toAssociateMemberToFleet()
* - .toAssumeFleetRoleForRead()
* - .toAssumeFleetRoleForWorker()
* - .toAssumeQueueRoleForWorker()
* - .toBatchGetJobEntity()
* - .toCreateFleet()
* - .toCreateQueueFleetAssociation()
* - .toCreateWorker()
* - .toDeleteFleet()
* - .toDeleteQueueFleetAssociation()
* - .toDeleteVolume()
* - .toDeleteWorker()
* - .toDisassociateMemberFromFleet()
* - .toGetFleet()
* - .toGetQueueFleetAssociation()
* - .toGetSessionsStatisticsAggregation()
* - .toGetVolume()
* - .toGetWorker()
* - .toListFleetMembers()
* - .toListFleets()
* - .toListQueueFleetAssociations()
* - .toListSessionsForWorker()
* - .toListTagsForResource()
* - .toListVolumes()
* - .toListWorkers()
* - .toStartSessionsStatisticsAggregation()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateFleet()
* - .toUpdateQueueFleetAssociation()
* - .toUpdateWorker()
* - .toUpdateWorkerSchedule()
*
* Applies to resource types:
* - fleet
* - volume
* - worker
*
* @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`
*/
ifFleetMembershipLevels(value, operator) {
return this.if(`FleetMembershipLevels`, value, operator ?? 'StringLike');
}
/**
* Filters access by membership levels on the job
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toAssociateMemberToJob()
* - .toCopyJobTemplate()
* - .toCreateJob()
* - .toDisassociateMemberFromJob()
* - .toGetJob()
* - .toGetSession()
* - .toGetSessionAction()
* - .toGetStep()
* - .toGetTask()
* - .toListJobMembers()
* - .toListJobParameterDefinitions()
* - .toListJobs()
* - .toListSessionActions()
* - .toListSessions()
* - .toListStepConsumers()
* - .toListStepDependencies()
* - .toListSteps()
* - .toListTagsForResource()
* - .toListTasks()
* - .toSearchSteps()
* - .toSearchTasks()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateJob()
* - .toUpdateSession()
* - .toUpdateStep()
* - .toUpdateTask()
* - .toGetJobTemplate()
*
* Applies to resource types:
* - job
*
* @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`
*/
ifJobMembershipLevels(value, operator) {
return this.if(`JobMembershipLevels`, value, operator ?? 'StringLike');
}
/**
* Filters access by the membership level passed in the request
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toAssociateMemberToFarm()
* - .toAssociateMemberToFleet()
* - .toAssociateMemberToJob()
* - .toAssociateMemberToQueue()
*
* @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`
*/
ifMembershipLevel(value, operator) {
return this.if(`MembershipLevel`, value, operator ?? 'StringLike');
}
/**
* Filters access by the principle ID provided in the request
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toListFarms()
* - .toListFleets()
* - .toListJobs()
* - .toListQueues()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPrincipalId(value, operator) {
return this.if(`PrincipalId`, value, operator ?? 'StringLike');
}
/**
* Filters access by membership levels on the queue
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toAssociateMemberToJob()
* - .toAssociateMemberToQueue()
* - .toAssumeQueueRoleForRead()
* - .toAssumeQueueRoleForUser()
* - .toAssumeQueueRoleForWorker()
* - .toCopyJobTemplate()
* - .toCreateJob()
* - .toCreateQueue()
* - .toCreateQueueEnvironment()
* - .toCreateQueueFleetAssociation()
* - .toCreateQueueLimitAssociation()
* - .toDeleteQueue()
* - .toDeleteQueueEnvironment()
* - .toDeleteQueueFleetAssociation()
* - .toDeleteQueueLimitAssociation()
* - .toDisassociateMemberFromJob()
* - .toDisassociateMemberFromQueue()
* - .toGetJob()
* - .toGetQueue()
* - .toGetQueueEnvironment()
* - .toGetQueueFleetAssociation()
* - .toGetQueueLimitAssociation()
* - .toGetSession()
* - .toGetSessionAction()
* - .toGetSessionsStatisticsAggregation()
* - .toGetStep()
* - .toGetStorageProfileForQueue()
* - .toGetTask()
* - .toListJobMembers()
* - .toListJobParameterDefinitions()
* - .toListJobs()
* - .toListQueueEnvironments()
* - .toListQueueFleetAssociations()
* - .toListQueueLimitAssociations()
* - .toListQueueMembers()
* - .toListQueues()
* - .toListSessionActions()
* - .toListSessions()
* - .toListStepConsumers()
* - .toListStepDependencies()
* - .toListSteps()
* - .toListStorageProfilesForQueue()
* - .toListTagsForResource()
* - .toListTasks()
* - .toSearchJobs()
* - .toSearchSteps()
* - .toSearchTasks()
* - .toStartSessionsStatisticsAggregation()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateJob()
* - .toUpdateQueue()
* - .toUpdateQueueEnvironment()
* - .toUpdateQueueFleetAssociation()
* - .toUpdateQueueLimitAssociation()
* - .toUpdateSession()
* - .toUpdateStep()
* - .toUpdateTask()
* - .toGetJobTemplate()
*
* Applies to resource types:
* - job
* - queue
*
* @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`
*/
ifQueueMembershipLevels(value, operator) {
return this.if(`QueueMembershipLevels`, value, operator ?? 'StringLike');
}
/**
* Filters access by the user calling the Deadline Cloud API
*
* https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
*
* Applies to actions:
* - .toListFarms()
* - .toListFleets()
* - .toListJobs()
* - .toListQueues()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRequesterPrincipalId(value, operator) {
return this.if(`RequesterPrincipalId`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [deadline](https://docs.aws.amazon.com/service-authorization/latest/reference/list_deadline.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'deadline';
this.accessLevelList = {
'Permissions management': [
'AssociateMemberToFarm',
'AssociateMemberToFleet',
'AssociateMemberToJob',
'AssociateMemberToQueue',
'DisassociateMemberFromFarm',
'DisassociateMemberFromFleet',
'DisassociateMemberFromJob',
'DisassociateMemberFromQueue'
],
Write: [
'AssociateMemberToFarm',
'AssociateMemberToFleet',
'AssociateMemberToJob',
'AssociateMemberToQueue',
'AssumeFleetRoleForRead',
'AssumeFleetRoleForWorker',
'AssumeQueueRoleForRead',
'AssumeQueueRoleForUser',
'AssumeQueueRoleForWorker',
'CopyJobTemplate',
'CreateBudget',
'CreateFarm',
'CreateFleet',
'CreateJob',
'CreateLicenseEndpoint',
'CreateLimit',
'CreateMonitor',
'CreateQueue',
'CreateQueueEnvironment',
'CreateQueueFleetAssociation',
'CreateQueueLimitAssociation',
'CreateStorageProfile',
'CreateWorker',
'DeleteBudget',
'DeleteFarm',
'DeleteFleet',
'DeleteLicenseEndpoint',
'DeleteLimit',
'DeleteMeteredProduct',
'DeleteMonitor',
'DeleteQueue',
'DeleteQueueEnvironment',
'DeleteQueueFleetAssociation',
'DeleteQueueLimitAssociation',
'DeleteStorageProfile',
'DeleteVolume',
'DeleteWorker',
'DisassociateMemberFromFarm',
'DisassociateMemberFromFleet',
'DisassociateMemberFromJob',
'DisassociateMemberFromQueue',
'PutMeteredProduct',
'TagResource',
'UntagResource',
'UpdateBudget',
'UpdateFarm',
'UpdateFleet',
'UpdateJob',
'UpdateLimit',
'UpdateMonitor',
'UpdateMonitorSettings',
'UpdateQueue',
'UpdateQueueEnvironment',
'UpdateQueueFleetAssociation',
'UpdateQueueLimitAssociation',
'UpdateSession',
'UpdateStep',
'UpdateStorageProfile',
'UpdateTask',
'UpdateWorker',
'UpdateWorkerSchedule'
],
Read: [
'BatchGetJobEntity',
'GetBudget',
'GetFarm',
'GetFleet',
'GetJob',
'GetLicenseEndpoint',
'GetLimit',
'GetMonitor',
'GetMonitorSettings',
'GetQueue',
'GetQueueEnvironment',
'GetQueueFleetAssociation',
'GetQueueLimitAssociation',
'GetSession',
'GetSessionAction',
'GetSessionsStatisticsAggregation',
'GetStep',
'GetStorageProfile',
'GetStorageProfileForQueue',
'GetTask',
'GetVolume',
'GetWorker',
'ListTagsForResource',
'SearchJobs',
'SearchSteps',
'SearchTasks',
'SearchWorkers',
'StartSessionsStatisticsAggregation',
'GetApplicationVersion',
'GetJobTemplate'
],
List: [
'ListAvailableMeteredProducts',
'ListBudgets',
'ListFarmMembers',
'ListFarms',
'ListFleetMembers',
'ListFleets',
'ListJobMembers',
'ListJobParameterDefinitions',
'ListJobs',
'ListLicenseEndpoints',
'ListLimits',
'ListMeteredProducts',
'ListMonitors',
'ListQueueEnvironments',
'ListQueueFleetAssociations',
'ListQueueLimitAssociations',
'ListQueueMembers',
'ListQueues',
'ListSessionActions',
'ListSessions',
'ListSessionsForWorker',
'ListStepConsumers',
'ListStepDependencies',
'ListSteps',
'ListStorageProfiles',
'ListStorageProfilesForQueue',
'ListTasks',
'ListVolumes',
'ListWorkers'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Deadline = Deadline;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZWFkbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsUUFBUyxTQUFRLHdCQUFlO0lBRzNDOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFD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QUNaLGdCQUFnQjtnQkFDaEIsNkJBQTZCO2dCQUM3QixVQUFVO2dCQUNWLHNCQUFzQjtnQkFDdEIsWUFBWTtnQkFDWixxQkFBcUI7Z0JBQ3JCLGNBQWM7Z0JBQ2QsdUJBQXVCO2dCQUN2Qiw0QkFBNEI7Z0JBQzVCLDRCQUE0QjtnQkFDNUIsa0JBQWtCO2dCQUNsQixZQUFZO2dCQUNaLG9CQUFvQjtnQkFDcEIsY0FBYztnQkFDZCx1QkFBdUI7Z0JBQ3ZCLG1CQUFtQjtnQkFDbkIsc0JBQXNCO2dCQUN0QixXQUFXO2dCQUNYLHFCQUFxQjtnQkFDckIsNkJBQTZCO2dCQUM3QixXQUFXO2dCQUNYLGFBQWE7Z0JBQ2IsYUFBYTthQUNkO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUE4dkJGLENBQUM7Q0FDRjtBQXZyRUQsNEJBdXJFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbZGVhZGxpbmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2RlYWRsaW5lLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgRGVhZGxpbmUgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdkZWFkbGluZSc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIG1lbWJlciB0byBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlTWVtYmVyVG9GYXJtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlTWVtYmVyVG9GYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGEgbWVtYmVyIHRvIGEgZmxlZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlTWVtYmVyVG9GbGVldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVNZW1iZXJUb0ZsZWV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVNZW1iZXJUb0ZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGEgbWVtYmVyIHRvIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZU1lbWJlclRvSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZU1lbWJlclRvSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVNZW1iZXJUb0pvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIG1lbWJlciB0byBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZU1lbWJlclRvUXVldWUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlTWVtYmVyVG9RdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlTWVtYmVyVG9RdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc3VtZSBhIGZsZWV0IHJvbGUgZm9yIHJlYWQtb25seSBhY2Nlc3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lRmxlZXRSb2xlRm9yUmVhZC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3N1bWVGbGVldFJvbGVGb3JSZWFkKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3N1bWVGbGVldFJvbGVGb3JSZWFkJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzdW1lIGEgZmxlZXQgcm9sZSBmb3IgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lRmxlZXRSb2xlRm9yV29ya2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc3VtZUZsZWV0Um9sZUZvcldvcmtlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzdW1lRmxlZXRSb2xlRm9yV29ya2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzdW1lIGEgcXVldWUgcm9sZSBmb3IgcmVhZC1vbmx5IGFjY2Vzc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3N1bWVRdWV1ZVJvbGVGb3JSZWFkLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3N1bWUgYSBxdWV1ZSByb2xlIGZvciBhIHVzZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lUXVldWVSb2xlRm9yVXNlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3N1bWVRdWV1ZVJvbGVGb3JVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3N1bWVRdWV1ZVJvbGVGb3JVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzdW1lIGEgcXVldWUgcm9sZSBmb3IgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lUXVldWVSb2xlRm9yV29ya2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzdW1lUXVldWVSb2xlRm9yV29ya2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgam9iIGVudGl0eSBmb3IgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9CYXRjaEdldEpvYkVudGl0eS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldEpvYkVudGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRKb2JFbnRpdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjb3B5IGEgam9iIHRlbXBsYXRlIHRvIGFuIEFtYXpvbiBTMyBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ29weUpvYlRlbXBsYXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NvcHlKb2JUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ29weUpvYlRlbXBsYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgYnVkZ2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUJ1ZGdldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVCdWRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUJ1ZGdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRmFybS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVGYXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVGYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgZmxlZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRmxlZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpY2Vuc2UgZW5kcG9pbnQgZm9yIGxpY2Vuc2VkIHNvZnR3YXJlIG9yIHByb2R1Y3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUxpY2Vuc2VFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMaWNlbnNlRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpbWl0IGZvciBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlTGltaXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTGltaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUxpbWl0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVNb25pdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU1vbml0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU1vbml0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVRdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUXVldWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZUVudmlyb25tZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVF1ZXVlRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVF1ZXVlRW52aXJvbm1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUXVldWVGbGVldEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZS1saW1pdCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBzdG9yYWdlIHByb2ZpbGUgZm9yIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVTdG9yYWdlUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTdG9yYWdlUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlU3RvcmFnZVByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlV29ya2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVdvcmtlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlV29ya2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgYnVkZ2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUJ1ZGdldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVCdWRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUJ1ZGdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRmFybS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVGYXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVGYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgZmxlZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRmxlZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbGljZW5zZSBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMaWNlbnNlRW5kcG9pbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTGljZW5zZUVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMaWNlbnNlRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBsaW1pdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMaW1pdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMaW1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTGltaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBtZXRlcmVkIHByb2R1Y3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTWV0ZXJlZFByb2R1Y3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTWV0ZXJlZFByb2R1Y3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU1ldGVyZWRQcm9kdWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVNb25pdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1vbml0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU1vbml0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVRdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUXVldWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZUVudmlyb25tZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUXVldWVGbGVldEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZS1saW1pdCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBzdG9yYWdlIHByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU3RvcmFnZVByb2ZpbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU3RvcmFnZVByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVN0b3JhZ2VQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdm9sdW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVZvbHVtZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVWb2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVZvbHVtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHdvcmtlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVXb3JrZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlV29ya2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVXb3JrZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBtZW1iZXIgZnJvbSBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZhcm0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZhcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgbWVtYmVyIGZyb20gYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFBlcm1pc3Npb25zIG1hbmFnZW1lbnQsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZsZWV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBtZW1iZXIgZnJvbSBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFBlcm1pc3Npb25zIG1hbmFnZW1lbnQsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBtZW1iZXIgZnJvbSBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGJ1ZGdldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEJ1ZGdldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRCdWRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEJ1ZGdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRGYXJtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEZhcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEZhcm0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEZsZWV0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEZsZWV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRGbGVldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRMaWNlbnNlRW5kcG9pbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGljZW5zZUVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMaWNlbnNlRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaW1pdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldExpbWl0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldExpbWl0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMaW1pdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIG1vbml0b3JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRNb25pdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE1vbml0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vbml0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgc2V0dGluZ3MgZm9yIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldE1vbml0b3JTZXR0aW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNb25pdG9yU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vbml0b3JTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UXVldWUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXVlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgcXVldWUgZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRRdWV1ZUVudmlyb25tZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXVlRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXVlRW52aXJvbm1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHF1ZXVlLWxpbWl0IGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXVlTGltaXRBc3NvY2lhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgc2Vzc2lvbiBmb3IgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzZXNzaW9uIGFjdGlvbiBmb3IgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTZXNzaW9uQWN0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlc3Npb25BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlc3Npb25BY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYWxsIGNvbGxlY3RlZCBzdGF0aXN0aWNzIGZvciBzZXNzaW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHN0ZXAgaW4gYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdGVwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0ZXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN0ZXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzdG9yYWdlIHByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdG9yYWdlUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTdG9yYWdlUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3RvcmFnZVByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzdG9yYWdlIHByb2ZpbGUgZm9yIGEgcXVldWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdG9yYWdlUHJvZmlsZUZvclF1ZXVlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBqb2IgdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHZvbHVtZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFZvbHVtZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRWb2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFZvbHVtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHdvcmtlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFdvcmtlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRXb3JrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFdvcmtlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIGF2YWlsYWJsZSBtZXRlcmVkIHByb2R1Y3RzIHdpdGhpbiBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QXZhaWxhYmxlTWV0ZXJlZFByb2R1Y3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBdmFpbGFibGVNZXRlcmVkUHJvZHVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBdmFpbGFibGVNZXRlcmVkUHJvZHVjdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBidWRnZXRzIGZvciBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QnVkZ2V0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QnVkZ2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJ1ZGdldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBtZW1iZXJzIG9mIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RGYXJtTWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmFybU1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RGYXJtTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIGZhcm1zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEZhcm1zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RGYXJtcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEZhcm1zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbWVtYmVycyBvZiBhIGZsZWV0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEZsZWV0TWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmxlZXRNZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RmxlZXRNZW1iZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgZmxlZXRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEZsZWV0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmxlZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RmxlZXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbWVtYmVycyBvZiBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RKb2JNZW1iZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RKb2JNZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Sm9iTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGpvYidzIHBhcmFtZXRlciBkZWZpbml0aW9ucyBpbiB0aGUgam9iIHRlbXBsYXRlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEpvYlBhcmFtZXRlckRlZmluaXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEpvYlBhcmFtZXRlckRlZmluaXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgam9icyBpbiBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEpvYnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RKb2JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbGljZW5zZSBlbmRwb2ludHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0TGljZW5zZUVuZHBvaW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TGljZW5zZUVuZHBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdExpY2Vuc2VFbmRwb2ludHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBsaW1pdHMgaW4gYSBmYXJtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdExpbWl0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TGltaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TGltaXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbWV0ZXJlZCBwcm9kdWN0cyBpbiBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0TWV0ZXJlZFByb2R1Y3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RNZXRlcmVkUHJvZHVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RNZXRlcmVkUHJvZHVjdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBtb25pdG9yc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RNb25pdG9ycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TW9uaXRvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RNb25pdG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHF1ZXVlIGVudmlyb25tZW50cyB0byB3aGljaCBhIHF1ZXVlIGlzIGFzc29jaWF0ZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVFbnZpcm9ubWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFF1ZXVlRW52aXJvbm1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UXVldWVFbnZpcm9ubWVudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFF1ZXVlRmxlZXRBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBxdWV1ZS1saW1pdCBhc3NvY2lhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVMaW1pdEFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UXVldWVMaW1pdEFzc29jaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFF1ZXVlTGltaXRBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBtZW1iZXJzIGluIGEgcXVldWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVNZW1iZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RRdWV1ZU1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RRdWV1ZU1lbWJlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBxdWV1ZXMgb24gYSBmYXJtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFF1ZXVlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UXVldWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgc2Vzc2lvbiBhY3Rpb25zIGZvciBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9uQWN0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvbkFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9uQWN0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHNlc3Npb25zIGZvciBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHNlc3Npb25zIGZvciBhIHdvcmtlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9uc0Zvcldvcmtlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvbnNGb3JXb3JrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9uc0ZvcldvcmtlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHN0ZXAgY29uc3VtZXJzIGZvciBhIGpvYiBzdGVwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFN0ZXBDb25zdW1lcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN0ZXBDb25zdW1lcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTdGVwQ29uc3VtZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBkZXBlbmRlbmNpZXMgZm9yIGEgam9iIHN0ZXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U3RlcERlcGVuZGVuY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U3RlcERlcGVuZGVuY2llcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFN0ZXBEZXBlbmRlbmNpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBzdGVwcyBmb3IgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U3RlcHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN0ZXBzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U3RlcHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBzdG9yYWdlIHByb2ZpbGVzIGluIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdG9yYWdlUHJvZmlsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN0b3JhZ2VQcm9maWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFN0b3JhZ2VQcm9maWxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHN0b3JhZ2UgcHJvZmlsZXMgaW4gYSBxdWV1ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U3RvcmFnZVByb2ZpbGVzRm9yUXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRhZ3Mgb24gc3BlY2lmaWVkIERlYWRsaW5lIENsb3VkIHJlc291cmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRhc2tzIGZvciBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYXNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgdm9sdW1lc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RWb2x1bWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RWb2x1bWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Vm9sdW1lcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHdvcmtlcnMgaW4gYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RXb3JrZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RXb3JrZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0V29ya2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCBhIG1ldGVyZWQgcHJvZHVjdCB0byBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0TWV0ZXJlZFByb2R1Y3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0TWV0ZXJlZFByb2R1Y3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dE1ldGVyZWRQcm9kdWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciBqb2JzIGluIG11bHRpcGxlIHF1ZXVlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1NlYXJjaEpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoSm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoSm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCB0aGUgc3RlcHMgd2l0aGluIGEgc2luZ2xlIGpvYiBvciB0byBzZWFyY2ggdGhlIHN0ZXBzIGZvciBtdWx0aXBsZSBxdWV1ZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TZWFyY2hTdGVwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hTdGVwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoU3RlcHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggdGhlIHRhc2tzIHdpdGhpbiBhIHNpbmdsZSBqb2Igb3IgdG8gc2VhcmNoIHRoZSB0YXNrcyBmb3IgbXVsdGlwbGUgcXVldWVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU2VhcmNoVGFza3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoVGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlYXJjaFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciB3b3JrZXJzIGluIG11bHRpcGxlIGZsZWV0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1NlYXJjaFdvcmtlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoV29ya2VycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoV29ya2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhbGwgY29sbGVjdGVkIHN0YXRpc3RpY3MgZm9yIHNlc3Npb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIG9yIG92ZXJ3cml0ZSBvbmUgb3IgbW9yZSB0YWdzIGZvciB0aGUgc3BlY2lmaWVkIERlYWRsaW5lIENsb3VkIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1RhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBvbmUgb3IgbW9yZSB0YWdzIGZyb20gdGhlIHNwZWNpZmllZCBEZWFkbGluZSBDbG91ZCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBidWRnZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlQnVkZ2V0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUJ1ZGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQnVkZ2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVGYXJtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUZhcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUZhcm0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVGbGVldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVGbGVldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRmxlZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgbGltaXQgZm9yIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVMaW1pdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVMaW1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTGltaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBtb25pdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZU1vbml0b3IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTW9uaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTW9uaXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBzZXR0aW5ncyBmb3IgYSBtb25pdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZU1vbml0b3JTZXR0aW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVNb25pdG9yU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU1vbml0b3JTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVF1ZXVlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVRdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlRW52aXJvbm1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUXVldWVFbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUXVldWVFbnZpcm9ubWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlLWZsZWV0IGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlLWxpbWl0IGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHNlc3Npb24gZm9yIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVNlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHN0ZXAgZm9yIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVN0ZXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlU3RlcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHN0b3JhZ2UgcHJvZmlsZSBmb3IgYSBmYXJtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVN0b3JhZ2VQcm9maWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVN0b3JhZ2VQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVTdG9yYWdlUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgd29ya2VyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVdvcmtlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVXb3JrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVdvcmtlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgc2NoZWR1bGUgZm9yIGEgd29ya2VyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVdvcmtlclNjaGVkdWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVdvcmtlclNjaGVkdWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVXb3JrZXJTY2hlZHVsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYW4gYXBwbGljYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL2RlYWRsaW5lLWNsb3VkLWpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QXBwbGljYXRpb25WZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBcHBsaWNhdGlvblZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWFkIGpvYiB0ZW1wbGF0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvd29ya2luZy13aXRoLWRlYWRsaW5lLW1vbml0b3IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Sm9iVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEpvYlRlbXBsYXRlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgJ1Blcm1pc3Npb25zIG1hbmFnZW1lbnQnOiBbXG4gICAgICAnQXNzb2NpYXRlTWVtYmVyVG9GYXJtJyxcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb0ZsZWV0JyxcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb0pvYicsXG4gICAgICAnQXNzb2NpYXRlTWVtYmVyVG9RdWV1ZScsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZhcm0nLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GbGVldCcsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUpvYicsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbVF1ZXVlJ1xuICAgIF0sXG4gICAgV3JpdGU6IFtcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb0Zhcm0nLFxuICAgICAgJ0Fzc29jaWF0ZU1lbWJlclRvRmxlZXQnLFxuICAgICAgJ0Fzc29jaWF0ZU1lbWJlclRvSm9iJyxcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb1F1ZXVlJyxcbiAgICAgICdBc3N1bWVGbGVldFJvbGVGb3JSZWFkJyxcbiAgICAgICdBc3N1bWVGbGVldFJvbGVGb3JXb3JrZXInLFxuICAgICAgJ0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQnLFxuICAgICAgJ0Fzc3VtZVF1ZXVlUm9sZUZvclVzZXInLFxuICAgICAgJ0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcicsXG4gICAgICAnQ29weUpvYlRlbXBsYXRlJyxcbiAgICAgICdDcmVhdGVCdWRnZXQnLFxuICAgICAgJ0NyZWF0ZUZhcm0nLFxuICAgICAgJ0NyZWF0ZUZsZWV0JyxcbiAgICAgICdDcmVhdGVKb2InLFxuICAgICAgJ0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCcsXG4gICAgICAnQ3JlYXRlTGltaXQnLFxuICAgICAgJ0NyZWF0ZU1vbml0b3InLFxuICAgICAgJ0NyZWF0ZVF1ZXVlJyxcbiAgICAgICdDcmVhdGVRdWV1ZUVudmlyb25tZW50JyxcbiAgICAgICdDcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nLFxuICAgICAgJ0NyZWF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbicsXG4gICAgICAnQ3JlYXRlU3RvcmFnZVByb2ZpbGUnLFxuICAgICAgJ0NyZWF0ZVdvcmtlcicsXG4gICAgICAnRGVsZXRlQnVkZ2V0JyxcbiAgICAgICdEZWxldGVGYXJtJyxcbiAgICAgICdEZWxldGVGbGVldCcsXG4gICAgICAnRGVsZXRlTGljZW5zZUVuZHBvaW50JyxcbiAgICAgICdEZWxldGVMaW1pdCcsXG4gICAgICAnRGVsZXRlTWV0ZXJlZFByb2R1Y3QnLFxuICAgICAgJ0RlbGV0ZU1vbml0b3InLFxuICAgICAgJ0RlbGV0ZVF1ZXVlJyxcbiAgICAgICdEZWxldGVRdWV1ZUVudmlyb25tZW50JyxcbiAgICAgICdEZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nLFxuICAgICAgJ0RlbGV0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbicsXG4gICAgICAnRGVsZXRlU3RvcmFnZVByb2ZpbGUnLFxuICAgICAgJ0RlbGV0ZVZvbHVtZScsXG4gICAgICAnRGVsZXRlV29ya2VyJyxcbiAgICAgICdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmFybScsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZsZWV0JyxcbiAgICAgICdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iJyxcbiAgICAgICdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUnLFxuICAgICAgJ1B1dE1ldGVyZWRQcm9kdWN0JyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlQnVkZ2V0JyxcbiAgICAgICdVcGRhdGVGYXJtJyxcbiAgICAgICdVcGRhdGVGbGVldCcsXG4gICAgICAnVXBkYXRlSm9iJyxcbiAgICAgICdVcGRhdGVMaW1pdCcsXG4gICAgICAnVXBkYXRlTW9uaXRvcicsXG4gICAgICAnVXBkYXRlTW9uaXRvclNldHRpbmdzJyxcbiAgICAgICdVcGRhdGVRdWV1ZScsXG4gICAgICAnVXBkYXRlUXVldWVFbnZpcm9ubWVudCcsXG4gICAgICAnVXBkYXRlUXVldWVGbGVldEFzc29jaWF0aW9uJyxcbiAgICAgICdVcGRhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24nLFxuICAgICAgJ1VwZGF0ZVNlc3Npb24nLFxuICAgICAgJ1VwZGF0ZVN0ZXAnLFxuICAgICAgJ1VwZGF0ZVN0b3JhZ2VQcm9maWxlJyxcbiAgICAgICdVcGRhdGVUYXNrJyxcbiAgICAgICdVcGRhdGVXb3JrZXInLFxuICAgICAgJ1VwZGF0ZVdvcmtlclNjaGVkdWxlJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0JhdGNoR2V0Sm9iRW50aXR5JyxcbiAgICAgICdHZXRCdWRnZXQnLFxuICAgICAgJ0dldEZhcm0nLFxuICAgICAgJ0dldEZsZWV0JyxcbiAgICAgICdHZXRKb2InLFxuICAgICAgJ0dldExpY2Vuc2VFbmRwb2ludCcsXG4gICAgICAnR2V0TGltaXQnLFxuICAgICAgJ0dldE1vbml0b3InLFxuICAgICAgJ0dldE1vbml0b3JTZXR0aW5ncycsXG4gICAgICAnR2V0UXVldWUnLFxuICAgICAgJ0dldFF1ZXVlRW52aXJvbm1lbnQnLFxuICAgICAgJ0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbicsXG4gICAgICAnR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uJyxcbiAgICAgICdHZXRTZXNzaW9uJyxcbiAgICAgICdHZXRTZXNzaW9uQWN0aW9uJyxcbiAgICAgICdHZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbicsXG4gICAgICAnR2V0U3RlcCcsXG4gICAgICAnR2V0U3RvcmFnZVByb2ZpbGUnLFxuICAgICAgJ0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUnLFxuICAgICAgJ0dldFRhc2snLFxuICAgICAgJ0dldFZvbHVtZScsXG4gICAgICAnR2V0V29ya2VyJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJyxcbiAgICAgICdTZWFyY2hKb2JzJyxcbiAgICAgICdTZWFyY2hTdGVwcycsXG4gICAgICAnU2VhcmNoVGFza3MnLFxuICAgICAgJ1NlYXJjaFdvcmtlcnMnLFxuICAgICAgJ1N0YXJ0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24nLFxuICAgICAgJ0dldEFwcGxpY2F0aW9uVmVyc2lvbicsXG4gICAgICAnR2V0Sm9iVGVtcGxhdGUnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEF2YWlsYWJsZU1ldGVyZWRQcm9kdWN0cycsXG4gICAgICAnTGlzdEJ1ZGdldHMnLFxuICAgICAgJ0xpc3RGYXJtTWVtYmVycycsXG4gICAgICAnTGlzdEZhcm1zJyxcbiAgICAgICdMaXN0RmxlZXRNZW1iZXJzJyxcbiAgICAgICdMaXN0RmxlZXRzJyxcbiAgICAgICdMaXN0Sm9iTWVtYmVycycsXG4gICAgICAnTGlzdEpvYlBhcmFtZXRlckRlZmluaXRpb25zJyxcbiAgICAgICdMaXN0Sm9icycsXG4gICAgICAnTGlzdExpY2Vuc2VFbmRwb2ludHMnLFxuICAgICAgJ0xpc3RMaW1pdHMnLFxuICAgICAgJ0xpc3RNZXRlcmVkUHJvZHVjdHMnLFxuICAgICAgJ0xpc3RNb25pdG9ycycsXG4gICAgICAnTGlzdFF1ZXVlRW52aXJvbm1lbnRzJyxcbiAgICAgICdMaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucycsXG4gICAgICAnTGlzdFF1ZXVlTGltaXRBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0xpc3RRdWV1ZU1lbWJlcnMnLFxuICAgICAgJ0xpc3RRdWV1ZXMnLFxuICAgICAgJ0xpc3RTZXNzaW9uQWN0aW9ucycsXG4gICAgICAnTGlzdFNlc3Npb25zJyxcbiAgICAgICdMaXN0U2Vzc2lvbnNGb3JXb3JrZXInLFxuICAgICAgJ0xpc3RTdGVwQ29uc3VtZXJzJyxcbiAgICAgICdMaXN0U3RlcERlcGVuZGVuY2llcycsXG4gICAgICAnTGlzdFN0ZXBzJyxcbiAgICAgICdMaXN0U3RvcmFnZVByb2ZpbGVzJyxcbiAgICAgICdMaXN0U3RvcmFnZVByb2ZpbGVzRm9yUXVldWUnLFxuICAgICAgJ0xpc3RUYXNrcycsXG4gICAgICAnTGlzdFZvbHVtZXMnLFxuICAgICAgJ0xpc3RXb3JrZXJzJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgYnVkZ2V0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvbWFuYWdlLWNvc3RzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZhcm1JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmYXJtSWQuXG4gICAqIEBwYXJhbSBidWRnZXRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBidWRnZXRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICovXG4gIHB1YmxpYyBvbkJ1ZGdldChmYXJtSWQ6IHN0cmluZywgYnVkZ2V0SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfS9idWRnZXQvJHsgYnVkZ2V0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGZhcm0gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9mYXJtcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBmYXJtSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZmFybUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmRmFybU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uRmFybShmYXJtSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGZsZWV0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvbWFuYWdlLWZsZWV0cy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBmYXJtSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZmFybUlkLlxuICAgKiBAcGFyYW0gZmxlZXRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmbGVldElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmRmFybU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKiAtIC5pZkZsZWV0TWVtYmVyc2hpcExldmVscygpXG4gICAqL1xuICBwdWJsaWMgb25GbGVldChmYXJtSWQ6IHN0cmluZywgZmxlZXRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmRlYWRsaW5lOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpmYXJtLyR7IGZhcm1JZCB9L2ZsZWV0LyR7IGZsZWV0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGpvYiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL2RlYWRsaW5lLWNsb3VkLWpvYnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZmFybUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZhcm1JZC5cbiAgICogQHBhcmFtIHF1ZXVlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcXVldWVJZC5cbiAgICogQHBhcmFtIGpvYklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGpvYklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmRmFybU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKiAtIC5pZkpvYk1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKiAtIC5pZlF1ZXVlTWVtYmVyc2hpcExldmVscygpXG4gICAqL1xuICBwdWJsaWMgb25Kb2IoZmFybUlkOiBzdHJpbmcsIHF1ZXVlSWQ6IHN0cmluZywgam9iSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfS9xdWV1ZS8keyBxdWV1ZUlkIH0vam9iLyR7IGpvYklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBsaWNlbnNlLWVuZHBvaW50IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvY21mLXVibC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBsaWNlbnNlRW5kcG9pbnRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsaWNlbnNlRW5kcG9pbnRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTGljZW5zZUVuZHBvaW50KGxpY2Vuc2VFbmRwb2ludElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZGVhZGxpbmU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmxpY2Vuc2UtZW5kcG9pbnQvJHsgbGljZW5zZUVuZHBvaW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG1vbml0b3IgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS93b3JraW5nLXdpdGgtZGVhZGxpbmUtbW9uaXRvci5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBtb25pdG9ySWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbW9uaXRvcklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Nb25pdG9yKG1vbml0b3JJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmRlYWRsaW5lOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptb25pdG9yLyR7IG1vbml0b3JJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgcXVldWUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9xdWV1ZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZmFybUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZhcm1JZC5cbiAgICogQHBhcmFtIHF1ZXVlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcXVldWVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICogLSAuaWZRdWV1ZU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uUXVldWUoZmFybUlkOiBzdHJpbmcsIHF1ZXVlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfS9xdWV1ZS8keyBxdWV1ZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2b2x1bWUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS92b2x1bWVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZhcm1JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmYXJtSWQuXG4gICAqIEBwYXJhbSBmbGVldElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZsZWV0SWQuXG4gICAqIEBwYXJhbSB2b2x1bWVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB2b2x1bWVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICogLSAuaWZGbGVldE1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uVm9sdW1lKGZhcm1JZDogc3RyaW5nLCBmbGVldElkOiBzdHJpbmcsIHZvbHVtZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZGVhZGxpbmU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmZhcm0vJHsgZmFybUlkIH0vZmxlZXQvJHsgZmxlZXRJZCB9L3ZvbHVtZS8keyB2b2x1bWVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgd29ya2VyIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZhcm1JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmYXJtSWQuXG4gICAqIEBwYXJhbSBmbGVldElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZsZWV0SWQuXG4gICAqIEBwYXJhbSB3b3JrZXJJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB3b3JrZXJJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICogLSAuaWZGbGVldE1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uV29ya2VyKGZhcm1JZDogc3RyaW5nLCBmbGVldElkOiBzdHJpbmcsIHdvcmtlcklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZGVhZGxpbmU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmZhcm0vJHsgZmFybUlkIH0vZmxlZXQvJHsgZmxlZXRJZCB9L3dvcmtlci8keyB3b3JrZXJJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVCdWRnZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZhcm0oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTW9uaXRvcigpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWUoKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVzb3VyY2V0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9GbGVldCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKiAtIC50b0Fzc3VtZUZsZWV0Um9sZUZvclJlYWQoKVxuICAgKiAtIC50b0Fzc3VtZUZsZWV0Um9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQXNzdW1lUXVldWVSb2xlRm9yUmVhZCgpXG4gICAqIC0gLnRvQXNzdW1lUXVldWVSb2xlRm9yVXNlcigpXG4gICAqIC0gLnRvQXNzdW1lUXVldWVSb2xlRm9yV29ya2VyKClcbiAgICogLSAudG9CYXRjaEdldEpvYkVudGl0eSgpXG4gICAqIC0gLnRvQ29weUpvYlRlbXBsYXRlKClcbiAgICogLSAudG9DcmVhdGVCdWRnZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZhcm0oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTGltaXQoKVxuICAgKiAtIC50b0NyZWF0ZU1vbml0b3IoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlKClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlU3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvRGVsZXRlQnVkZ2V0KClcbiAgICogLSAudG9EZWxldGVGYXJtKClcbiAgICogLSAudG9EZWxldGVGbGVldCgpXG4gICAqIC0gLnRvRGVsZXRlTGljZW5zZUVuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVMaW1pdCgpXG4gICAqIC0gLnRvRGVsZXRlTWV0ZXJlZFByb2R1Y3QoKVxuICAgKiAtIC50b0RlbGV0ZU1vbml0b3IoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlKClcbiAgICogLSAudG9EZWxldGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9EZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlU3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b0RlbGV0ZVZvbHVtZSgpXG4gICAqIC0gLnRvRGVsZXRlV29ya2VyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmFybSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZsZWV0KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUoKVxuICAgKiAtIC50b0dldEJ1ZGdldCgpXG4gICAqIC0gLnRvR2V0RmFybSgpXG4gICAqIC0gLnRvR2V0RmxlZXQoKVxuICAgKiAtIC50b0dldEpvYigpXG4gICAqIC0gLnRvR2V0TGljZW5zZUVuZHBvaW50KClcbiAgICogLSAudG9HZXRMaW1pdCgpXG4gICAqIC0gLnRvR2V0TW9uaXRvcigpXG4gICAqIC0gLnRvR2V0TW9uaXRvclNldHRpbmdzKClcbiAgICogLSAudG9HZXRRdWV1ZSgpXG4gICAqIC0gLnRvR2V0UXVldWVFbnZpcm9ubWVudCgpXG4gICAqIC0gLnRvR2V0UXVldWVGbGVldEFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRRdWV1ZUxpbWl0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldFNlc3Npb24oKVxuICAgKiAtIC50b0dldFNlc3Npb25BY3Rpb24oKVxuICAgKiAtIC50b0dldFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uKClcbiAgICogLSAudG9HZXRTdGVwKClcbiAgICogLSAudG9HZXRTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0U3RvcmFnZVByb2ZpbGVGb3JRdWV1ZSgpXG4gICAqIC0gLnRvR2V0VGFzaygpXG4gICAqIC0gLnRvR2V0Vm9sdW1lKClcbiAgICogLSAudG9HZXRXb3JrZXIoKVxuICAgKiAtIC50b0xpc3RCdWRnZXRzKClcbiAgICogLSAudG9MaXN0RmFybU1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RGYXJtcygpXG4gICAqIC0gLnRvTGlzdEZsZWV0TWVtYmVycygpXG4gICAqIC0gLnRvTGlzdEZsZWV0cygpXG4gICAqIC0gLnRvTGlzdEpvYk1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpXG4gICAqIC0gLnRvTGlzdEpvYnMoKVxuICAgKiAtIC50b0xpc3RMaWNlbnNlRW5kcG9pbnRzKClcbiAgICogLSAudG9MaXN0TGltaXRzKClcbiAgICogLSAudG9MaXN0TWV0ZXJlZFByb2R1Y3RzKClcbiAgICogLSAudG9MaXN0TW9uaXRvcnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUVudmlyb25tZW50cygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlRmxlZXRBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUxpbWl0QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9MaXN0UXVldWVNZW1iZXJzKClcbiAgICogLSAudG9MaXN0UXVldWVzKClcbiAgICogLSAudG9MaXN0U2Vzc2lvbkFjdGlvbnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9ucygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25zRm9yV29ya2VyKClcbiAgICogLSAudG9MaXN0U3RlcENvbnN1bWVycygpXG4gICAqIC0gLnRvTGlzdFN0ZXBEZXBlbmRlbmNpZXMoKVxuICAgKiAtIC50b0xpc3RTdGVwcygpXG4gICAqIC0gLnRvTGlzdFN0b3JhZ2VQcm9maWxlcygpXG4gICAqIC0gLnRvTGlzdFN0b3JhZ2VQcm9maWxlc0ZvclF1ZXVlKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9MaXN0VGFza3MoKVxuICAgKiAtIC50b0xpc3RWb2x1bWVzKClcbiAgICogLSAudG9MaXN0V29ya2VycygpXG4gICAqIC0gLnRvUHV0TWV0ZXJlZFByb2R1Y3QoKVxuICAgKiAtIC50b1NlYXJjaEpvYnMoKVxuICAgKiAtIC50b1NlYXJjaFN0ZXBzKClcbiAgICogLSAudG9TZWFyY2hUYXNrcygpXG4gICAqIC0gLnRvU3RhcnRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUJ1ZGdldCgpXG4gICAqIC0gLnRvVXBkYXRlRmFybSgpXG4gICAqIC0gLnRvVXBkYXRlRmxlZXQoKVxuICAgKiAtIC50b1VwZGF0ZUpvYigpXG4gICAqIC0gLnRvVXBkYXRlTGltaXQoKVxuICAgKiAtIC50b1VwZGF0ZU1vbml0b3IoKVxuICAgKiAtIC50b1VwZGF0ZU1vbml0b3JTZXR0aW5ncygpXG4gICAqIC0gLnRvVXBkYXRlUXVldWUoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9VcGRhdGVTZXNzaW9uKClcbiAgICogLSAudG9VcGRhdGVTdGVwKClcbiAgICogLSAudG9VcGRhdGVTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvVXBkYXRlVGFzaygpXG4gICAqIC0gLnRvVXBkYXRlV29ya2VyKClcbiAgICogLSAudG9VcGRhdGVXb3JrZXJTY2hlZHVsZSgpXG4gICAqIC0gLnRvR2V0QXBwbGljYXRpb25WZXJzaW9uKClcbiAgICogLSAudG9HZXRKb2JUZW1wbGF0ZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gYnVkZ2V0XG4gICAqIC0gZmFybVxuICAgKiAtIGZsZWV0XG4gICAqIC0gam9iXG4gICAqIC0gbGljZW5zZS1lbmRwb2ludFxuICAgKiAtIG1vbml0b3JcbiAgICogLSBxdWV1ZVxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHdvcmtlclxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFnIGtleXMgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy10YWdrZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVCdWRnZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZhcm0oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTW9uaXRvcigpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWUoKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGFzc29jaWF0ZWQgbWVtYmVyc2hpcCBsZXZlbCBvZiB0aGUgcHJpbmNpcGFsIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5LWlhbS1zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9GbGVldCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GYXJtKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXNzb2NpYXRlZE1lbWJlcnNoaXBMZXZlbCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQXNzb2NpYXRlZE1lbWJlcnNoaXBMZXZlbGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBhbGxvd2VkIGFjdGlvbiBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ2FsbGVkQWN0aW9uKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDYWxsZWRBY3Rpb25gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBtZW1iZXJzaGlwIGxldmVscyBvbiB0aGUgZmFybVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb0Zhcm0oKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmxlZXQoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvSm9iKClcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb1F1ZXVlKClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JSZWFkKClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JXb3JrZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclVzZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQmF0Y2hHZXRKb2JFbnRpdHkoKVxuICAgKiAtIC50b0NvcHlKb2JUZW1wbGF0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlQnVkZ2V0KClcbiAgICogLSAudG9DcmVhdGVGYXJtKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlSm9iKClcbiAgICogLSAudG9DcmVhdGVMaW1pdCgpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWUoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvQ3JlYXRlV29ya2VyKClcbiAgICogLSAudG9EZWxldGVCdWRnZXQoKVxuICAgKiAtIC50b0RlbGV0ZUZhcm0oKVxuICAgKiAtIC50b0RlbGV0ZUZsZWV0KClcbiAgICogLSAudG9EZWxldGVMaW1pdCgpXG4gICAqIC0gLnRvRGVsZXRlUXVldWUoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9EZWxldGVTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvRGVsZXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVXb3JrZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GYXJtKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZSgpXG4gICAqIC0gLnRvR2V0QnVkZ2V0KClcbiAgICogLSAudG9HZXRGYXJtKClcbiAgICogLSAudG9HZXRGbGVldCgpXG4gICAqIC0gLnRvR2V0Sm9iKClcbiAgICogLSAudG9HZXRMaW1pdCgpXG4gICAqIC0gLnRvR2V0UXVldWUoKVxuICAgKiAtIC50b0dldFF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uQWN0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvR2V0U3RlcCgpXG4gICAqIC0gLnRvR2V0U3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUoKVxuICAgKiAtIC50b0dldFRhc2soKVxuICAgKiAtIC50b0dldFZvbHVtZSgpXG4gICAqIC0gLnRvR2V0V29ya2VyKClcbiAgICogLSAudG9MaXN0QnVkZ2V0cygpXG4gICAqIC0gLnRvTGlzdEZhcm1NZW1iZXJzKClcbiAgICogLSAudG9MaXN0RmFybXMoKVxuICAgKiAtIC50b0xpc3RGbGVldE1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RGbGVldHMoKVxuICAgKiAtIC50b0xpc3RKb2JNZW1iZXJzKClcbiAgICogLSAudG9MaXN0Sm9iUGFyYW1ldGVyRGVmaW5pdGlvbnMoKVxuICAgKiAtIC50b0xpc3RKb2JzKClcbiAgICogLSAudG9MaXN0TGltaXRzKClcbiAgICogLSAudG9MaXN0UXVldWVFbnZpcm9ubWVudHMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUZsZWV0QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9MaXN0UXVldWVMaW1pdEFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlTWVtYmVycygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlcygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25BY3Rpb25zKClcbiAgICogLSAudG9MaXN0U2Vzc2lvbnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9uc0ZvcldvcmtlcigpXG4gICAqIC0gLnRvTGlzdFN0ZXBDb25zdW1lcnMoKVxuICAgKiAtIC50b0xpc3RTdGVwRGVwZW5kZW5jaWVzKClcbiAgICogLSAudG9MaXN0U3RlcHMoKVxuICAgKiAtIC50b0xpc3RTdG9yYWdlUHJvZmlsZXMoKVxuICAgKiAtIC50b0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZSgpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRhc2tzKClcbiAgICogLSAudG9MaXN0Vm9sdW1lcygpXG4gICAqIC0gLnRvTGlzdFdvcmtlcnMoKVxuICAgKiAtIC50b1NlYXJjaEpvYnMoKVxuICAgKiAtIC50b1NlYXJjaFN0ZXBzKClcbiAgICogLSAudG9TZWFyY2hUYXNrcygpXG4gICAqIC0gLnRvU3RhcnRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUJ1ZGdldCgpXG4gICAqIC0gLnRvVXBkYXRlRmFybSgpXG4gICAqIC0gLnRvVXBkYXRlRmxlZXQoKVxuICAgKiAtIC50b1VwZGF0ZUpvYigpXG4gICAqIC0gLnRvVXBkYXRlTGltaXQoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlKClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlU3RlcCgpXG4gICAqIC0gLnRvVXBkYXRlU3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b1VwZGF0ZVRhc2soKVxuICAgKiAtIC50b1VwZGF0ZVdvcmtlcigpXG4gICAqIC0gLnRvVXBkYXRlV29ya2VyU2NoZWR1bGUoKVxuICAgKiAtIC50b0dldEpvYlRlbXBsYXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBidWRnZXRcbiAgICogLSBmYXJtXG4gICAqIC0gZmxlZXRcbiAgICogLSBqb2JcbiAgICogLSBxdWV1ZVxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHdvcmtlclxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBGYXJtTWVtYmVyc2hpcExldmVsc2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IG1lbWJlcnNoaXAgbGV2ZWxzIG9uIHRoZSBmbGVldFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb0ZsZWV0KClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JSZWFkKClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JXb3JrZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQmF0Y2hHZXRKb2JFbnRpdHkoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvRGVsZXRlRmxlZXQoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVXb3JrZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GbGVldCgpXG4gICAqIC0gLnRvR2V0RmxlZXQoKVxuICAgKiAtIC50b0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24oKVxuICAgKiAtIC50b0dldFZvbHVtZSgpXG4gICAqIC0gLnRvR2V0V29ya2VyKClcbiAgICogLSAudG9MaXN0RmxlZXRNZW1iZXJzKClcbiAgICogLSAudG9MaXN0RmxlZXRzKClcbiAgICogLSAudG9MaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25zRm9yV29ya2VyKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9MaXN0Vm9sdW1lcygpXG4gICAqIC0gLnRvTGlzdFdvcmtlcnMoKVxuICAgKiAtIC50b1N0YXJ0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVGbGVldCgpXG4gICAqIC0gLnRvVXBkYXRlUXVldWVGbGVldEFzc29jaWF0aW9uKClcbiAgICogLSAudG9VcGRhdGVXb3JrZXIoKVxuICAgKiAtIC50b1VwZGF0ZVdvcmtlclNjaGVkdWxlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBmbGVldFxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHdvcmtlclxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkZsZWV0TWVtYmVyc2hpcExldmVscyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgRmxlZXRNZW1iZXJzaGlwTGV2ZWxzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgbWVtYmVyc2hpcCBsZXZlbHMgb24gdGhlIGpvYlxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb0pvYigpXG4gICAqIC0gLnRvQ29weUpvYlRlbXBsYXRlKClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKVxuICAgKiAtIC50b0dldEpvYigpXG4gICAqIC0gLnRvR2V0U2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U2Vzc2lvbkFjdGlvbigpXG4gICAqIC0gLnRvR2V0U3RlcCgpXG4gICAqIC0gLnRvR2V0VGFzaygpXG4gICAqIC0gLnRvTGlzdEpvYk1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpXG4gICAqIC0gLnRvTGlzdEpvYnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9uQWN0aW9ucygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25zKClcbiAgICogLSAudG9MaXN0U3RlcENvbnN1bWVycygpXG4gICAqIC0gLnRvTGlzdFN0ZXBEZXBlbmRlbmNpZXMoKVxuICAgKiAtIC50b0xpc3RTdGVwcygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRhc2tzKClcbiAgICogLSAudG9TZWFyY2hTdGVwcygpXG4gICAqIC0gLnRvU2VhcmNoVGFza3MoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVKb2IoKVxuICAgKiAtIC50b1VwZGF0ZVNlc3Npb24oKVxuICAgKiAtIC50b1VwZGF0ZVN0ZXAoKVxuICAgKiAtIC50b1VwZGF0ZVRhc2soKVxuICAgKiAtIC50b0dldEpvYlRlbXBsYXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBqb2JcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZKb2JNZW1iZXJzaGlwTGV2ZWxzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBKb2JNZW1iZXJzaGlwTGV2ZWxzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIG1lbWJlcnNoaXAgbGV2ZWwgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5LWlhbS1zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9GbGVldCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk1lbWJlcnNoaXBMZXZlbCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgTWVtYmVyc2hpcExldmVsYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHByaW5jaXBsZSBJRCBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9MaXN0RmFybXMoKVxuICAgKiAtIC50b0xpc3RGbGVldHMoKVxuICAgKiAtIC50b0xpc3RKb2JzKClcbiAgICogLSAudG9MaXN0UXVldWVzKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQcmluY2lwYWxJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUHJpbmNpcGFsSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBtZW1iZXJzaGlwIGxldmVscyBvbiB0aGUgcXVldWVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclVzZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQ29weUpvYlRlbXBsYXRlKClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlKClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVldWUoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUoKVxuICAgKiAtIC50b0dldEpvYigpXG4gICAqIC0gLnRvR2V0UXVldWUoKVxuICAgKiAtIC50b0dldFF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uQWN0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvR2V0U3RlcCgpXG4gICAqIC0gLnRvR2V0U3RvcmFnZVByb2ZpbGVGb3JRdWV1ZSgpXG4gICAqIC0gLnRvR2V0VGFzaygpXG4gICAqIC0gLnRvTGlzdEpvYk1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpXG4gICAqIC0gLnRvTGlzdEpvYnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUVudmlyb25tZW50cygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlRmxlZXRBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUxpbWl0QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9MaXN0UXVldWVNZW1iZXJzKClcbiAgICogLSAudG9MaXN0UXVldWVzKClcbiAgICogLSAudG9MaXN0U2Vzc2lvbkFjdGlvbnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9ucygpXG4gICAqIC0gLnRvTGlzdFN0ZXBDb25zdW1lcnMoKVxuICAgKiAtIC50b0xpc3RTdGVwRGVwZW5kZW5jaWVzKClcbiAgICogLSAudG9MaXN0U3RlcHMoKVxuICAgKiAtIC50b0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZSgpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRhc2tzKClcbiAgICogLSAudG9TZWFyY2hKb2JzKClcbiAgICogLSAudG9TZWFyY2hTdGVwcygpXG4gICAqIC0gLnRvU2VhcmNoVGFza3MoKVxuICAgKiAtIC50b1N0YXJ0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVKb2IoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlKClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlU3RlcCgpXG4gICAqIC0gLnRvVXBkYXRlVGFzaygpXG4gICAqIC0gLnRvR2V0Sm9iVGVtcGxhdGUoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGpvYlxuICAgKiAtIHF1ZXVlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUXVldWVNZW1iZXJzaGlwTGV2ZWxzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBRdWV1ZU1lbWJlcnNoaXBMZXZlbHNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdXNlciBjYWxsaW5nIHRoZSBEZWFkbGluZSBDbG91ZCBBUElcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvTGlzdEZhcm1zKClcbiAgICogLSAudG9MaXN0RmxlZXRzKClcbiAgICogLSAudG9MaXN0Sm9icygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlcygpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVxdWVzdGVyUHJpbmNpcGFsSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFJlcXVlc3RlclByaW5jaXBhbElkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtkZWFkbGluZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfZGVhZGxpbmUuaHRtbCkuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxufVxuIl19