UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

754 lines 73.2 kB
"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