UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

671 lines 55.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Wickr = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [wickr](https://docs.aws.amazon.com/service-authorization/latest/reference/list_wickr.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class Wickr extends shared_1.PolicyStatement { /** * Grants permission to batch create users in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toBatchCreateUser() { return this.to('BatchCreateUser'); } /** * Grants permission to batch delete users from a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toBatchDeleteUser() { return this.to('BatchDeleteUser'); } /** * Grants permission to batch lookup user unames in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toBatchLookupUserUname() { return this.to('BatchLookupUserUname'); } /** * Grants permission to batch reinvite users in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toBatchReinviteUser() { return this.to('BatchReinviteUser'); } /** * Grants permission to batch reset devices for a user in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toBatchResetDevicesForUser() { return this.to('BatchResetDevicesForUser'); } /** * Grants permission to batch toggle user suspend status in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toBatchToggleUserSuspendStatus() { return this.to('BatchToggleUserSuspendStatus'); } /** * Grants permission to create and manage Wickr networks * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toCreateAdminSession() { return this.to('CreateAdminSession'); } /** * Grants permission to create a bot in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toCreateBot() { return this.to('CreateBot'); } /** * Grants permission to create a data retention bot in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toCreateDataRetentionBot() { return this.to('CreateDataRetentionBot'); } /** * Grants permission to create a data retention bot challenge in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toCreateDataRetentionBotChallenge() { return this.to('CreateDataRetentionBotChallenge'); } /** * Grants permission to create a new Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toCreateNetwork() { return this.to('CreateNetwork'); } /** * Grants permission to create a security group in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toCreateSecurityGroup() { return this.to('CreateSecurityGroup'); } /** * Grants permission to delete a bot from a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toDeleteBot() { return this.to('DeleteBot'); } /** * Grants permission to delete a data retention bot from a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toDeleteDataRetentionBot() { return this.to('DeleteDataRetentionBot'); } /** * Grants permission to delete Wickr networks * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toDeleteNetwork() { return this.to('DeleteNetwork'); } /** * Grants permission to delete a security group from a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toDeleteSecurityGroup() { return this.to('DeleteSecurityGroup'); } /** * Grants permission to get bot information in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetBot() { return this.to('GetBot'); } /** * Grants permission to get bot count for a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetBotsCount() { return this.to('GetBotsCount'); } /** * Grants permission to get data retention bot information in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetDataRetentionBot() { return this.to('GetDataRetentionBot'); } /** * Grants permission to get guest user history count for a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetGuestUserHistoryCount() { return this.to('GetGuestUserHistoryCount'); } /** * Grants permission to get details of a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetNetwork() { return this.to('GetNetwork'); } /** * Grants permission to get network settings for a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetNetworkSettings() { return this.to('GetNetworkSettings'); } /** * Grants permission to get OIDC information for a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetOidcInfo() { return this.to('GetOidcInfo'); } /** * Grants permission to retrieve the OpenTDF integration configuration for a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/APIReference/API_GetOpentdfConfig.html */ toGetOpentdfConfig() { return this.to('GetOpentdfConfig'); } /** * Grants permission to get security group information in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetSecurityGroup() { return this.to('GetSecurityGroup'); } /** * Grants permission to get information about a user in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetUser() { return this.to('GetUser'); } /** * Grants permission to get user count for a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toGetUsersCount() { return this.to('GetUsersCount'); } /** * Grants permission to list blocked guest users in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListBlockedGuestUsers() { return this.to('ListBlockedGuestUsers'); } /** * Grants permission to list bots in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListBots() { return this.to('ListBots'); } /** * Grants permission to list devices for a user in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListDevicesForUser() { return this.to('ListDevicesForUser'); } /** * Grants permission to list guest users in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListGuestUsers() { return this.to('ListGuestUsers'); } /** * Grants permission to list Wickr networks * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListNetworks() { return this.to('ListNetworks'); } /** * Grants permission to list users in a security group in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListSecurityGroupUsers() { return this.to('ListSecurityGroupUsers'); } /** * Grants permission to list security groups in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListSecurityGroups() { return this.to('ListSecurityGroups'); } /** * Grants permission to list the tags applied to a Wickr resource * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListTagsForResource() { return this.to('ListTagsForResource'); } /** * Grants permission to list users in a Wickr network * * Access Level: Read * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toListUsers() { return this.to('ListUsers'); } /** * Grants permission to register OIDC configuration for a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toRegisterOidcConfig() { return this.to('RegisterOidcConfig'); } /** * Grants permission to test OIDC configuration for a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toRegisterOidcConfigTest() { return this.to('RegisterOidcConfigTest'); } /** * Grants permission to register and save OpenTDF integration configuration for a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/APIReference/API_RegisterOpentdfConfig.html */ toRegisterOpentdfConfig() { return this.to('RegisterOpentdfConfig'); } /** * Grants permission to add tags to a specified Wickr resource * * Access Level: Tagging, Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toTagResource() { return this.to('TagResource'); } /** * Grants permission to untag the specified tags from the specified Wickr resource * * Access Level: Tagging, Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUntagResource() { return this.to('UntagResource'); } /** * Grants permission to update a bot in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUpdateBot() { return this.to('UpdateBot'); } /** * Grants permission to update data retention settings in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUpdateDataRetention() { return this.to('UpdateDataRetention'); } /** * Grants permission to update guest user status in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUpdateGuestUser() { return this.to('UpdateGuestUser'); } /** * Grants permission to update Wickr network details * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUpdateNetworkDetails() { return this.to('UpdateNetworkDetails'); } /** * Grants permission to update network settings for a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUpdateNetworkSettings() { return this.to('UpdateNetworkSettings'); } /** * Grants permission to update a security group in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUpdateSecurityGroup() { return this.to('UpdateSecurityGroup'); } /** * Grants permission to update user information in a Wickr network * * Access Level: Write * * https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html */ toUpdateUser() { return this.to('UpdateUser'); } /** * Adds a resource of type network to the statement * * https://docs.aws.amazon.com/wickr/latest/adminguide/ * * @param networkId - Identifier for the networkId. * @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() */ onNetwork(networkId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:wickr:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network/${networkId}`); } /** * 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: * - .toCreateNetwork() * - .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 tag key-value pairs attached to the resource * * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag * * Applies to actions: * - .toBatchCreateUser() * - .toBatchDeleteUser() * - .toBatchLookupUserUname() * - .toBatchReinviteUser() * - .toBatchResetDevicesForUser() * - .toBatchToggleUserSuspendStatus() * - .toCreateAdminSession() * - .toCreateBot() * - .toCreateDataRetentionBot() * - .toCreateDataRetentionBotChallenge() * - .toCreateNetwork() * - .toCreateSecurityGroup() * - .toDeleteBot() * - .toDeleteDataRetentionBot() * - .toDeleteNetwork() * - .toDeleteSecurityGroup() * - .toGetBot() * - .toGetBotsCount() * - .toGetDataRetentionBot() * - .toGetGuestUserHistoryCount() * - .toGetNetwork() * - .toGetNetworkSettings() * - .toGetOidcInfo() * - .toGetOpentdfConfig() * - .toGetSecurityGroup() * - .toGetUser() * - .toGetUsersCount() * - .toListBlockedGuestUsers() * - .toListBots() * - .toListDevicesForUser() * - .toListGuestUsers() * - .toListSecurityGroupUsers() * - .toListSecurityGroups() * - .toListTagsForResource() * - .toListUsers() * - .toRegisterOidcConfig() * - .toRegisterOidcConfigTest() * - .toRegisterOpentdfConfig() * - .toTagResource() * - .toUntagResource() * - .toUpdateBot() * - .toUpdateDataRetention() * - .toUpdateGuestUser() * - .toUpdateNetworkDetails() * - .toUpdateNetworkSettings() * - .toUpdateSecurityGroup() * - .toUpdateUser() * * Applies to resource types: * - network * * @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: * - .toCreateNetwork() * - .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 [wickr](https://docs.aws.amazon.com/service-authorization/latest/reference/list_wickr.html). * */ constructor(props) { super(props); this.servicePrefix = 'wickr'; this.accessLevelList = { Write: [ 'BatchCreateUser', 'BatchDeleteUser', 'BatchReinviteUser', 'BatchResetDevicesForUser', 'BatchToggleUserSuspendStatus', 'CreateAdminSession', 'CreateBot', 'CreateDataRetentionBot', 'CreateDataRetentionBotChallenge', 'CreateNetwork', 'CreateSecurityGroup', 'DeleteBot', 'DeleteDataRetentionBot', 'DeleteNetwork', 'DeleteSecurityGroup', 'RegisterOidcConfig', 'RegisterOidcConfigTest', 'RegisterOpentdfConfig', 'TagResource', 'UntagResource', 'UpdateBot', 'UpdateDataRetention', 'UpdateGuestUser', 'UpdateNetworkDetails', 'UpdateNetworkSettings', 'UpdateSecurityGroup', 'UpdateUser' ], Read: [ 'BatchLookupUserUname', 'GetBot', 'GetBotsCount', 'GetDataRetentionBot', 'GetGuestUserHistoryCount', 'GetNetwork', 'GetNetworkSettings', 'GetOidcInfo', 'GetOpentdfConfig', 'GetSecurityGroup', 'GetUser', 'GetUsersCount', 'ListBlockedGuestUsers', 'ListBots', 'ListDevicesForUser', 'ListGuestUsers', 'ListNetworks', 'ListSecurityGroupUsers', 'ListSecurityGroups', 'ListTagsForResource', 'ListUsers' ], Tagging: [ 'TagResource', 'UntagResource' ] }; } } exports.Wickr = Wickr; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lja3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3aWNrci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsS0FBTSxTQUFRLHdCQUFlO0lBR3hDOzs7Ozs7T0FNRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw4QkFBOEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENB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QkFBdUI7Z0JBQ3ZCLHFCQUFxQjtnQkFDckIsWUFBWTthQUNiO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLHNCQUFzQjtnQkFDdEIsUUFBUTtnQkFDUixjQUFjO2dCQUNkLHFCQUFxQjtnQkFDckIsMEJBQTBCO2dCQUMxQixZQUFZO2dCQUNaLG9CQUFvQjtnQkFDcEIsYUFBYTtnQkFDYixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsU0FBUztnQkFDVCxlQUFlO2dCQUNmLHVCQUF1QjtnQkFDdkIsVUFBVTtnQkFDVixvQkFBb0I7Z0JBQ3BCLGdCQUFnQjtnQkFDaEIsY0FBYztnQkFDZCx3QkFBd0I7Z0JBQ3hCLG9CQUFvQjtnQkFDcEIscUJBQXFCO2dCQUNyQixXQUFXO2FBQ1o7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQTRIRixDQUFDO0NBQ0Y7QUF6c0JELHNCQXlzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3dpY2tyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF93aWNrci5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFdpY2tyIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnd2lja3InO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCBjcmVhdGUgdXNlcnMgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaENyZWF0ZVVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoQ3JlYXRlVXNlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJhdGNoIGRlbGV0ZSB1c2VycyBmcm9tIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hEZWxldGVVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlbGV0ZVVzZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCBsb29rdXAgdXNlciB1bmFtZXMgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoTG9va3VwVXNlclVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaExvb2t1cFVzZXJVbmFtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJhdGNoIHJlaW52aXRlIHVzZXJzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hSZWludml0ZVVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoUmVpbnZpdGVVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYmF0Y2ggcmVzZXQgZGV2aWNlcyBmb3IgYSB1c2VyIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hSZXNldERldmljZXNGb3JVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaFJlc2V0RGV2aWNlc0ZvclVzZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCB0b2dnbGUgdXNlciBzdXNwZW5kIHN0YXR1cyBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoVG9nZ2xlVXNlclN1c3BlbmRTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoVG9nZ2xlVXNlclN1c3BlbmRTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW5kIG1hbmFnZSBXaWNrciBuZXR3b3Jrc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQWRtaW5TZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVBZG1pblNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBib3QgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVCb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUJvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGRhdGEgcmV0ZW50aW9uIGJvdCBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZURhdGFSZXRlbnRpb25Cb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURhdGFSZXRlbnRpb25Cb3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBkYXRhIHJldGVudGlvbiBib3QgY2hhbGxlbmdlIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRGF0YVJldGVudGlvbkJvdENoYWxsZW5nZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRGF0YVJldGVudGlvbkJvdENoYWxsZW5nZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVOZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVOZXR3b3JrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc2VjdXJpdHkgZ3JvdXAgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTZWN1cml0eUdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTZWN1cml0eUdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgYm90IGZyb20gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVCb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUJvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGRhdGEgcmV0ZW50aW9uIGJvdCBmcm9tIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRGF0YVJldGVudGlvbkJvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRGF0YVJldGVudGlvbkJvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBXaWNrciBuZXR3b3Jrc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTmV0d29yaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHNlY3VyaXR5IGdyb3VwIGZyb20gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTZWN1cml0eUdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTZWN1cml0eUdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGJvdCBpbmZvcm1hdGlvbiBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Qm90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRCb3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYm90IGNvdW50IGZvciBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Qm90c0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRCb3RzQ291bnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgZGF0YSByZXRlbnRpb24gYm90IGluZm9ybWF0aW9uIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREYXRhUmV0ZW50aW9uQm90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREYXRhUmV0ZW50aW9uQm90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGd1ZXN0IHVzZXIgaGlzdG9yeSBjb3VudCBmb3IgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEd1ZXN0VXNlckhpc3RvcnlDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0R3Vlc3RVc2VySGlzdG9yeUNvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRldGFpbHMgb2YgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE5ldHdvcmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgbmV0d29yayBzZXR0aW5ncyBmb3IgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE5ldHdvcmtTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TmV0d29ya1NldHRpbmdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IE9JREMgaW5mb3JtYXRpb24gZm9yIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRPaWRjSW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0T2lkY0luZm8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgT3BlblRERiBpbnRlZ3JhdGlvbiBjb25maWd1cmF0aW9uIGZvciBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRPcGVudGRmQ29uZmlnLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE9wZW50ZGZDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE9wZW50ZGZDb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgc2VjdXJpdHkgZ3JvdXAgaW5mb3JtYXRpb24gaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlY3VyaXR5R3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlY3VyaXR5R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHVzZXIgY291bnQgZm9yIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRVc2Vyc0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRVc2Vyc0NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBibG9ja2VkIGd1ZXN0IHVzZXJzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QmxvY2tlZEd1ZXN0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCbG9ja2VkR3Vlc3RVc2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYm90cyBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCb3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBkZXZpY2VzIGZvciBhIHVzZXIgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REZXZpY2VzRm9yVXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdERldmljZXNGb3JVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBndWVzdCB1c2VycyBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEd1ZXN0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RHdWVzdFVzZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBXaWNrciBuZXR3b3Jrc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TmV0d29ya3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3ROZXR3b3JrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdXNlcnMgaW4gYSBzZWN1cml0eSBncm91cCBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNlY3VyaXR5R3JvdXBVc2VycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNlY3VyaXR5R3JvdXBVc2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc2VjdXJpdHkgZ3JvdXBzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2VjdXJpdHlHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZWN1cml0eUdyb3VwcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHRhZ3MgYXBwbGllZCB0byBhIFdpY2tyIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHVzZXJzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RVc2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlZ2lzdGVyIE9JREMgY29uZmlndXJhdGlvbiBmb3IgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWdpc3Rlck9pZGNDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlZ2lzdGVyT2lkY0NvbmZpZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHRlc3QgT0lEQyBjb25maWd1cmF0aW9uIGZvciBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlZ2lzdGVyT2lkY0NvbmZpZ1Rlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlZ2lzdGVyT2lkY0NvbmZpZ1Rlc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWdpc3RlciBhbmQgc2F2ZSBPcGVuVERGIGludGVncmF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZWdpc3Rlck9wZW50ZGZDb25maWcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVnaXN0ZXJPcGVudGRmQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWdpc3Rlck9wZW50ZGZDb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgdGFncyB0byBhIHNwZWNpZmllZCBXaWNrciByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdW50YWcgdGhlIHNwZWNpZmllZCB0YWdzIGZyb20gdGhlIHNwZWNpZmllZCBXaWNrciByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW50YWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW50YWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIGJvdCBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUJvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQm90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGRhdGEgcmV0ZW50aW9uIHNldHRpbmdzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRGF0YVJldGVudGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRGF0YVJldGVudGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBndWVzdCB1c2VyIHN0YXR1cyBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUd1ZXN0VXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlR3Vlc3RVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIFdpY2tyIG5ldHdvcmsgZGV0YWlsc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTmV0d29ya0RldGFpbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU5ldHdvcmtEZXRhaWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIG5ldHdvcmsgc2V0dGluZ3MgZm9yIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTmV0d29ya1NldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVOZXR3b3JrU2V0dGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBzZWN1cml0eSBncm91cCBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVNlY3VyaXR5R3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVNlY3VyaXR5R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVVzZXInKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0JhdGNoQ3JlYXRlVXNlcicsXG4gICAgICAnQmF0Y2hEZWxldGVVc2VyJyxcbiAgICAgICdCYXRjaFJlaW52aXRlVXNlcicsXG4gICAgICAnQmF0Y2hSZXNldERldmljZXNGb3JVc2VyJyxcbiAgICAgICdCYXRjaFRvZ2dsZVVzZXJTdXNwZW5kU3RhdHVzJyxcbiAgICAgICdDcmVhdGVBZG1pblNlc3Npb24nLFxuICAgICAgJ0NyZWF0ZUJvdCcsXG4gICAgICAnQ3JlYXRlRGF0YVJldGVudGlvbkJvdCcsXG4gICAgICAnQ3JlYXRlRGF0YVJldGVudGlvbkJvdENoYWxsZW5nZScsXG4gICAgICAnQ3JlYXRlTmV0d29yaycsXG4gICAgICAnQ3JlYXRlU2VjdXJpdHlHcm91cCcsXG4gICAgICAnRGVsZXRlQm90JyxcbiAgICAgICdEZWxldGVEYXRhUmV0ZW50aW9uQm90JyxcbiAgICAgICdEZWxldGVOZXR3b3JrJyxcbiAgICAgICdEZWxldGVTZWN1cml0eUdyb3VwJyxcbiAgICAgICdSZWdpc3Rlck9pZGNDb25maWcnLFxuICAgICAgJ1JlZ2lzdGVyT2lkY0NvbmZpZ1Rlc3QnLFxuICAgICAgJ1JlZ2lzdGVyT3BlbnRkZkNvbmZpZycsXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnLFxuICAgICAgJ1VwZGF0ZUJvdCcsXG4gICAgICAnVXBkYXRlRGF0YVJldGVudGlvbicsXG4gICAgICAnVXBkYXRlR3Vlc3RVc2VyJyxcbiAgICAgICdVcGRhdGVOZXR3b3JrRGV0YWlscycsXG4gICAgICAnVXBkYXRlTmV0d29ya1NldHRpbmdzJyxcbiAgICAgICdVcGRhdGVTZWN1cml0eUdyb3VwJyxcbiAgICAgICdVcGRhdGVVc2VyJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0JhdGNoTG9va3VwVXNlclVuYW1lJyxcbiAgICAgICdHZXRCb3QnLFxuICAgICAgJ0dldEJvdHNDb3VudCcsXG4gICAgICAnR2V0RGF0YVJldGVudGlvbkJvdCcsXG4gICAgICAnR2V0R3Vlc3RVc2VySGlzdG9yeUNvdW50JyxcbiAgICAgICdHZXROZXR3b3JrJyxcbiAgICAgICdHZXROZXR3b3JrU2V0dGluZ3MnLFxuICAgICAgJ0dldE9pZGNJbmZvJyxcbiAgICAgICdHZXRPcGVudGRmQ29uZmlnJyxcbiAgICAgICdHZXRTZWN1cml0eUdyb3VwJyxcbiAgICAgICdHZXRVc2VyJyxcbiAgICAgICdHZXRVc2Vyc0NvdW50JyxcbiAgICAgICdMaXN0QmxvY2tlZEd1ZXN0VXNlcnMnLFxuICAgICAgJ0xpc3RCb3RzJyxcbiAgICAgICdMaXN0RGV2aWNlc0ZvclVzZXInLFxuICAgICAgJ0xpc3RHdWVzdFVzZXJzJyxcbiAgICAgICdMaXN0TmV0d29ya3MnLFxuICAgICAgJ0xpc3RTZWN1cml0eUdyb3VwVXNlcnMnLFxuICAgICAgJ0xpc3RTZWN1cml0eUdyb3VwcycsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZScsXG4gICAgICAnTGlzdFVzZXJzJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbmV0d29yayB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9cbiAgICpcbiAgICogQHBhcmFtIG5ldHdvcmtJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBuZXR3b3JrSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlx