cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
617 lines • 57.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NeptuneGraph = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [neptune-graph](https://docs.aws.amazon.com/service-authorization/latest/reference/list_neptune-graph.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class NeptuneGraph extends shared_1.PolicyStatement {
/**
* Grants permission to cancel an ongoing export task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_CancelExportTask.html
*/
toCancelExportTask() {
return this.to('CancelExportTask');
}
/**
* Grants permission to cancel an ongoing import task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_CancelImportTask.html
*/
toCancelImportTask() {
return this.to('CancelImportTask');
}
/**
* Grants permission to cancel a query
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_CancelQuery.html
*/
toCancelQuery() {
return this.to('CancelQuery');
}
/**
* Grants permission to create a new graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_CreateGraph.html
*/
toCreateGraph() {
return this.to('CreateGraph');
}
/**
* Grants permission to create a new snapshot from an existing graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_CreateGraphSnapshot.html
*/
toCreateGraphSnapshot() {
return this.to('CreateGraphSnapshot');
}
/**
* Grants permission to create a new graph while importing data into the new graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_CreateGraphUsingImportTask.html
*/
toCreateGraphUsingImportTask() {
return this.to('CreateGraphUsingImportTask');
}
/**
* Grants permission to create a new private graph endpoint to access the graph from within a vpc
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_CreatePrivateGraphEndpoint.html
*/
toCreatePrivateGraphEndpoint() {
return this.to('CreatePrivateGraphEndpoint');
}
/**
* Grants permission to delete data via query APIs on the graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ExecuteQuery.html
*/
toDeleteDataViaQuery() {
return this.to('DeleteDataViaQuery');
}
/**
* Grants permission to delete a graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_DeleteGraph.html
*/
toDeleteGraph() {
return this.to('DeleteGraph');
}
/**
* Grants permission to delete a snapshot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_DeleteGraphSnapshot.html
*/
toDeleteGraphSnapshot() {
return this.to('DeleteGraphSnapshot');
}
/**
* Grants permission to delete a private graph endpoint of a graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_DeletePrivateGraphEndpoint.html
*/
toDeletePrivateGraphEndpoint() {
return this.to('DeletePrivateGraphEndpoint');
}
/**
* Grants permission to get the engine status of the graph
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/#GetEngineStatus
*/
toGetEngineStatus() {
return this.to('GetEngineStatus');
}
/**
* Grants permission to get details about an export task
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_GetExportTask.html
*/
toGetExportTask() {
return this.to('GetExportTask');
}
/**
* Grants permission to get details about a graph
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_GetGraph.html
*/
toGetGraph() {
return this.to('GetGraph');
}
/**
* Grants permission to get details about a snapshot
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_GetGraphSnapshot.html
*/
toGetGraphSnapshot() {
return this.to('GetGraphSnapshot');
}
/**
* Grants permission to get the summary for the data in the graph
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_GetGraphSummary.html
*/
toGetGraphSummary() {
return this.to('GetGraphSummary');
}
/**
* Grants permission to get details about an import task
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_GetImportTask.html
*/
toGetImportTask() {
return this.to('GetImportTask');
}
/**
* Grants permission to get details about a private graph endpoint of a graph
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_GetPrivateGraphEndpoint.html
*/
toGetPrivateGraphEndpoint() {
return this.to('GetPrivateGraphEndpoint');
}
/**
* Grants permission to check the status of a given query
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_GetQuery.html
*/
toGetQueryStatus() {
return this.to('GetQueryStatus');
}
/**
* Grants permission to get the statistics for the data in the graph
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/#GetStatisticsStatus
*/
toGetStatisticsStatus() {
return this.to('GetStatisticsStatus');
}
/**
* Grants permission to list the export tasks in your account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ListExportTasks.html
*/
toListExportTasks() {
return this.to('ListExportTasks');
}
/**
* Grants permission to list the snapshots in your account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ListGraphSnapshots.html
*/
toListGraphSnapshots() {
return this.to('ListGraphSnapshots');
}
/**
* Grants permission to list the graphs in your account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ListGraphs.html
*/
toListGraphs() {
return this.to('ListGraphs');
}
/**
* Grants permission to list the import tasks in your account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ListImportTasks.html
*/
toListImportTasks() {
return this.to('ListImportTasks');
}
/**
* Grants permission to list the private graph endpoints for a given graph
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ListPrivateGraphEndpoints.html
*/
toListPrivateGraphEndpoints() {
return this.to('ListPrivateGraphEndpoints');
}
/**
* Grants permission to check the status of all active queries
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ListQueries.html
*/
toListQueries() {
return this.to('ListQueries');
}
/**
* Grants permission to lists tag for a Neptune Analytics resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to read data via query APIs on the graph
*
* Access Level: Read
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ExecuteQuery.html
*/
toReadDataViaQuery() {
return this.to('ReadDataViaQuery');
}
/**
* Grants permission to reset a graph which deletes all data within the graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ResetGraph.html
*/
toResetGraph() {
return this.to('ResetGraph');
}
/**
* Grants permission to create a new graph from an existing snapshot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_RestoreGraphFromSnapshot.html
*/
toRestoreGraphFromSnapshot() {
return this.to('RestoreGraphFromSnapshot');
}
/**
* Grants permission to export data from an existing graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_StartExportTask.html
*/
toStartExportTask() {
return this.to('StartExportTask');
}
/**
* Grants permission to start a graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_StartGraph.html
*/
toStartGraph() {
return this.to('StartGraph');
}
/**
* Grants permission to import data into an existing graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_StartImportTask.html
*/
toStartImportTask() {
return this.to('StartImportTask');
}
/**
* Grants permission to stop a graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_StopGraph.html
*/
toStopGraph() {
return this.to('StopGraph');
}
/**
* Grants permission to tag a Neptune Analytics resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to untag a Neptune Analytics resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to modify a graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_UpdateGraph.html
*/
toUpdateGraph() {
return this.to('UpdateGraph');
}
/**
* Grants permission to write data via query APIs on the graph
*
* Access Level: Write
*
* https://docs.aws.amazon.com/neptune-analytics/latest/apiref/API_ExecuteQuery.html
*/
toWriteDataViaQuery() {
return this.to('WriteDataViaQuery');
}
/**
* Adds a resource of type export-task to the statement
*
* https://docs.aws.amazon.com/neptune-analytics/latest/userguide/iam-resources.html#export-task
*
* @param resourceId - Identifier for the resourceId.
* @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.
*/
onExportTask(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:neptune-graph:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:export-task/${resourceId}`);
}
/**
* Adds a resource of type graph to the statement
*
* https://docs.aws.amazon.com/neptune-analytics/latest/userguide/iam-resources.html#graph
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onGraph(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:neptune-graph:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:graph/${resourceId}`);
}
/**
* Adds a resource of type graph-snapshot to the statement
*
* https://docs.aws.amazon.com/neptune-analytics/latest/userguide/iam-resources.html#graph-snapshot
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onGraphSnapshot(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:neptune-graph:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:graph-snapshot/${resourceId}`);
}
/**
* Adds a resource of type import-task to the statement
*
* https://docs.aws.amazon.com/neptune-analytics/latest/userguide/iam-resources.html#import-task
*
* @param resourceId - Identifier for the resourceId.
* @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.
*/
onImportTask(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:neptune-graph:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:import-task/${resourceId}`);
}
/**
* Filters access by a tag's key and value in a request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateGraph()
* - .toCreateGraphSnapshot()
* - .toCreateGraphUsingImportTask()
* - .toCreatePrivateGraphEndpoint()
* - .toRestoreGraphFromSnapshot()
* - .toStartExportTask()
* - .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 presence of tag key-value pairs in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toCancelExportTask()
* - .toCancelQuery()
* - .toCreateGraph()
* - .toCreateGraphSnapshot()
* - .toCreateGraphUsingImportTask()
* - .toCreatePrivateGraphEndpoint()
* - .toDeleteDataViaQuery()
* - .toDeleteGraph()
* - .toDeleteGraphSnapshot()
* - .toDeletePrivateGraphEndpoint()
* - .toGetEngineStatus()
* - .toGetExportTask()
* - .toGetGraph()
* - .toGetGraphSnapshot()
* - .toGetGraphSummary()
* - .toGetPrivateGraphEndpoint()
* - .toGetQueryStatus()
* - .toGetStatisticsStatus()
* - .toListGraphSnapshots()
* - .toListGraphs()
* - .toListPrivateGraphEndpoints()
* - .toListQueries()
* - .toListTagsForResource()
* - .toReadDataViaQuery()
* - .toResetGraph()
* - .toRestoreGraphFromSnapshot()
* - .toStartExportTask()
* - .toStartGraph()
* - .toStartImportTask()
* - .toStopGraph()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateGraph()
* - .toWriteDataViaQuery()
*
* Applies to resource types:
* - graph
* - graph-snapshot
*
* @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 in a request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateGraph()
* - .toCreateGraphSnapshot()
* - .toCreateGraphUsingImportTask()
* - .toCreatePrivateGraphEndpoint()
* - .toRestoreGraphFromSnapshot()
* - .toStartExportTask()
* - .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 value of the public connectivity parameter provided in the request or its default value, if unspecified. All access to graphs is IAM authenticated
*
* https://docs.aws.amazon.com/neptune-analytics/latest/userguide/iam-condition-keys.html#publicconnectivity
*
* Applies to actions:
* - .toCreateGraph()
* - .toCreateGraphUsingImportTask()
* - .toRestoreGraphFromSnapshot()
* - .toUpdateGraph()
*
* @param value `true` or `false`. **Default:** `true`
*/
ifPublicConnectivity(value) {
return this.if(`PublicConnectivity`, (typeof value !== 'undefined' ? value : true), 'Bool');
}
/**
* Statement provider for service [neptune-graph](https://docs.aws.amazon.com/service-authorization/latest/reference/list_neptune-graph.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'neptune-graph';
this.accessLevelList = {
Write: [
'CancelExportTask',
'CancelImportTask',
'CancelQuery',
'CreateGraph',
'CreateGraphSnapshot',
'CreateGraphUsingImportTask',
'CreatePrivateGraphEndpoint',
'DeleteDataViaQuery',
'DeleteGraph',
'DeleteGraphSnapshot',
'DeletePrivateGraphEndpoint',
'ResetGraph',
'RestoreGraphFromSnapshot',
'StartExportTask',
'StartGraph',
'StartImportTask',
'StopGraph',
'TagResource',
'UntagResource',
'UpdateGraph',
'WriteDataViaQuery'
],
Read: [
'GetEngineStatus',
'GetExportTask',
'GetGraph',
'GetGraphSnapshot',
'GetGraphSummary',
'GetImportTask',
'GetPrivateGraphEndpoint',
'GetQueryStatus',
'GetStatisticsStatus',
'ListExportTasks',
'ListGraphSnapshots',
'ListGraphs',
'ListImportTasks',
'ListPrivateGraphEndpoints',
'ListQueries',
'ListTagsForResource',
'ReadDataViaQuery'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.NeptuneGraph = NeptuneGraph;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVwdHVuZS1ncmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lcHR1bmUtZ3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLFlBQWEsU0FBUSx3QkFBZTtJQUcvQzs7Ozs7O09BTUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDRCQUE0QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksNEJBQTRCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFD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bUJBQW1CO2FBQ3BCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLGlCQUFpQjtnQkFDakIsZUFBZTtnQkFDZixVQUFVO2dCQUNWLGtCQUFrQjtnQkFDbEIsaUJBQWlCO2dCQUNqQixlQUFlO2dCQUNmLHlCQUF5QjtnQkFDekIsZ0JBQWdCO2dCQUNoQixxQkFBcUI7Z0JBQ3JCLGlCQUFpQjtnQkFDakIsb0JBQW9CO2dCQUNwQixZQUFZO2dCQUNaLGlCQUFpQjtnQkFDakIsMkJBQTJCO2dCQUMzQixhQUFhO2dCQUNiLHFCQUFxQjtnQkFDckIsa0JBQWtCO2FBQ25CO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUF3TEYsQ0FBQztDQUNGO0FBN29CRCxvQ0E2b0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtuZXB0dW5lLWdyYXBoXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9uZXB0dW5lLWdyYXBoLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgTmVwdHVuZUdyYXBoIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnbmVwdHVuZS1ncmFwaCc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhbiBvbmdvaW5nIGV4cG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0NhbmNlbEV4cG9ydFRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsRXhwb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsRXhwb3J0VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhbiBvbmdvaW5nIGltcG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0NhbmNlbEltcG9ydFRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsSW1wb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsSW1wb3J0VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhIHF1ZXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0NhbmNlbFF1ZXJ5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxRdWVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9DcmVhdGVHcmFwaC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVHcmFwaCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlR3JhcGgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgc25hcHNob3QgZnJvbSBhbiBleGlzdGluZyBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9DcmVhdGVHcmFwaFNuYXBzaG90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUdyYXBoU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUdyYXBoU25hcHNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgZ3JhcGggd2hpbGUgaW1wb3J0aW5nIGRhdGEgaW50byB0aGUgbmV3IGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0NyZWF0ZUdyYXBoVXNpbmdJbXBvcnRUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUdyYXBoVXNpbmdJbXBvcnRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVHcmFwaFVzaW5nSW1wb3J0VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBwcml2YXRlIGdyYXBoIGVuZHBvaW50IHRvIGFjY2VzcyB0aGUgZ3JhcGggZnJvbSB3aXRoaW4gYSB2cGNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L2FwaXJlZi9BUElfQ3JlYXRlUHJpdmF0ZUdyYXBoRW5kcG9pbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUHJpdmF0ZUdyYXBoRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVByaXZhdGVHcmFwaEVuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGRhdGEgdmlhIHF1ZXJ5IEFQSXMgb24gdGhlIGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0V4ZWN1dGVRdWVyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVEYXRhVmlhUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZURhdGFWaWFRdWVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0RlbGV0ZUdyYXBoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUdyYXBoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVHcmFwaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHNuYXBzaG90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0RlbGV0ZUdyYXBoU25hcHNob3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlR3JhcGhTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlR3JhcGhTbmFwc2hvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHByaXZhdGUgZ3JhcGggZW5kcG9pbnQgb2YgYSBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9EZWxldGVQcml2YXRlR3JhcGhFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVQcml2YXRlR3JhcGhFbmRwb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUHJpdmF0ZUdyYXBoRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIGVuZ2luZSBzdGF0dXMgb2YgdGhlIGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L2FwaXJlZi8jR2V0RW5naW5lU3RhdHVzXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFbmdpbmVTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEVuZ2luZVN0YXR1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBkZXRhaWxzIGFib3V0IGFuIGV4cG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L2FwaXJlZi9BUElfR2V0RXhwb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFeHBvcnRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRFeHBvcnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRldGFpbHMgYWJvdXQgYSBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0dldEdyYXBoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEdyYXBoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRHcmFwaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBkZXRhaWxzIGFib3V0IGEgc25hcHNob3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9HZXRHcmFwaFNuYXBzaG90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEdyYXBoU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEdyYXBoU25hcHNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHN1bW1hcnkgZm9yIHRoZSBkYXRhIGluIHRoZSBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0dldEdyYXBoU3VtbWFyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRHcmFwaFN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEdyYXBoU3VtbWFyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBkZXRhaWxzIGFib3V0IGFuIGltcG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L2FwaXJlZi9BUElfR2V0SW1wb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJbXBvcnRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRJbXBvcnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRldGFpbHMgYWJvdXQgYSBwcml2YXRlIGdyYXBoIGVuZHBvaW50IG9mIGEgZ3JhcGhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9HZXRQcml2YXRlR3JhcGhFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQcml2YXRlR3JhcGhFbmRwb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UHJpdmF0ZUdyYXBoRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gcXVlcnlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9HZXRRdWVyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRRdWVyeVN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVlcnlTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHN0YXRpc3RpY3MgZm9yIHRoZSBkYXRhIGluIHRoZSBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvI0dldFN0YXRpc3RpY3NTdGF0dXNcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0YXRpc3RpY3NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN0YXRpc3RpY3NTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRoZSBleHBvcnQgdGFza3MgaW4geW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L2FwaXJlZi9BUElfTGlzdEV4cG9ydFRhc2tzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RFeHBvcnRUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEV4cG9ydFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgc25hcHNob3RzIGluIHlvdXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0xpc3RHcmFwaFNuYXBzaG90cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0R3JhcGhTbmFwc2hvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RHcmFwaFNuYXBzaG90cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIGdyYXBocyBpbiB5b3VyIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9MaXN0R3JhcGhzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RHcmFwaHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RHcmFwaHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRoZSBpbXBvcnQgdGFza3MgaW4geW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L2FwaXJlZi9BUElfTGlzdEltcG9ydFRhc2tzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RJbXBvcnRUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEltcG9ydFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgcHJpdmF0ZSBncmFwaCBlbmRwb2ludHMgZm9yIGEgZ2l2ZW4gZ3JhcGhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9MaXN0UHJpdmF0ZUdyYXBoRW5kcG9pbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQcml2YXRlR3JhcGhFbmRwb2ludHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RQcml2YXRlR3JhcGhFbmRwb2ludHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGFsbCBhY3RpdmUgcXVlcmllc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0xpc3RRdWVyaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RRdWVyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UXVlcmllcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3RzIHRhZyBmb3IgYSBOZXB0dW5lIEFuYWx5dGljcyByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlYWQgZGF0YSB2aWEgcXVlcnkgQVBJcyBvbiB0aGUgZ3JhcGhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9FeGVjdXRlUXVlcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVhZERhdGFWaWFRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVhZERhdGFWaWFRdWVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlc2V0IGEgZ3JhcGggd2hpY2ggZGVsZXRlcyBhbGwgZGF0YSB3aXRoaW4gdGhlIGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX1Jlc2V0R3JhcGguaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVzZXRHcmFwaCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVzZXRHcmFwaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBncmFwaCBmcm9tIGFuIGV4aXN0aW5nIHNuYXBzaG90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX1Jlc3RvcmVHcmFwaEZyb21TbmFwc2hvdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXN0b3JlR3JhcGhGcm9tU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVHcmFwaEZyb21TbmFwc2hvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGV4cG9ydCBkYXRhIGZyb20gYW4gZXhpc3RpbmcgZ3JhcGhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L2FwaXJlZi9BUElfU3RhcnRFeHBvcnRUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0RXhwb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRFeHBvcnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYSBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9TdGFydEdyYXBoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0R3JhcGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0R3JhcGgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbXBvcnQgZGF0YSBpbnRvIGFuIGV4aXN0aW5nIGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX1N0YXJ0SW1wb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydEltcG9ydFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0SW1wb3J0VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgYSBncmFwaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9TdG9wR3JhcGguaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RvcEdyYXBoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9wR3JhcGgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0YWcgYSBOZXB0dW5lIEFuYWx5dGljcyByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lLWFuYWx5dGljcy9sYXRlc3QvYXBpcmVmL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bnRhZyBhIE5lcHR1bmUgQW5hbHl0aWNzIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX1VudGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW50YWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW50YWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhIGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX1VwZGF0ZUdyYXBoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUdyYXBoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVHcmFwaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHdyaXRlIGRhdGEgdmlhIHF1ZXJ5IEFQSXMgb24gdGhlIGdyYXBoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC9hcGlyZWYvQVBJX0V4ZWN1dGVRdWVyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Xcml0ZURhdGFWaWFRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnV3JpdGVEYXRhVmlhUXVlcnknKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0NhbmNlbEV4cG9ydFRhc2snLFxuICAgICAgJ0NhbmNlbEltcG9ydFRhc2snLFxuICAgICAgJ0NhbmNlbFF1ZXJ5JyxcbiAgICAgICdDcmVhdGVHcmFwaCcsXG4gICAgICAnQ3JlYXRlR3JhcGhTbmFwc2hvdCcsXG4gICAgICAnQ3JlYXRlR3JhcGhVc2luZ0ltcG9ydFRhc2snLFxuICAgICAgJ0NyZWF0ZVByaXZhdGVHcmFwaEVuZHBvaW50JyxcbiAgICAgICdEZWxldGVEYXRhVmlhUXVlcnknLFxuICAgICAgJ0RlbGV0ZUdyYXBoJyxcbiAgICAgICdEZWxldGVHcmFwaFNuYXBzaG90JyxcbiAgICAgICdEZWxldGVQcml2YXRlR3JhcGhFbmRwb2ludCcsXG4gICAgICAnUmVzZXRHcmFwaCcsXG4gICAgICAnUmVzdG9yZUdyYXBoRnJvbVNuYXBzaG90JyxcbiAgICAgICdTdGFydEV4cG9ydFRhc2snLFxuICAgICAgJ1N0YXJ0R3JhcGgnLFxuICAgICAgJ1N0YXJ0SW1wb3J0VGFzaycsXG4gICAgICAnU3RvcEdyYXBoJyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlR3JhcGgnLFxuICAgICAgJ1dyaXRlRGF0YVZpYVF1ZXJ5J1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0dldEVuZ2luZVN0YXR1cycsXG4gICAgICAnR2V0RXhwb3J0VGFzaycsXG4gICAgICAnR2V0R3JhcGgnLFxuICAgICAgJ0dldEdyYXBoU25hcHNob3QnLFxuICAgICAgJ0dldEdyYXBoU3VtbWFyeScsXG4gICAgICAnR2V0SW1wb3J0VGFzaycsXG4gICAgICAnR2V0UHJpdmF0ZUdyYXBoRW5kcG9pbnQnLFxuICAgICAgJ0dldFF1ZXJ5U3RhdHVzJyxcbiAgICAgICdHZXRTdGF0aXN0aWNzU3RhdHVzJyxcbiAgICAgICdMaXN0RXhwb3J0VGFza3MnLFxuICAgICAgJ0xpc3RHcmFwaFNuYXBzaG90cycsXG4gICAgICAnTGlzdEdyYXBocycsXG4gICAgICAnTGlzdEltcG9ydFRhc2tzJyxcbiAgICAgICdMaXN0UHJpdmF0ZUdyYXBoRW5kcG9pbnRzJyxcbiAgICAgICdMaXN0UXVlcmllcycsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZScsXG4gICAgICAnUmVhZERhdGFWaWFRdWVyeSdcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGV4cG9ydC10YXNrIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC91c2VyZ3VpZGUvaWFtLXJlc291cmNlcy5odG1sI2V4cG9ydC10YXNrXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uRXhwb3J0VGFzayhyZXNvdXJjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bmVwdHVuZS1ncmFwaDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZXhwb3J0LXRhc2svJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZ3JhcGggdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS1hbmFseXRpY3MvbGF0ZXN0L3VzZXJndWlkZS9pYW0tcmVzb3VyY2VzLmh0bWwjZ3JhcGhcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uR3JhcGgocmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om5lcHR1bmUtZ3JhcGg6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmdyYXBoLyR7IHJlc291cmNlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGdyYXBoLXNuYXBzaG90IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUtYW5hbHl0aWNzL2xhdGVzdC91c2VyZ3VpZGUvaWFtLXJlc291cmNlcy5odG1sI2dyYXBoLXNuYXBzaG90XG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkdyYXBoU25hcHNob3QocmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om5lcHR1bmUtZ3JhcGg6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmdyYXBoLXNuYXB