cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
754 lines • 73.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.HealthAgent = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [health-agent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_connecthealth.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class HealthAgent extends shared_1.PolicyStatement {
/**
* Grants permission to activate a subscription to enable billing for a user
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ActivateSubscription.html
*/
toActivateSubscription() {
return this.to('ActivateSubscription');
}
/**
* Grants permission to create a new domain for managing HealthAgent resources
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_CreateDomain.html
*/
toCreateDomain() {
return this.to('CreateDomain');
}
/**
* Grants permission to create a new subscription within a domain for billing and user management
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_CreateSubscription.html
*/
toCreateSubscription() {
return this.to('CreateSubscription');
}
/**
* Grants permission to deactivate a subscription to stop billing for a user
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_DeactivateSubscription.html
*/
toDeactivateSubscription() {
return this.to('DeactivateSubscription');
}
/**
* Grants permission to delete a domain and all associated resources
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_DeleteDomain.html
*/
toDeleteDomain() {
return this.to('DeleteDomain');
}
/**
* Grants permission to retrieve information about a domain
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetDomain.html
*/
toGetDomain() {
return this.to('GetDomain');
}
/**
* Grants permission to retrieve aggregated analytics for a domain
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetDomainAnalytics.html
*/
toGetDomainAnalytics() {
return this.to('GetDomainAnalytics');
}
/**
* Grants permission to retrieve details about an existing Medical Scribe listening session
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetMedicalScribeListeningSession.html
*/
toGetMedicalScribeListeningSession() {
return this.to('GetMedicalScribeListeningSession');
}
/**
* Grants permission to get details of a started patient insights job
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetPatientInsightsJob.html
*/
toGetPatientInsightsJob() {
return this.to('GetPatientInsightsJob');
}
/**
* Grants permission to retrieve information about a subscription
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetSubscription.html
*/
toGetSubscription() {
return this.to('GetSubscription');
}
/**
* Grants permission to list domains for a given account
*
* Access Level: List
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListDomains.html
*/
toListDomains() {
return this.to('ListDomains');
}
/**
* Grants permission to list session records for a domain
*
* Access Level: List
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListSessionRecords.html
*/
toListSessionRecords() {
return this.to('ListSessionRecords');
}
/**
* Grants permission to list all subscriptions within a domain
*
* Access Level: List
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListSubscriptions.html
*/
toListSubscriptions() {
return this.to('ListSubscriptions');
}
/**
* Grants permission to list the tags for the specified resource
*
* Access Level: List
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to start a new Medical Scribe listening session for real-time audio transcription
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_StartMedicalScribeListeningSession.html
*/
toStartMedicalScribeListeningSession() {
return this.to('StartMedicalScribeListeningSession');
}
/**
* Grants permission to start a new patient insights job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_StartPatientInsightsJob.html
*/
toStartPatientInsightsJob() {
return this.to('StartPatientInsightsJob');
}
/**
* Grants permission to add the specified tags to the specified resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove the tags identified by the TagKeys list from a resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to cancel an appointment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toCancelAppointment() {
return this.to('CancelAppointment');
}
/**
* Grants permission to create a new agent with an initial version in DRAFT state
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toCreateAgent() {
return this.to('CreateAgent');
}
/**
* Grants permission to create a new integration for a domain
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toCreateIntegration() {
return this.to('CreateIntegration');
}
/**
* Grants permission to create a new session with specified agent configurations
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toCreateSession() {
return this.to('CreateSession');
}
/**
* Grants permission to delete an agent configuration and all its versions
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toDeleteAgent() {
return this.to('DeleteAgent');
}
/**
* Grants permission to delete an integration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toDeleteIntegration() {
return this.to('DeleteIntegration');
}
/**
* Grants permission to retrieve an agent configuration, defaulting to the most recent version if not specified
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toGetAgent() {
return this.to('GetAgent');
}
/**
* Grants permission to retrieve the care team provider of a patient
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toGetCareTeamProvider() {
return this.to('GetCareTeamProvider');
}
/**
* Grants permission to get an existing integration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toGetIntegration() {
return this.to('GetIntegration');
}
/**
* Grants permission to retrieve patient information
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toGetPatient() {
return this.to('GetPatient');
}
/**
* Grants permission to retrieve practitioner information
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toGetPractitioner() {
return this.to('GetPractitioner');
}
/**
* Grants permission to retrieve structured session context including attributes and collected data
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toGetSessionContext() {
return this.to('GetSessionContext');
}
/**
* Grants permission to invoke an agent within a session with streaming response support
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toInvokeAgent() {
return this.to('InvokeAgent');
}
/**
* Grants permission to list all agents in a domain
*
* Access Level: List
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toListAgents() {
return this.to('ListAgents');
}
/**
* Grants permission to list available appointment slots
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toListAppointmentSlots() {
return this.to('ListAppointmentSlots');
}
/**
* Grants permission to list integrations for a domain
*
* Access Level: List
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toListIntegrations() {
return this.to('ListIntegrations');
}
/**
* Grants permission to list patient appointments
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toListPatientAppointments() {
return this.to('ListPatientAppointments');
}
/**
* Grants permission to list patient insurance coverages
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toListPatientInsuranceCoverages() {
return this.to('ListPatientInsuranceCoverages');
}
/**
* Grants permission to list patient medications
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toListPatientMedications() {
return this.to('ListPatientMedications');
}
/**
* Grants permission to retrieve active providers available for scheduling appointments with a patient
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toListProviders() {
return this.to('ListProviders');
}
/**
* Grants permission to match a patient
*
* Access Level: Read
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toMatchPatient() {
return this.to('MatchPatient');
}
/**
* Grants permission to publish an agent configuration version
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toPublishAgent() {
return this.to('PublishAgent');
}
/**
* Grants permission to reschedule an appointment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toRescheduleAppointment() {
return this.to('RescheduleAppointment');
}
/**
* Grants permission to reset a patient MyChart password via email or SMS
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toResetPassword() {
return this.to('ResetPassword');
}
/**
* Grants permission to schedule an appointment for a patient
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toScheduleAppointment() {
return this.to('ScheduleAppointment');
}
/**
* Grants permission to submit a medication renewal for a patient
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toSubmitMedicationRenewal() {
return this.to('SubmitMedicationRenewal');
}
/**
* Grants permission to update a draft agent configuration, creating a new draft version if none exists
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toUpdateAgent() {
return this.to('UpdateAgent');
}
/**
* Grants permission to update an existing integration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toUpdateIntegration() {
return this.to('UpdateIntegration');
}
/**
* Grants permission to update session attributes such as departmentId and appointmentType
*
* Access Level: Write
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*/
toUpdateSession() {
return this.to('UpdateSession');
}
/**
* Adds a resource of type Agent to the statement
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/agent-customization.html
*
* @param domainId - Identifier for the domainId.
* @param agentId - Identifier for the agentId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onAgent(domainId, agentId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/agent/${agentId}`);
}
/**
* Adds a resource of type Domain to the statement
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/setting-up.html#setting-up-create-domain
*
* @param domainId - Identifier for the domainId.
* @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()
*/
onDomain(domainId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}`);
}
/**
* Adds a resource of type Integration to the statement
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/configuring-testing-pe-agents.html
*
* @param domainId - Identifier for the domainId.
* @param integrationId - Identifier for the integrationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onIntegration(domainId, integrationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/integration/${integrationId}`);
}
/**
* Adds a resource of type PatientInsightsJob to the statement
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-insights.html
*
* @param domainId - Identifier for the domainId.
* @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()
*/
onPatientInsightsJob(domainId, jobId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/patient-insights-job/${jobId}`);
}
/**
* Adds a resource of type Session to the statement
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html
*
* @param domainId - Identifier for the domainId.
* @param sessionId - Identifier for the sessionId.
* @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()
*/
onSession(domainId, sessionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/session/${sessionId}`);
}
/**
* Adds a resource of type Subscription to the statement
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/ambient-documentation.html#al-subscription-management
*
* @param domainId - Identifier for the domainId.
* @param subscriptionId - Identifier for the subscriptionId.
* @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()
*/
onSubscription(domainId, subscriptionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/subscription/${subscriptionId}`);
}
/**
* Filters access by the tags that are passed in the request
*
* https://docs.aws.amazon.com/connecthealth/latest/userguide/security-iam-service-with-iam.htmlsecurity-iam-service-with-iam.html#security-iam-service-with-iam-tags
*
* Applies to actions:
* - .toCreateDomain()
* - .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/connecthealth/latest/userguide/security-iam-service-with-iam.htmlsecurity-iam-service-with-iam.html#security-iam-service-with-iam-tags
*
* Applies to actions:
* - .toActivateSubscription()
* - .toCreateSubscription()
* - .toDeactivateSubscription()
* - .toDeleteDomain()
* - .toGetDomain()
* - .toGetDomainAnalytics()
* - .toGetMedicalScribeListeningSession()
* - .toGetPatientInsightsJob()
* - .toGetSubscription()
* - .toListSessionRecords()
* - .toListSubscriptions()
* - .toListTagsForResource()
* - .toStartMedicalScribeListeningSession()
* - .toStartPatientInsightsJob()
* - .toTagResource()
* - .toUntagResource()
* - .toCancelAppointment()
* - .toCreateAgent()
* - .toCreateIntegration()
* - .toCreateSession()
* - .toDeleteAgent()
* - .toDeleteIntegration()
* - .toGetAgent()
* - .toGetCareTeamProvider()
* - .toGetIntegration()
* - .toGetPatient()
* - .toGetPractitioner()
* - .toGetSessionContext()
* - .toInvokeAgent()
* - .toListAgents()
* - .toListAppointmentSlots()
* - .toListIntegrations()
* - .toListPatientAppointments()
* - .toListPatientInsuranceCoverages()
* - .toListPatientMedications()
* - .toListProviders()
* - .toMatchPatient()
* - .toPublishAgent()
* - .toRescheduleAppointment()
* - .toResetPassword()
* - .toScheduleAppointment()
* - .toSubmitMedicationRenewal()
* - .toUpdateAgent()
* - .toUpdateIntegration()
* - .toUpdateSession()
*
* Applies to resource types:
* - Agent
* - Domain
* - Integration
* - PatientInsightsJob
* - Session
* - Subscription
*
* @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/connecthealth/latest/userguide/security-iam-service-with-iam.htmlsecurity-iam-service-with-iam.html#security-iam-service-with-iam-tags
*
* Applies to actions:
* - .toCreateDomain()
* - .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');
}
/**
* Statement provider for service [health-agent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_connecthealth.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'health-agent';
this.accessLevelList = {
Write: [
'ActivateSubscription',
'CreateDomain',
'CreateSubscription',
'DeactivateSubscription',
'DeleteDomain',
'StartMedicalScribeListeningSession',
'StartPatientInsightsJob',
'TagResource',
'UntagResource',
'CancelAppointment',
'CreateAgent',
'CreateIntegration',
'CreateSession',
'DeleteAgent',
'DeleteIntegration',
'InvokeAgent',
'PublishAgent',
'RescheduleAppointment',
'ResetPassword',
'ScheduleAppointment',
'SubmitMedicationRenewal',
'UpdateAgent',
'UpdateIntegration',
'UpdateSession'
],
Read: [
'GetDomain',
'GetDomainAnalytics',
'GetMedicalScribeListeningSession',
'GetPatientInsightsJob',
'GetSubscription',
'GetAgent',
'GetCareTeamProvider',
'GetIntegration',
'GetPatient',
'GetPractitioner',
'GetSessionContext',
'ListAppointmentSlots',
'ListPatientAppointments',
'ListPatientInsuranceCoverages',
'ListPatientMedications',
'ListProviders',
'MatchPatient'
],
List: [
'ListDomains',
'ListSessionRecords',
'ListSubscriptions',
'ListTagsForResource',
'ListAgents',
'ListIntegrations'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.HealthAgent = HealthAgent;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbm5lY3RoZWFsdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLFdBQVksU0FBUSx3QkFBZTtJQUc5Qzs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQ0FBa0M7UUFDdkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENB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RTtnQkFDTCxzQkFBc0I7Z0JBQ3RCLGNBQWM7Z0JBQ2Qsb0JBQW9CO2dCQUNwQix3QkFBd0I7Z0JBQ3hCLGNBQWM7Z0JBQ2Qsb0NBQW9DO2dCQUNwQyx5QkFBeUI7Z0JBQ3pCLGFBQWE7Z0JBQ2IsZUFBZTtnQkFDZixtQkFBbUI7Z0JBQ25CLGFBQWE7Z0JBQ2IsbUJBQW1CO2dCQUNuQixlQUFlO2dCQUNmLGFBQWE7Z0JBQ2IsbUJBQW1CO2dCQUNuQixhQUFhO2dCQUNiLGNBQWM7Z0JBQ2QsdUJBQXVCO2dCQUN2QixlQUFlO2dCQUNmLHFCQUFxQjtnQkFDckIseUJBQXlCO2dCQUN6QixhQUFhO2dCQUNiLG1CQUFtQjtnQkFDbkIsZUFBZTthQUNoQjtZQUNELElBQUksRUFBRTtnQkFDSixXQUFXO2dCQUNYLG9CQUFvQjtnQkFDcEIsa0NBQWtDO2dCQUNsQyx1QkFBdUI7Z0JBQ3ZCLGlCQUFpQjtnQkFDakIsVUFBVTtnQkFDVixxQkFBcUI7Z0JBQ3JCLGdCQUFnQjtnQkFDaEIsWUFBWTtnQkFDWixpQkFBaUI7Z0JBQ2pCLG1CQUFtQjtnQkFDbkIsc0JBQXNCO2dCQUN0Qix5QkFBeUI7Z0JBQ3pCLCtCQUErQjtnQkFDL0Isd0JBQXdCO2dCQUN4QixlQUFlO2dCQUNmLGNBQWM7YUFDZjtZQUNELElBQUksRUFBRTtnQkFDSixhQUFhO2dCQUNiLG9CQUFvQjtnQkFDcEIsbUJBQW1CO2dCQUNuQixxQkFBcUI7Z0JBQ3JCLFlBQVk7Z0JBQ1osa0JBQWtCO2FBQ25CO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUF5TkYsQ0FBQztDQUNGO0FBaHlCRCxrQ0FneUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtoZWFsdGgtYWdlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2Nvbm5lY3RoZWFsdGguaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBIZWFsdGhBZ2VudCBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ2hlYWx0aC1hZ2VudCc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFjdGl2YXRlIGEgc3Vic2NyaXB0aW9uIHRvIGVuYWJsZSBiaWxsaW5nIGZvciBhIHVzZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BY3RpdmF0ZVN1YnNjcmlwdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BY3RpdmF0ZVN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWN0aXZhdGVTdWJzY3JpcHRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgZG9tYWluIGZvciBtYW5hZ2luZyBIZWFsdGhBZ2VudCByZXNvdXJjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVEb21haW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVEb21haW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgc3Vic2NyaXB0aW9uIHdpdGhpbiBhIGRvbWFpbiBmb3IgYmlsbGluZyBhbmQgdXNlciBtYW5hZ2VtZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlU3Vic2NyaXB0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlU3Vic2NyaXB0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVhY3RpdmF0ZSBhIHN1YnNjcmlwdGlvbiB0byBzdG9wIGJpbGxpbmcgZm9yIGEgdXNlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlYWN0aXZhdGVTdWJzY3JpcHRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVhY3RpdmF0ZVN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVhY3RpdmF0ZVN1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGRvbWFpbiBhbmQgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRG9tYWluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZURvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldERvbWFpbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERvbWFpbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFnZ3JlZ2F0ZWQgYW5hbHl0aWNzIGZvciBhIGRvbWFpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RG9tYWluQW5hbHl0aWNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERvbWFpbkFuYWx5dGljcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RG9tYWluQW5hbHl0aWNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgZGV0YWlscyBhYm91dCBhbiBleGlzdGluZyBNZWRpY2FsIFNjcmliZSBsaXN0ZW5pbmcgc2Vzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TWVkaWNhbFNjcmliZUxpc3RlbmluZ1Nlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TWVkaWNhbFNjcmliZUxpc3RlbmluZ1Nlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1lZGljYWxTY3JpYmVMaXN0ZW5pbmdTZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRldGFpbHMgb2YgYSBzdGFydGVkIHBhdGllbnQgaW5zaWdodHMgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRQYXRpZW50SW5zaWdodHNKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UGF0aWVudEluc2lnaHRzSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRQYXRpZW50SW5zaWdodHNKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIHN1YnNjcmlwdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0U3Vic2NyaXB0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3Vic2NyaXB0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBkb21haW5zIGZvciBhIGdpdmVuIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3REb21haW5zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REb21haW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RG9tYWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc2Vzc2lvbiByZWNvcmRzIGZvciBhIGRvbWFpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFNlc3Npb25SZWNvcmRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTZXNzaW9uUmVjb3JkcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNlc3Npb25SZWNvcmRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgc3Vic2NyaXB0aW9ucyB3aXRoaW4gYSBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdWJzY3JpcHRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTdWJzY3JpcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U3Vic2NyaXB0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHRhZ3MgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgbmV3IE1lZGljYWwgU2NyaWJlIGxpc3RlbmluZyBzZXNzaW9uIGZvciByZWFsLXRpbWUgYXVkaW8gdHJhbnNjcmlwdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0TWVkaWNhbFNjcmliZUxpc3RlbmluZ1Nlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRNZWRpY2FsU2NyaWJlTGlzdGVuaW5nU2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRNZWRpY2FsU2NyaWJlTGlzdGVuaW5nU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgbmV3IHBhdGllbnQgaW5zaWdodHMgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRQYXRpZW50SW5zaWdodHNKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRQYXRpZW50SW5zaWdodHNKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0UGF0aWVudEluc2lnaHRzSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIHRoZSBzcGVjaWZpZWQgdGFncyB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIHRoZSB0YWdzIGlkZW50aWZpZWQgYnkgdGhlIFRhZ0tleXMgbGlzdCBmcm9tIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYW4gYXBwb2ludG1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxBcHBvaW50bWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsQXBwb2ludG1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgYWdlbnQgd2l0aCBhbiBpbml0aWFsIHZlcnNpb24gaW4gRFJBRlQgc3RhdGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVBZ2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQWdlbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgaW50ZWdyYXRpb24gZm9yIGEgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlSW50ZWdyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUludGVncmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24gd2l0aCBzcGVjaWZpZWQgYWdlbnQgY29uZmlndXJhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGFnZW50IGNvbmZpZ3VyYXRpb24gYW5kIGFsbCBpdHMgdmVyc2lvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBZ2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQWdlbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gaW50ZWdyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJbnRlZ3JhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlSW50ZWdyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhbiBhZ2VudCBjb25maWd1cmF0aW9uLCBkZWZhdWx0aW5nIHRvIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIGlmIG5vdCBzcGVjaWZpZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEFnZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBZ2VudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRoZSBjYXJlIHRlYW0gcHJvdmlkZXIgb2YgYSBwYXRpZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDYXJlVGVhbVByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDYXJlVGVhbVByb3ZpZGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGFuIGV4aXN0aW5nIGludGVncmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJbnRlZ3JhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SW50ZWdyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBwYXRpZW50IGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQYXRpZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRQYXRpZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcHJhY3RpdGlvbmVyIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQcmFjdGl0aW9uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFByYWN0aXRpb25lcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHN0cnVjdHVyZWQgc2Vzc2lvbiBjb250ZXh0IGluY2x1ZGluZyBhdHRyaWJ1dGVzIGFuZCBjb2xsZWN0ZWQgZGF0YVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2Vzc2lvbkNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlc3Npb25Db250ZXh0Jyk7XG4gIH1cbl