Retrieves the contents of the encrypted fields SecretString
or SecretBinary
for up to 20 secrets. To retrieve a single secret, call GetSecretValue.
To choose which secrets to retrieve, you can specify a list of secrets by name or ARN, or you can use filters. If Secrets Manager encounters errors such as AccessDeniedException
while attempting to retrieve any of the secrets, you can see the errors in Errors
in the response.
Secrets Manager generates CloudTrail GetSecretValue
log entries for each secret you request when you call this action. Do not include sensitive information in request parameters because it might be logged. For more information, see Logging Secrets Manager events with CloudTrail.
+ * Required permissions:
+ * secretsmanager:BatchGetSecretValue
, and you must have secretsmanager:GetSecretValue
for each secret. If you use filters, you must also have secretsmanager:ListSecrets
. If the secrets are encrypted using customer-managed keys instead of the Amazon Web Services managed key
+ * aws/secretsmanager
, then you also need kms:Decrypt
permissions for the keys.
+ * For more information, see
+ * IAM policy actions for Secrets Manager and Authentication
+ * and access control in Secrets Manager.
Secrets Manager can't decrypt the protected secret text using the provided KMS key.
+ * + * @throws {@link InternalServiceError} (server fault) + *An error occurred on the server side.
+ * + * @throws {@link InvalidNextTokenException} (client fault) + *The NextToken
value is invalid.
The parameter name or value is invalid.
+ * + * @throws {@link InvalidRequestException} (client fault) + *A parameter value is not valid for the current state of the + * resource.
+ *Possible causes:
+ *The secret is scheduled for deletion.
+ *You tried to enable rotation on a secret that doesn't already have a Lambda function + * ARN configured and you didn't include such an ARN as a parameter in this call.
+ *The secret is managed by another service, and you must use that service to update it. + * For more information, see Secrets managed by other Amazon Web Services services.
+ *Secrets Manager can't find the resource that you asked for.
+ * + * @throws {@link SecretsManagerServiceException} + *Base exception class for all service exceptions from SecretsManager service.
+ * + */ +export class BatchGetSecretValueCommand extends $Command< + BatchGetSecretValueCommandInput, + BatchGetSecretValueCommandOutput, + SecretsManagerClientResolvedConfig +> { + public static getEndpointParameterInstructions(): EndpointParameterInstructions { + return { + UseFIPS: { type: "builtInParams", name: "useFipsEndpoint" }, + Endpoint: { type: "builtInParams", name: "endpoint" }, + Region: { type: "builtInParams", name: "region" }, + UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" }, + }; + } + + /** + * @public + */ + constructor(readonly input: BatchGetSecretValueCommandInput) { + super(); + } + + /** + * @internal + */ + resolveMiddleware( + clientStack: MiddlewareStackRetrieves the contents of the encrypted fields SecretString
or
* SecretBinary
from the specified version of a secret, whichever contains
* content.
To retrieve the values for a group of secrets, call BatchGetSecretValue.
*We recommend that you cache your secret values by using client-side caching. * Caching secrets improves speed and reduces your costs. For more information, see Cache secrets for * your applications.
diff --git a/clients/client-secrets-manager/src/commands/ListSecretsCommand.ts b/clients/client-secrets-manager/src/commands/ListSecretsCommand.ts index 367baff68820..1c6495bd75b5 100644 --- a/clients/client-secrets-manager/src/commands/ListSecretsCommand.ts +++ b/clients/client-secrets-manager/src/commands/ListSecretsCommand.ts @@ -42,8 +42,7 @@ export interface ListSecretsCommandOutput extends ListSecretsResponse, __Metadat *ListSecrets is eventually consistent, however it might not reflect changes from the last five minutes. * To get the latest information for a specific secret, use DescribeSecret.
*To list the versions of a secret, use ListSecretVersionIds.
- *To get the secret value from SecretString
or SecretBinary
,
- * call GetSecretValue.
To retrieve the values for the secrets, call BatchGetSecretValue or GetSecretValue.
*For information about finding secrets in the console, see Find secrets in Secrets Manager.
*Secrets Manager generates a CloudTrail log entry when you call this action. Do not include sensitive information in request parameters because it might be logged. For more information, see Logging Secrets Manager events with CloudTrail.
*diff --git a/clients/client-secrets-manager/src/commands/index.ts b/clients/client-secrets-manager/src/commands/index.ts index 214445e8f4b3..2b1413e768cc 100644 --- a/clients/client-secrets-manager/src/commands/index.ts +++ b/clients/client-secrets-manager/src/commands/index.ts @@ -1,4 +1,5 @@ // smithy-typescript generated code +export * from "./BatchGetSecretValueCommand"; export * from "./CancelRotateSecretCommand"; export * from "./CreateSecretCommand"; export * from "./DeleteResourcePolicyCommand"; diff --git a/clients/client-secrets-manager/src/models/models_0.ts b/clients/client-secrets-manager/src/models/models_0.ts index bcb79d9bd0fd..5604e211c3e4 100644 --- a/clients/client-secrets-manager/src/models/models_0.ts +++ b/clients/client-secrets-manager/src/models/models_0.ts @@ -23,42 +23,230 @@ export interface ReplicaRegionType { /** * @public + *
The error Secrets Manager encountered while retrieving an individual secret as part of BatchGetSecretValue.
*/ -export interface CancelRotateSecretRequest { +export interface APIErrorType { /** * @public *The ARN or name of the secret.
- *For an ARN, we recommend that you specify a complete ARN rather - * than a partial ARN. See Finding a secret from a partial ARN.
*/ - SecretId: string | undefined; + SecretId?: string; + + /** + * @public + *The error Secrets Manager encountered while retrieving an individual secret as part of BatchGetSecretValue, for example ResourceNotFoundException
,InvalidParameterException
, InvalidRequestException
, DecryptionFailure
, or AccessDeniedException
.
A message describing the error.
+ */ + Message?: string; } /** * @public + * @enum */ -export interface CancelRotateSecretResponse { +export const FilterNameStringType = { + all: "all", + description: "description", + name: "name", + owning_service: "owning-service", + primary_region: "primary-region", + tag_key: "tag-key", + tag_value: "tag-value", +} as const; + +/** + * @public + */ +export type FilterNameStringType = (typeof FilterNameStringType)[keyof typeof FilterNameStringType]; + +/** + * @public + *Allows you to add filters when you use the search function in Secrets Manager. For more information, see Find secrets in Secrets Manager.
+ */ +export interface Filter { /** * @public - *The ARN of the secret.
+ *The following are keys you can use:
+ *+ * description: Prefix match, not case-sensitive.
+ *+ * name: Prefix match, case-sensitive.
+ *+ * tag-key: Prefix match, case-sensitive.
+ *+ * tag-value: Prefix match, case-sensitive.
+ *+ * primary-region: Prefix match, case-sensitive.
+ *+ * owning-service: Prefix match, case-sensitive.
+ *+ * all: Breaks the filter value string into words and then searches all attributes for matches. Not case-sensitive.
+ *The keyword to filter for.
+ *You can prefix your search value with an exclamation mark (!
) in order to perform negation filters.
The ARN or names of the secrets to retrieve. You must include Filters
or SecretIdList
, but not both.
The filters to choose which secrets to retrieve. You must include Filters
or SecretIdList
, but not both.
The number of results to include in the response.
+ *If there are more results available, in the response, Secrets Manager includes NextToken
.
+ * To get the next results, call BatchGetSecretValue
again with the value from
+ * NextToken
.
A token that indicates where the output should continue from, if a
+ * previous call did not show all results. To get the next results, call BatchGetSecretValue
again
+ * with this value.
A structure that contains the secret value and other details for a secret.
+ */ +export interface SecretValueEntry { + /** + * @public + *The Amazon Resource Name (ARN) of the secret.
*/ ARN?: string; /** * @public - *The name of the secret.
+ *The friendly name of the secret.
*/ Name?: string; /** * @public - *The unique identifier of the version of the secret created during the rotation. This
- * version might not be complete, and should be evaluated for possible deletion. We recommend
- * that you remove the VersionStage
value AWSPENDING
from this version so that
- * Secrets Manager can delete it. Failing to clean up a cancelled rotation can block you from
- * starting future rotations.
The unique version identifier of this version of the secret.
*/ VersionId?: string; + + /** + * @public + *The decrypted secret value, if the secret value was originally provided as + * binary data in the form of a byte array. The parameter represents the binary data as + * a base64-encoded + * string.
+ */ + SecretBinary?: Uint8Array; + + /** + * @public + *The decrypted secret value, if the secret value was originally provided as a string or + * through the Secrets Manager console.
+ */ + SecretString?: string; + + /** + * @public + *A list of all of the staging labels currently attached to this version of the + * secret.
+ */ + VersionStages?: string[]; + + /** + * @public + *The date the secret was created.
+ */ + CreatedDate?: Date; +} + +/** + * @public + */ +export interface BatchGetSecretValueResponse { + /** + * @public + *A list of secret values.
+ */ + SecretValues?: SecretValueEntry[]; + + /** + * @public + *Secrets Manager includes this value if
+ * there's more output available than what is included in the current response. This can
+ * occur even when the response includes no values at all, such as when you ask for a filtered view
+ * of a long list. To get the next results, call BatchGetSecretValue
again
+ * with this value.
A list of errors Secrets Manager encountered while attempting to retrieve individual secrets.
+ */ + Errors?: APIErrorType[]; +} + +/** + * @public + *Secrets Manager can't decrypt the protected secret text using the provided KMS key.
+ */ +export class DecryptionFailure extends __BaseException { + readonly name: "DecryptionFailure" = "DecryptionFailure"; + readonly $fault: "client" = "client"; + Message?: string; + /** + * @internal + */ + constructor(opts: __ExceptionOptionTypeThe NextToken
value is invalid.
The parameter name or value is invalid.
@@ -164,6 +374,46 @@ export class ResourceNotFoundException extends __BaseException { } } +/** + * @public + */ +export interface CancelRotateSecretRequest { + /** + * @public + *The ARN or name of the secret.
+ *For an ARN, we recommend that you specify a complete ARN rather + * than a partial ARN. See Finding a secret from a partial ARN.
+ */ + SecretId: string | undefined; +} + +/** + * @public + */ +export interface CancelRotateSecretResponse { + /** + * @public + *The ARN of the secret.
+ */ + ARN?: string; + + /** + * @public + *The name of the secret.
+ */ + Name?: string; + + /** + * @public + *The unique identifier of the version of the secret created during the rotation. This
+ * version might not be complete, and should be evaluated for possible deletion. We recommend
+ * that you remove the VersionStage
value AWSPENDING
from this version so that
+ * Secrets Manager can delete it. Failing to clean up a cancelled rotation can block you from
+ * starting future rotations.
A structure that contains information about a tag.
@@ -408,28 +658,6 @@ export interface CreateSecretResponse { ReplicationStatus?: ReplicationStatusType[]; } -/** - * @public - *Secrets Manager can't decrypt the protected secret text using the provided KMS key.
- */ -export class DecryptionFailure extends __BaseException { - readonly name: "DecryptionFailure" = "DecryptionFailure"; - readonly $fault: "client" = "client"; - Message?: string; - /** - * @internal - */ - constructor(opts: __ExceptionOptionTypeSecrets Manager can't encrypt the protected secret text using the provided KMS key. Check that the @@ -872,74 +1100,6 @@ export interface DescribeSecretResponse { ReplicationStatus?: ReplicationStatusType[]; } -/** - * @public - * @enum - */ -export const FilterNameStringType = { - all: "all", - description: "description", - name: "name", - owning_service: "owning-service", - primary_region: "primary-region", - tag_key: "tag-key", - tag_value: "tag-value", -} as const; - -/** - * @public - */ -export type FilterNameStringType = (typeof FilterNameStringType)[keyof typeof FilterNameStringType]; - -/** - * @public - *
Allows you to add filters when you use the search function in Secrets Manager. For more information, see Find secrets in Secrets Manager.
- */ -export interface Filter { - /** - * @public - *The following are keys you can use:
- *- * description: Prefix match, not case-sensitive.
- *- * name: Prefix match, case-sensitive.
- *- * tag-key: Prefix match, case-sensitive.
- *- * tag-value: Prefix match, case-sensitive.
- *- * primary-region: Prefix match, case-sensitive.
- *- * owning-service: Prefix match, case-sensitive.
- *- * all: Breaks the filter value string into words and then searches all attributes for matches. Not case-sensitive.
- *The keyword to filter for.
- *You can prefix your search value with an exclamation mark (!
) in order to perform negation filters.
The NextToken
value is invalid.
The friendly name of the secret. You can use forward slashes in the name to represent a
- * path hierarchy. For example, /prod/databases/dbserver1
could represent the secret
- * for a server named dbserver1
in the folder databases
in the folder
- * prod
.
The friendly name of the secret.
*/ Name?: string; @@ -2110,6 +2245,23 @@ export interface ValidateResourcePolicyResponse { ValidationErrors?: ValidationErrorsEntry[]; } +/** + * @internal + */ +export const SecretValueEntryFilterSensitiveLog = (obj: SecretValueEntry): any => ({ + ...obj, + ...(obj.SecretBinary && { SecretBinary: SENSITIVE_STRING }), + ...(obj.SecretString && { SecretString: SENSITIVE_STRING }), +}); + +/** + * @internal + */ +export const BatchGetSecretValueResponseFilterSensitiveLog = (obj: BatchGetSecretValueResponse): any => ({ + ...obj, + ...(obj.SecretValues && { SecretValues: obj.SecretValues.map((item) => SecretValueEntryFilterSensitiveLog(item)) }), +}); + /** * @internal */ diff --git a/clients/client-secrets-manager/src/pagination/BatchGetSecretValuePaginator.ts b/clients/client-secrets-manager/src/pagination/BatchGetSecretValuePaginator.ts new file mode 100644 index 000000000000..c3e184918a8e --- /dev/null +++ b/clients/client-secrets-manager/src/pagination/BatchGetSecretValuePaginator.ts @@ -0,0 +1,50 @@ +// smithy-typescript generated code +import { Paginator } from "@smithy/types"; + +import { + BatchGetSecretValueCommand, + BatchGetSecretValueCommandInput, + BatchGetSecretValueCommandOutput, +} from "../commands/BatchGetSecretValueCommand"; +import { SecretsManagerClient } from "../SecretsManagerClient"; +import { SecretsManagerPaginationConfiguration } from "./Interfaces"; + +/** + * @internal + */ +const makePagedClientRequest = async ( + client: SecretsManagerClient, + input: BatchGetSecretValueCommandInput, + ...args: any +): PromiseThe ARN or name of the secret.
" + } + }, + "ErrorCode": { + "target": "com.amazonaws.secretsmanager#ErrorCode", + "traits": { + "smithy.api#documentation": "The error Secrets Manager encountered while retrieving an individual secret as part of BatchGetSecretValue, for example ResourceNotFoundException
,InvalidParameterException
, InvalidRequestException
, DecryptionFailure
, or AccessDeniedException
.
A message describing the error.
" + } + } + }, + "traits": { + "smithy.api#documentation": "The error Secrets Manager encountered while retrieving an individual secret as part of BatchGetSecretValue.
" + } + }, "com.amazonaws.secretsmanager#AddReplicaRegionListType": { "type": "list", "member": { @@ -49,6 +81,101 @@ } } }, + "com.amazonaws.secretsmanager#BatchGetSecretValue": { + "type": "operation", + "input": { + "target": "com.amazonaws.secretsmanager#BatchGetSecretValueRequest" + }, + "output": { + "target": "com.amazonaws.secretsmanager#BatchGetSecretValueResponse" + }, + "errors": [ + { + "target": "com.amazonaws.secretsmanager#DecryptionFailure" + }, + { + "target": "com.amazonaws.secretsmanager#InternalServiceError" + }, + { + "target": "com.amazonaws.secretsmanager#InvalidNextTokenException" + }, + { + "target": "com.amazonaws.secretsmanager#InvalidParameterException" + }, + { + "target": "com.amazonaws.secretsmanager#InvalidRequestException" + }, + { + "target": "com.amazonaws.secretsmanager#ResourceNotFoundException" + } + ], + "traits": { + "smithy.api#documentation": "Retrieves the contents of the encrypted fields SecretString
or SecretBinary
for up to 20 secrets. To retrieve a single secret, call GetSecretValue.
To choose which secrets to retrieve, you can specify a list of secrets by name or ARN, or you can use filters. If Secrets Manager encounters errors such as AccessDeniedException
while attempting to retrieve any of the secrets, you can see the errors in Errors
in the response.
Secrets Manager generates CloudTrail GetSecretValue
log entries for each secret you request when you call this action. Do not include sensitive information in request parameters because it might be logged. For more information, see Logging Secrets Manager events with CloudTrail.
\n Required permissions: \n secretsmanager:BatchGetSecretValue
, and you must have secretsmanager:GetSecretValue
for each secret. If you use filters, you must also have secretsmanager:ListSecrets
. If the secrets are encrypted using customer-managed keys instead of the Amazon Web Services managed key \n aws/secretsmanager
, then you also need kms:Decrypt
permissions for the keys.\n For more information, see \n IAM policy actions for Secrets Manager and Authentication \n and access control in Secrets Manager.
The ARN or names of the secrets to retrieve. You must include Filters
or SecretIdList
, but not both.
The filters to choose which secrets to retrieve. You must include Filters
or SecretIdList
, but not both.
The number of results to include in the response.
\nIf there are more results available, in the response, Secrets Manager includes NextToken
. \n To get the next results, call BatchGetSecretValue
again with the value from \n NextToken
.
A token that indicates where the output should continue from, if a \n previous call did not show all results. To get the next results, call BatchGetSecretValue
again \n with this value.
A list of secret values.
" + } + }, + "NextToken": { + "target": "com.amazonaws.secretsmanager#NextTokenType", + "traits": { + "smithy.api#documentation": "Secrets Manager includes this value if \n there's more output available than what is included in the current response. This can \n occur even when the response includes no values at all, such as when you ask for a filtered view \n of a long list. To get the next results, call BatchGetSecretValue
again \n with this value.
A list of errors Secrets Manager encountered while attempting to retrieve individual secrets.
" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.secretsmanager#BooleanType": { "type": "boolean", "traits": { @@ -664,6 +791,9 @@ "smithy.api#error": "client" } }, + "com.amazonaws.secretsmanager#ErrorCode": { + "type": "string" + }, "com.amazonaws.secretsmanager#ErrorMessage": { "type": "string" }, @@ -1021,7 +1151,7 @@ } ], "traits": { - "smithy.api#documentation": "Retrieves the contents of the encrypted fields SecretString
or\n SecretBinary
from the specified version of a secret, whichever contains\n content.
We recommend that you cache your secret values by using client-side caching. \n Caching secrets improves speed and reduces your costs. For more information, see Cache secrets for \n your applications.
\nTo retrieve the previous version of a secret, use VersionStage
and specify \n AWSPREVIOUS. To revert to the previous version of a secret, call UpdateSecretVersionStage.
Secrets Manager generates a CloudTrail log entry when you call this action. Do not include sensitive information in request parameters because it might be logged. For more information, see Logging Secrets Manager events with CloudTrail.
\n\n Required permissions: \n secretsmanager:GetSecretValue
. \n If the secret is encrypted using a customer-managed key instead of the Amazon Web Services managed key \n aws/secretsmanager
, then you also need kms:Decrypt
permissions for that key.\n For more information, see \n IAM policy actions for Secrets Manager and Authentication \n and access control in Secrets Manager.
Retrieves the contents of the encrypted fields SecretString
or\n SecretBinary
from the specified version of a secret, whichever contains\n content.
To retrieve the values for a group of secrets, call BatchGetSecretValue.
\nWe recommend that you cache your secret values by using client-side caching. \n Caching secrets improves speed and reduces your costs. For more information, see Cache secrets for \n your applications.
\nTo retrieve the previous version of a secret, use VersionStage
and specify \n AWSPREVIOUS. To revert to the previous version of a secret, call UpdateSecretVersionStage.
Secrets Manager generates a CloudTrail log entry when you call this action. Do not include sensitive information in request parameters because it might be logged. For more information, see Logging Secrets Manager events with CloudTrail.
\n\n Required permissions: \n secretsmanager:GetSecretValue
. \n If the secret is encrypted using a customer-managed key instead of the Amazon Web Services managed key \n aws/secretsmanager
, then you also need kms:Decrypt
permissions for that key.\n For more information, see \n IAM policy actions for Secrets Manager and Authentication \n and access control in Secrets Manager.
Lists the secrets that are stored by Secrets Manager in the Amazon Web Services account, not including secrets \n that are marked for deletion. To see secrets marked for deletion, use the Secrets Manager console.
\nListSecrets is eventually consistent, however it might not reflect changes from the last five minutes. \n To get the latest information for a specific secret, use DescribeSecret.
\nTo list the versions of a secret, use ListSecretVersionIds.
\nTo get the secret value from SecretString
or SecretBinary
, \n call GetSecretValue.
For information about finding secrets in the console, see Find secrets in Secrets Manager.
\nSecrets Manager generates a CloudTrail log entry when you call this action. Do not include sensitive information in request parameters because it might be logged. For more information, see Logging Secrets Manager events with CloudTrail.
\n\n Required permissions: \n secretsmanager:ListSecrets
. \n For more information, see \n IAM policy actions for Secrets Manager and Authentication \n and access control in Secrets Manager.
Lists the secrets that are stored by Secrets Manager in the Amazon Web Services account, not including secrets \n that are marked for deletion. To see secrets marked for deletion, use the Secrets Manager console.
\nListSecrets is eventually consistent, however it might not reflect changes from the last five minutes. \n To get the latest information for a specific secret, use DescribeSecret.
\nTo list the versions of a secret, use ListSecretVersionIds.
\nTo retrieve the values for the secrets, call BatchGetSecretValue or GetSecretValue.
\nFor information about finding secrets in the console, see Find secrets in Secrets Manager.
\nSecrets Manager generates a CloudTrail log entry when you call this action. Do not include sensitive information in request parameters because it might be logged. For more information, see Logging Secrets Manager events with CloudTrail.
\n\n Required permissions: \n secretsmanager:ListSecrets
. \n For more information, see \n IAM policy actions for Secrets Manager and Authentication \n and access control in Secrets Manager.
The friendly name of the secret. You can use forward slashes in the name to represent a\n path hierarchy. For example, /prod/databases/dbserver1
could represent the secret\n for a server named dbserver1
in the folder databases
in the folder\n prod
.
The friendly name of the secret.
" } }, "Description": { @@ -2468,6 +2619,62 @@ "smithy.api#sensitive": {} } }, + "com.amazonaws.secretsmanager#SecretValueEntry": { + "type": "structure", + "members": { + "ARN": { + "target": "com.amazonaws.secretsmanager#SecretARNType", + "traits": { + "smithy.api#documentation": "The Amazon Resource Name (ARN) of the secret.
" + } + }, + "Name": { + "target": "com.amazonaws.secretsmanager#SecretNameType", + "traits": { + "smithy.api#documentation": "The friendly name of the secret.
" + } + }, + "VersionId": { + "target": "com.amazonaws.secretsmanager#SecretVersionIdType", + "traits": { + "smithy.api#documentation": "The unique version identifier of this version of the secret.
" + } + }, + "SecretBinary": { + "target": "com.amazonaws.secretsmanager#SecretBinaryType", + "traits": { + "smithy.api#documentation": "The decrypted secret value, if the secret value was originally provided as\n binary data in the form of a byte array. The parameter represents the binary data as\n a base64-encoded\n string.
" + } + }, + "SecretString": { + "target": "com.amazonaws.secretsmanager#SecretStringType", + "traits": { + "smithy.api#documentation": "The decrypted secret value, if the secret value was originally provided as a string or \n through the Secrets Manager console.
" + } + }, + "VersionStages": { + "target": "com.amazonaws.secretsmanager#SecretVersionStagesType", + "traits": { + "smithy.api#documentation": "A list of all of the staging labels currently attached to this version of the\n secret.
" + } + }, + "CreatedDate": { + "target": "com.amazonaws.secretsmanager#CreatedDateType", + "traits": { + "smithy.api#documentation": "The date the secret was created.
" + } + } + }, + "traits": { + "smithy.api#documentation": "A structure that contains the secret value and other details for a secret.
" + } + }, + "com.amazonaws.secretsmanager#SecretValuesType": { + "type": "list", + "member": { + "target": "com.amazonaws.secretsmanager#SecretValueEntry" + } + }, "com.amazonaws.secretsmanager#SecretVersionIdType": { "type": "string", "traits": { @@ -3177,6 +3384,9 @@ "type": "service", "version": "2017-10-17", "operations": [ + { + "target": "com.amazonaws.secretsmanager#BatchGetSecretValue" + }, { "target": "com.amazonaws.secretsmanager#CancelRotateSecret" },